diff --git a/proto/api.proto b/proto/api.proto index b38fb45c69..acd7c50256 100644 --- a/proto/api.proto +++ b/proto/api.proto @@ -44,17 +44,13 @@ message Player { oneof spec { BalanceDruid balance_druid = 12; - FeralDruid feral_druid = 13; - GuardianDruid guardian_druid = 53; + FeralCatDruid feral_druid = 13; + FeralBearDruid guardian_druid = 53; RestorationDruid restoration_druid = 14; - BeastMasteryHunter beast_mastery_hunter = 15; - MarksmanshipHunter marksmanship_hunter = 16; - SurvivalHunter survival_hunter = 17; + Hunter hunter = 17; - ArcaneMage arcane_mage = 18; - FireMage fire_mage = 19; - FrostMage frost_mage = 20; + Mage mage = 20; HolyPaladin holy_paladin = 21; ProtectionPaladin protection_paladin = 22; @@ -64,20 +60,15 @@ message Player { HolyPriest holy_priest = 25; ShadowPriest shadow_priest = 26; - AssassinationRogue assassination_rogue = 27; - CombatRogue combat_rogue = 28; - SubtletyRogue subtlety_rogue = 29; + Rogue rogue = 29; ElementalShaman elemental_shaman = 30; EnhancementShaman enhancement_shaman = 31; RestorationShaman restoration_shaman = 32; - AfflictionWarlock affliction_warlock = 33; - DemonologyWarlock demonology_warlock = 34; - DestructionWarlock destruction_warlock = 35; + Warlock warlock = 35; - ArmsWarrior arms_warrior = 36; - FuryWarrior fury_warrior = 37; + DPSWarrior dps_warrior = 37; ProtectionWarrior protection_warrior = 38; } diff --git a/proto/apl.proto b/proto/apl.proto index f32761ae30..f73efb15e1 100644 --- a/proto/apl.proto +++ b/proto/apl.proto @@ -367,7 +367,7 @@ message APLActionItemSwap { } message APLActionCatOptimalRotationAction { - FeralDruid.Rotation.AplType rotation_type = 1; + FeralCatDruid.Rotation.AplType rotation_type = 1; bool bear_weave = 2; bool snek_weave = 3; bool allow_aoe_berserk = 4; diff --git a/proto/common.proto b/proto/common.proto index 6d50b701e6..376a1e1e99 100644 --- a/proto/common.proto +++ b/proto/common.proto @@ -42,42 +42,33 @@ message ScalingItemProperties { enum Spec { SpecUnknown = 0; - SpecBalanceDruid = 4; - SpecFeralDruid = 5; - SpecGuardianDruid = 31; - SpecRestorationDruid = 6; - - SpecBeastMasteryHunter = 7; - SpecMarksmanshipHunter = 8; - SpecSurvivalHunter = 9; - - SpecArcaneMage = 10; - SpecFireMage = 11; - SpecFrostMage = 12; - - SpecHolyPaladin = 13; - SpecProtectionPaladin = 14; - SpecRetributionPaladin = 15; - - SpecDisciplinePriest = 16; - SpecHolyPriest = 17; - SpecShadowPriest = 18; - - SpecAssassinationRogue = 19; - SpecCombatRogue = 20; - SpecSubtletyRogue = 21; - - SpecElementalShaman = 22; - SpecEnhancementShaman = 23; - SpecRestorationShaman = 24; - - SpecAfflictionWarlock = 25; - SpecDemonologyWarlock = 26; - SpecDestructionWarlock = 27; - - SpecArmsWarrior = 28; - SpecFuryWarrior = 29; - SpecProtectionWarrior = 30; + SpecBalanceDruid = 1; + SpecFeralCatDruid = 2; + SpecFeralBearDruid = 3; + SpecRestorationDruid = 4; + + SpecHunter = 5; + + SpecMage = 6; + + SpecHolyPaladin = 7; + SpecProtectionPaladin = 8; + SpecRetributionPaladin = 9; + + SpecDisciplinePriest = 10; + SpecHolyPriest = 11; + SpecShadowPriest = 12; + + SpecRogue = 13; + + SpecElementalShaman = 14; + SpecEnhancementShaman = 15; + SpecRestorationShaman = 16; + + SpecWarlock = 17; + + SpecDPSWarrior = 18; + SpecProtectionWarrior = 19; } enum Race { diff --git a/proto/druid.proto b/proto/druid.proto index b54ca563ee..e5a87cc271 100644 --- a/proto/druid.proto +++ b/proto/druid.proto @@ -91,7 +91,7 @@ message BalanceDruid { Options options = 3; } -message FeralDruid { +message FeralCatDruid { message Rotation { enum AplType { SingleTarget = 0; @@ -127,7 +127,7 @@ message FeralDruid { Options options = 3; } -message GuardianDruid { +message FeralBearDruid { message Rotation { bool maintain_faerie_fire = 1; bool maintain_demoralizing_roar = 2; diff --git a/proto/hunter.proto b/proto/hunter.proto index 23b381647b..0e5365ab66 100644 --- a/proto/hunter.proto +++ b/proto/hunter.proto @@ -152,7 +152,7 @@ message HunterOptions { double glaive_toss_success = 9; } -message BeastMasteryHunter { +message Hunter { message Rotation { RotationType type = 9; HunterStingType sting = 5; @@ -174,39 +174,3 @@ message BeastMasteryHunter { } Options options = 1; } - -message MarksmanshipHunter { - message Rotation { - RotationType type = 9; - HunterStingType sting = 5; - - bool trap_weave = 1; - - // Switch to Aspect of the Viper when mana goes below this percent. - double viper_start_mana_percent = 6; - // Switch back to Aspect of the Hawk when mana goes above this percent. - double viper_stop_mana_percent = 7; - - // Allow use of Explosive Shot Rank 3 during LNL procs. - bool allow_explosive_shot_downrank = 10; - - bool multi_dot_serpent_sting = 11; - } - message Options { - HunterOptions class_options = 1; - } - Options options = 1; -} - -message SurvivalHunter { - message Rotation { - RotationType type = 9; - HunterStingType sting = 5; - - bool multi_dot_serpent_sting = 11; - } - message Options { - HunterOptions class_options = 1; - } - Options options = 1; -} diff --git a/proto/mage.proto b/proto/mage.proto index 19db75a871..bdbabb3445 100644 --- a/proto/mage.proto +++ b/proto/mage.proto @@ -91,7 +91,7 @@ message MageOptions { MageArmor default_mage_armor = 1; } -message ArcaneMage { +message Mage { message Rotation { } @@ -100,31 +100,3 @@ message ArcaneMage { } Options options = 1; } - -message FireMage { - message Rotation { - // Minimum Combustion threshold to cast Combustion at during lust - int32 combust_always_send = 1; - int32 combust_bloodlust = 2; - int32 combust_post_alter = 3; - int32 combust_no_alter = 4; - int32 combust_end_of_combat = 5; - } - - message Options { - MageOptions class_options = 1; - } - Options options = 1; -} - -message FrostMage { - message Rotation { - } - - message Options { - MageOptions class_options = 1; - // Chance for water elemental to disobey, doing nothing rather than cast. - double water_elemental_disobey_chance = 2; - } - Options options = 1; -} diff --git a/proto/rogue.proto b/proto/rogue.proto index f562d54c83..07302712e6 100644 --- a/proto/rogue.proto +++ b/proto/rogue.proto @@ -95,7 +95,7 @@ message RogueOptions { float vanish_break_time = 5; } -message AssassinationRogue { +message Rogue { message Rotation {} message Options { @@ -103,22 +103,3 @@ message AssassinationRogue { } Options options = 1; } - -message CombatRogue { - message Rotation {} - - message Options { - RogueOptions class_options = 1; - } - Options options = 1; -} - -message SubtletyRogue { - message Rotation {} - - message Options { - RogueOptions class_options = 1; - int32 honor_among_thieves_crit_rate = 6; - } - Options options = 1; -} diff --git a/proto/warlock.proto b/proto/warlock.proto index ad7f05d0dd..13a7f20277 100644 --- a/proto/warlock.proto +++ b/proto/warlock.proto @@ -92,7 +92,7 @@ message WarlockOptions { bool use_item_swap_bonus_stats = 3; } -message AfflictionWarlock { +message Warlock { message Rotation { } @@ -102,23 +102,3 @@ message AfflictionWarlock { } Options options = 1; } - -message DemonologyWarlock { - message Rotation { - } - - message Options { - WarlockOptions class_options = 1; - } - Options options = 1; -} - -message DestructionWarlock { - message Rotation { - } - - message Options { - WarlockOptions class_options = 1; - } - Options options = 1; -} diff --git a/proto/warrior.proto b/proto/warrior.proto index 3295a991dd..abe2d7670c 100644 --- a/proto/warrior.proto +++ b/proto/warrior.proto @@ -82,17 +82,7 @@ message WarriorTalents { message WarriorOptions { } -message ArmsWarrior { - message Rotation {} - - message Options { - WarriorOptions class_options = 1; - bool stance_snapshot = 2; - } - Options options = 1; -} - -message FuryWarrior { +message DPSWarrior { message Rotation {} message Options { diff --git a/ui/core/player.ts b/ui/core/player.ts index 15712aecaa..3edb62c771 100644 --- a/ui/core/player.ts +++ b/ui/core/player.ts @@ -27,14 +27,12 @@ import { HandType, HealingModel, IndividualBuffs, - ItemLevelState, ItemRandomSuffix, ItemSlot, Profession, PseudoStat, Race, RangedWeaponType, - ReforgeStat, Spec, Stat, UnitReference, @@ -482,11 +480,6 @@ export class Player { return this.sim.db.getAvailableReforges(equippedItem.item).map(reforge => equippedItem.getReforgeData(reforge)!); } - // Returns reforge given an id - getReforge(id: number): ReforgeStat | undefined { - return this.sim.db.getReforgeById(id); - } - // Returns all enchants that this player can wear in the given slot. getEnchants(slot: ItemSlot): Array { return this.sim.db.getEnchants(slot).filter(enchant => canEquipEnchant(enchant, this.playerSpec)); @@ -698,7 +691,7 @@ export class Player { } canDualWield2H(): boolean { - return this.getSpec() == Spec.SpecFuryWarrior; + return false; } equipItem(eventID: EventID, slot: ItemSlot, newItem: EquippedItem | null) { @@ -744,7 +737,7 @@ export class Player { getMeleeCritCapInfo(): MeleeCritCapInfo { const meleeCrit = this.currentStats.finalStats?.pseudoStats[PseudoStat.PseudoStatPhysicalCritPercent] || 0.0; const meleeHit = this.currentStats.finalStats?.pseudoStats[PseudoStat.PseudoStatPhysicalHitPercent] || 0.0; - const expertise = (this.currentStats.finalStats?.stats[Stat.StatExpertiseRating] || 0.0) / Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION / 4; + const expertise = (this.currentStats.finalStats?.stats[Stat.StatExpertise] || 0.0) / Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION / 4; //const agility = (this.currentStats.finalStats?.stats[Stat.StatAgility] || 0.0) / this.getClass(); const suppression = 4.8; const glancing = 24.0; @@ -1079,19 +1072,6 @@ export class Player { return this.computeStatsEP(stats); } - computeUpgradeEP(equippedItem: EquippedItem, upgradeLevel: ItemLevelState, slot: ItemSlot): number { - const cacheKey = `${equippedItem.id}-${JSON.stringify(this.epWeights)}-${slot}-${equippedItem.randomSuffix?.id}-${upgradeLevel}`; - if (this.upgradeEPCache.has(cacheKey)) { - return this.upgradeEPCache.get(cacheKey)!; - } - - const stats = equippedItem.withUpgrade(upgradeLevel).withDynamicStats().calcStats(slot); - const ep = this.computeStatsEP(stats); - this.upgradeEPCache.set(cacheKey, ep); - - return ep; - } - computeItemEP(item: Item, slot: ItemSlot): number { if (item == null) return 0; @@ -1253,10 +1233,10 @@ export class Player { }; if (filters.minIlvl != 0) { - itemData = filterItems(itemData, item => (item.scalingOptions?.[ItemLevelState.Base].ilvl || item.ilvl) >= filters.minIlvl); + itemData = filterItems(itemData, item => (item.scalingOptions?.[0].ilvl || item.ilvl) >= filters.minIlvl); } if (filters.maxIlvl != 0) { - itemData = filterItems(itemData, item => (item.scalingOptions?.[ItemLevelState.Base].ilvl || item.ilvl) <= filters.maxIlvl); + itemData = filterItems(itemData, item => (item.scalingOptions?.[0].ilvl || item.ilvl) <= filters.maxIlvl); } if (filters.factionRestriction != UIItem_FactionRestriction.UNSPECIFIED) { diff --git a/ui/core/player_specs/druid.ts b/ui/core/player_specs/druid.ts index d88becdf4f..9b0d0d076a 100644 --- a/ui/core/player_specs/druid.ts +++ b/ui/core/player_specs/druid.ts @@ -39,12 +39,12 @@ export class BalanceDruid extends PlayerSpec { }; } -export class FeralDruid extends PlayerSpec { +export class FeralCatDruid extends PlayerSpec { static specIndex = 1; - static specID = Spec.SpecFeralDruid as Spec.SpecFeralDruid; + static specID = Spec.SpecFeralCatDruid as Spec.SpecFeralCatDruid; static classID = Class.ClassDruid as Class.ClassDruid; - static friendlyName = 'Feral'; - static simLink = getSpecSiteUrl('druid', 'feral'); + static friendlyName = 'Feral Cat'; + static simLink = getSpecSiteUrl('druid', 'feralcat'); static isTankSpec = false; static isHealingSpec = false; @@ -53,34 +53,34 @@ export class FeralDruid extends PlayerSpec { static canDualWield = false; - readonly specIndex = FeralDruid.specIndex; - readonly specID = FeralDruid.specID; - readonly classID = FeralDruid.classID; - readonly friendlyName = FeralDruid.friendlyName; - readonly simLink = FeralDruid.simLink; + readonly specIndex = FeralCatDruid.specIndex; + readonly specID = FeralCatDruid.specID; + readonly classID = FeralCatDruid.classID; + readonly friendlyName = FeralCatDruid.friendlyName; + readonly simLink = FeralCatDruid.simLink; - readonly isTankSpec = FeralDruid.isTankSpec; - readonly isHealingSpec = FeralDruid.isHealingSpec; - readonly isRangedDpsSpec = FeralDruid.isRangedDpsSpec; - readonly isMeleeDpsSpec = FeralDruid.isMeleeDpsSpec; + readonly isTankSpec = FeralCatDruid.isTankSpec; + readonly isHealingSpec = FeralCatDruid.isHealingSpec; + readonly isRangedDpsSpec = FeralCatDruid.isRangedDpsSpec; + readonly isMeleeDpsSpec = FeralCatDruid.isMeleeDpsSpec; - readonly canDualWield = FeralDruid.canDualWield; + readonly canDualWield = FeralCatDruid.canDualWield; static getIcon = (size: IconSize): string => { return `https://wow.zamimg.com/images/wow/icons/${size}/ability_druid_catform.jpg`; }; getIcon = (size: IconSize): string => { - return FeralDruid.getIcon(size); + return FeralCatDruid.getIcon(size); }; } -export class GuardianDruid extends PlayerSpec { +export class FeralBearDruid extends PlayerSpec { static specIndex = 2; - static specID = Spec.SpecGuardianDruid as Spec.SpecGuardianDruid; + static specID = Spec.SpecFeralBearDruid as Spec.SpecFeralBearDruid; static classID = Class.ClassDruid as Class.ClassDruid; - static friendlyName = 'Guardian'; - static simLink = getSpecSiteUrl('druid', 'guardian'); + static friendlyName = 'Feral Bear'; + static simLink = getSpecSiteUrl('druid', 'feralbear'); static isTankSpec = true; static isHealingSpec = false; @@ -89,25 +89,25 @@ export class GuardianDruid extends PlayerSpec { static canDualWield = false; - readonly specIndex = GuardianDruid.specIndex; - readonly specID = GuardianDruid.specID; - readonly classID = GuardianDruid.classID; - readonly friendlyName = GuardianDruid.friendlyName; - readonly simLink = GuardianDruid.simLink; + readonly specIndex = FeralBearDruid.specIndex; + readonly specID = FeralBearDruid.specID; + readonly classID = FeralBearDruid.classID; + readonly friendlyName = FeralBearDruid.friendlyName; + readonly simLink = FeralBearDruid.simLink; - readonly isTankSpec = GuardianDruid.isTankSpec; - readonly isHealingSpec = GuardianDruid.isHealingSpec; - readonly isRangedDpsSpec = GuardianDruid.isRangedDpsSpec; - readonly isMeleeDpsSpec = GuardianDruid.isMeleeDpsSpec; + readonly isTankSpec = FeralBearDruid.isTankSpec; + readonly isHealingSpec = FeralBearDruid.isHealingSpec; + readonly isRangedDpsSpec = FeralBearDruid.isRangedDpsSpec; + readonly isMeleeDpsSpec = FeralBearDruid.isMeleeDpsSpec; - readonly canDualWield = GuardianDruid.canDualWield; + readonly canDualWield = FeralBearDruid.canDualWield; static getIcon = (size: IconSize): string => { return `https://wow.zamimg.com/images/wow/icons/${size}/ability_racial_bearform.jpg`; }; getIcon = (size: IconSize): string => { - return GuardianDruid.getIcon(size); + return FeralBearDruid.getIcon(size); }; } diff --git a/ui/core/player_specs/hunter.ts b/ui/core/player_specs/hunter.ts index 9ac8dc3650..16de834fb1 100644 --- a/ui/core/player_specs/hunter.ts +++ b/ui/core/player_specs/hunter.ts @@ -3,12 +3,12 @@ import { PlayerSpec } from '../player_spec'; import { Class, Spec } from '../proto/common'; import { getSpecSiteUrl } from '../proto_utils/utils'; -export class BeastMasteryHunter extends PlayerSpec { +export class Hunter extends PlayerSpec { static specIndex = 0; - static specID = Spec.SpecBeastMasteryHunter as Spec.SpecBeastMasteryHunter; + static specID = Spec.SpecHunter as Spec.SpecHunter; static classID = Class.ClassHunter as Class.ClassHunter; - static friendlyName = 'Beast Mastery'; - static simLink = getSpecSiteUrl('hunter', 'beast_mastery'); + static friendlyName = 'Hunter'; + static simLink = getSpecSiteUrl('hunter', 'hunter'); static isTankSpec = false; static isHealingSpec = false; @@ -17,96 +17,24 @@ export class BeastMasteryHunter extends PlayerSpec static canDualWield = true; - readonly specIndex = BeastMasteryHunter.specIndex; - readonly specID = BeastMasteryHunter.specID; - readonly classID = BeastMasteryHunter.classID; - readonly friendlyName = BeastMasteryHunter.friendlyName; - readonly simLink = BeastMasteryHunter.simLink; + readonly specIndex = Hunter.specIndex; + readonly specID = Hunter.specID; + readonly classID = Hunter.classID; + readonly friendlyName = Hunter.friendlyName; + readonly simLink = Hunter.simLink; - readonly isTankSpec = BeastMasteryHunter.isTankSpec; - readonly isHealingSpec = BeastMasteryHunter.isHealingSpec; - readonly isRangedDpsSpec = BeastMasteryHunter.isRangedDpsSpec; - readonly isMeleeDpsSpec = BeastMasteryHunter.isMeleeDpsSpec; + readonly isTankSpec = Hunter.isTankSpec; + readonly isHealingSpec = Hunter.isHealingSpec; + readonly isRangedDpsSpec = Hunter.isRangedDpsSpec; + readonly isMeleeDpsSpec = Hunter.isMeleeDpsSpec; - readonly canDualWield = BeastMasteryHunter.canDualWield; + readonly canDualWield = Hunter.canDualWield; static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_hunter_bestialdiscipline.jpg`; + return `https://wow.zamimg.com/images/wow/icons/${size}/class_hunter.jpg`; }; getIcon = (size: IconSize): string => { - return BeastMasteryHunter.getIcon(size); - }; -} - -export class MarksmanshipHunter extends PlayerSpec { - static specIndex = 1; - static specID = Spec.SpecMarksmanshipHunter as Spec.SpecMarksmanshipHunter; - static classID = Class.ClassHunter as Class.ClassHunter; - static friendlyName = 'Marksmanship'; - static simLink = getSpecSiteUrl('hunter', 'marksmanship'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = true; - static isMeleeDpsSpec = false; - - static canDualWield = true; - - readonly specIndex = MarksmanshipHunter.specIndex; - readonly specID = MarksmanshipHunter.specID; - readonly classID = MarksmanshipHunter.classID; - readonly friendlyName = MarksmanshipHunter.friendlyName; - readonly simLink = MarksmanshipHunter.simLink; - - readonly isTankSpec = MarksmanshipHunter.isTankSpec; - readonly isHealingSpec = MarksmanshipHunter.isHealingSpec; - readonly isRangedDpsSpec = MarksmanshipHunter.isRangedDpsSpec; - readonly isMeleeDpsSpec = MarksmanshipHunter.isMeleeDpsSpec; - - readonly canDualWield = MarksmanshipHunter.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_hunter_focusedaim.jpg`; - }; - - getIcon = (size: IconSize): string => { - return MarksmanshipHunter.getIcon(size); - }; -} - -export class SurvivalHunter extends PlayerSpec { - static specIndex = 2; - static specID = Spec.SpecSurvivalHunter as Spec.SpecSurvivalHunter; - static classID = Class.ClassHunter as Class.ClassHunter; - static friendlyName = 'Survival'; - static simLink = getSpecSiteUrl('hunter', 'survival'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = true; - static isMeleeDpsSpec = false; - - static canDualWield = true; - - readonly specIndex = SurvivalHunter.specIndex; - readonly specID = SurvivalHunter.specID; - readonly classID = SurvivalHunter.classID; - readonly friendlyName = SurvivalHunter.friendlyName; - readonly simLink = SurvivalHunter.simLink; - - readonly isTankSpec = SurvivalHunter.isTankSpec; - readonly isHealingSpec = SurvivalHunter.isHealingSpec; - readonly isRangedDpsSpec = SurvivalHunter.isRangedDpsSpec; - readonly isMeleeDpsSpec = SurvivalHunter.isMeleeDpsSpec; - - readonly canDualWield = SurvivalHunter.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_hunter_camouflage.jpg`; - }; - - getIcon = (size: IconSize): string => { - return SurvivalHunter.getIcon(size); + return Hunter.getIcon(size); }; } diff --git a/ui/core/player_specs/index.ts b/ui/core/player_specs/index.ts index 8c76d5dee2..096908792f 100644 --- a/ui/core/player_specs/index.ts +++ b/ui/core/player_specs/index.ts @@ -19,17 +19,13 @@ const specToPlayerSpec: Record | undefined> = { [Spec.SpecUnknown]: undefined, // Druid [Spec.SpecBalanceDruid]: DruidSpecs.BalanceDruid, - [Spec.SpecFeralDruid]: DruidSpecs.FeralDruid, - [Spec.SpecGuardianDruid]: DruidSpecs.GuardianDruid, + [Spec.SpecFeralCatDruid]: DruidSpecs.FeralCatDruid, + [Spec.SpecFeralBearDruid]: DruidSpecs.FeralBearDruid, [Spec.SpecRestorationDruid]: DruidSpecs.RestorationDruid, // Hunter - [Spec.SpecBeastMasteryHunter]: HunterSpecs.BeastMasteryHunter, - [Spec.SpecMarksmanshipHunter]: HunterSpecs.MarksmanshipHunter, - [Spec.SpecSurvivalHunter]: HunterSpecs.SurvivalHunter, + [Spec.SpecHunter]: HunterSpecs.Hunter, // Mage - [Spec.SpecArcaneMage]: MageSpecs.ArcaneMage, - [Spec.SpecFireMage]: MageSpecs.FireMage, - [Spec.SpecFrostMage]: MageSpecs.FrostMage, + [Spec.SpecMage]: MageSpecs.Mage, // Paladin [Spec.SpecHolyPaladin]: PaladinSpecs.HolyPaladin, [Spec.SpecProtectionPaladin]: PaladinSpecs.ProtectionPaladin, @@ -39,20 +35,15 @@ const specToPlayerSpec: Record | undefined> = { [Spec.SpecHolyPriest]: PriestSpecs.HolyPriest, [Spec.SpecShadowPriest]: PriestSpecs.ShadowPriest, // Rogue - [Spec.SpecAssassinationRogue]: RogueSpecs.AssassinationRogue, - [Spec.SpecCombatRogue]: RogueSpecs.CombatRogue, - [Spec.SpecSubtletyRogue]: RogueSpecs.SubtletyRogue, + [Spec.SpecRogue]: RogueSpecs.Rogue, // Shaman [Spec.SpecElementalShaman]: ShamanSpecs.ElementalShaman, [Spec.SpecEnhancementShaman]: ShamanSpecs.EnhancementShaman, [Spec.SpecRestorationShaman]: ShamanSpecs.RestorationShaman, // Warlock - [Spec.SpecAfflictionWarlock]: WarlockSpecs.AfflictionWarlock, - [Spec.SpecDemonologyWarlock]: WarlockSpecs.DemonologyWarlock, - [Spec.SpecDestructionWarlock]: WarlockSpecs.DestructionWarlock, + [Spec.SpecWarlock]: WarlockSpecs.Warlock, // Warrior - [Spec.SpecArmsWarrior]: WarriorSpecs.ArmsWarrior, - [Spec.SpecFuryWarrior]: WarriorSpecs.FuryWarrior, + [Spec.SpecDPSWarrior]: WarriorSpecs.DPSWarrior, [Spec.SpecProtectionWarrior]: WarriorSpecs.ProtectionWarrior, }; diff --git a/ui/core/player_specs/mage.ts b/ui/core/player_specs/mage.ts index 8ddaeb2724..7d5f2f70ec 100644 --- a/ui/core/player_specs/mage.ts +++ b/ui/core/player_specs/mage.ts @@ -3,12 +3,12 @@ import { PlayerSpec } from '../player_spec'; import { Class, Spec } from '../proto/common'; import { getSpecSiteUrl } from '../proto_utils/utils'; -export class ArcaneMage extends PlayerSpec { +export class Mage extends PlayerSpec { static specIndex = 0; - static specID = Spec.SpecArcaneMage as Spec.SpecArcaneMage; + static specID = Spec.SpecMage as Spec.SpecMage; static classID = Class.ClassMage as Class.ClassMage; - static friendlyName = 'Arcane'; - static simLink = getSpecSiteUrl('mage', 'arcane'); + static friendlyName = 'Mage'; + static simLink = getSpecSiteUrl('mage', 'mage'); static isTankSpec = false; static isHealingSpec = false; @@ -17,96 +17,24 @@ export class ArcaneMage extends PlayerSpec { static canDualWield = false; - readonly specIndex = ArcaneMage.specIndex; - readonly specID = ArcaneMage.specID; - readonly classID = ArcaneMage.classID; - readonly friendlyName = ArcaneMage.friendlyName; - readonly simLink = ArcaneMage.simLink; + readonly specIndex = Mage.specIndex; + readonly specID = Mage.specID; + readonly classID = Mage.classID; + readonly friendlyName = Mage.friendlyName; + readonly simLink = Mage.simLink; - readonly isTankSpec = ArcaneMage.isTankSpec; - readonly isHealingSpec = ArcaneMage.isHealingSpec; - readonly isRangedDpsSpec = ArcaneMage.isRangedDpsSpec; - readonly isMeleeDpsSpec = ArcaneMage.isMeleeDpsSpec; + readonly isTankSpec = Mage.isTankSpec; + readonly isHealingSpec = Mage.isHealingSpec; + readonly isRangedDpsSpec = Mage.isRangedDpsSpec; + readonly isMeleeDpsSpec = Mage.isMeleeDpsSpec; - readonly canDualWield = ArcaneMage.canDualWield; + readonly canDualWield = Mage.canDualWield; static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/spell_holy_magicalsentry.jpg`; + return `https://wow.zamimg.com/images/wow/icons/${size}/class_mage.jpg`; }; getIcon = (size: IconSize): string => { - return ArcaneMage.getIcon(size); - }; -} - -export class FireMage extends PlayerSpec { - static specIndex = 1; - static specID = Spec.SpecFireMage as Spec.SpecFireMage; - static classID = Class.ClassMage as Class.ClassMage; - static friendlyName = 'Fire'; - static simLink = getSpecSiteUrl('mage', 'fire'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = true; - static isMeleeDpsSpec = false; - - static canDualWield = false; - - readonly specIndex = FireMage.specIndex; - readonly specID = FireMage.specID; - readonly classID = FireMage.classID; - readonly friendlyName = FireMage.friendlyName; - readonly simLink = FireMage.simLink; - - readonly isTankSpec = FireMage.isTankSpec; - readonly isHealingSpec = FireMage.isHealingSpec; - readonly isRangedDpsSpec = FireMage.isRangedDpsSpec; - readonly isMeleeDpsSpec = FireMage.isMeleeDpsSpec; - - readonly canDualWield = FireMage.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/spell_fire_firebolt02.jpg`; - }; - - getIcon = (size: IconSize): string => { - return FireMage.getIcon(size); - }; -} - -export class FrostMage extends PlayerSpec { - static specIndex = 2; - static specID = Spec.SpecFrostMage as Spec.SpecFrostMage; - static classID = Class.ClassMage as Class.ClassMage; - static friendlyName = 'Frost'; - static simLink = getSpecSiteUrl('mage', 'frost'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = true; - static isMeleeDpsSpec = false; - - static canDualWield = false; - - readonly specIndex = FrostMage.specIndex; - readonly specID = FrostMage.specID; - readonly classID = FrostMage.classID; - readonly friendlyName = FrostMage.friendlyName; - readonly simLink = FrostMage.simLink; - - readonly isTankSpec = FrostMage.isTankSpec; - readonly isHealingSpec = FrostMage.isHealingSpec; - readonly isRangedDpsSpec = FrostMage.isRangedDpsSpec; - readonly isMeleeDpsSpec = FrostMage.isMeleeDpsSpec; - - readonly canDualWield = FrostMage.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/spell_frost_frostbolt02.jpg`; - }; - - getIcon = (size: IconSize): string => { - return FrostMage.getIcon(size); + return Mage.getIcon(size); }; } diff --git a/ui/core/player_specs/rogue.ts b/ui/core/player_specs/rogue.ts index 35ad2eba47..662d55480b 100644 --- a/ui/core/player_specs/rogue.ts +++ b/ui/core/player_specs/rogue.ts @@ -3,12 +3,12 @@ import { PlayerSpec } from '../player_spec'; import { Class, Spec } from '../proto/common'; import { getSpecSiteUrl } from '../proto_utils/utils'; -export class AssassinationRogue extends PlayerSpec { +export class Rogue extends PlayerSpec { static specIndex = 0; - static specID = Spec.SpecAssassinationRogue as Spec.SpecAssassinationRogue; + static specID = Spec.SpecRogue as Spec.SpecRogue; static classID = Class.ClassRogue as Class.ClassRogue; - static friendlyName = 'Assassination'; - static simLink = getSpecSiteUrl('rogue', 'assassination'); + static friendlyName = 'Rogue'; + static simLink = getSpecSiteUrl('rogue', 'rogue'); static isTankSpec = false; static isHealingSpec = false; @@ -17,96 +17,24 @@ export class AssassinationRogue extends PlayerSpec static canDualWield = true; - readonly specIndex = AssassinationRogue.specIndex; - readonly specID = AssassinationRogue.specID; - readonly classID = AssassinationRogue.classID; - readonly friendlyName = AssassinationRogue.friendlyName; - readonly simLink = AssassinationRogue.simLink; + readonly specIndex = Rogue.specIndex; + readonly specID = Rogue.specID; + readonly classID = Rogue.classID; + readonly friendlyName = Rogue.friendlyName; + readonly simLink = Rogue.simLink; - readonly isTankSpec = AssassinationRogue.isTankSpec; - readonly isHealingSpec = AssassinationRogue.isHealingSpec; - readonly isRangedDpsSpec = AssassinationRogue.isRangedDpsSpec; - readonly isMeleeDpsSpec = AssassinationRogue.isMeleeDpsSpec; + readonly isTankSpec = Rogue.isTankSpec; + readonly isHealingSpec = Rogue.isHealingSpec; + readonly isRangedDpsSpec = Rogue.isRangedDpsSpec; + readonly isMeleeDpsSpec = Rogue.isMeleeDpsSpec; - readonly canDualWield = AssassinationRogue.canDualWield; + readonly canDualWield = Rogue.canDualWield; static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_rogue_eviscerate.jpg`; + return `https://wow.zamimg.com/images/wow/icons/${size}/class_rogue.jpg`; }; getIcon = (size: IconSize): string => { - return AssassinationRogue.getIcon(size); - }; -} - -export class CombatRogue extends PlayerSpec { - static specIndex = 1; - static specID = Spec.SpecCombatRogue as Spec.SpecCombatRogue; - static classID = Class.ClassRogue as Class.ClassRogue; - static friendlyName = 'Combat'; - static simLink = getSpecSiteUrl('rogue', 'combat'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = false; - static isMeleeDpsSpec = true; - - static canDualWield = true; - - readonly specIndex = CombatRogue.specIndex; - readonly specID = CombatRogue.specID; - readonly classID = CombatRogue.classID; - readonly friendlyName = CombatRogue.friendlyName; - readonly simLink = CombatRogue.simLink; - - readonly isTankSpec = CombatRogue.isTankSpec; - readonly isHealingSpec = CombatRogue.isHealingSpec; - readonly isRangedDpsSpec = CombatRogue.isRangedDpsSpec; - readonly isMeleeDpsSpec = CombatRogue.isMeleeDpsSpec; - - readonly canDualWield = CombatRogue.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_backstab.jpg`; - }; - - getIcon = (size: IconSize): string => { - return CombatRogue.getIcon(size); - }; -} - -export class SubtletyRogue extends PlayerSpec { - static specIndex = 2; - static specID = Spec.SpecSubtletyRogue as Spec.SpecSubtletyRogue; - static classID = Class.ClassRogue as Class.ClassRogue; - static friendlyName = 'Subtlety'; - static simLink = getSpecSiteUrl('rogue', 'subtlety'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = false; - static isMeleeDpsSpec = true; - - static canDualWield = true; - - readonly specIndex = SubtletyRogue.specIndex; - readonly specID = SubtletyRogue.specID; - readonly classID = SubtletyRogue.classID; - readonly friendlyName = SubtletyRogue.friendlyName; - readonly simLink = SubtletyRogue.simLink; - - readonly isTankSpec = SubtletyRogue.isTankSpec; - readonly isHealingSpec = SubtletyRogue.isHealingSpec; - readonly isRangedDpsSpec = SubtletyRogue.isRangedDpsSpec; - readonly isMeleeDpsSpec = SubtletyRogue.isMeleeDpsSpec; - - readonly canDualWield = SubtletyRogue.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_stealth.jpg`; - }; - - getIcon = (size: IconSize): string => { - return SubtletyRogue.getIcon(size); + return Rogue.getIcon(size); }; } diff --git a/ui/core/player_specs/warlock.ts b/ui/core/player_specs/warlock.ts index c085d80587..3ebd76f1da 100644 --- a/ui/core/player_specs/warlock.ts +++ b/ui/core/player_specs/warlock.ts @@ -3,12 +3,12 @@ import { PlayerSpec } from '../player_spec'; import { Class, Spec } from '../proto/common'; import { getSpecSiteUrl } from '../proto_utils/utils'; -export class AfflictionWarlock extends PlayerSpec { +export class Warlock extends PlayerSpec { static specIndex = 0; - static specID = Spec.SpecAfflictionWarlock as Spec.SpecAfflictionWarlock; + static specID = Spec.SpecWarlock as Spec.SpecWarlock; static classID = Class.ClassWarlock as Class.ClassWarlock; - static friendlyName = 'Affliction'; - static simLink = getSpecSiteUrl('warlock', 'affliction'); + static friendlyName = 'Warlock'; + static simLink = getSpecSiteUrl('warlock', 'warlock'); static isTankSpec = false; static isHealingSpec = false; @@ -17,96 +17,24 @@ export class AfflictionWarlock extends PlayerSpec { static canDualWield = false; - readonly specIndex = AfflictionWarlock.specIndex; - readonly specID = AfflictionWarlock.specID; - readonly classID = AfflictionWarlock.classID; - readonly friendlyName = AfflictionWarlock.friendlyName; - readonly simLink = AfflictionWarlock.simLink; + readonly specIndex = Warlock.specIndex; + readonly specID = Warlock.specID; + readonly classID = Warlock.classID; + readonly friendlyName = Warlock.friendlyName; + readonly simLink = Warlock.simLink; - readonly isTankSpec = AfflictionWarlock.isTankSpec; - readonly isHealingSpec = AfflictionWarlock.isHealingSpec; - readonly isRangedDpsSpec = AfflictionWarlock.isRangedDpsSpec; - readonly isMeleeDpsSpec = AfflictionWarlock.isMeleeDpsSpec; + readonly isTankSpec = Warlock.isTankSpec; + readonly isHealingSpec = Warlock.isHealingSpec; + readonly isRangedDpsSpec = Warlock.isRangedDpsSpec; + readonly isMeleeDpsSpec = Warlock.isMeleeDpsSpec; - readonly canDualWield = AfflictionWarlock.canDualWield; + readonly canDualWield = Warlock.canDualWield; static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/spell_shadow_deathcoil.jpg`; + return `https://wow.zamimg.com/images/wow/icons/${size}/class_warlock.jpg`; }; getIcon = (size: IconSize): string => { - return AfflictionWarlock.getIcon(size); - }; -} - -export class DemonologyWarlock extends PlayerSpec { - static specIndex = 1; - static specID = Spec.SpecDemonologyWarlock as Spec.SpecDemonologyWarlock; - static classID = Class.ClassWarlock as Class.ClassWarlock; - static friendlyName = 'Demonology'; - static simLink = getSpecSiteUrl('warlock', 'demonology'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = true; - static isMeleeDpsSpec = false; - - static canDualWield = false; - - readonly specIndex = DemonologyWarlock.specIndex; - readonly specID = DemonologyWarlock.specID; - readonly classID = DemonologyWarlock.classID; - readonly friendlyName = DemonologyWarlock.friendlyName; - readonly simLink = DemonologyWarlock.simLink; - - readonly isTankSpec = DemonologyWarlock.isTankSpec; - readonly isHealingSpec = DemonologyWarlock.isHealingSpec; - readonly isRangedDpsSpec = DemonologyWarlock.isRangedDpsSpec; - readonly isMeleeDpsSpec = DemonologyWarlock.isMeleeDpsSpec; - - readonly canDualWield = DemonologyWarlock.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/spell_shadow_metamorphosis.jpg`; - }; - - getIcon = (size: IconSize): string => { - return DemonologyWarlock.getIcon(size); - }; -} - -export class DestructionWarlock extends PlayerSpec { - static specIndex = 2; - static specID = Spec.SpecDestructionWarlock as Spec.SpecDestructionWarlock; - static classID = Class.ClassWarlock as Class.ClassWarlock; - static friendlyName = 'Destruction'; - static simLink = getSpecSiteUrl('warlock', 'destruction'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = true; - static isMeleeDpsSpec = false; - - static canDualWield = false; - - readonly specIndex = DestructionWarlock.specIndex; - readonly specID = DestructionWarlock.specID; - readonly classID = DestructionWarlock.classID; - readonly friendlyName = DestructionWarlock.friendlyName; - readonly simLink = DestructionWarlock.simLink; - - readonly isTankSpec = DestructionWarlock.isTankSpec; - readonly isHealingSpec = DestructionWarlock.isHealingSpec; - readonly isRangedDpsSpec = DestructionWarlock.isRangedDpsSpec; - readonly isMeleeDpsSpec = DestructionWarlock.isMeleeDpsSpec; - - readonly canDualWield = DestructionWarlock.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/spell_shadow_rainoffire.jpg`; - }; - - getIcon = (size: IconSize): string => { - return DestructionWarlock.getIcon(size); + return Warlock.getIcon(size); }; } diff --git a/ui/core/player_specs/warrior.ts b/ui/core/player_specs/warrior.ts index 2a15977145..b5aae8c882 100644 --- a/ui/core/player_specs/warrior.ts +++ b/ui/core/player_specs/warrior.ts @@ -3,12 +3,12 @@ import { PlayerSpec } from '../player_spec'; import { Class, Spec } from '../proto/common'; import { getSpecSiteUrl } from '../proto_utils/utils'; -export class ArmsWarrior extends PlayerSpec { +export class DPSWarrior extends PlayerSpec { static specIndex = 0; - static specID = Spec.SpecArmsWarrior as Spec.SpecArmsWarrior; + static specID = Spec.SpecDPSWarrior as Spec.SpecDPSWarrior; static classID = Class.ClassWarrior as Class.ClassWarrior; - static friendlyName = 'Arms'; - static simLink = getSpecSiteUrl('warrior', 'arms'); + static friendlyName = 'DPS Warrior'; + static simLink = getSpecSiteUrl('warrior', 'dpswarrior'); static isTankSpec = false; static isHealingSpec = false; @@ -17,61 +17,25 @@ export class ArmsWarrior extends PlayerSpec { static canDualWield = true; - readonly specIndex = ArmsWarrior.specIndex; - readonly specID = ArmsWarrior.specID; - readonly classID = ArmsWarrior.classID; - readonly friendlyName = ArmsWarrior.friendlyName; - readonly simLink = ArmsWarrior.simLink; + readonly specIndex = DPSWarrior.specIndex; + readonly specID = DPSWarrior.specID; + readonly classID = DPSWarrior.classID; + readonly friendlyName = DPSWarrior.friendlyName; + readonly simLink = DPSWarrior.simLink; - readonly isTankSpec = ArmsWarrior.isTankSpec; - readonly isHealingSpec = ArmsWarrior.isHealingSpec; - readonly isRangedDpsSpec = ArmsWarrior.isRangedDpsSpec; - readonly isMeleeDpsSpec = ArmsWarrior.isMeleeDpsSpec; + readonly isTankSpec = DPSWarrior.isTankSpec; + readonly isHealingSpec = DPSWarrior.isHealingSpec; + readonly isRangedDpsSpec = DPSWarrior.isRangedDpsSpec; + readonly isMeleeDpsSpec = DPSWarrior.isMeleeDpsSpec; - readonly canDualWield = ArmsWarrior.canDualWield; + readonly canDualWield = DPSWarrior.canDualWield; static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_warrior_savageblow.jpg`; + return `https://wow.zamimg.com/images/wow/icons/${size}/spell_nature_bloodlust.jpg`; }; getIcon = (size: IconSize): string => { - return ArmsWarrior.getIcon(size); - }; -} - -export class FuryWarrior extends PlayerSpec { - static specIndex = 1; - static specID = Spec.SpecFuryWarrior as Spec.SpecFuryWarrior; - static classID = Class.ClassWarrior as Class.ClassWarrior; - static friendlyName = 'Fury'; - static simLink = getSpecSiteUrl('warrior', 'fury'); - - static isTankSpec = false; - static isHealingSpec = false; - static isRangedDpsSpec = false; - static isMeleeDpsSpec = true; - - static canDualWield = true; - - readonly specIndex = FuryWarrior.specIndex; - readonly specID = FuryWarrior.specID; - readonly classID = FuryWarrior.classID; - readonly friendlyName = FuryWarrior.friendlyName; - readonly simLink = FuryWarrior.simLink; - - readonly isTankSpec = FuryWarrior.isTankSpec; - readonly isHealingSpec = FuryWarrior.isHealingSpec; - readonly isRangedDpsSpec = FuryWarrior.isRangedDpsSpec; - readonly isMeleeDpsSpec = FuryWarrior.isMeleeDpsSpec; - - readonly canDualWield = FuryWarrior.canDualWield; - - static getIcon = (size: IconSize): string => { - return `https://wow.zamimg.com/images/wow/icons/${size}/ability_warrior_innerrage.jpg`; - }; - - getIcon = (size: IconSize): string => { - return FuryWarrior.getIcon(size); + return DPSWarrior.getIcon(size); }; } diff --git a/ui/druid/balance/presets.ts b/ui/druid/balance/presets.ts index f8ad290d7a..7d2603d135 100644 --- a/ui/druid/balance/presets.ts +++ b/ui/druid/balance/presets.ts @@ -25,10 +25,6 @@ export const StandardEPWeights = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 1, [Stat.StatSpirit]: 0.88, [Stat.StatSpellPower]: 0.80, - [Stat.StatHitRating]: 0.88, - [Stat.StatCritRating]: 0.54, - [Stat.StatHasteRating]: 0.55, - [Stat.StatMasteryRating]: 0.46, }), ); @@ -56,12 +52,6 @@ export const DefaultConsumables = ConsumesSpec.create({ export const DefaultRaidBuffs = RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - markOfTheWild: true, // stats - darkIntent: true, // spell power - moonkinAura: true, // spell haste - leaderOfThePack: true, // crit % - blessingOfMight: true, // mastery - bloodlust: true, // major haste }); export const DefaultIndividualBuffs = IndividualBuffs.create({}); @@ -69,7 +59,7 @@ export const DefaultIndividualBuffs = IndividualBuffs.create({}); export const DefaultPartyBuffs = PartyBuffs.create({}); export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, // spell dmg taken + }); export const OtherDefaults = { diff --git a/ui/druid/balance/sim.ts b/ui/druid/balance/sim.ts index f4f9924f43..360743d8b7 100644 --- a/ui/druid/balance/sim.ts +++ b/ui/druid/balance/sim.ts @@ -21,7 +21,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecBalanceDruid, { knownIssues: [], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatIntellect, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. @@ -33,8 +33,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecBalanceDruid, { Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, ], [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), @@ -46,7 +44,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecBalanceDruid, { const talentsStats = Stats.fromProto(playerStats.talentsStats); const talentsDelta = talentsStats.subtract(gearStats); const talentsMod = new Stats().withStat( - Stat.StatHitRating, + Stat.StatSpellHitRating, talentsDelta.getPseudoStat(PseudoStat.PseudoStatSpellHitPercent) * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, ); @@ -60,10 +58,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecBalanceDruid, { gear: Presets.T14PresetGear.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.StandardEPWeights.epWeights, - // Default stat caps for the Reforge optimizer - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), // Default breakpoint limits - set 12T MF/SF with 4P breakpointLimits: (() => { return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHastePercent, Presets.BALANCE_T14_4P_BREAKPOINTS!.presets.get('12-tick MF/SF')!); @@ -130,7 +124,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecBalanceDruid, { otherDefaults: Presets.OtherDefaults, defaultFactionRaces: { [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, + [Faction.Alliance]: Race.RaceTauren, [Faction.Horde]: Race.RaceTroll, }, defaultGear: { diff --git a/ui/druid/guardian/apls/balerocMT.apl.json b/ui/druid/feralbear/apls/balerocMT.apl.json similarity index 100% rename from ui/druid/guardian/apls/balerocMT.apl.json rename to ui/druid/feralbear/apls/balerocMT.apl.json diff --git a/ui/druid/guardian/apls/balerocOT.apl.json b/ui/druid/feralbear/apls/balerocOT.apl.json similarity index 100% rename from ui/druid/guardian/apls/balerocOT.apl.json rename to ui/druid/feralbear/apls/balerocOT.apl.json diff --git a/ui/druid/guardian/apls/bethtilac.apl.json b/ui/druid/feralbear/apls/bethtilac.apl.json similarity index 100% rename from ui/druid/guardian/apls/bethtilac.apl.json rename to ui/druid/feralbear/apls/bethtilac.apl.json diff --git a/ui/druid/guardian/apls/blackhorn.apl.json b/ui/druid/feralbear/apls/blackhorn.apl.json similarity index 100% rename from ui/druid/guardian/apls/blackhorn.apl.json rename to ui/druid/feralbear/apls/blackhorn.apl.json diff --git a/ui/druid/guardian/apls/cleave.apl.json b/ui/druid/feralbear/apls/cleave.apl.json similarity index 100% rename from ui/druid/guardian/apls/cleave.apl.json rename to ui/druid/feralbear/apls/cleave.apl.json diff --git a/ui/druid/guardian/apls/default.apl.json b/ui/druid/feralbear/apls/default.apl.json similarity index 100% rename from ui/druid/guardian/apls/default.apl.json rename to ui/druid/feralbear/apls/default.apl.json diff --git a/ui/druid/guardian/apls/empress.apl.json b/ui/druid/feralbear/apls/empress.apl.json similarity index 100% rename from ui/druid/guardian/apls/empress.apl.json rename to ui/druid/feralbear/apls/empress.apl.json diff --git a/ui/druid/guardian/apls/horridon.apl.json b/ui/druid/feralbear/apls/horridon.apl.json similarity index 100% rename from ui/druid/guardian/apls/horridon.apl.json rename to ui/druid/feralbear/apls/horridon.apl.json diff --git a/ui/druid/guardian/apls/nef.apl.json b/ui/druid/feralbear/apls/nef.apl.json similarity index 100% rename from ui/druid/guardian/apls/nef.apl.json rename to ui/druid/feralbear/apls/nef.apl.json diff --git a/ui/druid/guardian/apls/offensiveHotw.apl.json b/ui/druid/feralbear/apls/offensiveHotw.apl.json similarity index 100% rename from ui/druid/guardian/apls/offensiveHotw.apl.json rename to ui/druid/feralbear/apls/offensiveHotw.apl.json diff --git a/ui/druid/guardian/apls/sha.apl.json b/ui/druid/feralbear/apls/sha.apl.json similarity index 100% rename from ui/druid/guardian/apls/sha.apl.json rename to ui/druid/feralbear/apls/sha.apl.json diff --git a/ui/druid/guardian/gear_sets/hof.gear.json b/ui/druid/feralbear/gear_sets/hof.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/hof.gear.json rename to ui/druid/feralbear/gear_sets/hof.gear.json diff --git a/ui/druid/guardian/gear_sets/msv.gear.json b/ui/druid/feralbear/gear_sets/msv.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/msv.gear.json rename to ui/druid/feralbear/gear_sets/msv.gear.json diff --git a/ui/druid/guardian/gear_sets/p1.gear.json b/ui/druid/feralbear/gear_sets/p1.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/p1.gear.json rename to ui/druid/feralbear/gear_sets/p1.gear.json diff --git a/ui/druid/guardian/gear_sets/p2.gear.json b/ui/druid/feralbear/gear_sets/p2.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/p2.gear.json rename to ui/druid/feralbear/gear_sets/p2.gear.json diff --git a/ui/druid/guardian/gear_sets/p2_item_swap.gear.json b/ui/druid/feralbear/gear_sets/p2_item_swap.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/p2_item_swap.gear.json rename to ui/druid/feralbear/gear_sets/p2_item_swap.gear.json diff --git a/ui/druid/guardian/gear_sets/p2_offensive.gear.json b/ui/druid/feralbear/gear_sets/p2_offensive.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/p2_offensive.gear.json rename to ui/druid/feralbear/gear_sets/p2_offensive.gear.json diff --git a/ui/druid/guardian/gear_sets/p3.gear.json b/ui/druid/feralbear/gear_sets/p3.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/p3.gear.json rename to ui/druid/feralbear/gear_sets/p3.gear.json diff --git a/ui/druid/guardian/gear_sets/p4.gear.json b/ui/druid/feralbear/gear_sets/p4.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/p4.gear.json rename to ui/druid/feralbear/gear_sets/p4.gear.json diff --git a/ui/druid/guardian/gear_sets/preraid.gear.json b/ui/druid/feralbear/gear_sets/preraid.gear.json similarity index 100% rename from ui/druid/guardian/gear_sets/preraid.gear.json rename to ui/druid/feralbear/gear_sets/preraid.gear.json diff --git a/ui/druid/guardian/index.ts b/ui/druid/feralbear/index.ts similarity index 64% rename from ui/druid/guardian/index.ts rename to ui/druid/feralbear/index.ts index bb7a618eca..43998d6a0e 100644 --- a/ui/druid/guardian/index.ts +++ b/ui/druid/feralbear/index.ts @@ -3,12 +3,12 @@ import { PlayerSpecs } from '../../core/player_specs'; import { Spec } from '../../core/proto/common'; import { Sim } from '../../core/sim'; import { TypedEvent } from '../../core/typed_event'; -import { GuardianDruidSimUI } from './sim'; +import { FeralBearDruidSimUI } from './sim'; const sim = new Sim(); -const player = new Player(PlayerSpecs.GuardianDruid, sim); +const player = new Player(PlayerSpecs.FeralBearDruid, sim); player.enableHealing(); sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); -const simUI = new GuardianDruidSimUI(document.body, player); +const simUI = new FeralBearDruidSimUI(document.body, player); diff --git a/ui/druid/guardian/inputs.ts b/ui/druid/feralbear/inputs.ts similarity index 82% rename from ui/druid/guardian/inputs.ts rename to ui/druid/feralbear/inputs.ts index 6ab8a0b648..1b7d2b34b3 100644 --- a/ui/druid/guardian/inputs.ts +++ b/ui/druid/feralbear/inputs.ts @@ -5,7 +5,7 @@ import i18n from '../../i18n/config.js'; // Configuration for spec-specific UI elements on the settings tab. // These don't need to be in a separate file but it keeps things cleaner. -export const SymbiosisSelection = InputHelpers.makeSpecOptionsEnumInput>({ +export const SymbiosisSelection = InputHelpers.makeSpecOptionsEnumInput>({ fieldName: 'symbiosisTarget', label: 'Symbiosis Target', labelTooltip: 'Class from which to receive a Symbiosis spell', @@ -15,23 +15,23 @@ export const SymbiosisSelection = InputHelpers.makeSpecOptionsEnumInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'maintainFaerieFire', label: i18n.t('rotation_tab.options.druid.guardian.maintain_faerie_fire.label'), labelTooltip: i18n.t('rotation_tab.options.druid.guardian.maintain_faerie_fire.tooltip'), }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'maintainDemoralizingRoar', label: i18n.t('rotation_tab.options.druid.guardian.maintain_demo_roar.label'), labelTooltip: i18n.t('rotation_tab.options.druid.guardian.maintain_demo_roar.tooltip'), }), - InputHelpers.makeRotationNumberInput({ + InputHelpers.makeRotationNumberInput({ fieldName: 'demoTime', label: i18n.t('rotation_tab.options.druid.guardian.demo_roar_refresh_leeway.label'), labelTooltip: i18n.t('rotation_tab.options.druid.guardian.demo_roar_refresh_leeway.tooltip'), - showWhen: (player: Player) => player.getSimpleRotation().maintainDemoralizingRoar, + showWhen: (player: Player) => player.getSimpleRotation().maintainDemoralizingRoar, }), - InputHelpers.makeRotationNumberInput({ + InputHelpers.makeRotationNumberInput({ fieldName: 'pulverizeTime', label: i18n.t('rotation_tab.options.druid.guardian.pulverize_refresh_leeway.label'), labelTooltip: i18n.t('rotation_tab.options.druid.guardian.pulverize_refresh_leeway.tooltip'), diff --git a/ui/druid/guardian/presets.ts b/ui/druid/feralbear/presets.ts similarity index 82% rename from ui/druid/guardian/presets.ts rename to ui/druid/feralbear/presets.ts index f31a6d8f59..9ba0124adb 100644 --- a/ui/druid/guardian/presets.ts +++ b/ui/druid/feralbear/presets.ts @@ -1,7 +1,7 @@ import * as Mechanics from '../../core/constants/mechanics.js'; import * as PresetUtils from '../../core/preset_utils.js'; import { ConsumesSpec, Profession, PseudoStat, Stat } from '../../core/proto/common'; -import { GuardianDruid_Options as DruidOptions, GuardianDruid_Rotation as DruidRotation } from '../../core/proto/druid.js'; +import { FeralBearDruid_Options as DruidOptions, FeralBearDruid_Rotation as DruidRotation } from '../../core/proto/druid.js'; import { SavedTalents } from '../../core/proto/ui.js'; // Preset options for this spec. // Eventually we will import these values for the raid sim too, so its good to @@ -57,18 +57,12 @@ export const SURVIVAL_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatAgility]: 1.0, [Stat.StatArmor]: 4.81, [Stat.StatBonusArmor]: 1.10, - [Stat.StatDodgeRating]: 0.76, - [Stat.StatMasteryRating]: 2.20, [Stat.StatStrength]: 0.02, [Stat.StatAttackPower]: 0.02, - [Stat.StatHitRating]: 1.07, - [Stat.StatExpertiseRating]: 1.06, - [Stat.StatCritRating]: 0.61, - [Stat.StatHasteRating]: 0.77, }, { [PseudoStat.PseudoStatMainHandDps]: 0.0, - [PseudoStat.PseudoStatPhysicalHitPercent]: 1.07 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, + [PseudoStat.PseudoStatMeleeHitPercent]: 1.07 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, [PseudoStat.PseudoStatSpellHitPercent]: 0.01 * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, }, ), @@ -83,18 +77,12 @@ export const BALANCED_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatAgility]: 1.0, [Stat.StatArmor]: 1.70, [Stat.StatBonusArmor]: 0.39, - [Stat.StatDodgeRating]: 0.28, - [Stat.StatMasteryRating]: 0.78, [Stat.StatStrength]: 0.18, [Stat.StatAttackPower]: 0.18, - [Stat.StatHitRating]: 1.50, - [Stat.StatExpertiseRating]: 1.50, - [Stat.StatCritRating]: 1.07, - [Stat.StatHasteRating]: 0.60, }, { [PseudoStat.PseudoStatMainHandDps]: 0.84, - [PseudoStat.PseudoStatPhysicalHitPercent]: 1.50 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, + [PseudoStat.PseudoStatMeleeHitPercent]: 1.50 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, [PseudoStat.PseudoStatSpellHitPercent]: 0.0 * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, }, ), @@ -109,18 +97,12 @@ export const OFFENSIVE_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatAgility]: 1.0, [Stat.StatArmor]: 0.76, [Stat.StatBonusArmor]: 0.17, - [Stat.StatDodgeRating]: 0.13, - [Stat.StatMasteryRating]: 0.35, [Stat.StatStrength]: 0.23, [Stat.StatAttackPower]: 0.22, - [Stat.StatHitRating]: 1.64, - [Stat.StatExpertiseRating]: 1.64, - [Stat.StatCritRating]: 1.21, - [Stat.StatHasteRating]: 0.54, }, { [PseudoStat.PseudoStatMainHandDps]: 1.09, - [PseudoStat.PseudoStatPhysicalHitPercent]: 1.64 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, + [PseudoStat.PseudoStatMeleeHitPercent]: 1.64 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, [PseudoStat.PseudoStatSpellHitPercent]: 0.0 * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, }, ), diff --git a/ui/druid/guardian/sim.ts b/ui/druid/feralbear/sim.ts similarity index 87% rename from ui/druid/guardian/sim.ts rename to ui/druid/feralbear/sim.ts index 8eea1af136..9272607f2e 100644 --- a/ui/druid/guardian/sim.ts +++ b/ui/druid/feralbear/sim.ts @@ -7,16 +7,14 @@ import { Player } from '../../core/player.js'; import { PlayerClasses } from '../../core/player_classes'; import { APLAction, APLListItem, APLPrepullAction, APLRotation, APLRotation_Type as APLRotationType, SimpleRotation } from '../../core/proto/apl.js'; import { Cooldowns, Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common.js'; -import { GuardianDruid_Rotation as DruidRotation } from '../../core/proto/druid.js'; -import { StatCapType } from '../../core/proto/ui'; import * as AplUtils from '../../core/proto_utils/apl_utils.js'; import { StatCap, Stats, UnitStat } from '../../core/proto_utils/stats.js'; import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; import * as DruidInputs from './inputs.js'; import * as Presets from './presets.js'; -const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { - cssClass: 'guardian-druid-sim-ui', +const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralBearDruid, { + cssClass: 'feral-bear-druid-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Druid), // Override required talent rows - Guardian only requires rows 1, 3, and 5 instead of all rows requiredTalentRows: [1, 3, 5], @@ -31,16 +29,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { Stat.StatAgility, Stat.StatArmor, Stat.StatBonusArmor, - Stat.StatDodgeRating, - Stat.StatMasteryRating, Stat.StatStrength, - Stat.StatAttackPower, - Stat.StatHitRating, - Stat.StatExpertiseRating, - Stat.StatCritRating, - Stat.StatHasteRating, + Stat.StatAttackPower ], - epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatSpellHitPercent], + epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatSpellHitPercent], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatAgility, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. @@ -51,15 +43,13 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { Stat.StatAgility, Stat.StatArmor, Stat.StatBonusArmor, - Stat.StatMasteryRating, Stat.StatStrength, Stat.StatAttackPower, - Stat.StatExpertiseRating, ], [ PseudoStat.PseudoStatDodgePercent, - PseudoStat.PseudoStatPhysicalHitPercent, - PseudoStat.PseudoStatPhysicalCritPercent, + PseudoStat.PseudoStatMeleeHitPercent, + PseudoStat.PseudoStatMeleeCritPercent, PseudoStat.PseudoStatMeleeHastePercent, PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, @@ -71,13 +61,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { gear: Presets.PRERAID_PRESET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.BALANCED_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - return new Stats() - .withStat(Stat.StatExpertiseRating, 15 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION) - .withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5) - .withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, @@ -91,19 +74,15 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - trueshotAura: true, - unholyAura: true, - leaderOfThePack: true, - graceOfAir: true, - markOfTheWild: true, - powerWordFortitude: true, - bloodlust: true, }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), + partyBuffs: PartyBuffs.create({ + + }), + individualBuffs: IndividualBuffs.create({ + + }), debuffs: Debuffs.create({ - physicalVulnerability: true, - lightningBreath: true, + }), }, @@ -147,7 +126,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { builds: [], }, - autoRotation: (_player: Player): APLRotation => { + autoRotation: (_player: Player): APLRotation => { return Presets.ROTATION_DEFAULT.rotation.rotation!; }, @@ -229,7 +208,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { raidSimPresets: [ { - spec: Spec.SpecGuardianDruid, + spec: Spec.SpecFeralBearDruid, talents: Presets.DefaultTalents.data, specOptions: Presets.DefaultOptions, consumables: Presets.DefaultConsumables, @@ -258,10 +237,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecGuardianDruid, { ], }); -export class GuardianDruidSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { +export class FeralBearDruidSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this); } } diff --git a/ui/druid/feral/apls/aoe.apl.json b/ui/druid/feralcat/apls/aoe.apl.json similarity index 100% rename from ui/druid/feral/apls/aoe.apl.json rename to ui/druid/feralcat/apls/aoe.apl.json diff --git a/ui/druid/feral/apls/custom_apl_example.apl.json b/ui/druid/feralcat/apls/custom_apl_example.apl.json similarity index 100% rename from ui/druid/feral/apls/custom_apl_example.apl.json rename to ui/druid/feralcat/apls/custom_apl_example.apl.json diff --git a/ui/druid/feral/apls/default.apl.json b/ui/druid/feralcat/apls/default.apl.json similarity index 100% rename from ui/druid/feral/apls/default.apl.json rename to ui/druid/feralcat/apls/default.apl.json diff --git a/ui/druid/feral/apls/monocat.apl.json b/ui/druid/feralcat/apls/monocat.apl.json similarity index 100% rename from ui/druid/feral/apls/monocat.apl.json rename to ui/druid/feralcat/apls/monocat.apl.json diff --git a/ui/druid/feral/apls/tendon.apl.json b/ui/druid/feralcat/apls/tendon.apl.json similarity index 100% rename from ui/druid/feral/apls/tendon.apl.json rename to ui/druid/feralcat/apls/tendon.apl.json diff --git a/ui/druid/feral/builds/single_target.build.json b/ui/druid/feralcat/builds/single_target.build.json similarity index 100% rename from ui/druid/feral/builds/single_target.build.json rename to ui/druid/feralcat/builds/single_target.build.json diff --git a/ui/druid/feral/builds/sustained_cleave.build.json b/ui/druid/feralcat/builds/sustained_cleave.build.json similarity index 100% rename from ui/druid/feral/builds/sustained_cleave.build.json rename to ui/druid/feralcat/builds/sustained_cleave.build.json diff --git a/ui/druid/feral/gear_sets/p1.gear.json b/ui/druid/feralcat/gear_sets/p1.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/p1.gear.json rename to ui/druid/feralcat/gear_sets/p1.gear.json diff --git a/ui/druid/feral/gear_sets/p1_item_swap.gear.json b/ui/druid/feralcat/gear_sets/p1_item_swap.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/p1_item_swap.gear.json rename to ui/druid/feralcat/gear_sets/p1_item_swap.gear.json diff --git a/ui/druid/feral/gear_sets/p2.gear.json b/ui/druid/feralcat/gear_sets/p2.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/p2.gear.json rename to ui/druid/feralcat/gear_sets/p2.gear.json diff --git a/ui/druid/feral/gear_sets/p3.gear.json b/ui/druid/feralcat/gear_sets/p3.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/p3.gear.json rename to ui/druid/feralcat/gear_sets/p3.gear.json diff --git a/ui/druid/feral/gear_sets/p4.gear.json b/ui/druid/feralcat/gear_sets/p4.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/p4.gear.json rename to ui/druid/feralcat/gear_sets/p4.gear.json diff --git a/ui/druid/feral/gear_sets/prehof.gear.json b/ui/druid/feralcat/gear_sets/prehof.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/prehof.gear.json rename to ui/druid/feralcat/gear_sets/prehof.gear.json diff --git a/ui/druid/feral/gear_sets/preraid.gear.json b/ui/druid/feralcat/gear_sets/preraid.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/preraid.gear.json rename to ui/druid/feralcat/gear_sets/preraid.gear.json diff --git a/ui/druid/feral/gear_sets/pretoes.gear.json b/ui/druid/feralcat/gear_sets/pretoes.gear.json similarity index 100% rename from ui/druid/feral/gear_sets/pretoes.gear.json rename to ui/druid/feralcat/gear_sets/pretoes.gear.json diff --git a/ui/mage/fire/index.ts b/ui/druid/feralcat/index.ts similarity index 64% rename from ui/mage/fire/index.ts rename to ui/druid/feralcat/index.ts index 0116d60210..6c20097c7e 100644 --- a/ui/mage/fire/index.ts +++ b/ui/druid/feralcat/index.ts @@ -3,10 +3,10 @@ import { PlayerSpecs } from '../../core/player_specs'; import { Spec } from '../../core/proto/common'; import { Sim } from '../../core/sim'; import { TypedEvent } from '../../core/typed_event'; -import { FireMageSimUI } from './sim'; +import { FeralCatDruidSimUI } from './sim'; const sim = new Sim(); -const player = new Player(PlayerSpecs.FireMage, sim); +const player = new Player(PlayerSpecs.FeralCatDruid, sim); sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); -new FireMageSimUI(document.body, player); +new FeralCatDruidSimUI(document.body, player); diff --git a/ui/druid/feral/inputs.ts b/ui/druid/feralcat/inputs.ts similarity index 67% rename from ui/druid/feral/inputs.ts rename to ui/druid/feralcat/inputs.ts index 20ddf37a54..8861c627ab 100644 --- a/ui/druid/feral/inputs.ts +++ b/ui/druid/feralcat/inputs.ts @@ -2,39 +2,39 @@ import * as InputHelpers from '../../core/components/input_helpers.js'; import { Player } from '../../core/player.js'; import { APLRotation_Type } from '../../core/proto/apl.js'; import { Spec } from '../../core/proto/common.js'; -import { FeralDruid_Rotation_AplType as AplType, FeralDruid_Rotation_HotwStrategy as HotwType } from '../../core/proto/druid.js'; +import { FeralCatDruid_Rotation_AplType as AplType, FeralCatDruid_Rotation_HotwStrategy as HotwType } from '../../core/proto/druid.js'; import { TypedEvent } from '../../core/typed_event.js'; import i18n from '../../i18n/config.js'; // Configuration for spec-specific UI elements on the settings tab. // These don't need to be in a separate file but it keeps things cleaner. -export const AssumeBleedActive = InputHelpers.makeSpecOptionsBooleanInput({ +export const AssumeBleedActive = InputHelpers.makeSpecOptionsBooleanInput({ fieldName: 'assumeBleedActive', label: i18n.t('settings_tab.other.assume_bleed_active.label'), labelTooltip: i18n.t('settings_tab.other.assume_bleed_active.tooltip'), extraCssClasses: ['within-raid-sim-hide'], }); -export const CannotShredTarget = InputHelpers.makeSpecOptionsBooleanInput({ +export const CannotShredTarget = InputHelpers.makeSpecOptionsBooleanInput({ fieldName: 'cannotShredTarget', label: i18n.t('settings_tab.other.cannot_shred_target.label'), labelTooltip: i18n.t('settings_tab.other.cannot_shred_target.tooltip'), }); -function ShouldShowAdvParamST(player: Player): boolean { +function ShouldShowAdvParamST(player: Player): boolean { const rot = player.getSimpleRotation(); return rot.manualParams && rot.rotationType == AplType.SingleTarget; } -function ShouldShowAdvParamAoe(player: Player): boolean { +function ShouldShowAdvParamAoe(player: Player): boolean { const rot = player.getSimpleRotation(); return rot.manualParams && rot.rotationType == AplType.Aoe; } export const FeralDruidRotationConfig = { inputs: [ - InputHelpers.makeRotationEnumInput({ + InputHelpers.makeRotationEnumInput({ fieldName: 'rotationType', label: i18n.t('rotation_tab.options.druid.feral.target_type.label'), values: [ @@ -42,25 +42,25 @@ export const FeralDruidRotationConfig = { { name: i18n.t('rotation_tab.options.druid.feral.target_type.aoe'), value: AplType.Aoe }, ], }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'bearWeave', label: i18n.t('rotation_tab.options.druid.feral.bear_weave.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.bear_weave.tooltip'), }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'snekWeave', label: i18n.t('rotation_tab.options.druid.feral.snek_weave.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.snek_weave.tooltip'), - showWhen: (player: Player) => player.getSimpleRotation().bearWeave, + showWhen: (player: Player) => player.getSimpleRotation().bearWeave, }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'useNs', label: i18n.t('rotation_tab.options.druid.feral.use_ns.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.use_ns.tooltip'), - showWhen: (player: Player) => player.getTalents().dreamOfCenarius, - changeEmitter: (player: Player) => TypedEvent.onAny([player.rotationChangeEmitter, player.talentsChangeEmitter]), + showWhen: (player: Player) => player.getTalents().dreamOfCenarius, + changeEmitter: (player: Player) => TypedEvent.onAny([player.rotationChangeEmitter, player.talentsChangeEmitter]), }), - InputHelpers.makeRotationEnumInput({ + InputHelpers.makeRotationEnumInput({ fieldName: 'hotwStrategy', label: i18n.t('rotation_tab.options.druid.feral.hotw_strategy.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.hotw_strategy.tooltip'), @@ -69,51 +69,51 @@ export const FeralDruidRotationConfig = { { name: i18n.t('rotation_tab.options.druid.feral.hotw_strategy.values.enhanced_bear_weaving'), value: HotwType.Bear }, { name: i18n.t('rotation_tab.options.druid.feral.hotw_strategy.values.wrath_weaving'), value: HotwType.Wrath }, ], - showWhen: (player: Player) => player.getTalents().heartOfTheWild, - changeEmitter: (player: Player) => TypedEvent.onAny([player.rotationChangeEmitter, player.talentsChangeEmitter]), + showWhen: (player: Player) => player.getTalents().heartOfTheWild, + changeEmitter: (player: Player) => TypedEvent.onAny([player.rotationChangeEmitter, player.talentsChangeEmitter]), }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'allowAoeBerserk', label: i18n.t('rotation_tab.options.druid.feral.allow_aoe_berserk.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.allow_aoe_berserk.tooltip'), - showWhen: (player: Player) => player.getSimpleRotation().rotationType == AplType.Aoe, + showWhen: (player: Player) => player.getSimpleRotation().rotationType == AplType.Aoe, }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'manualParams', label: i18n.t('rotation_tab.options.druid.feral.manual_params.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.manual_params.tooltip'), - showWhen: (player: Player) => player.getSimpleRotation().rotationType == AplType.SingleTarget, + showWhen: (player: Player) => player.getSimpleRotation().rotationType == AplType.SingleTarget, }), - InputHelpers.makeRotationNumberInput({ + InputHelpers.makeRotationNumberInput({ fieldName: 'minRoarOffset', label: i18n.t('rotation_tab.options.druid.feral.roar_offset.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.roar_offset.tooltip'), showWhen: ShouldShowAdvParamST, }), - InputHelpers.makeRotationNumberInput({ + InputHelpers.makeRotationNumberInput({ fieldName: 'ripLeeway', label: i18n.t('rotation_tab.options.druid.feral.rip_leeway.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.rip_leeway.tooltip'), showWhen: ShouldShowAdvParamST, }), - InputHelpers.makeRotationBooleanInput({ + InputHelpers.makeRotationBooleanInput({ fieldName: 'useBite', label: i18n.t('rotation_tab.options.druid.feral.bite_during_rotation.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.bite_during_rotation.tooltip'), showWhen: ShouldShowAdvParamST, }), - InputHelpers.makeRotationNumberInput({ + InputHelpers.makeRotationNumberInput({ fieldName: 'biteTime', label: i18n.t('rotation_tab.options.druid.feral.bite_time.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.bite_time.tooltip'), - showWhen: (player: Player) => + showWhen: (player: Player) => ShouldShowAdvParamST(player) && player.getSimpleRotation().useBite, }), - InputHelpers.makeRotationNumberInput({ + InputHelpers.makeRotationNumberInput({ fieldName: 'berserkBiteTime', label: i18n.t('rotation_tab.options.druid.feral.berserk_bite_time.label'), labelTooltip: i18n.t('rotation_tab.options.druid.feral.berserk_bite_time.tooltip'), - showWhen: (player: Player) => + showWhen: (player: Player) => ShouldShowAdvParamST(player) && player.getSimpleRotation().useBite, }), ], diff --git a/ui/druid/feral/presets.ts b/ui/druid/feralcat/presets.ts similarity index 78% rename from ui/druid/feral/presets.ts rename to ui/druid/feralcat/presets.ts index ba7bf825ba..b78c9cbb1e 100644 --- a/ui/druid/feral/presets.ts +++ b/ui/druid/feralcat/presets.ts @@ -1,10 +1,10 @@ import * as PresetUtils from '../../core/preset_utils'; import { ConsumesSpec, Profession, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; import { - FeralDruid_Options as FeralDruidOptions, - FeralDruid_Rotation as FeralDruidRotation, - FeralDruid_Rotation_AplType, - FeralDruid_Rotation_HotwStrategy, + FeralCatDruid_Options as FeralDruidOptions, + FeralCatDruid_Rotation as FeralDruidRotation, + FeralCatDruid_Rotation_AplType, + FeralCatDruid_Rotation_HotwStrategy, } from '../../core/proto/druid'; import { SavedTalents } from '../../core/proto/ui'; // Preset options for this spec. @@ -26,9 +26,9 @@ export const ITEM_SWAP_PRESET = PresetUtils.makePresetItemSwapGear('HotW Caster import DefaultApl from './apls/default.apl.json'; export const APL_ROTATION_DEFAULT = PresetUtils.makePresetAPLRotation('APL List View', DefaultApl); import SingleTargetBuild from './builds/single_target.build.json'; -export const PRESET_BUILD_ST = PresetUtils.makePresetBuildFromJSON("Single-Target Patchwerk", Spec.SpecFeralDruid, SingleTargetBuild); +export const PRESET_BUILD_ST = PresetUtils.makePresetBuildFromJSON("Single-Target Patchwerk", Spec.SpecFeralCatDruid, SingleTargetBuild); import SustainedCleaveBuild from './builds/sustained_cleave.build.json'; -export const PRESET_BUILD_CLEAVE = PresetUtils.makePresetBuildFromJSON("4-Target Cleave", Spec.SpecFeralDruid, SustainedCleaveBuild); +export const PRESET_BUILD_CLEAVE = PresetUtils.makePresetBuildFromJSON("4-Target Cleave", Spec.SpecFeralCatDruid, SustainedCleaveBuild); import { Stats } from '../../core/proto_utils/stats'; @@ -40,11 +40,6 @@ export const DOC_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatStrength]: 0.39, [Stat.StatAgility]: 1.0, [Stat.StatAttackPower]: 0.37, - [Stat.StatHitRating]: 0.45, - [Stat.StatExpertiseRating]: 0.45, - [Stat.StatCritRating]: 0.36, - [Stat.StatHasteRating]: 0.27, - [Stat.StatMasteryRating]: 0.42, }, { [PseudoStat.PseudoStatMainHandDps]: 0.73, @@ -59,11 +54,6 @@ export const DOC_RORO_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatStrength]: 0.39, [Stat.StatAgility]: 1.0, [Stat.StatAttackPower]: 0.37, - [Stat.StatHitRating]: 0.44, - [Stat.StatExpertiseRating]: 0.44, - [Stat.StatCritRating]: 0.49, - [Stat.StatHasteRating]: 0.42, - [Stat.StatMasteryRating]: 0.39, }, { [PseudoStat.PseudoStatMainHandDps]: 0.74, @@ -78,11 +68,6 @@ export const HOTW_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatStrength]: 0.34, [Stat.StatAgility]: 1.0, [Stat.StatAttackPower]: 0.32, - [Stat.StatHitRating]: 0.37, - [Stat.StatExpertiseRating]: 0.37, - [Stat.StatCritRating]: 0.36, - [Stat.StatHasteRating]: 0.25, - [Stat.StatMasteryRating]: 0.37, }, { [PseudoStat.PseudoStatMainHandDps]: 0.72, @@ -97,11 +82,6 @@ export const HOTW_RORO_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatStrength]: 0.34, [Stat.StatAgility]: 1.0, [Stat.StatAttackPower]: 0.32, - [Stat.StatHitRating]: 0.36, - [Stat.StatExpertiseRating]: 0.36, - [Stat.StatCritRating]: 0.54, - [Stat.StatHasteRating]: 0.35, - [Stat.StatMasteryRating]: 0.35, }, { [PseudoStat.PseudoStatMainHandDps]: 0.72, @@ -110,7 +90,7 @@ export const HOTW_RORO_PRESET = PresetUtils.makePresetEpWeights( ); export const DefaultRotation = FeralDruidRotation.create({ - rotationType: FeralDruid_Rotation_AplType.SingleTarget, + rotationType: FeralCatDruid_Rotation_AplType.SingleTarget, bearWeave: true, snekWeave: true, useNs: true, @@ -121,10 +101,10 @@ export const DefaultRotation = FeralDruidRotation.create({ useBite: true, biteTime: 6, berserkBiteTime: 5, - hotwStrategy: FeralDruid_Rotation_HotwStrategy.Wrath, + hotwStrategy: FeralCatDruid_Rotation_HotwStrategy.Wrath, }); -export const SIMPLE_ROTATION_DEFAULT = PresetUtils.makePresetSimpleRotation('Single Target Default', Spec.SpecFeralDruid, DefaultRotation); +export const SIMPLE_ROTATION_DEFAULT = PresetUtils.makePresetSimpleRotation('Single Target Default', Spec.SpecFeralCatDruid, DefaultRotation); //export const AoeRotation = FeralDruidRotation.create({ // rotationType: FeralDruid_Rotation_AplType.Aoe, @@ -170,5 +150,5 @@ export const OtherDefaults = { iterationCount: 25000, profession1: Profession.Engineering, profession2: Profession.ProfessionUnknown, - race: Race.RaceWorgen, + race: Race.RaceTauren, }; diff --git a/ui/druid/feral/sim.ts b/ui/druid/feralcat/sim.ts similarity index 83% rename from ui/druid/feral/sim.ts rename to ui/druid/feralcat/sim.ts index 02d9e77bf8..1747ccab4e 100644 --- a/ui/druid/feral/sim.ts +++ b/ui/druid/feralcat/sim.ts @@ -8,9 +8,9 @@ import { PlayerClasses } from '../../core/player_classes'; import { APLAction, APLListItem, APLPrepullAction, APLRotation, APLRotation_Type as APLRotationType } from '../../core/proto/apl'; import { Cooldowns, Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; import { - FeralDruid_Rotation as DruidRotation, - FeralDruid_Rotation_AplType as FeralRotationType, - FeralDruid_Rotation_HotwStrategy as HotwStrategy, + FeralCatDruid_Rotation as DruidRotation, + FeralCatDruid_Rotation_AplType as FeralRotationType, + FeralCatDruid_Rotation_HotwStrategy as HotwStrategy, } from '../../core/proto/druid'; import * as AplUtils from '../../core/proto_utils/apl_utils'; import { Stats, UnitStat } from '../../core/proto_utils/stats'; @@ -19,7 +19,7 @@ import { TypedEvent } from '../../core/typed_event'; import * as FeralInputs from './inputs'; import * as Presets from './presets'; -const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { +const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralCatDruid, { cssClass: 'feral-druid-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Druid), // Override required talent rows - Feral only requires rows 3 and 5 instead of all rows @@ -33,19 +33,14 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, - Stat.StatHitRating, - Stat.StatExpertiseRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, ], epPseudoStats: [PseudoStat.PseudoStatMainHandDps], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatAgility, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, Stat.StatExpertiseRating, Stat.StatMasteryRating, Stat.StatMana], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatMeleeHastePercent], + [Stat.StatHealth, Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, Stat.StatMana], + [PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatMeleeCritPercent, PseudoStat.PseudoStatMeleeHastePercent], ), defaults: { @@ -53,13 +48,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { gear: Presets.PRERAID_PRESET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.DOC_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - const hitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5); - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - - return hitCap.add(expCap); - })(), other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, @@ -73,20 +61,15 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - markOfTheWild: true, - trueshotAura: true, - unholyAura: true, - graceOfAir: true, - bloodlust: true, - arcaneBrilliance: true, - moonkinAura: true, }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), + partyBuffs: PartyBuffs.create({ + + }), + individualBuffs: IndividualBuffs.create({ + + }), debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - lightningBreath: true, + }), }, @@ -125,11 +108,11 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { builds: [Presets.PRESET_BUILD_ST, Presets.PRESET_BUILD_CLEAVE], }, - autoRotation: (_player: Player): APLRotation => { + autoRotation: (_player: Player): APLRotation => { return Presets.APL_ROTATION_DEFAULT.rotation.rotation!; }, - simpleRotation: (player: Player, simple: DruidRotation, cooldowns: Cooldowns): APLRotation => { + simpleRotation: (player: Player, simple: DruidRotation, cooldowns: Cooldowns): APLRotation => { const [prepullActions, actions] = AplUtils.standardCooldownDefaults(cooldowns); // Rotation entries @@ -200,7 +183,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { raidSimPresets: [ { - spec: Spec.SpecFeralDruid, + spec: Spec.SpecFeralCatDruid, talents: Presets.StandardTalents.data, specOptions: Presets.DefaultOptions, consumables: Presets.DefaultConsumables, @@ -229,19 +212,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFeralDruid, { ], }); -export class FeralDruidSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { +export class FeralCatDruidSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this, { - getEPDefaults: (player: Player) => { - if (player.getTalents().heartOfTheWild) { - return RelativeStatCap.hasRoRo(player) ? Presets.HOTW_RORO_PRESET.epWeights : Presets.HOTW_EP_PRESET.epWeights; - } else { - return RelativeStatCap.hasRoRo(player) ? Presets.DOC_RORO_PRESET.epWeights : Presets.DOC_EP_PRESET.epWeights; - } - }, - defaultRelativeStatCap: Stat.StatMasteryRating, - }); } } diff --git a/ui/druid/restoration/presets.ts b/ui/druid/restoration/presets.ts index c09bdb8f40..78f87436b8 100644 --- a/ui/druid/restoration/presets.ts +++ b/ui/druid/restoration/presets.ts @@ -24,8 +24,6 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 0.38, [Stat.StatSpirit]: 0.34, [Stat.StatSpellPower]: 1, - [Stat.StatCritRating]: 0.69, - [Stat.StatHasteRating]: 0.77, [Stat.StatMP5]: 0.0, }), ); diff --git a/ui/druid/restoration/sim.ts b/ui/druid/restoration/sim.ts index 56017c8aae..00d77e0ac0 100644 --- a/ui/druid/restoration/sim.ts +++ b/ui/druid/restoration/sim.ts @@ -16,12 +16,12 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRestorationDruid, { knownIssues: [], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMP5, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatSpellPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5, Stat.StatMasteryRating], + [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5], [PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), gemStats: DEFAULT_HYBRID_CASTER_GEM_STATS, diff --git a/ui/hunter/apls/blank.apl.json b/ui/hunter/apls/blank.apl.json new file mode 100644 index 0000000000..725b143fed --- /dev/null +++ b/ui/hunter/apls/blank.apl.json @@ -0,0 +1,4 @@ +{ + "type": "TypeAPL", + "priorityList": [] +} diff --git a/ui/hunter/beast_mastery/apls/aoe.apl.json b/ui/hunter/beast_mastery/apls/aoe.apl.json deleted file mode 100644 index 2421cb6d72..0000000000 --- a/ui/hunter/beast_mastery/apls/aoe.apl.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - { - "action": { - "condition": { "cmp": { "op": "OpGt", "lhs": { "currentTime": {} }, "rhs": { "const": { "val": "10s" } } } }, - "autocastOtherCooldowns": {} - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 2643 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 77767 } } } } - ] -} diff --git a/ui/hunter/beast_mastery/apls/bm.apl.json b/ui/hunter/beast_mastery/apls/bm.apl.json deleted file mode 100644 index 28c570068e..0000000000 --- a/ui/hunter/beast_mastery/apls/bm.apl.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } }, "doAtValue": { "const": { "val": "-5s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13165 } } }, "doAtValue": { "const": { "val": "-4s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 1130 } } }, "doAtValue": { "const": { "val": "-3s" } } }, - { "action": { "castSpell": { "spellId": { "otherId": "OtherActionPotion" } } }, "doAtValue": { "const": { "val": "-0.5s" } } } - ], - "priorityList": [ - { - "action": { "condition": { "not": { "val": { "sequenceIsComplete": { "sequenceName": "opener" } } } }, "groupReference": { "groupName": "Opener" } } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 121818 } } } }, - { - "action": { - "condition": { "auraIsActive": { "auraId": { "spellId": 120668, "tag": -1 }, "includeReactionTime": true } }, - "castSpell": { "spellId": { "spellId": 120360 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 53351 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 34026 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 131894 } } } }, - { - "action": { - "condition": { "cmp": { "op": "OpLe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "60" } } } }, - "castSpell": { "spellId": { "spellId": 82726 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 120697 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120679 } } } }, - { - "action": { - "condition": { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - "castSpell": { "spellId": { "spellId": 1978 } } - } - }, - { - "action": { - "condition": { - "cmp": { "op": "OpLe", "lhs": { "dotRemainingTime": { "spellId": { "spellId": 1978 } } }, "rhs": { "const": { "val": "6s" } } } - }, - "sequence": { "name": "cobra", "actions": [{ "castSpell": { "spellId": { "spellId": 77767 } } }] } - } - }, - { - "action": { - "condition": { - "cmp": { "op": "OpGt", "lhs": { "dotRemainingTime": { "spellId": { "spellId": 1978 } } }, "rhs": { "const": { "val": "6s" } } } - }, - "resetSequence": { "sequenceName": "cobra" } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 117050 } } } }, - { "action": { "condition": { "variableRef": { "name": "Frenzy" } }, "castSpell": { "spellId": { "spellId": 82692 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120360 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 109259 } } } }, - { "action": { "condition": { "variableRef": { "name": "Arcane" } }, "castSpell": { "spellId": { "spellId": 3044 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 77767 } } } } - ], - "groups": [ - { - "name": "Opener", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 34026 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 131894 } } } }, - { - "action": { - "condition": { - "and": { - "vals": [ - { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - { "not": { "val": { "spellInFlight": { "spellId": { "spellId": 1978 } } } } } - ] - } - }, - "castSpell": { "spellId": { "spellId": 1978 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 121818 } } } }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120679 } } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 109259 } } }] } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 117050 } } }] } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 120360 } } }] } } } - ] - }, - { - "name": "Cooldowns", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 126734 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 53401 } } } }, - { - "action": { - "condition": { "cmp": { "op": "OpLt", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "60" } } } }, - "castSpell": { "spellId": { "spellId": 82726 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 3045 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 33697 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 26297 } } } }, - { "action": { "autocastOtherCooldowns": {} } }, - { "action": { "castSpell": { "spellId": { "spellId": 114206, "tag": -1 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 2825, "tag": -1 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120668, "tag": -1 } } } }, - { "action": { "groupReference": { "groupName": "Potion" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 19574 } } } } - ] - }, - { - "name": "Potion", - "actions": [ - { - "action": { - "condition": { - "or": { - "vals": [ - { "isExecutePhase": { "threshold": "E20" } }, - { "auraIsActive": { "auraId": { "spellId": 3045 }, "includeReactionTime": true } }, - { - "and": { - "vals": [ - { "dotIsActive": { "spellId": { "spellId": 131894 } } }, - { - "cmp": { - "op": "OpGt", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 3045 } } }, - "rhs": { - "math": { "op": "OpSub", "lhs": { "remainingTime": {} }, "rhs": { "const": { "val": "15s" } } } - } - } - } - ] - } - } - ] - } - }, - "castSpell": { "spellId": { "itemId": 76089 } } - } - } - ] - } - ], - "valueVariables": [ - { - "name": "Arcane", - "value": { - "or": { - "vals": [ - { - "and": { - "vals": [ - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "31" } } } }, - { "auraIsActive": { "auraId": { "spellId": 19574 }, "includeReactionTime": true } } - ] - } - }, - { - "and": { - "vals": [ - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "66" } } } }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 19574 } } }, - "rhs": { "const": { "val": "10s" } } - } - } - ] - } - }, - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "100" } } } } - ] - } - } - }, - { - "name": "Frenzy", - "value": { - "or": { - "vals": [ - { - "cmp": { - "op": "OpEq", - "lhs": { - "auraNumStacks": { - "sourceUnit": { "type": "Pet", "owner": { "type": "Self" } }, - "auraId": { "spellId": 19623 }, - "includeReactionTime": true - } - }, - "rhs": { "const": { "val": "5" } } - } - }, - { - "cmp": { - "op": "OpLe", - "lhs": { - "auraRemainingTime": { "sourceUnit": { "type": "Pet", "owner": { "type": "Self" } }, "auraId": { "spellId": 19623 } } - }, - "rhs": { "const": { "val": "3s" } } - } - } - ] - } - } - } - ] -} diff --git a/ui/hunter/beast_mastery/apls/bm_advanced.apl.json b/ui/hunter/beast_mastery/apls/bm_advanced.apl.json deleted file mode 100644 index 03036596c5..0000000000 --- a/ui/hunter/beast_mastery/apls/bm_advanced.apl.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - { "action": { "castSpell": { "spellId": { "otherId": "OtherActionPotion" } } }, "doAtValue": { "const": { "val": "-1s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13165 } } }, "doAtValue": { "const": { "val": "-2s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 1130 } } }, "doAtValue": { "const": { "val": "-3s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 2825, "tag": -1 } } }, "doAtValue": { "const": { "val": "-1s" } } }, - { "action": {}, "doAtValue": { "const": { "val": "-1s" } } } - ], - "priorityList": [ - { "action": { "autocastOtherCooldowns": {} } }, - { - "action": { - "condition": { - "and": { - "vals": [ - { - "cmp": { - "op": "OpEq", - "lhs": { - "auraNumStacks": { "sourceUnit": { "type": "Pet", "owner": { "type": "Self" } }, "auraId": { "spellId": 19622 } } - }, - "rhs": { "const": { "val": "5" } } - } - }, - { "cmp": { "op": "OpLe", "lhs": { "auraRemainingTime": { "auraId": { "spellId": 82692 } } }, "rhs": { "const": { "val": "4s" } } } } - ] - } - }, - "castSpell": { "spellId": { "spellId": 82692 } } - } - }, - { - "action": { - "condition": { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "60" } } } }, - "castSpell": { "spellId": { "spellId": 19574 } } - } - }, - { - "action": { - "condition": { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - "castSpell": { "spellId": { "spellId": 1978 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 53351 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 3045 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 34026 } } } }, - { - "action": { - "condition": { "cmp": { "op": "OpLe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "37" } } } }, - "castSpell": { "spellId": { "spellId": 82726 } } - } - }, - { - "action": { - "condition": { - "or": { - "vals": [ - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "59" } } } }, - { "auraIsActive": { "auraId": { "spellId": 19574 } } } - ] - } - }, - "castSpell": { "spellId": { "spellId": 3044 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 77767 } } } } - ] -} diff --git a/ui/hunter/beast_mastery/builds/p2.build.json b/ui/hunter/beast_mastery/builds/p2.build.json deleted file mode 100644 index 3235e710e2..0000000000 --- a/ui/hunter/beast_mastery/builds/p2.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 87004, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86953, "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90505, "enchant": 4804, "gems": [76692], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86963, "enchant": 4894, "reforging": 167, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 87002, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87014, "enchant": 4416, "gems": [0], "reforging": 144, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87003, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89951, "gems": [76692, 76692, 76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 87005, "enchant": 4822, "gems": [76692], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86985, "enchant": 4428, "gems": [76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90503, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86974, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87057, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87168, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "beastMasteryHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312211", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/beast_mastery/builds/p3.build.json b/ui/hunter/beast_mastery/builds/p3.build.json deleted file mode 100644 index 0b76129388..0000000000 --- a/ui/hunter/beast_mastery/builds/p3.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 96628, "gems": [95346, 76658], "reforging": 140 }, - { "id": 96815, "gems": [76692], "reforging": 138 }, - { "id": 96630, "enchant": 4804, "gems": [76692, 76666], "reforging": 138 }, - { "id": 96833, "enchant": 4894, "gems": [76692], "reforging": 145, "tinker": 4897 }, - { "id": 96626, "enchant": 4419, "gems": [76692, 76658, 76680], "reforging": 160 }, - { "id": 96797, "randomSuffix": -336, "enchant": 4416, "gems": [76658, 0], "reforging": 146 }, - { "id": 96627, "enchant": 4433, "gems": [76692, 0], "reforging": 160, "tinker": 4898 }, - { "id": 96846, "gems": [76692, 76666, 76692], "reforging": 147, "tinker": 4223 }, - { "id": 96921, "enchant": 4822, "gems": [76692, 76692, 76692], "reforging": 147 }, - { "id": 95009, "enchant": 4428, "gems": [76666, 76680], "reforging": 145 }, - { "id": 95021, "gems": [76680], "reforging": 140 }, - { "id": 96885, "gems": [76692], "reforging": 151 }, - { "id": 96741, "reforging": 160 }, - { "id": 96781, "reforging": 167 }, - { "id": 96844, "enchant": 4699, "gems": [76692, 76692], "reforging": 147 }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "beastMasteryHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312213", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/beast_mastery/builds/preraid.build.json b/ui/hunter/beast_mastery/builds/preraid.build.json deleted file mode 100644 index 51221424cc..0000000000 --- a/ui/hunter/beast_mastery/builds/preraid.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 90413, "gems": [76884, 76658], "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90432, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86634, "enchant": 4804, "gems": [76680], "reforging": 159, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86831, "enchant": 4894, "reforging": 168, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 86638, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86189, "enchant": 4416, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86637, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 90453, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 86635, "enchant": 4822, "gems": [76692], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90444, "enchant": 4428, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93248, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90437, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86890, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79328, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86889, "enchant": 4699, "gems": [89873, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "beastMasteryHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312211", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/beast_mastery/gear_sets/p2.gear.json b/ui/hunter/beast_mastery/gear_sets/p2.gear.json deleted file mode 100644 index 10628181c9..0000000000 --- a/ui/hunter/beast_mastery/gear_sets/p2.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87004, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86953, "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90505, "enchant": 4804, "gems": [76692], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86963, "enchant": 4894, "reforging": 167, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 87002, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87014, "enchant": 4416, "gems": [0], "reforging": 144, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87003, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89951, "gems": [76692, 76692, 76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 87005, "enchant": 4822, "gems": [76692], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86985, "enchant": 4428, "gems": [76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90503, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86974, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87057, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87168, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/hunter/beast_mastery/gear_sets/p3.gear.json b/ui/hunter/beast_mastery/gear_sets/p3.gear.json deleted file mode 100644 index f31aec9f43..0000000000 --- a/ui/hunter/beast_mastery/gear_sets/p3.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 96628, "gems": [95346, 76658], "reforging": 140 }, - { "id": 96815, "gems": [76692], "reforging": 138 }, - { "id": 96630, "enchant": 4804, "gems": [76692, 76666], "reforging": 138 }, - { "id": 96833, "enchant": 4894, "gems": [76692], "reforging": 145, "tinker": 4897 }, - { "id": 96626, "enchant": 4419, "gems": [76692, 76658, 76680], "reforging": 160 }, - { "id": 96797, "randomSuffix": -336, "enchant": 4416, "gems": [76658, 0], "reforging": 146 }, - { "id": 96627, "enchant": 4433, "gems": [76692, 0], "reforging": 160, "tinker": 4898 }, - { "id": 96846, "gems": [76692, 76666, 76692], "reforging": 147, "tinker": 4223 }, - { "id": 96921, "enchant": 4822, "gems": [76692, 76692, 76692], "reforging": 147 }, - { "id": 95009, "enchant": 4428, "gems": [76666, 76680], "reforging": 145 }, - { "id": 95021, "gems": [76680], "reforging": 140 }, - { "id": 96885, "gems": [76692], "reforging": 151 }, - { "id": 96741, "reforging": 160 }, - { "id": 96781, "reforging": 167 }, - { "id": 96844, "enchant": 4699, "gems": [76692, 76692], "reforging": 147 }, - {} - ] -} diff --git a/ui/hunter/beast_mastery/gear_sets/preraid.gear.json b/ui/hunter/beast_mastery/gear_sets/preraid.gear.json deleted file mode 100644 index 36bf7600fc..0000000000 --- a/ui/hunter/beast_mastery/gear_sets/preraid.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 90413, "gems": [76884, 76658], "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90432, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86634, "enchant": 4804, "gems": [76680], "reforging": 159, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86831, "enchant": 4894, "reforging": 168, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 86638, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86189, "enchant": 4416, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86637, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 90453, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 86635, "enchant": 4822, "gems": [76692], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90444, "enchant": 4428, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93248, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90437, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86890, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79328, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86889, "enchant": 4699, "gems": [89873, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/hunter/beast_mastery/index.ts b/ui/hunter/beast_mastery/index.ts deleted file mode 100644 index ddec03db43..0000000000 --- a/ui/hunter/beast_mastery/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { BeastMasteryHunterSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.BeastMasteryHunter, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new BeastMasteryHunterSimUI(document.body, player); diff --git a/ui/hunter/beast_mastery/inputs.ts b/ui/hunter/beast_mastery/inputs.ts deleted file mode 100644 index 2367010cc6..0000000000 --- a/ui/hunter/beast_mastery/inputs.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as InputHelpers from '../../core/components/input_helpers'; -import { Player } from '../../core/player'; -import { RotationType, Spec } from '../../core/proto/common'; -import { HunterStingType as StingType } from '../../core/proto/hunter'; -import { TypedEvent } from '../../core/typed_event'; -import i18n from '../../i18n/config'; - -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -export const BMRotationConfig = { - inputs: [ - InputHelpers.makeRotationEnumInput({ - fieldName: 'type', - label: i18n.t('rotation_tab.common.rotation_type.label'), - values: [ - { name: i18n.t('rotation_tab.common.rotation_type.single_target'), value: RotationType.SingleTarget }, - { name: i18n.t('rotation_tab.common.rotation_type.aoe'), value: RotationType.Aoe }, - ], - }), - InputHelpers.makeRotationEnumInput({ - fieldName: 'sting', - label: i18n.t('rotation_tab.options.hunter.beast_mastery.sting.label'), - labelTooltip: i18n.t('rotation_tab.options.hunter.beast_mastery.sting.tooltip'), - values: [ - { name: i18n.t('rotation_tab.options.hunter.beast_mastery.sting.values.none'), value: StingType.NoSting }, - { name: i18n.t('rotation_tab.options.hunter.beast_mastery.sting.values.serpent_sting'), value: StingType.SerpentSting }, - ], - showWhen: (player: Player) => player.getSimpleRotation().type == RotationType.SingleTarget, - }), - InputHelpers.makeRotationBooleanInput({ - fieldName: 'trapWeave', - label: i18n.t('rotation_tab.options.hunter.beast_mastery.trap_weave.label'), - labelTooltip: i18n.t('rotation_tab.options.hunter.beast_mastery.trap_weave.tooltip'), - }), - InputHelpers.makeRotationBooleanInput({ - fieldName: 'multiDotSerpentSting', - label: i18n.t('rotation_tab.options.hunter.beast_mastery.multi_dot_serpent_sting.label'), - labelTooltip: i18n.t('rotation_tab.options.hunter.beast_mastery.multi_dot_serpent_sting.tooltip'), - changeEmitter: (player: Player) => TypedEvent.onAny([player.rotationChangeEmitter, player.talentsChangeEmitter]), - }), - ], -}; diff --git a/ui/hunter/beast_mastery/presets.ts b/ui/hunter/beast_mastery/presets.ts deleted file mode 100644 index fe6fb3efdd..0000000000 --- a/ui/hunter/beast_mastery/presets.ts +++ /dev/null @@ -1,96 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { APLRotation_Type as APLRotationType } from '../../core/proto/apl.js'; -import { ConsumesSpec, Profession, PseudoStat, Spec, Stat } from '../../core/proto/common'; -import { BeastMasteryHunter_Options as BeastMasteryOptions, HunterOptions_PetType as PetType } from '../../core/proto/hunter'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import P2Build from './builds/p2.build.json'; -import P3Build from './builds/p3.build.json'; -import PreRaidBuild from './builds/preraid.build.json'; -import P2Gear from './gear_sets/p2.gear.json'; -import P3Gear from './gear_sets/p3.gear.json'; -import PreRaidGear from './gear_sets/preraid.gear.json'; -import AoeApl from './apls/aoe.apl.json'; -import BmApl from './apls/bm.apl.json'; - -export const PRERAID_PRESET_GEAR = PresetUtils.makePresetGear('Pre-raid', PreRaidGear); -export const P2_PRESET_GEAR = PresetUtils.makePresetGear('P2', P2Gear); -export const P3_PRESET_GEAR = PresetUtils.makePresetGear('P3 (WiP)', P3Gear); -export const ROTATION_PRESET_BM = PresetUtils.makePresetAPLRotation('BM', BmApl); -export const ROTATION_PRESET_AOE = PresetUtils.makePresetAPLRotation('AOE', AoeApl); -export const DefaultTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '312211', - }), -}; - -export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( - 'P2', - Stats.fromMap( - { - [Stat.StatAgility]: 1, - [Stat.StatHitRating]: 0.3, - [Stat.StatCritRating]: 0.28, - [Stat.StatHasteRating]: 0.29, - [Stat.StatMasteryRating]: 0.25, - [Stat.StatExpertiseRating]: 0.3, - }, - { - [PseudoStat.PseudoStatRangedDps]: 0.63, - }, - ), -); -export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( - 'P3', - Stats.fromMap( - { - [Stat.StatAgility]: 1, - [Stat.StatRangedAttackPower]: 0.35, - [Stat.StatHitRating]: 0.49, - [Stat.StatCritRating]: 0.39, - [Stat.StatHasteRating]: 0.5, - [Stat.StatMasteryRating]: 0.4, - [Stat.StatExpertiseRating]: 0.49, - }, - { - [PseudoStat.PseudoStatRangedDps]: 0.7, - }, - ), -); - -export const PRERAID_PRESET = PresetUtils.makePresetBuildFromJSON('Pre-raid', Spec.SpecBeastMasteryHunter, PreRaidBuild, { - epWeights: P2_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); -export const P2_PRESET = PresetUtils.makePresetBuildFromJSON('P2', Spec.SpecBeastMasteryHunter, P2Build, { - epWeights: P2_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); -export const P3_PRESET = PresetUtils.makePresetBuildFromJSON('P3 (WiP)', Spec.SpecBeastMasteryHunter, P3Build, { - epWeights: P3_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); - -export const BMDefaultOptions = BeastMasteryOptions.create({ - classOptions: { - petUptime: 1, - useHuntersMark: true, - petType: PetType.Tallstrider, - glaiveTossSuccess: 0.8, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76084, // Flask of the Winds - foodId: 74648, // Seafood Magnifique Feast - potId: 76089, // Potion of the Tol'vir - prepotId: 76089, // Potion of the Tol'vir -}); - -export const OtherDefaults = { - distanceFromTarget: 24, - iterationCount: 25000, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, -}; diff --git a/ui/hunter/beast_mastery/sim.ts b/ui/hunter/beast_mastery/sim.ts deleted file mode 100644 index 900a0cfaa6..0000000000 --- a/ui/hunter/beast_mastery/sim.ts +++ /dev/null @@ -1,188 +0,0 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; -import { StatCapType } from '../../core/proto/ui'; -import { StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as HunterInputs from '../inputs'; -import { sharedHunterDisplayStatsModifiers } from '../shared'; -import * as BMInputs from './inputs'; -import * as Presets from './presets'; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecBeastMasteryHunter, { - cssClass: 'beast-mastery-hunter-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Hunter), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - warnings: [], - // All stats for which EP should be calculated. - epStats: [ - Stat.StatAgility, - Stat.StatRangedAttackPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - gemStats: [ - Stat.StatStamina, - Stat.StatAgility, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - epPseudoStats: [PseudoStat.PseudoStatRangedDps], - // Reference stat against which to calculate EP. - epReferenceStat: Stat.StatAgility, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatRangedAttackPower, Stat.StatMasteryRating, Stat.StatExpertiseRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatRangedHastePercent], - ), - modifyDisplayStats: (player: Player) => { - return sharedHunterDisplayStatsModifiers(player); - }, - itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], - defaults: { - // Default equipped gear. - gear: Presets.P2_PRESET_GEAR.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P2_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - return new Stats() - .withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5) - .withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - })(), - // Default breakpoint limits - set 19% haste as default target - breakpointLimits: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatRangedHastePercent, 19); - })(), - softCapBreakpoints: (() => { - return [ - StatCap.fromPseudoStat(PseudoStat.PseudoStatRangedHastePercent, { - breakpoints: [19, 20, 26, 33], - capType: StatCapType.TypeSoftCap, - postCapEPs: [0.25, 0.2, 0.2, 0.2], // Single value that gets repeated for all breakpoints - }), - ]; - })(), - - other: Presets.OtherDefaults, - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.DefaultTalents.data, - // Default spec-specific settings. - specOptions: Presets.BMDefaultOptions, - // Default raid/party buffs settings. - raidBuffs: RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - blessingOfKings: true, - trueshotAura: true, - leaderOfThePack: true, - blessingOfMight: true, - commandingShout: true, - unholyAura: true, - bloodlust: true, - }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - curseOfElements: true, - }), - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [HunterInputs.PetTypeInput()], //[HunterInputs.PetTypeInput()], - // Inputs to include in the 'Rotation' section on the settings tab. - rotationInputs: BMInputs.BMRotationConfig, - petConsumeInputs: [], - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [BuffDebuffInputs.StaminaBuff, BuffDebuffInputs.SpellDamageDebuff, BuffDebuffInputs.MajorArmorDebuff], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [HunterInputs.PetUptime(), HunterInputs.GlaiveTossChance(), OtherInputs.InputDelay, OtherInputs.DistanceFromTarget, OtherInputs.TankAssignment], - }, - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: false, - }, - - presets: { - epWeights: [Presets.P2_EP_PRESET, Presets.P3_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.DefaultTalents], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_BM, Presets.ROTATION_PRESET_AOE], - // Preset gear configurations that the user can quickly select. - builds: [Presets.PRERAID_PRESET, Presets.P2_PRESET, Presets.P3_PRESET], - gear: [Presets.PRERAID_PRESET_GEAR, Presets.P2_PRESET_GEAR, Presets.P3_PRESET_GEAR], - }, - - autoRotation: (_: Player): APLRotation => { - return Presets.ROTATION_PRESET_BM.rotation.rotation!; - }, - - raidSimPresets: [ - { - spec: Spec.SpecBeastMasteryHunter, - talents: Presets.DefaultTalents.data, - specOptions: Presets.BMDefaultOptions, - - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.PRERAID_PRESET_GEAR.gear, - 2: Presets.P2_PRESET_GEAR.gear, - 3: Presets.P3_PRESET_GEAR.gear, - }, - [Faction.Horde]: { - 1: Presets.PRERAID_PRESET_GEAR.gear, - 2: Presets.P2_PRESET_GEAR.gear, - 3: Presets.P3_PRESET_GEAR.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class BeastMasteryHunterSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this, { - updateSoftCaps: softCaps => { - // Implement stepped EP reduction for haste breakpoints - const hasteCap = softCaps.find(v => v.unitStat.equalsPseudoStat(PseudoStat.PseudoStatRangedHastePercent)); - if (hasteCap) { - const hasteWeights = player.getEpWeights().getStat(Stat.StatHasteRating); - // Set stepped EP values: 0.27 -> 0.24 -> 0.21 -> 0.18 -> 0.15 - const baseEP = hasteWeights * Mechanics.HASTE_RATING_PER_HASTE_PERCENT; - const reduction = 0.03 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT; - hasteCap.postCapEPs = hasteCap.breakpoints.map((_, index) => Math.max(0, baseEP - reduction * (index + 1))); - } - return softCaps; - }, - }); - } -} diff --git a/ui/hunter/gear_sets/blank.gear.json b/ui/hunter/gear_sets/blank.gear.json new file mode 100644 index 0000000000..9c53a135fe --- /dev/null +++ b/ui/hunter/gear_sets/blank.gear.json @@ -0,0 +1 @@ +{"items": []} diff --git a/ui/hunter/index.ts b/ui/hunter/index.ts new file mode 100644 index 0000000000..474433e623 --- /dev/null +++ b/ui/hunter/index.ts @@ -0,0 +1,12 @@ +import { Player } from '../core/player.js'; +import { PlayerSpecs } from '../core/player_specs/index.js'; +import { Spec } from '../core/proto/common.js'; +import { Sim } from '../core/sim.js'; +import { TypedEvent } from '../core/typed_event.js'; +import { HunterSimUI } from './sim.js'; + +const sim = new Sim(); +const player = new Player(PlayerSpecs.Hunter, sim); +sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); + +new HunterSimUI(document.body, player); diff --git a/ui/hunter/inputs.ts b/ui/hunter/inputs.ts index 8a14b400ea..3c1c7fad18 100644 --- a/ui/hunter/inputs.ts +++ b/ui/hunter/inputs.ts @@ -1,6 +1,7 @@ import * as InputHelpers from '../core/components/input_helpers'; import { HunterSpecs } from '../core/proto_utils/utils'; import { makePetTypeInputConfig } from '../core/talents/hunter_pet'; +import { RotationType, Spec } from '../core/proto/common'; import i18n from '../i18n/config.js'; // import { makePetTypeInputConfig } from '../core/talents/hunter_pet'; @@ -25,3 +26,15 @@ export const GlaiveTossChance = () => labelTooltip: i18n.t('settings_tab.other.glaive_toss_chance.tooltip'), percent: true, }); + +export const MMRotationConfig = { + inputs: [ + InputHelpers.makeRotationEnumInput({ + fieldName: 'type', + label: i18n.t('rotation_tab.common.rotation_type.label'), + values: [ + { name: i18n.t('rotation_tab.common.rotation_type.single_target'), value: RotationType.SingleTarget }, + { name: i18n.t('rotation_tab.common.rotation_type.aoe'), value: RotationType.Aoe }, + ], + }), + ]}; diff --git a/ui/hunter/marksmanship/apls/aoe.apl.json b/ui/hunter/marksmanship/apls/aoe.apl.json deleted file mode 100644 index d68e96aecc..0000000000 --- a/ui/hunter/marksmanship/apls/aoe.apl.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - { "action": { "autocastOtherCooldowns": {} } }, - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 2643 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 56641 } } } } - ] -} diff --git a/ui/hunter/marksmanship/apls/mm.apl.json b/ui/hunter/marksmanship/apls/mm.apl.json deleted file mode 100644 index a44cc0923e..0000000000 --- a/ui/hunter/marksmanship/apls/mm.apl.json +++ /dev/null @@ -1,256 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - { "action": { "castSpell": { "spellId": { "spellId": 13165 } } }, "doAtValue": { "const": { "val": "-10s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 1130 } } }, "doAtValue": { "const": { "val": "-7s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } }, "doAtValue": { "const": { "val": "-5s" } } }, - { "action": { "castSpell": { "spellId": { "otherId": "OtherActionPotion" } } }, "doAtValue": { "const": { "val": "-0.5s" } } } - ], - "priorityList": [ - { - "action": { "condition": { "not": { "val": { "sequenceIsComplete": { "sequenceName": "opener" } } } }, "groupReference": { "groupName": "Opener" } } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { - "action": { - "condition": { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - "castSpell": { "spellId": { "spellId": 1978 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 53209 } } } }, - { - "action": { - "condition": { "auraIsActive": { "auraId": { "spellId": 120668, "tag": -1 }, "includeReactionTime": true } }, - "castSpell": { "spellId": { "spellId": 120360 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 131894 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 82928 } } } }, - { "action": { "condition": { "isExecutePhase": { "threshold": "E20" } }, "castSpell": { "spellId": { "spellId": 53351 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120697 } } } }, - { "action": { "condition": { "variableRef": { "name": "Steady Focus" } }, "castSpell": { "spellId": { "spellId": 56641 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120360 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 117050 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 109259 } } } }, - { "action": { "condition": { "variableRef": { "name": "Aimed" } }, "castSpell": { "spellId": { "spellId": 19434 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 56641 } } } } - ], - "groups": [ - { - "name": "Opener", - "actions": [ - { "action": { "condition": { "spellIsKnown": { "spellId": { "spellId": 82726 } } }, "groupReference": { "groupName": "Fervor Opener" } } }, - { "action": { "condition": { "spellIsKnown": { "spellId": { "spellId": 120679 } } }, "groupReference": { "groupName": "Dire Beast Opener" } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 117050 } } }] } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 109259 } } }] } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 120360 } } }] } } } - ] - }, - { - "name": "Fervor Opener", - "actions": [ - { - "action": { - "sequence": { - "name": "step 1", - "actions": [ - { "castSpell": { "spellId": { "spellId": 131894 } } }, - { "castSpell": { "spellId": { "spellId": 1978 } } }, - { "castSpell": { "spellId": { "spellId": 121818 } } }, - { "wait": { "duration": { "gcdTimeToReady": {} } } }, - { "castSpell": { "spellId": { "spellId": 82726 } } } - ] - } - } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { - "action": { - "sequence": { - "name": "step 3", - "actions": [ - { "castSpell": { "spellId": { "spellId": 53209 } } }, - { "wait": { "duration": { "gcdTimeToReady": {} } } }, - { "castSpell": { "spellId": { "spellId": 3045 } } }, - { "castSpell": { "spellId": { "spellId": 56641 } } }, - { "castSpell": { "spellId": { "spellId": 56641 } } } - ] - } - } - } - ] - }, - { - "name": "Dire Beast Opener", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 131894 } } } }, - { - "action": { - "condition": { - "and": { - "vals": [ - { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - { "not": { "val": { "spellInFlight": { "spellId": { "spellId": 1978 } } } } } - ] - } - }, - "castSpell": { "spellId": { "spellId": 1978 } } - } - }, - { - "action": { - "sequence": { - "name": "step 1", - "actions": [{ "castSpell": { "spellId": { "spellId": 121818 } } }, { "wait": { "duration": { "gcdTimeToReady": {} } } }] - } - } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120679 } } } }, - { - "action": { - "sequence": { - "name": "step 2", - "actions": [ - { "castSpell": { "spellId": { "spellId": 53209 } } }, - { "wait": { "duration": { "gcdTimeToReady": {} } } }, - { "castSpell": { "spellId": { "spellId": 3045 } } }, - { "castSpell": { "spellId": { "spellId": 56641 } } }, - { "castSpell": { "spellId": { "spellId": 56641 } } } - ] - } - } - } - ] - }, - { - "name": "Cooldowns", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 126734 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 53401 } } } }, - { - "action": { - "condition": { - "and": { - "vals": [ - { "cmp": { "op": "OpLe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "50" } } } }, - { "sequenceIsComplete": { "sequenceName": "opener" } } - ] - } - }, - "castSpell": { "spellId": { "spellId": 82726 } } - } - }, - { "action": { "condition": { "sequenceIsComplete": { "sequenceName": "opener" } }, "castSpell": { "spellId": { "spellId": 3045 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 33697 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 26297 } } } }, - { "action": { "autocastOtherCooldowns": {} } }, - { "action": { "castSpell": { "spellId": { "spellId": 114206, "tag": -1 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 2825, "tag": -1 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120668, "tag": -1 } } } }, - { "action": { "groupReference": { "groupName": "Second Pot" } } }, - { "action": { "condition": { "sequenceIsComplete": { "sequenceName": "opener" } }, "castSpell": { "spellId": { "spellId": 121818 } } } }, - { "action": { "condition": { "sequenceIsComplete": { "sequenceName": "opener" } }, "castSpell": { "spellId": { "spellId": 120679 } } } } - ] - }, - { - "name": "Second Pot", - "actions": [ - { - "action": { - "condition": { - "or": { - "vals": [ - { "isExecutePhase": { "threshold": "E20" } }, - { "auraIsActive": { "auraId": { "spellId": 3045 }, "includeReactionTime": true } }, - { - "and": { - "vals": [ - { "dotIsActive": { "spellId": { "spellId": 131894 } } }, - { - "cmp": { - "op": "OpGt", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 3045 } } }, - "rhs": { - "math": { "op": "OpSub", "lhs": { "remainingTime": {} }, "rhs": { "const": { "val": "15s" } } } - } - } - } - ] - } - } - ] - } - }, - "castSpell": { "spellId": { "itemId": 76089 } } - } - } - ] - } - ], - "valueVariables": [ - { - "name": "Steady Focus", - "value": { - "and": { - "vals": [ - { - "cmp": { - "op": "OpEq", - "lhs": { "auraNumStacks": { "auraId": { "spellId": 53224, "tag": 2 } } }, - "rhs": { "const": { "val": "2" } } - } - }, - { - "cmp": { - "op": "OpLe", - "lhs": { "auraRemainingTime": { "auraId": { "spellId": 53224, "tag": 1 } } }, - "rhs": { "const": { "val": "7s" } } - } - } - ] - } - } - }, - { - "name": "Aimed", - "value": { - "or": { - "vals": [ - { "and": { "vals": [{ "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "85" } } } }] } }, - { "and": { "vals": [{ "auraIsActive": { "auraId": { "spellId": 3045 }, "includeReactionTime": true } }] } }, - { - "and": { - "vals": [ - { - "not": { - "val": { - "cmp": { - "op": "OpLe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 53209 } } }, - "rhs": { "const": { "val": "3s" } } - } - } - } - }, - { - "not": { - "val": { - "cmp": { - "op": "OpLe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 131894 } } }, - "rhs": { "const": { "val": "3s" } } - } - } - } - }, - { "not": { "val": { "spellIsReady": { "spellId": { "spellId": 131894 } } } } } - ] - } - } - ] - } - } - } - ] -} diff --git a/ui/hunter/marksmanship/builds/p2.build.json b/ui/hunter/marksmanship/builds/p2.build.json deleted file mode 100644 index 37c159f3b6..0000000000 --- a/ui/hunter/marksmanship/builds/p2.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 87004, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86953, "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90505, "enchant": 4804, "gems": [76692], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86963, "enchant": 4894, "reforging": 165, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 87002, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87014, "enchant": 4416, "gems": [0], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87003, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89951, "gems": [76692, 76692, 76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 87005, "enchant": 4822, "gems": [76692], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86985, "enchant": 4428, "gems": [76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90503, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86974, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87057, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87168, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "marksmanshipHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312111", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/marksmanship/builds/p3.build.json b/ui/hunter/marksmanship/builds/p3.build.json deleted file mode 100644 index 096ce26b7e..0000000000 --- a/ui/hunter/marksmanship/builds/p3.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceTroll", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 96788, "gems": [95346, 76658] }, - { "id": 96762, "reforging": 159 }, - { "id": 96630, "enchant": 4804, "gems": [76692, 76658], "reforging": 138 }, - { "id": 95015, "enchant": 4424, "gems": [76658] }, - { "id": 95034, "enchant": 4419, "gems": [76692, 76692, 76692], "reforging": 137 }, - { "id": 96797, "randomSuffix": -340, "enchant": 4416, "gems": [76658, 0], "reforging": 152 }, - { "id": 96627, "enchant": 4430, "gems": [76692, 0], "reforging": 160, "tinker": 4898 }, - { "id": 96846, "gems": [76692, 76658, 76692], "reforging": 153 }, - { "id": 96921, "enchant": 4822, "gems": [76692, 76692, 76692] }, - { "id": 96798, "enchant": 4428, "gems": [76692], "reforging": 151 }, - { "id": 95021, "gems": [76680], "reforging": 137 }, - { "id": 96885, "gems": [76658] }, - { "id": 96741, "reforging": 159 }, - { "id": 96781, "reforging": 166 }, - { "id": 96897, "enchant": 4699, "gems": [76692, 76692], "reforging": 137 }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "marksmanshipHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312213", - "profession1": "Engineering", - "profession2": "Herbalism", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/marksmanship/builds/preraid.build.json b/ui/hunter/marksmanship/builds/preraid.build.json deleted file mode 100644 index 08a419a935..0000000000 --- a/ui/hunter/marksmanship/builds/preraid.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 90413, "gems": [76884, 76658], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90432, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86634, "enchant": 4804, "gems": [76680], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86831, "enchant": 4894, "reforging": 168, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 86638, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86189, "enchant": 4416, "gems": [0], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86637, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 90453, "gems": [76692, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 86635, "enchant": 4822, "gems": [76692], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90444, "enchant": 4428, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93248, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90437, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86890, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79328, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86889, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "marksmanshipHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312111", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/marksmanship/gear_sets/p2.gear.json b/ui/hunter/marksmanship/gear_sets/p2.gear.json deleted file mode 100644 index 13bd56db38..0000000000 --- a/ui/hunter/marksmanship/gear_sets/p2.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87004, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86953, "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90505, "enchant": 4804, "gems": [76692], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86963, "enchant": 4894, "reforging": 165, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 87002, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87014, "enchant": 4416, "gems": [0], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87003, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89951, "gems": [76692, 76692, 76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 87005, "enchant": 4822, "gems": [76692], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86985, "enchant": 4428, "gems": [76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90503, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86974, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87057, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87168, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/hunter/marksmanship/gear_sets/p3.gear.json b/ui/hunter/marksmanship/gear_sets/p3.gear.json deleted file mode 100644 index 9437c46efc..0000000000 --- a/ui/hunter/marksmanship/gear_sets/p3.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 96788, "gems": [95346, 76658] }, - { "id": 96762, "reforging": 159 }, - { "id": 96630, "enchant": 4804, "gems": [76692, 76658], "reforging": 138 }, - { "id": 95015, "enchant": 4424, "gems": [76658] }, - { "id": 95034, "enchant": 4419, "gems": [76692, 76692, 76692], "reforging": 137 }, - { "id": 96797, "randomSuffix": -340, "enchant": 4416, "gems": [76658, 0], "reforging": 152 }, - { "id": 96627, "enchant": 4430, "gems": [76692, 0], "reforging": 160, "tinker": 4898 }, - { "id": 96846, "gems": [76692, 76658, 76692], "reforging": 153 }, - { "id": 96921, "enchant": 4822, "gems": [76692, 76692, 76692] }, - { "id": 96798, "enchant": 4428, "gems": [76692], "reforging": 151 }, - { "id": 95021, "gems": [76680], "reforging": 137 }, - { "id": 96885, "gems": [76658] }, - { "id": 96741, "reforging": 159 }, - { "id": 96781, "reforging": 166 }, - { "id": 96897, "enchant": 4699, "gems": [76692, 76692], "reforging": 137 }, - {} - ] -} diff --git a/ui/hunter/marksmanship/gear_sets/preraid.gear.json b/ui/hunter/marksmanship/gear_sets/preraid.gear.json deleted file mode 100644 index 35f8cedf46..0000000000 --- a/ui/hunter/marksmanship/gear_sets/preraid.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 90413, "gems": [76884, 76658], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90432, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86634, "enchant": 4804, "gems": [76680], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86831, "enchant": 4894, "reforging": 168, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 86638, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86189, "enchant": 4416, "gems": [0], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86637, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 90453, "gems": [76692, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 86635, "enchant": 4822, "gems": [76692], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90444, "enchant": 4428, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93248, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90437, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86890, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79328, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86889, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/hunter/marksmanship/index.ts b/ui/hunter/marksmanship/index.ts deleted file mode 100644 index 63be380120..0000000000 --- a/ui/hunter/marksmanship/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player.js'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common.js'; -import { Sim } from '../../core/sim.js'; -import { TypedEvent } from '../../core/typed_event.js'; -import { MarksmanshipHunterSimUI } from './sim.js'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.MarksmanshipHunter, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new MarksmanshipHunterSimUI(document.body, player); diff --git a/ui/hunter/marksmanship/inputs.ts b/ui/hunter/marksmanship/inputs.ts deleted file mode 100644 index c14ab968bd..0000000000 --- a/ui/hunter/marksmanship/inputs.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as InputHelpers from '../../core/components/input_helpers'; -import { RotationType, Spec } from '../../core/proto/common'; -import i18n from '../../i18n/config'; - -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -export const MMRotationConfig = { - inputs: [ - InputHelpers.makeRotationEnumInput({ - fieldName: 'type', - label: i18n.t('rotation_tab.common.rotation_type.label'), - values: [ - { name: i18n.t('rotation_tab.common.rotation_type.single_target'), value: RotationType.SingleTarget }, - { name: i18n.t('rotation_tab.common.rotation_type.aoe'), value: RotationType.Aoe }, - ], - }), - ], -}; diff --git a/ui/hunter/marksmanship/presets.ts b/ui/hunter/marksmanship/presets.ts deleted file mode 100644 index 7bc7f8f10d..0000000000 --- a/ui/hunter/marksmanship/presets.ts +++ /dev/null @@ -1,97 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { APLRotation_Type as APLRotationType } from '../../core/proto/apl.js'; -import { ConsumesSpec, Profession, PseudoStat, Spec, Stat } from '../../core/proto/common'; -import { HunterOptions_PetType as PetType, SurvivalHunter_Options as HunterOptions } from '../../core/proto/hunter'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import P2Build from './builds/p2.build.json'; -import P3Build from './builds/p3.build.json'; -import PreRaidBuild from './builds/preraid.build.json'; -import P2Gear from './gear_sets/p2.gear.json'; -import P3Gear from './gear_sets/p3.gear.json'; -import PreRaidGear from './gear_sets/preraid.gear.json'; -import AoeApl from './apls/aoe.apl.json'; -import Apl from './apls/mm.apl.json'; - -export const PRERAID_PRESET_GEAR = PresetUtils.makePresetGear('Pre-raid', PreRaidGear); -export const P2_PRESET_GEAR = PresetUtils.makePresetGear('P2', P2Gear); -export const P3_PRESET_GEAR = PresetUtils.makePresetGear('P3 (WiP)', P3Gear); -export const ROTATION_PRESET_MM = PresetUtils.makePresetAPLRotation('Single Target', Apl); -export const ROTATION_PRESET_AOE = PresetUtils.makePresetAPLRotation('AOE', AoeApl); -export const DefaultTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '312111', - }), -}; - -export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( - 'P2', - Stats.fromMap( - { - [Stat.StatAgility]: 1, - [Stat.StatRangedAttackPower]: 0.35, - [Stat.StatHitRating]: 0.44, - [Stat.StatCritRating]: 0.43, - [Stat.StatHasteRating]: 0.35, - [Stat.StatMasteryRating]: 0.19, - [Stat.StatExpertiseRating]: 0.44, - }, - { - [PseudoStat.PseudoStatRangedDps]: 1.75, - }, - ), -); -export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( - 'P3', - Stats.fromMap( - { - [Stat.StatAgility]: 1, - [Stat.StatRangedAttackPower]: 0.33, - [Stat.StatHitRating]: 0.47, - [Stat.StatCritRating]: 0.46, - [Stat.StatHasteRating]: 0.35, - [Stat.StatMasteryRating]: 0.2, - [Stat.StatExpertiseRating]: 0.47, - }, - { - [PseudoStat.PseudoStatRangedDps]: 1.72, - }, - ), -); - -export const PRERAID_PRESET = PresetUtils.makePresetBuildFromJSON('Pre-raid', Spec.SpecMarksmanshipHunter, PreRaidBuild, { - epWeights: P2_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); -export const P2_PRESET = PresetUtils.makePresetBuildFromJSON('P2', Spec.SpecMarksmanshipHunter, P2Build, { - epWeights: P2_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); -export const P3_PRESET = PresetUtils.makePresetBuildFromJSON('P3 (WiP)', Spec.SpecMarksmanshipHunter, P3Build, { - epWeights: P3_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); - -export const MMDefaultOptions = HunterOptions.create({ - classOptions: { - useHuntersMark: true, - petType: PetType.Tallstrider, - petUptime: 1, - glaiveTossSuccess: 0.8, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76084, // Flask of the Winds - foodId: 74648, // Seafood Magnifique Feast - potId: 76089, // Potion of the Tol'vir - prepotId: 76089, // Potion of the Tol'vir -}); - -export const OtherDefaults = { - distanceFromTarget: 24, - iterationCount: 25000, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, -}; diff --git a/ui/hunter/presets.ts b/ui/hunter/presets.ts new file mode 100644 index 0000000000..1e9febe3a0 --- /dev/null +++ b/ui/hunter/presets.ts @@ -0,0 +1,79 @@ +import * as PresetUtils from '../core/preset_utils'; +import { APLRotation_Type as APLRotationType } from '../core/proto/apl.js'; +import { ConsumesSpec, Profession, PseudoStat, Spec, Stat } from '../core/proto/common'; +import { HunterOptions_PetType as PetType, Hunter_Options as HunterOptions } from '../core/proto/hunter'; +import { SavedTalents } from '../core/proto/ui'; +import { Stats } from '../core/proto_utils/stats'; +import BlankAPL from './apls/blank.apl.json' +import BlankGear from './gear_sets/blank.gear.json'; + +// Preset options for this spec. +// Eventually we will import these values for the raid sim too, so its good to +// keep them in a separate file. + +export const BLANK_APL = PresetUtils.makePresetAPLRotation('Blank', BlankAPL) + +export const BLANK_GEARSET = PresetUtils.makePresetGear('Blank', BlankGear); + +export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( + 'P2', + Stats.fromMap( + { + [Stat.StatAgility]: 1, + [Stat.StatRangedAttackPower]: 0.35, + }, + { + [PseudoStat.PseudoStatRangedDps]: 1.75, + }, + ), +); +export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( + 'P3', + Stats.fromMap( + { + [Stat.StatAgility]: 1, + [Stat.StatRangedAttackPower]: 0.33, + }, + { + [PseudoStat.PseudoStatRangedDps]: 1.72, + }, + ), +); + +// Default talents. Uses the wowhead calculator format, make the talents on +// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. + +export const Talents = { + name: 'A', + data: SavedTalents.create({ + talentsString: '', + }), +}; + +// export const PRERAID_PRESET = PresetUtils.makePresetBuildFromJSON('Pre-raid', Spec.SpecHunter, PreRaidBuild, { +// epWeights: P2_EP_PRESET, +// rotationType: APLRotationType.TypeAuto, +// }); + +export const MMDefaultOptions = HunterOptions.create({ + classOptions: { + useHuntersMark: true, + petType: PetType.Tallstrider, + petUptime: 1, + glaiveTossSuccess: 0.8, + }, +}); + +export const DefaultConsumables = ConsumesSpec.create({ + flaskId: 76084, // Flask of the Winds + foodId: 74648, // Seafood Magnifique Feast + potId: 76089, // Potion of the Tol'vir + prepotId: 76089, // Potion of the Tol'vir +}); + +export const OtherDefaults = { + distanceFromTarget: 24, + iterationCount: 25000, + profession1: Profession.Engineering, + profession2: Profession.Tailoring, +}; diff --git a/ui/hunter/shared.ts b/ui/hunter/shared.ts deleted file mode 100644 index bc888df765..0000000000 --- a/ui/hunter/shared.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { StatMods } from '../core/components/character_stats'; -import * as Mechanics from '../core/constants/mechanics'; -import { Player } from '../core/player'; -import { ItemSlot, PseudoStat, Race, RangedWeaponType, Spec, Stat } from '../core/proto/common'; -import { Stats } from '../core/proto_utils/stats'; - -export const sharedHunterDisplayStatsModifiers = ( - player: Player | Player | Player, -): StatMods => { - return {}; -}; diff --git a/ui/hunter/marksmanship/sim.ts b/ui/hunter/sim.ts similarity index 50% rename from ui/hunter/marksmanship/sim.ts rename to ui/hunter/sim.ts index 1094bfb924..e2de0a53b4 100644 --- a/ui/hunter/marksmanship/sim.ts +++ b/ui/hunter/sim.ts @@ -1,20 +1,19 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; -import { Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as HunterInputs from '../inputs'; -import { sharedHunterDisplayStatsModifiers } from '../shared'; +import * as BuffDebuffInputs from '../core/components/inputs/buffs_debuffs'; +import * as OtherInputs from '../core/components/inputs/other_inputs'; +import { ReforgeOptimizer } from '../core/components/suggest_reforges_action'; +import * as Mechanics from '../core/constants/mechanics.js'; +import { IndividualSimUI, registerSpecConfig } from '../core/individual_sim_ui'; +import { Player } from '../core/player'; +import { PlayerClasses } from '../core/player_classes'; +import { APLRotation } from '../core/proto/apl'; +import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../core/proto/common'; +import { Stats, UnitStat } from '../core/proto_utils/stats'; +import { defaultRaidBuffMajorDamageCooldowns } from '../core/proto_utils/utils'; +import * as HunterInputs from './inputs'; import * as Inputs from './inputs'; import * as Presets from './presets'; -const SPEC_CONFIG = registerSpecConfig(Spec.SpecMarksmanshipHunter, { +const SPEC_CONFIG = registerSpecConfig(Spec.SpecHunter, { cssClass: 'marksmanship-hunter-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Hunter), // List any known bugs / issues here and they'll be shown on the site. @@ -24,68 +23,40 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMarksmanshipHunter, { epStats: [ Stat.StatAgility, Stat.StatRangedAttackPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, ], gemStats: [ Stat.StatStamina, Stat.StatAgility, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, ], epPseudoStats: [PseudoStat.PseudoStatRangedDps], // Reference stat against which to calculate EP. epReferenceStat: Stat.StatAgility, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatRangedAttackPower, Stat.StatMasteryRating, Stat.StatExpertiseRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatRangedHastePercent], + [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatRangedAttackPower], + [PseudoStat.PseudoStatRangedHitPercent, PseudoStat.PseudoStatRangedCritPercent, PseudoStat.PseudoStatRangedHastePercent], ), - modifyDisplayStats: (player: Player) => { - return sharedHunterDisplayStatsModifiers(player); - }, itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], defaults: { // Default equipped gear. - gear: Presets.P2_PRESET_GEAR.gear, + gear: Presets.BLANK_GEARSET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.P2_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - return new Stats() - .withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5) - .withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - })(), other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. - talents: Presets.DefaultTalents.data, + talents: Presets.Talents.data, // Default spec-specific settings. specOptions: Presets.MMDefaultOptions, // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - blessingOfKings: true, - trueshotAura: true, - leaderOfThePack: true, - blessingOfMight: true, - commandingShout: true, - unholyAura: true, - bloodlust: true, }), partyBuffs: PartyBuffs.create({}), individualBuffs: IndividualBuffs.create({}), debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - curseOfElements: true, + }), }, @@ -107,43 +78,39 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMarksmanshipHunter, { }, presets: { - epWeights: [Presets.P2_EP_PRESET, Presets.P3_EP_PRESET], + epWeights: [], // Preset talents that the user can quickly select. - talents: [Presets.DefaultTalents], + talents: [], // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_MM, Presets.ROTATION_PRESET_AOE], + rotations: [], // Preset gear configurations that the user can quickly select. - builds: [Presets.PRERAID_PRESET, Presets.P2_PRESET, Presets.P3_PRESET], - gear: [Presets.PRERAID_PRESET_GEAR, Presets.P2_PRESET_GEAR, Presets.P3_PRESET_GEAR], + builds: [], + gear: [], }, - autoRotation: (_: Player): APLRotation => { - return Presets.ROTATION_PRESET_MM.rotation.rotation!; + autoRotation: (_: Player): APLRotation => { + return Presets.BLANK_APL.rotation.rotation!; }, raidSimPresets: [ { - spec: Spec.SpecMarksmanshipHunter, - talents: Presets.DefaultTalents.data, + spec: Spec.SpecHunter, + talents: Presets.Talents.data, specOptions: Presets.MMDefaultOptions, consumables: Presets.DefaultConsumables, defaultFactionRaces: { [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, + [Faction.Alliance]: Race.RaceDraenei, [Faction.Horde]: Race.RaceOrc, }, defaultGear: { [Faction.Unknown]: {}, [Faction.Alliance]: { - 1: Presets.PRERAID_PRESET_GEAR.gear, - 2: Presets.P2_PRESET_GEAR.gear, - 3: Presets.P3_PRESET_GEAR.gear, + 1: Presets.BLANK_GEARSET.gear, }, [Faction.Horde]: { - 1: Presets.PRERAID_PRESET_GEAR.gear, - 2: Presets.P2_PRESET_GEAR.gear, - 3: Presets.P3_PRESET_GEAR.gear, + 1: Presets.BLANK_GEARSET.gear, }, }, otherDefaults: Presets.OtherDefaults, @@ -151,8 +118,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMarksmanshipHunter, { ], }); -export class MarksmanshipHunterSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { +export class HunterSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); this.reforger = new ReforgeOptimizer(this); diff --git a/ui/hunter/survival/apls/aoe.apl.json b/ui/hunter/survival/apls/aoe.apl.json deleted file mode 100644 index c0eb969185..0000000000 --- a/ui/hunter/survival/apls/aoe.apl.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":13165}}},"doAtValue":{"const":{"val":"-10s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":1130}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":13812}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"1s"}}}},"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":131894}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":56343}}},"castSpell":{"spellId":{"spellId":53301}}}}, - {"action":{"castSpell":{"spellId":{"spellId":2643}}}}, - {"action":{"castSpell":{"spellId":{"spellId":120679}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentFocus":{}},"rhs":{"const":{"val":"50"}}}},"castSpell":{"spellId":{"spellId":82726}}}}, - {"action":{"castSpell":{"spellId":{"spellId":13812}}}}, - {"action":{"castSpell":{"spellId":{"spellId":53351}}}}, - {"action":{"castSpell":{"spellId":{"spellId":3674}}}}, - {"action":{"castSpell":{"spellId":{"spellId":117050}}}}, - {"action":{"castSpell":{"spellId":{"spellId":120697}}}}, - {"action":{"castSpell":{"spellId":{"spellId":120360}}}}, - {"action":{"castSpell":{"spellId":{"spellId":77767}}}} - ] -} diff --git a/ui/hunter/survival/apls/sv.apl.json b/ui/hunter/survival/apls/sv.apl.json deleted file mode 100644 index 6305b70504..0000000000 --- a/ui/hunter/survival/apls/sv.apl.json +++ /dev/null @@ -1,332 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - { "action": { "castSpell": { "spellId": { "spellId": 13165 } } }, "doAtValue": { "const": { "val": "-10s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } }, "doAtValue": { "const": { "val": "-5s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 1130 } } }, "doAtValue": { "const": { "val": "-4s" } } }, - { "action": { "castSpell": { "spellId": { "otherId": "OtherActionPotion" } } }, "doAtValue": { "const": { "val": "-0.5s" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 3674 } } }, "doAtValue": { "const": { "val": "-0.5s" } } } - ], - "priorityList": [ - { - "action": { "condition": { "not": { "val": { "sequenceIsComplete": { "sequenceName": "opener" } } } }, "groupReference": { "groupName": "Opener" } } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 53301 } } } }, - { - "action": { - "condition": { "auraIsActive": { "auraId": { "spellId": 120668, "tag": -1 }, "includeReactionTime": true } }, - "castSpell": { "spellId": { "spellId": 120360 } } - } - }, - { "action": { "condition": { "isExecutePhase": { "threshold": "E20" } }, "castSpell": { "spellId": { "spellId": 53351 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 131894 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120697 } } } }, - { - "action": { - "condition": { - "and": { - "vals": [ - { "cmp": { "op": "OpGe", "lhs": { "remainingTime": {} }, "rhs": { "const": { "val": "8s" } } } }, - { - "or": { - "vals": [ - { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 3674 } } } } }, - { - "cmp": { - "op": "OpLe", - "lhs": { "dotRemainingTime": { "spellId": { "spellId": 3674 } } }, - "rhs": { "dotTickFrequency": { "spellId": { "spellId": 3674 } } } - } - } - ] - } - } - ] - } - }, - "castSpell": { "spellId": { "spellId": 3674 } } - } - }, - { - "action": { - "condition": { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - "castSpell": { "spellId": { "spellId": 1978 } } - } - }, - { - "action": { - "condition": { - "cmp": { "op": "OpGt", "lhs": { "dotRemainingTime": { "spellId": { "spellId": 1978 } } }, "rhs": { "const": { "val": "6s" } } } - }, - "resetSequence": { "sequenceName": "cobra" } - } - }, - { - "action": { - "condition": { - "cmp": { "op": "OpLe", "lhs": { "dotRemainingTime": { "spellId": { "spellId": 1978 } } }, "rhs": { "const": { "val": "6s" } } } - }, - "sequence": { "name": "cobra", "actions": [{ "castSpell": { "spellId": { "spellId": 77767 } } }] } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 120679 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 117050 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 109259 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120360 } } } }, - { "action": { "condition": { "variableRef": { "name": "ShouldAS" } }, "castSpell": { "spellId": { "spellId": 3044 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 13812 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 77767 } } } } - ], - "groups": [ - { - "name": "Opener", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 3674 } } } }, - { "action": { "condition": { "spellIsKnown": { "spellId": { "spellId": 120679 } } }, "groupReference": { "groupName": "Dire Beast Opener" } } }, - { "action": { "condition": { "spellIsKnown": { "spellId": { "spellId": 82726 } } }, "groupReference": { "groupName": "Fervor Opener" } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 117050 } } }] } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 109259 } } }] } } }, - { "action": { "sequence": { "name": "opener", "actions": [{ "castSpell": { "spellId": { "spellId": 120360 } } }] } } } - ] - }, - { - "name": "Dire Beast Opener", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 131894 } } } }, - { - "action": { - "sequence": { - "name": "stampede", - "actions": [{ "castSpell": { "spellId": { "spellId": 121818 } } }, { "wait": { "duration": { "gcdTimeToReady": {} } } }] - } - } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120679 } } } }, - { - "action": { - "condition": { "auraIsInactive": { "auraId": { "spellId": 56343 }, "includeReactionTime": true } }, - "castSpell": { "spellId": { "spellId": 53301 } } - } - }, - { - "action": { - "condition": { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - "sequence": { "name": "SrS", "actions": [{ "castSpell": { "spellId": { "spellId": 1978 } } }] } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 53301 } } } } - ] - }, - { - "name": "Fervor Opener", - "actions": [ - { - "action": { - "sequence": { - "name": "amoc", - "actions": [{ "castSpell": { "spellId": { "spellId": 131894 } } }, { "wait": { "duration": { "gcdTimeToReady": {} } } }] - } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 82726 } } } }, - { - "action": { - "condition": { "auraIsInactive": { "auraId": { "spellId": 56343 }, "includeReactionTime": true } }, - "castSpell": { "spellId": { "spellId": 53301 } } - } - }, - { - "action": { - "condition": { - "and": { - "vals": [ - { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - { "auraIsInactive": { "auraId": { "spellId": 56343 }, "includeReactionTime": true } } - ] - } - }, - "sequence": { "name": "SrS 1", "actions": [{ "castSpell": { "spellId": { "spellId": 2643 } } }] } - } - }, - { "action": { "groupReference": { "groupName": "Cooldowns" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 53301 } } } }, - { - "action": { - "condition": { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - "sequence": { "name": "SrS 2", "actions": [{ "castSpell": { "spellId": { "spellId": 2643 } } }] } - } - }, - { - "action": { - "condition": { - "and": { - "vals": [ - { "not": { "val": { "dotIsActive": { "spellId": { "spellId": 1978 } } } } }, - { "not": { "val": { "spellInFlight": { "spellId": { "spellId": 2643 } } } } } - ] - } - }, - "sequence": { "name": "SrS 3", "actions": [{ "castSpell": { "spellId": { "spellId": 1978 } } }] } - } - } - ] - }, - { - "name": "Cooldowns", - "actions": [ - { "action": { "castSpell": { "spellId": { "spellId": 126734 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 53401 } } } }, - { - "action": { - "condition": { "cmp": { "op": "OpLe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "50" } } } }, - "castSpell": { "spellId": { "spellId": 82726 } } - } - }, - { "action": { "castSpell": { "spellId": { "spellId": 3045 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 33697 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 26297 } } } }, - { "action": { "autocastOtherCooldowns": {} } }, - { "action": { "castSpell": { "spellId": { "spellId": 114206, "tag": -1 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 2825, "tag": -1 } } } }, - { "action": { "castSpell": { "spellId": { "spellId": 120668, "tag": -1 } } } }, - { "action": { "groupReference": { "groupName": "Second Pot" } } }, - { "action": { "castSpell": { "spellId": { "spellId": 121818 } } } } - ] - }, - { - "name": "Second Pot", - "actions": [ - { - "action": { - "condition": { - "or": { - "vals": [ - { "isExecutePhase": { "threshold": "E20" } }, - { "auraIsActive": { "auraId": { "spellId": 3045 }, "includeReactionTime": true } }, - { - "and": { - "vals": [ - { "dotIsActive": { "spellId": { "spellId": 131894 } } }, - { - "cmp": { - "op": "OpGt", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 3045 } } }, - "rhs": { - "math": { "op": "OpSub", "lhs": { "remainingTime": {} }, "rhs": { "const": { "val": "15s" } } } - } - } - } - ] - } - } - ] - } - }, - "castSpell": { "spellId": { "itemId": 76089 } } - } - } - ] - } - ], - "valueVariables": [ - { - "name": "ShouldAS", - "value": { - "or": { - "vals": [ - { - "and": { - "vals": [ - { "spellIsKnown": { "spellId": { "spellId": 82726 } } }, - { "spellIsReady": { "spellId": { "spellId": 82726 } } }, - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "50" } } } } - ] - } - }, - { - "and": { - "vals": [ - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "55" } } } }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 3674 } } }, - "rhs": { "const": { "val": "4s" } } - } - }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 131894 } } }, - "rhs": { "const": { "val": "10s" } } - } - } - ] - } - }, - { - "and": { - "vals": [ - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "30" } } } }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 3674 } } }, - "rhs": { "const": { "val": "6s" } } - } - }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 53301 } } }, - "rhs": { "const": { "val": "4s" } } - } - }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 117050 } } }, - "rhs": { "const": { "val": "4s" } } - } - }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 120360 } } }, - "rhs": { "const": { "val": "4s" } } - } - }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 131894 } } }, - "rhs": { "const": { "val": "10s" } } - } - } - ] - } - }, - { - "and": { - "vals": [ - { "spellIsKnown": { "spellId": { "spellId": 131894 } } }, - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "70" } } } }, - { - "cmp": { - "op": "OpGe", - "lhs": { "spellTimeToReady": { "spellId": { "spellId": 131894 } } }, - "rhs": { "const": { "val": "5s" } } - } - } - ] - } - }, - { "cmp": { "op": "OpGe", "lhs": { "currentFocus": {} }, "rhs": { "const": { "val": "85" } } } } - ] - } - } - } - ] -} diff --git a/ui/hunter/survival/builds/p2.build.json b/ui/hunter/survival/builds/p2.build.json deleted file mode 100644 index ee226ae75d..0000000000 --- a/ui/hunter/survival/builds/p2.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 87004, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86953, "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90505, "enchant": 4804, "gems": [76692], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86963, "enchant": 4894, "reforging": 165, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 87002, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87014, "enchant": 4416, "gems": [0], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87003, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89951, "gems": [76692, 76692, 76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 87005, "enchant": 4822, "gems": [76692], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86985, "enchant": 4428, "gems": [76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90503, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86974, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87057, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87168, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "survivalHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312111", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/survival/builds/p3.build.json b/ui/hunter/survival/builds/p3.build.json deleted file mode 100644 index 16d6e41431..0000000000 --- a/ui/hunter/survival/builds/p3.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceTroll", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 96788, "gems": [95346, 76658] }, - { "id": 96815, "gems": [76692], "reforging": 137 }, - { "id": 96630, "enchant": 4804, "gems": [76692, 76658], "reforging": 139 }, - { "id": 96833, "enchant": 4894, "gems": [76680], "reforging": 167, "tinker": 4897 }, - { "id": 95034, "enchant": 4419, "gems": [76692, 76692, 76692], "reforging": 137 }, - { "id": 96797, "randomSuffix": -336, "enchant": 4416, "gems": [76658, 0] }, - { "id": 96627, "enchant": 4431, "gems": [76692, 0], "reforging": 160, "tinker": 4898 }, - { "id": 96846, "gems": [76692, 76658, 76692], "tinker": 4223 }, - { "id": 96921, "enchant": 4822, "gems": [76692, 76692, 76692] }, - { "id": 95009, "enchant": 4428, "gems": [76658, 76680], "reforging": 165 }, - { "id": 95021, "gems": [76680], "reforging": 137 }, - { "id": 96885, "gems": [76692], "reforging": 153 }, - { "id": 96741, "reforging": 159 }, - { "id": 96781, "reforging": 166 }, - { "id": 96844, "enchant": 4699, "gems": [76692, 76692] }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "survivalHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312213", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/survival/builds/preraid.build.json b/ui/hunter/survival/builds/preraid.build.json deleted file mode 100644 index de4fbe6138..0000000000 --- a/ui/hunter/survival/builds/preraid.build.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "apiVersion": 2, - "raidBuffs": { - "trueshotAura": true, - "unholyAura": true, - "leaderOfThePack": true, - "blessingOfMight": true, - "blessingOfKings": true, - "commandingShout": true, - "bloodlust": true, - "stormlashTotemCount": 4, - "skullBannerCount": 2 - }, - "debuffs": { - "physicalVulnerability": true, - "weakenedArmor": true, - "curseOfElements": true - }, - "partyBuffs": {}, - "player": { - "name": "Player", - "race": "RaceOrc", - "class": "ClassHunter", - "equipment": { - "items": [ - { "id": 86636, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90432, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 89979, "enchant": 4804, "gems": [76692], "upgradeStep": "UpgradeStepTwo" }, - { "id": 89076, "enchant": 4894, "reforging": 137, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 86638, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86189, "enchant": 4416, "gems": [0], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86637, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 90453, "gems": [76692, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 86635, "enchant": 4822, "gems": [76692], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93267, "enchant": 4428, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93248, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90437, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86890, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79328, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86889, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] - }, - "consumables": { - "prepotId": 76089, - "potId": 76089, - "flaskId": 76084, - "foodId": 74648 - }, - "bonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - }, - "itemSwap": { - "items": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}], - "prepullBonusStats": { - "apiVersion": 2, - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "pseudoStats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - } - }, - "buffs": {}, - "survivalHunter": { - "options": { - "classOptions": { - "petType": "Tallstrider", - "petUptime": 1, - "useHuntersMark": true, - "glaiveTossSuccess": 0.8 - } - } - }, - "talentsString": "312111", - "profession1": "Engineering", - "profession2": "Tailoring", - "cooldowns": {}, - "rotation": { - "type": "TypeAuto" - }, - "reactionTimeMs": 100, - "distanceFromTarget": 24, - "healingModel": {} - }, - "encounter": { - "apiVersion": 2, - "duration": 300, - "durationVariation": 60, - "executeProportion20": 0.2, - "executeProportion25": 0.25, - "executeProportion35": 0.35, - "executeProportion45": 0.45, - "executeProportion90": 0.9, - "targets": [ - { - "id": 31146, - "name": "Raid Target", - "level": 93, - "mobType": "MobTypeMechanical", - "stats": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24835, 0, 120016403, 0, 0], - "minBaseDamage": 550000, - "damageSpread": 0.4, - "swingSpeed": 2 - } - ] - } -} diff --git a/ui/hunter/survival/gear_sets/p2.gear.json b/ui/hunter/survival/gear_sets/p2.gear.json deleted file mode 100644 index 13bd56db38..0000000000 --- a/ui/hunter/survival/gear_sets/p2.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87004, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86953, "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90505, "enchant": 4804, "gems": [76692], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86963, "enchant": 4894, "reforging": 165, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 87002, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87014, "enchant": 4416, "gems": [0], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87003, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89951, "gems": [76692, 76692, 76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 87005, "enchant": 4822, "gems": [76692], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86985, "enchant": 4428, "gems": [76692], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90503, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86974, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87057, "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87168, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/hunter/survival/gear_sets/p3.gear.json b/ui/hunter/survival/gear_sets/p3.gear.json deleted file mode 100644 index 1da6fce92e..0000000000 --- a/ui/hunter/survival/gear_sets/p3.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 96788, "gems": [95346, 76658] }, - { "id": 96815, "gems": [76692], "reforging": 137 }, - { "id": 96630, "enchant": 4804, "gems": [76692, 76658], "reforging": 139 }, - { "id": 96833, "enchant": 4894, "gems": [76680], "reforging": 167, "tinker": 4897 }, - { "id": 95034, "enchant": 4419, "gems": [76692, 76692, 76692], "reforging": 137 }, - { "id": 96797, "randomSuffix": -336, "enchant": 4416, "gems": [76658, 0] }, - { "id": 96627, "enchant": 4431, "gems": [76692, 0], "reforging": 160, "tinker": 4898 }, - { "id": 96846, "gems": [76692, 76658, 76692], "tinker": 4223 }, - { "id": 96921, "enchant": 4822, "gems": [76692, 76692, 76692] }, - { "id": 95009, "enchant": 4428, "gems": [76658, 76680], "reforging": 165 }, - { "id": 95021, "gems": [76680], "reforging": 137 }, - { "id": 96885, "gems": [76692], "reforging": 153 }, - { "id": 96741, "reforging": 159 }, - { "id": 96781, "reforging": 166 }, - { "id": 96844, "enchant": 4699, "gems": [76692, 76692] }, - {} - ] -} diff --git a/ui/hunter/survival/gear_sets/preraid.gear.json b/ui/hunter/survival/gear_sets/preraid.gear.json deleted file mode 100644 index 4e2964b163..0000000000 --- a/ui/hunter/survival/gear_sets/preraid.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86636, "gems": [76884, 76680], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90432, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 89979, "enchant": 4804, "gems": [76692], "upgradeStep": "UpgradeStepTwo" }, - { "id": 89076, "enchant": 4894, "reforging": 137, "upgradeStep": "UpgradeStepTwo", "tinker": 4897 }, - { "id": 86638, "enchant": 4419, "gems": [76692, 76692], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86189, "enchant": 4416, "gems": [0], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86637, "enchant": 4431, "gems": [0], "reforging": 139, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 90453, "gems": [76692, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo", "tinker": 4223 }, - { "id": 86635, "enchant": 4822, "gems": [76692], "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93267, "enchant": 4428, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 93248, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90437, "reforging": 139, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86890, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79328, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86889, "enchant": 4699, "gems": [89873, 76692], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/hunter/survival/index.ts b/ui/hunter/survival/index.ts deleted file mode 100644 index de7c5e05fc..0000000000 --- a/ui/hunter/survival/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player.js'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common.js'; -import { Sim } from '../../core/sim.js'; -import { TypedEvent } from '../../core/typed_event.js'; -import { SurvivalHunterSimUI } from './sim.js'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.SurvivalHunter, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new SurvivalHunterSimUI(document.body, player); diff --git a/ui/hunter/survival/inputs.ts b/ui/hunter/survival/inputs.ts deleted file mode 100644 index d4e4269b7c..0000000000 --- a/ui/hunter/survival/inputs.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as InputHelpers from '../../core/components/input_helpers.js'; -import { RotationType, Spec } from '../../core/proto/common.js'; -import i18n from '../../i18n/config.js'; - -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -// export const SniperTrainingUptime = InputHelpers.makeSpecOptionsNumberInput({ -// fieldName: 'sniperTrainingUptime', -// label: 'ST Uptime (%)', -// labelTooltip: 'Uptime for the Sniper Training talent, as a percent of the fight duration.', -// percent: true, -// showWhen: (player: Player) => player.getTalents().sniperTraining > 0, -// changeEmitter: (player: Player) => TypedEvent.onAny([player.specOptionsChangeEmitter, player.talentsChangeEmitter]), -// }); - -export const SVRotationConfig = { - inputs: [ - InputHelpers.makeRotationEnumInput({ - fieldName: 'type', - label: i18n.t('rotation_tab.common.rotation_type.label'), - values: [ - { name: i18n.t('rotation_tab.common.rotation_type.single_target'), value: RotationType.SingleTarget }, - { name: i18n.t('rotation_tab.common.rotation_type.aoe'), value: RotationType.Aoe }, - ], - }), - ], -}; diff --git a/ui/hunter/survival/presets.ts b/ui/hunter/survival/presets.ts deleted file mode 100644 index ad6717ecb0..0000000000 --- a/ui/hunter/survival/presets.ts +++ /dev/null @@ -1,97 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { APLRotation_Type as APLRotationType } from '../../core/proto/apl.js'; -import { ConsumesSpec, Profession, PseudoStat, Spec, Stat } from '../../core/proto/common'; -import { HunterOptions_PetType as PetType, SurvivalHunter_Options as HunterOptions } from '../../core/proto/hunter'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import P2Build from './builds/p2.build.json'; -import P3Build from './builds/p3.build.json'; -import PreRaidBuild from './builds/preraid.build.json'; -import P2Gear from './gear_sets/p2.gear.json'; -import P3Gear from './gear_sets/p3.gear.json'; -import PreRaidGear from './gear_sets/preraid.gear.json'; -import AoeApl from './apls/aoe.apl.json'; -import SvApl from './apls/sv.apl.json'; - -export const PRERAID_PRESET_GEAR = PresetUtils.makePresetGear('Pre-raid', PreRaidGear); -export const P2_PRESET_GEAR = PresetUtils.makePresetGear('P2', P2Gear); -export const P3_PRESET_GEAR = PresetUtils.makePresetGear('P3 (WiP)', P3Gear); -export const ROTATION_PRESET_SV = PresetUtils.makePresetAPLRotation('Single Target', SvApl); -export const ROTATION_PRESET_AOE = PresetUtils.makePresetAPLRotation('AOE', AoeApl); -export const DefaultTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '312111', - }), -}; - -export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( - 'P2', - Stats.fromMap( - { - [Stat.StatAgility]: 1, - [Stat.StatRangedAttackPower]: 0.38, - [Stat.StatHitRating]: 0.33, - [Stat.StatCritRating]: 0.32, - [Stat.StatHasteRating]: 0.27, - [Stat.StatMasteryRating]: 0.21, - [Stat.StatExpertiseRating]: 0.33, - }, - { - [PseudoStat.PseudoStatRangedDps]: 0.5, - }, - ), -); -export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( - 'P3', - Stats.fromMap( - { - [Stat.StatAgility]: 1, - [Stat.StatRangedAttackPower]: 0.36, - [Stat.StatHitRating]: 0.37, - [Stat.StatCritRating]: 0.36, - [Stat.StatHasteRating]: 0.32, - [Stat.StatMasteryRating]: 0.26, - [Stat.StatExpertiseRating]: 0.37, - }, - { - [PseudoStat.PseudoStatRangedDps]: 0.67, - }, - ), -); - -export const PRERAID_PRESET = PresetUtils.makePresetBuildFromJSON('Pre-raid', Spec.SpecSurvivalHunter, PreRaidBuild, { - epWeights: P2_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); -export const P2_PRESET = PresetUtils.makePresetBuildFromJSON('P2', Spec.SpecSurvivalHunter, P2Build, { - epWeights: P2_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); -export const P3_PRESET = PresetUtils.makePresetBuildFromJSON('P3 (WiP)', Spec.SpecSurvivalHunter, P3Build, { - epWeights: P3_EP_PRESET, - rotationType: APLRotationType.TypeAuto, -}); - -export const SVDefaultOptions = HunterOptions.create({ - classOptions: { - useHuntersMark: true, - petType: PetType.Tallstrider, - petUptime: 1, - glaiveTossSuccess: 0.8, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76084, // Flask of the Winds - foodId: 74648, // Seafood Magnifique Feast - potId: 76089, // Potion of the Tol'vir - prepotId: 76089, // Potion of the Tol'vir -}); - -export const OtherDefaults = { - distanceFromTarget: 24, - iterationCount: 25000, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, -}; diff --git a/ui/hunter/survival/sim.ts b/ui/hunter/survival/sim.ts deleted file mode 100644 index 658ffc57c3..0000000000 --- a/ui/hunter/survival/sim.ts +++ /dev/null @@ -1,160 +0,0 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; -import { Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as HunterInputs from '../inputs'; -import { sharedHunterDisplayStatsModifiers } from '../shared'; -import * as SVInputs from './inputs'; -import * as Presets from './presets'; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecSurvivalHunter, { - cssClass: 'survival-hunter-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Hunter), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: ['Glaive Toss hits AoE targets only once.'], - warnings: [], - // All stats for which EP should be calculated. - epStats: [ - Stat.StatAgility, - Stat.StatRangedAttackPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - gemStats: [ - Stat.StatStamina, - Stat.StatAgility, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - epPseudoStats: [PseudoStat.PseudoStatRangedDps], - // Reference stat against which to calculate EP. - epReferenceStat: Stat.StatAgility, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatRangedAttackPower, Stat.StatMasteryRating, Stat.StatExpertiseRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatRangedHastePercent], - ), - modifyDisplayStats: (player: Player) => { - return sharedHunterDisplayStatsModifiers(player); - }, - itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], - defaults: { - // Default equipped gear. - gear: Presets.P2_PRESET_GEAR.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P2_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - return new Stats() - .withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5) - .withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - })(), - - other: Presets.OtherDefaults, - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.DefaultTalents.data, - // Default spec-specific settings. - specOptions: Presets.SVDefaultOptions, - // Default raid/party buffs settings. - raidBuffs: RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - blessingOfKings: true, - trueshotAura: true, - leaderOfThePack: true, - blessingOfMight: true, - commandingShout: true, - unholyAura: true, - bloodlust: true, - }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - curseOfElements: true, - }), - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [HunterInputs.PetTypeInput()], - // Inputs to include in the 'Rotation' section on the settings tab. - rotationInputs: SVInputs.SVRotationConfig, - petConsumeInputs: [], - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [BuffDebuffInputs.StaminaBuff, BuffDebuffInputs.SpellDamageDebuff, BuffDebuffInputs.MajorArmorDebuff], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [HunterInputs.PetUptime(), HunterInputs.GlaiveTossChance(), OtherInputs.InputDelay, OtherInputs.DistanceFromTarget, OtherInputs.TankAssignment], - }, - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: false, - }, - - presets: { - epWeights: [Presets.P2_EP_PRESET, Presets.P3_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.DefaultTalents], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_SV, Presets.ROTATION_PRESET_AOE], - // Preset gear configurations that the user can quickly select. - builds: [Presets.PRERAID_PRESET, Presets.P2_PRESET, Presets.P3_PRESET], - gear: [Presets.PRERAID_PRESET_GEAR, Presets.P2_PRESET_GEAR, Presets.P3_PRESET_GEAR], - }, - - autoRotation: (player: Player): APLRotation => { - return player.sim.encounter.targets.length >= 3 ? Presets.ROTATION_PRESET_AOE.rotation.rotation! : Presets.ROTATION_PRESET_SV.rotation.rotation!; - }, - - raidSimPresets: [ - { - spec: Spec.SpecSurvivalHunter, - talents: Presets.DefaultTalents.data, - specOptions: Presets.SVDefaultOptions, - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.PRERAID_PRESET_GEAR.gear, - 2: Presets.P2_PRESET_GEAR.gear, - 3: Presets.P3_PRESET_GEAR.gear, - }, - [Faction.Horde]: { - 1: Presets.PRERAID_PRESET_GEAR.gear, - 2: Presets.P2_PRESET_GEAR.gear, - 3: Presets.P3_PRESET_GEAR.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class SurvivalHunterSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this); - } -} diff --git a/ui/mage/apls/blank.apl.json b/ui/mage/apls/blank.apl.json new file mode 100644 index 0000000000..725b143fed --- /dev/null +++ b/ui/mage/apls/blank.apl.json @@ -0,0 +1,4 @@ +{ + "type": "TypeAPL", + "priorityList": [] +} diff --git a/ui/mage/arcane/apls/Arcane_T15_4pc.apl.json b/ui/mage/arcane/apls/Arcane_T15_4pc.apl.json deleted file mode 100644 index 6e1c43e45a..0000000000 --- a/ui/mage/arcane/apls/Arcane_T15_4pc.apl.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":55342}}},"doAtValue":{"const":{"val":"-4.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":30451}}},"doAtValue":{"const":{"val":"-1.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":116011},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":108978}}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}},{"auraIsActive":{"auraId":{"spellId":108978},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpMul","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"const":{"val":"3"}}}}}}]}},"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"strictMultidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":114923}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"condition":{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":33697}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":12042}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":12042}}}]}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":12042}}},{"spellIsReady":{"spellId":{"spellId":108978}}}]}},"castSpell":{"spellId":{"itemId":36799}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":12042}}},{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"10"}}}},{"anyTrinketStatProcsActive":{"statType1":3,"statType2":6,"statType3":7}}]}}]}},"castSpell":{"spellId":{"spellId":108978}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":108978}}},"rhs":{"spellCastTime":{"spellId":{"spellId":7268}}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":108978}}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"spellTravelTime":{"spellId":{"spellId":44425}}}}}]}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellTravelTime":{"spellId":{"spellId":44425}}}}}]}},"castSpell":{"spellId":{"spellId":2136}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"250000"}}}}]}},"castSpell":{"spellId":{"itemId":36799}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}},{"auraIsInactive":{"auraId":{"spellId":79683},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}},{"auraIsActive":{"auraId":{"spellId":79683},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"92%"}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"96%"}}}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"96%"}}}}]}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"castSpell":{"spellId":{"spellId":30451}}}} - ] - } diff --git a/ui/mage/arcane/apls/arcane_cleave.apl.json b/ui/mage/arcane/apls/arcane_cleave.apl.json deleted file mode 100644 index 9cd43fb7f1..0000000000 --- a/ui/mage/arcane/apls/arcane_cleave.apl.json +++ /dev/null @@ -1,16 +0,0 @@ - { - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":116011}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpMul","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"const":{"val":"3"}}}}}}]}},"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"strictMultidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":114923}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"condition":{"auraIsInactiveWithReactionTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948}}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"auraIsActiveWithReactionTime":{"auraId":{"spellId":79683}}},"channelSpell":{"spellId":{"spellId":7268},"interruptIf":{}}}}, - {"action":{"castSpell":{"spellId":{"spellId":30451}}}} - ] - } diff --git a/ui/mage/arcane/apls/default.apl.json b/ui/mage/arcane/apls/default.apl.json deleted file mode 100644 index 4d65cc6e22..0000000000 --- a/ui/mage/arcane/apls/default.apl.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":55342}}},"doAtValue":{"const":{"val":"-4.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":30451}}},"doAtValue":{"const":{"val":"-1.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":116011},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":108978}}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}},{"auraIsActive":{"auraId":{"spellId":108978},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpMul","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"const":{"val":"3"}}}}}}]}},"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"strictMultidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":114923}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"condition":{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":33697}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":12042}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":12042}}}]}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":12042}}},{"spellIsReady":{"spellId":{"spellId":108978}}}]}},"castSpell":{"spellId":{"itemId":36799}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":12042}}},{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"10"}}}},{"allTrinketStatProcsActive":{"statType1":3,"statType2":6,"statType3":7}}]}}]}},"castSpell":{"spellId":{"spellId":108978}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":108978}}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"spellTravelTime":{"spellId":{"spellId":44425}}}}}]}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellCastTime":{"spellId":{"spellId":30451}}}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellTravelTime":{"spellId":{"spellId":44425}}}}}]}},"castSpell":{"spellId":{"spellId":2136}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"250000"}}}}]}},"castSpell":{"spellId":{"itemId":36799}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"auraIsInactive":{"auraId":{"spellId":79683},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"auraIsActive":{"auraId":{"spellId":79683},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"95%"}}}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"95%"}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpGe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"95%"}}}}]}},"castSpell":{"spellId":{"spellId":30451}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"90%"}}}}]}},"castSpell":{"spellId":{"spellId":44425}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraNumStacks":{"auraId":{"spellId":36032}}},"rhs":{"const":{"val":"3"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":79683},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":7268}}}}, - {"action":{"castSpell":{"spellId":{"spellId":30451}}}} - ] -} diff --git a/ui/mage/arcane/gear_sets/p1_bis.gear.json b/ui/mage/arcane/gear_sets/p1_bis.gear.json deleted file mode 100644 index 96792c15e3..0000000000 --- a/ui/mage/arcane/gear_sets/p1_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87008, "gems": [76885, 76643], "reforging": 145 }, - { "id": 87076, "reforging": 147 }, - { "id": 87011, "enchant": 4806, "gems": [76643] }, - { "id": 90512, "enchant": 4892, "reforging": 151 }, - { "id": 87169, "enchant": 4419, "gems": [76672, 76700], "reforging": 139 }, - { "id": 86948, "enchant": 4414, "gems": [0], "reforging": 151 }, - { "id": 87007, "enchant": 4430, "gems": [0], "reforging": 154, "tinker": 4898 }, - { "id": 86981, "gems": [76700, 76643, 76700], "reforging": 140 }, - { "id": 87009, "enchant": 4895, "gems": [76672] }, - { "id": 87162, "enchant": 4429, "gems": [76700], "reforging": 153 }, - { "id": 90859 }, - { "id": 86949, "reforging": 147 }, - { "id": 87175 }, - { "id": 87065, "reforging": 154 }, - { "id": 90513, "enchant": 4442, "gems": [76643], "reforging": 144 }, - { "id": 86960, "enchant": 4434, "reforging": 147 } - ] -} diff --git a/ui/mage/arcane/gear_sets/p1_post_hof.gear.json b/ui/mage/arcane/gear_sets/p1_post_hof.gear.json deleted file mode 100644 index 8149845eac..0000000000 --- a/ui/mage/arcane/gear_sets/p1_post_hof.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86970, "gems": [76885, 76672], "reforging": 153 }, - { "id": 87076, "reforging": 144 }, - { "id": 87038, "enchant": 4806, "gems": [76672], "reforging": 147 }, - { "id": 86971, "enchant": 4892, "reforging": 145 }, - { "id": 87010, "enchant": 4419, "gems": [76700, 76700], "reforging": 146 }, - { "id": 86948, "enchant": 4414, "gems": [0], "reforging": 168 }, - { "id": 87007, "enchant": 4430, "gems": [0], "reforging": 154, "tinker": 4898 }, - { "id": 86981, "gems": [76700, 76643, 76700], "reforging": 153 }, - { "id": 87009, "enchant": 4895, "gems": [76672] }, - { "id": 86969, "enchant": 4429, "gems": [76700] }, - { "id": 90859 }, - { "id": 86949, "reforging": 145 }, - { "id": 79331 }, - { "id": 87065, "reforging": 154 }, - { "id": 87066, "enchant": 4442, "reforging": 146 }, - { "id": 86960, "enchant": 4434, "reforging": 147 } - ] -} diff --git a/ui/mage/arcane/gear_sets/p1_post_msv.gear.json b/ui/mage/arcane/gear_sets/p1_post_msv.gear.json deleted file mode 100644 index 47385b8a11..0000000000 --- a/ui/mage/arcane/gear_sets/p1_post_msv.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87073, "gems": [76885, 76643] }, - { "id": 87076, "reforging": 147 }, - { "id": 87038, "enchant": 4806, "gems": [76672], "reforging": 144 }, - { "id": 89936, "enchant": 4892, "reforging": 145 }, - { "id": 87027, "enchant": 4419, "gems": [76672, 76700], "reforging": 145 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 167 }, - { "id": 87052, "enchant": 4430, "gems": [76643, 0], "reforging": 165, "tinker": 4898 }, - { "id": 87064, "gems": [76700, 76643, 76700] }, - { "id": 89088, "enchant": 4895, "gems": [76672], "reforging": 145 }, - { "id": 88878, "enchant": 4429, "reforging": 146 }, - { "id": 90859, "reforging": 167 }, - { "id": 89072 }, - { "id": 79331 }, - { "id": 87065 }, - { "id": 87066, "enchant": 4442, "reforging": 144 }, - { "id": 79334, "enchant": 4434, "reforging": 167 } - ] -} diff --git a/ui/mage/arcane/gear_sets/p1_prebis.gear.json b/ui/mage/arcane/gear_sets/p1_prebis.gear.json deleted file mode 100644 index 1fb25feb0b..0000000000 --- a/ui/mage/arcane/gear_sets/p1_prebis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86717, "gems": [76885, 76682], "reforging": 146 }, - { "id": 89068, "reforging": 167 }, - { "id": 86714, "enchant": 4806, "gems": [76682], "reforging": 167 }, - { "id": 89077, "enchant": 4892, "reforging": 168 }, - { "id": 86892, "gems": [76694, 76668], "reforging": 138 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 167 }, - { "id": 86718, "enchant": 4430, "gems": [0], "reforging": 153, "tinker": 4898 }, - { "id": 86857, "gems": [76668, 76682, 76694], "reforging": 140 }, - { "id": 86716, "enchant": 4825, "gems": [76694] }, - { "id": 86888, "enchant": 4426, "gems": [76668], "reforging": 168 }, - { "id": 90859, "reforging": 138 }, - { "id": 89072, "reforging": 140 }, - { "id": 79331 }, - { "id": 86907 }, - { "id": 86886, "enchant": 4442, "gems": [89882, 0], "reforging": 146 }, - { "id": 86829, "reforging": 145 } - ] -} diff --git a/ui/mage/arcane/gear_sets/p1_prebis_realistic.gear.json b/ui/mage/arcane/gear_sets/p1_prebis_realistic.gear.json deleted file mode 100644 index 7a534ffe5e..0000000000 --- a/ui/mage/arcane/gear_sets/p1_prebis_realistic.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 81289, "gems": [76885, 76694], "reforging": 153 }, - { "id": 81566, "reforging": 168 }, - { "id": 81291, "enchant": 4806, "gems": [76694], "reforging": 165 }, - { "id": 81575, "enchant": 4423, "reforging": 168 }, - { "id": 81188, "enchant": 4419, "gems": [76694], "reforging": 147 }, - { "id": 81064, "gems": [0], "reforging": 153 }, - { "id": 81240, "enchant": 4430, "gems": [0], "reforging": 153, "tinker": 4898 }, - { "id": 82861, "gems": [76694], "reforging": 168 }, - { "id": 81106, "enchant": 4825, "gems": [76668], "reforging": 151 }, - { "id": 81699, "enchant": 4426, "gems": [76668], "reforging": 147 }, - { "id": 81189 }, - { "id": 81182, "reforging": 138 }, - { "id": 81263 }, - { "id": 81192 }, - { "id": 81140, "enchant": 4442, "reforging": 168 }, - {} - ] -} diff --git a/ui/mage/arcane/gear_sets/p2_bis.gear.json b/ui/mage/arcane/gear_sets/p2_bis.gear.json deleted file mode 100644 index 93cf4a7cfa..0000000000 --- a/ui/mage/arcane/gear_sets/p2_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87008, "gems": [76885, 76643], "reforging": 144, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87028, "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87011, "enchant": 4806, "gems": [76643], "upgradeStep": "UpgradeStepTwo" }, - { "id": 90512, "enchant": 4892, "reforging": 153, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87169, "enchant": 4419, "gems": [76672, 76700], "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86948, "enchant": 4414, "gems": [0], "reforging": 153, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87007, "enchant": 4430, "gems": [0], "reforging": 154, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 86981, "gems": [76700, 76643, 76700], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87009, "enchant": 4895, "gems": [76671], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87162, "enchant": 4429, "gems": [76700], "upgradeStep": "UpgradeStepTwo" }, - { "id": 90511, "reforging": 119, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86949, "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87175, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79331, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87164, "enchant": 4442, "gems": [89882, 76700], "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86960, "enchant": 4434, "reforging": 140, "upgradeStep": "UpgradeStepTwo" } - ] -} diff --git a/ui/mage/arcane/gear_sets/p3_bis.gear.json b/ui/mage/arcane/gear_sets/p3_bis.gear.json deleted file mode 100644 index 6ac6877a59..0000000000 --- a/ui/mage/arcane/gear_sets/p3_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ - { - "items": [ - {"id":96635,"gems":[95347,76700],"reforging":140}, - {"id":96453,"reforging":147,"upgradeStep":"UpgradeStepTwo"}, - {"id":96638,"enchant":4806,"gems":[76672,76700],"reforging":147}, - {"id":95014,"enchant":4892,"gems":[76700],"reforging":140}, - {"id":96637,"enchant":4419,"gems":[76672,76700,76643],"reforging":138}, - {"id":96452,"randomSuffix":-339,"enchant":4414,"gems":[76700,0],"upgradeStep":"UpgradeStepTwo"}, - {"id":96634,"enchant":4433,"gems":[76672,0],"reforging":145,"tinker":4898}, - {"id":96462,"gems":[76672,76700,76700],"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":95030,"enchant":4825,"gems":[76672,76700,76700]}, - {"id":95004,"enchant":4429,"gems":[76700,76643],"reforging":145}, - {"id":96529,"gems":[76700],"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":95019,"gems":[76643],"reforging":154}, - {"id":96516,"reforging":147,"upgradeStep":"UpgradeStepTwo"}, - {"id":96558,"upgradeStep":"UpgradeStepTwo"}, - {"id":96518,"enchant":4442,"gems":[76672,76700],"reforging":153,"upgradeStep":"UpgradeStepTwo"}, - {"id":96562,"enchant":4434,"gems":[76672],"reforging":147,"upgradeStep":"UpgradeStepTwo"} - ] - } diff --git a/ui/mage/arcane/index.ts b/ui/mage/arcane/index.ts deleted file mode 100644 index 6a7eb8e272..0000000000 --- a/ui/mage/arcane/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { ArcaneMageSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.ArcaneMage, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new ArcaneMageSimUI(document.body, player); diff --git a/ui/mage/arcane/inputs.ts b/ui/mage/arcane/inputs.ts deleted file mode 100644 index 846447dacd..0000000000 --- a/ui/mage/arcane/inputs.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -export const MageRotationConfig = { - inputs: [], -}; diff --git a/ui/mage/arcane/presets.ts b/ui/mage/arcane/presets.ts deleted file mode 100644 index bae6ea9f64..0000000000 --- a/ui/mage/arcane/presets.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { Encounter } from '../../core/encounter'; -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Profession, Race, Stat } from '../../core/proto/common'; -import { ArcaneMage_Options as MageOptions, MageArmor } from '../../core/proto/mage'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import ArcaneApl from './apls/default.apl.json'; -import ArcaneP3APL from './apls/Arcane_T15_4pc.apl.json'; -import P1PreBISGear from './gear_sets/p1_prebis.gear.json'; -import P1BISGear from './gear_sets/p1_bis.gear.json'; -import P2BISGear from './gear_sets/p2_bis.gear.json'; -import P3BISGear from './gear_sets/p3_bis.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. -export const P1_PREBIS = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBISGear); -export const P1_BIS = PresetUtils.makePresetGear('P1 - BIS', P1BISGear); -export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BISGear); -export const P3_BIS = PresetUtils.makePresetGear('P3 - BIS', P3BISGear); - -export const ROTATION_PRESET_DEFAULT = PresetUtils.makePresetAPLRotation('Default', ArcaneApl); -export const ROTATION_PRESET_P3_4PC = PresetUtils.makePresetAPLRotation('P3 - T15 4PC', ArcaneP3APL); -// export const ROTATION_PRESET_CLEAVE = PresetUtils.makePresetAPLRotation('Cleave', ArcaneCleaveApl); - -// Preset options for EP weights -export const P3_BIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level >= 525', - Stats.fromMap({ - [Stat.StatIntellect]: 1.23, - [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 1.71, - [Stat.StatCritRating]: 0.61, - [Stat.StatHasteRating]: 0.90, - [Stat.StatMasteryRating]: 0.74, - }), -); - -export const P1_BIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level >= 495', - Stats.fromMap({ - [Stat.StatIntellect]: 1.24, - [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 1.45, - [Stat.StatCritRating]: 0.59, - [Stat.StatHasteRating]: 0.64, - [Stat.StatMasteryRating]: 0.70, - }), -); - -export const P1_PREBIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level < 495', - Stats.fromMap({ - [Stat.StatIntellect]: 1.24, - [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 1.31, - [Stat.StatCritRating]: 0.52, - [Stat.StatHasteRating]: 0.62, - [Stat.StatMasteryRating]: 0.60, - }), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/tbc/talent-calc and copy the numbers in the url. -export const ArcaneTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '311122', - }), -}; - -export const ArcaneTalentsCleave = { - name: 'Cleave', - data: SavedTalents.create({ - talentsString: '311112', - }), -}; - -export const ENCOUNTER_SINGLE_TARGET = PresetUtils.makePresetEncounter('Single Target', Encounter.defaultEncounterProto()); -export const ENCOUNTER_CLEAVE = PresetUtils.makePresetEncounter('Cleave (2 targets)', Encounter.defaultEncounterProto(2)); - -export const P1_PRESET_BUILD_DEFAULT = PresetUtils.makePresetBuild('Single Target', { - talents: ArcaneTalents, - rotation: ROTATION_PRESET_DEFAULT, - encounter: ENCOUNTER_SINGLE_TARGET, -}); - -export const P1_PRESET_BUILD_CLEAVE = PresetUtils.makePresetBuild('Cleave (2 targets)', { - talents: ArcaneTalentsCleave, - rotation: ROTATION_PRESET_DEFAULT, - encounter: ENCOUNTER_CLEAVE, -}); - -export const DefaultArcaneOptions = MageOptions.create({ - classOptions: { - defaultMageArmor: MageArmor.MageArmorFrostArmor, - }, -}); -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76085, // Flask of the Warm Sun - foodId: 74650, // Mogu Fish Stew - potId: 76093, // Potion of the Jade Serpent - prepotId: 76093, // Potion of the Jade Serpent -}); - -export const OtherDefaults = { - distanceFromTarget: 20, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, - race: Race.RaceTroll, -}; diff --git a/ui/mage/arcane/sim.tsx b/ui/mage/arcane/sim.tsx deleted file mode 100644 index d20da6f1dd..0000000000 --- a/ui/mage/arcane/sim.tsx +++ /dev/null @@ -1,235 +0,0 @@ -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { Mage } from '../../core/player_classes/mage'; -import { APLRotation } from '../../core/proto/apl'; -import { Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { StatCapType } from '../../core/proto/ui'; -import { DEFAULT_CASTER_GEM_STATS, StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { formatToNumber } from '../../core/utils'; -import { DefaultDebuffs, DefaultRaidBuffs, MAGE_BREAKPOINTS } from '../presets'; -import * as ArcaneInputs from './inputs'; -import * as Presets from './presets'; -import * as MageInputs from '../inputs'; - -const hasteBreakpoints = MAGE_BREAKPOINTS.presets; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecArcaneMage, { - cssClass: 'arcane-mage-sim-ui', - cssScheme: PlayerClasses.getCssClass(Mage), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. - epReferenceStat: Stat.StatSpellPower, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [ - Stat.StatHealth, - Stat.StatMana, - Stat.StatStamina, - Stat.StatIntellect, - Stat.StatSpirit, - Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], - ), - gemStats: DEFAULT_CASTER_GEM_STATS, - - defaults: { - // Default equipped gear. - gear: Presets.P2_BIS.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P1_BIS_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - const hitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - const hasteCap = new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHastePercent, 53.32); - - return hitCap.add(hasteCap); - })(), - // Default soft caps for the Reforge optimizer - softCapBreakpoints: (() => { - const hasteSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { - breakpoints: [ - hasteBreakpoints.get('5-tick - Living Bomb')!, - hasteBreakpoints.get('6-tick - Living Bomb')!, - hasteBreakpoints.get('7-tick - Living Bomb')!, - hasteBreakpoints.get('8-tick - Living Bomb')!, - hasteBreakpoints.get('9-tick - Living Bomb')!, - hasteBreakpoints.get('10-tick - Living Bomb')!, - // Higher ticks commented out as they may be unrealistic for most gear levels - // hasteBreakpoints.get('11-tick - Living Bomb')!, - // hasteBreakpoints.get('12-tick - Living Bomb')!, - ], - capType: StatCapType.TypeThreshold, - postCapEPs: [0.6 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT], - }); - - return [hasteSoftCapConfig]; - })(), - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.ArcaneTalents.data, - // Default spec-specific settings. - specOptions: Presets.DefaultArcaneOptions, - other: Presets.OtherDefaults, - // Default raid/party buffs settings. - raidBuffs: DefaultRaidBuffs, - - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: DefaultDebuffs, - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [MageInputs.MageArmorInputs()], - // Inputs to include in the 'Rotation' section on the settings tab. - rotationInputs: ArcaneInputs.MageRotationConfig, - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [OtherInputs.InputDelay, OtherInputs.DistanceFromTarget, OtherInputs.TankAssignment], - }, - itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: true, - }, - - presets: { - epWeights: [Presets.P1_PREBIS_EP_PRESET, Presets.P1_BIS_EP_PRESET, Presets.P3_BIS_EP_PRESET], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_DEFAULT, Presets.ROTATION_PRESET_P3_4PC], - // Preset talents that the user can quickly select. - talents: [Presets.ArcaneTalents, Presets.ArcaneTalentsCleave], - // Preset gear configurations that the user can quickly select. - gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS], - - builds: [Presets.P1_PRESET_BUILD_DEFAULT, Presets.P1_PRESET_BUILD_CLEAVE], - }, - - autoRotation: (player: Player): APLRotation => { - // const numTargets = player.sim.encounter.targets.length; - // if (numTargets >= 2) { - // return Presets.ROTATION_PRESET_CLEAVE.rotation.rotation!; - // } else { - return Presets.ROTATION_PRESET_DEFAULT.rotation.rotation!; - // } - }, - - raidSimPresets: [ - { - spec: Spec.SpecArcaneMage, - talents: Presets.ArcaneTalents.data, - specOptions: Presets.DefaultArcaneOptions, - consumables: Presets.DefaultConsumables, - otherDefaults: Presets.OtherDefaults, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceAlliancePandaren, - [Faction.Horde]: Race.RaceTroll, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.P1_PREBIS.gear, - }, - [Faction.Horde]: { - 1: Presets.P1_PREBIS.gear, - }, - }, - }, - ], -}); - -export class ArcaneMageSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - const statSelectionPresets = [ - { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: hasteBreakpoints, - }, - ]; - - this.reforger = new ReforgeOptimizer(this, { - statSelectionPresets: statSelectionPresets, - enableBreakpointLimits: true, - getEPDefaults: player => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - if (avgIlvl >= 525) { - return Presets.P3_BIS_EP_PRESET.epWeights; - } else if (avgIlvl >= 495) { - return Presets.P1_BIS_EP_PRESET.epWeights; - } - return Presets.P1_PREBIS_EP_PRESET.epWeights; - }, - updateSoftCaps: softCaps => { - const raidBuffs = player.getRaid()?.getBuffs(); - const hasBL = !!raidBuffs?.bloodlust; - const hasBerserking = player.getRace() === Race.RaceTroll; - - const modifyHaste = (oldHastePercent: number, modifier: number) => - Number(formatToNumber(((oldHastePercent / 100 + 1) / modifier - 1) * 100, { maximumFractionDigits: 5 })); - - this.individualConfig.defaults.softCapBreakpoints!.forEach(softCap => { - const softCapToModify = softCaps.find(sc => sc.unitStat.equals(softCap.unitStat)); - if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHastePercent) && softCapToModify) { - const adjustedHasteBreakpoints = new Set([...softCap.breakpoints]); - const hasCloseMatchingValue = (value: number) => [...adjustedHasteBreakpoints.values()].find(bp => bp.toFixed(2) === value.toFixed(2)); - - softCap.breakpoints.forEach(breakpoint => { - if (hasBL) { - const blBreakpoint = modifyHaste(breakpoint, 1.3); - - if (blBreakpoint > 0) { - if (!hasCloseMatchingValue(blBreakpoint)) adjustedHasteBreakpoints.add(blBreakpoint); - if (hasBerserking) { - const berserkingBreakpoint = modifyHaste(blBreakpoint, 1.2); - if (berserkingBreakpoint > 0 && !hasCloseMatchingValue(berserkingBreakpoint)) { - adjustedHasteBreakpoints.add(berserkingBreakpoint); - } - } - } - } - }); - softCapToModify.breakpoints = [...adjustedHasteBreakpoints].sort((a, b) => a - b); - } - }); - return softCaps; - }, - additionalSoftCapTooltipInformation: { - [Stat.StatHasteRating]: () => { - const raidBuffs = player.getRaid()?.getBuffs(); - const hasBL = !!raidBuffs?.bloodlust; - const hasBerserking = player.getRace() === Race.RaceTroll; - - return ( - <> - {(hasBL || hasBerserking) && ( - <> -

Additional Living Bomb breakpoints have been created using the following cooldowns:

-
    - {hasBL &&
  • Bloodlust
  • } - {hasBerserking &&
  • Berserking
  • } -
- - )} - - ); - }, - }, - }); - } -} diff --git a/ui/mage/fire/apls/fire.apl.json b/ui/mage/fire/apls/fire.apl.json deleted file mode 100755 index fde1b7fae5..0000000000 --- a/ui/mage/fire/apls/fire.apl.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":55342}}},"doAtValue":{"const":{"val":"-7.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":12051}}},"doAtValue":{"const":{"val":"-6s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-4.5s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":11366}}},"doAtValue":{"const":{"val":"-3s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116257}}},"rhs":{"spellCastTime":{"spellId":{"spellId":12051}}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"30000"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":116011},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsReady":{"spellId":{"spellId":108978}}},{"variableRef":{"name":"Pyro: Has Instant + HU"}}]}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsReady":{"spellId":{"spellId":11129}}},{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"variableRef":{"name":"Combust: Size - Just send it"}}}}]}},"castSpell":{"spellId":{"spellId":11129}}}}, - {"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"Pyro: Has Instant + HU"}},{"spellIsReady":{"spellId":{"spellId":108978}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":26297}}},{"castSpell":{"spellId":{"spellId":12043}}},{"castSpell":{"spellId":{"spellId":126734}}},{"castSpell":{"spellId":{"spellId":108978}}},{"castSpell":{"spellId":{"spellId":11366}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":108978}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":108978},"includeReactionTime":true}}}},{"cmp":{"op":"OpEq","lhs":{"math":{"op":"OpDiv","lhs":{"spellFullCooldown":{"spellId":{"spellId":108978}}},"rhs":{"spellFullCooldown":{"spellId":{"spellId":12043}}}}},"rhs":{"const":{"val":"2"}}}},{"variableRef":{"name":"Pyro: No Instant"}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":12043}}},{"castSpell":{"spellId":{"spellId":11366}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":108978},"includeReactionTime":true}},{"or":{"vals":[{"variableRef":{"name":"Pyro: Has Instant"}},{"auraIsActive":{"auraId":{"spellId":12043},"includeReactionTime":true}}]}}]}},"castSpell":{"spellId":{"spellId":11366}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":108978},"includeReactionTime":true}},{"auraIsInactive":{"auraId":{"spellId":12043},"includeReactionTime":true}},{"variableRef":{"name":"Pyro: No Instant"}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":108978,"tag":1}}},{"castSpell":{"spellId":{"spellId":11366}}},{"castSpell":{"spellId":{"spellId":11366}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsInactive":{"auraId":{"spellId":108978},"includeReactionTime":true}},{"variableRef":{"name":"Alter: Time To Ready - 2s leeway"}},{"or":{"vals":[{"variableRef":{"name":"Pyro: Has Instant"}},{"auraIsActive":{"auraId":{"spellId":12043},"includeReactionTime":true}}]}}]}},"castSpell":{"spellId":{"spellId":11366}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"math":{"op":"OpSub","lhs":{"spellFullCooldown":{"spellId":{"spellId":126734}}},"rhs":{"const":{"val":"5s"}}}}}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"dotTickFrequency":{"spellId":{"spellId":44457}}}}}}, - {"action":{"multidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"dotTickFrequency":{"spellId":{"spellId":114923}}}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948},"includeReactionTime":true}},{"spellIsReady":{"spellId":{"spellId":112948}}}]}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"variableRef":{"name":"Pyro: Has Instant"}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":11129}}},"rhs":{"const":{"val":"5s"}}}}]}},{"and":{"vals":[{"variableRef":{"name":"Pyro: Has Instant"}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":11366}}},"rhs":{"const":{"val":"2s"}}}}]}},{"auraIsActive":{"auraId":{"spellId":12043},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":11366}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":2825,"tag":-1},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"variableRef":{"name":"Combust: Size - BL"}}}}]}},{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":2825,"tag":-1},"includeReactionTime":true}}}},{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"variableRef":{"name":"Combust: Size - Post-AT"}}}}]}},{"and":{"vals":[{"auraIsInactive":{"auraId":{"spellId":108978},"includeReactionTime":true}},{"or":{"vals":[{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"Alter: Time To Ready - 1s leeway"}}}},{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"variableRef":{"name":"Combust: Size - No AT"}}}},{"cmp":{"op":"OpGe","lhs":{"math":{"op":"OpDiv","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"spellFullCooldown":{"spellId":{"spellId":11129}}}}},"rhs":{"const":{"val":"0.5"}}}}]}}]}}]}},{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"variableRef":{"name":"Combust: Size - End of Combat"}}}}]}}]}},"castSpell":{"spellId":{"spellId":11129}}}}, - {"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"Pyro: Only HU"}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":108978},"includeReactionTime":true}}}}]}},"castSpell":{"spellId":{"spellId":108853}}}}, - {"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"Pyro: Only Instant"}}]}},"castSpell":{"spellId":{"spellId":133}}}}, - {"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"Pyro: Has Instant + HU"}}]}},"castSpell":{"spellId":{"spellId":11366}}}}, - {"action":{"castSpell":{"spellId":{"spellId":133}}}} - ], - "valueVariables": [ - {"name":"Pyro: Has Instant","value":{"auraIsActive":{"auraId":{"spellId":48108},"includeReactionTime":true}}}, - {"name":"Pyro: No Instant","value":{"not":{"val":{"variableRef":{"name":"Pyro: Has Instant"}}}}}, - {"name":"Pyro: Has HU","value":{"auraIsActive":{"auraId":{"spellId":48107},"includeReactionTime":true}}}, - {"name":"Pyro: No HU","value":{"not":{"val":{"variableRef":{"name":"Pyro: Has HU"}}}}}, - {"name":"Pyro: Has Instant + HU","value":{"and":{"vals":[{"variableRef":{"name":"Pyro: Has HU"}},{"variableRef":{"name":"Pyro: Has Instant"}}]}}}, - {"name":"Pyro: Only HU","value":{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"Pyro: Has Instant"}}}},{"variableRef":{"name":"Pyro: Has HU"}}]}}}, - {"name":"Pyro: Only Instant","value":{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"Pyro: Has HU"}}}},{"variableRef":{"name":"Pyro: Has Instant"}}]}}}, - {"name":"Alter: Time To Ready - 2s leeway","value":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"math":{"op":"OpSub","lhs":{"spellFullCooldown":{"spellId":{"spellId":108978}}},"rhs":{"const":{"val":"8s"}}}}}}}, - {"name":"Alter: Time To Ready - 1s leeway","value":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"math":{"op":"OpSub","lhs":{"spellFullCooldown":{"spellId":{"spellId":108978}}},"rhs":{"const":{"val":"7s"}}}}}}}, - {"name":"Combust: Size - Just send it","value":{"const":{"val":"5600000"}}}, - {"name":"Combust: Size - BL","value":{"const":{"val":"4600000"}}}, - {"name":"Combust: Size - Post-AT","value":{"const":{"val":"2600000"}}}, - {"name":"Combust: Size - No AT","value":{"const":{"val":"460000"}}}, - {"name":"Combust: Size - End of Combat","value":{"const":{"val":"350000"}}} - ] -} diff --git a/ui/mage/fire/apls/fire_cleave.apl.json b/ui/mage/fire/apls/fire_cleave.apl.json deleted file mode 100644 index 47ff5ae975..0000000000 --- a/ui/mage/fire/apls/fire_cleave.apl.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":12051}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116257}}},"rhs":{"spellCastTime":{"spellId":{"spellId":12051}}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"30000"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":116011}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"strictMultidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":114923}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"condition":{"auraIsInactiveWithReactionTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948}}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"const":{"val":"400000"}}}},{"and":{"vals":[{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":48107}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":108853}}}}}]}},{"auraIsInactiveWithReactionTime":{"auraId":{"spellId":48108}}},{"spellIsReady":{"spellId":{"spellId":108853}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"mageCurrentCombustionDotEstimate":{}},"rhs":{"const":{"val":"750000"}}}},{"spellIsReady":{"spellId":{"spellId":108853}}}]}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":11129}}},{"castSpell":{"spellId":{"spellId":108853}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":48107}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":48108}}}}}]}},"castSpell":{"spellId":{"spellId":108853}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":48108}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":11129}}},"rhs":{"const":{"val":"5s"}}}}]}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":48108}}},{"auraIsActive":{"auraId":{"spellId":48107}}}]}}]}},"castSpell":{"spellId":{"spellId":11366}}}}, - {"action":{"castSpell":{"spellId":{"spellId":133}}}} - ] - } diff --git a/ui/mage/fire/gear_sets/p1_bis.gear.json b/ui/mage/fire/gear_sets/p1_bis.gear.json deleted file mode 100644 index beb4805743..0000000000 --- a/ui/mage/fire/gear_sets/p1_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87008, "gems": [76885, 76641] }, - { "id": 87028 }, - { "id": 87011, "enchant": 4806, "gems": [76641], "reforging": 137 }, - { "id": 90512, "enchant": 4892, "reforging": 152 }, - { "id": 87010, "enchant": 4419, "gems": [76697, 76697], "reforging": 151 }, - { "id": 86958, "enchant": 4414, "gems": [0], "reforging": 152 }, - { "id": 87007, "enchant": 4433, "gems": [0], "reforging": 152, "tinker": 4898 }, - { "id": 86981, "gems": [76697, 76641, 76697], "reforging": 152 }, - { "id": 86989, "enchant": 4895, "gems": [76659, 76641], "reforging": 168 }, - { "id": 86969, "enchant": 4429, "gems": [76697], "reforging": 137 }, - { "id": 90511, "reforging": 116 }, - { "id": 86949 }, - { "id": 87175 }, - { "id": 87065, "reforging": 152 }, - { "id": 90513, "enchant": 4442, "gems": [76641] }, - { "id": 86960, "enchant": 4434, "reforging": 140 } - ] -} diff --git a/ui/mage/fire/gear_sets/p1_post_hof.gear.json b/ui/mage/fire/gear_sets/p1_post_hof.gear.json deleted file mode 100644 index 2565330f1d..0000000000 --- a/ui/mage/fire/gear_sets/p1_post_hof.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86970, "gems": [76885, 76660], "reforging": 152 }, - { "id": 87076, "reforging": 154 }, - { "id": 87038, "enchant": 4806, "gems": [76660], "reforging": 153 }, - { "id": 86971, "enchant": 4892 }, - { "id": 87010, "enchant": 4419, "gems": [76697, 76697], "reforging": 151 }, - { "id": 86958, "enchant": 4414, "gems": [0], "reforging": 152 }, - { "id": 87007, "enchant": 4430, "gems": [0], "reforging": 152, "tinker": 4898 }, - { "id": 86981, "gems": [76697, 76641, 76697], "reforging": 152 }, - { "id": 86989, "enchant": 4895, "gems": [76660, 76641], "reforging": 168 }, - { "id": 86969, "enchant": 4429, "gems": [76697], "reforging": 166 }, - { "id": 86949 }, - { "id": 89072, "reforging": 152 }, - { "id": 87065, "reforging": 152 }, - { "id": 79331 }, - { "id": 87066, "enchant": 4442, "reforging": 153 }, - { "id": 86960, "enchant": 4434 } - ] -} diff --git a/ui/mage/fire/gear_sets/p1_post_msv.gear.json b/ui/mage/fire/gear_sets/p1_post_msv.gear.json deleted file mode 100644 index 05420a034f..0000000000 --- a/ui/mage/fire/gear_sets/p1_post_msv.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87073, "gems": [76885, 76641], "reforging": 137 }, - { "id": 87076, "reforging": 153 }, - { "id": 87038, "enchant": 4806, "gems": [76660], "reforging": 153 }, - { "id": 89936, "enchant": 4892, "reforging": 165 }, - { "id": 87027, "enchant": 4419, "gems": [76660, 76697], "reforging": 165 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 166 }, - { "id": 89931, "enchant": 4430, "gems": [76641, 0], "reforging": 168, "tinker": 4898 }, - { "id": 87064, "gems": [76697, 76641, 76697], "reforging": 152 }, - { "id": 89088, "enchant": 4895, "gems": [76659] }, - { "id": 88878, "enchant": 4429 }, - { "id": 90859, "reforging": 137 }, - { "id": 89072, "reforging": 152 }, - { "id": 87065, "reforging": 152 }, - { "id": 79331 }, - { "id": 87066, "enchant": 4442, "reforging": 153 }, - { "id": 79334, "enchant": 4434, "reforging": 166 } - ] -} diff --git a/ui/mage/fire/gear_sets/p1_prebis.gear.json b/ui/mage/fire/gear_sets/p1_prebis.gear.json deleted file mode 100644 index d8adfa1a80..0000000000 --- a/ui/mage/fire/gear_sets/p1_prebis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86717, "gems": [76885, 76641] }, - { "id": 90596 }, - { "id": 86714, "enchant": 4806, "gems": [76641], "reforging": 137 }, - { "id": 89077, "enchant": 4892, "reforging": 166 }, - { "id": 86715, "gems": [76697, 76697], "reforging": 151 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 166 }, - { "id": 88742, "enchant": 4430, "gems": [0], "tinker": 4898 }, - { "id": 89062, "gems": [76641, 76697] }, - { "id": 86716, "enchant": 4825, "gems": [76659], "reforging": 152 }, - { "id": 88878, "enchant": 4426, "reforging": 140 }, - { "id": 90859, "reforging": 137 }, - { "id": 89072, "reforging": 152 }, - { "id": 79331 }, - { "id": 86907 }, - { "id": 86886, "enchant": 4442, "gems": [89882, 0], "reforging": 151 }, - { "id": 86829 } - ] -} diff --git a/ui/mage/fire/gear_sets/p2_bis.gear.json b/ui/mage/fire/gear_sets/p2_bis.gear.json deleted file mode 100644 index 9fe4c87df8..0000000000 --- a/ui/mage/fire/gear_sets/p2_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87008, "gems": [76885, 76641], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87028, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87011, "enchant": 4806, "gems": [76641], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90512, "enchant": 4892, "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87010, "enchant": 4419, "gems": [76697, 76697], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86958, "enchant": 4414, "gems": [0], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87007, "enchant": 4433, "gems": [0], "reforging": 152, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 86981, "gems": [76697, 76641, 76697], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86989, "enchant": 4895, "gems": [76659, 76641], "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86969, "enchant": 4429, "gems": [76697], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90511, "reforging": 116, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86949, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87175, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87065, "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87164, "enchant": 4442, "gems": [89882, 76697], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86960, "enchant": 4434, "reforging": 140, "upgradeStep": "UpgradeStepTwo" } - ] -} diff --git a/ui/mage/fire/gear_sets/p3_bis.gear.json b/ui/mage/fire/gear_sets/p3_bis.gear.json deleted file mode 100644 index 04b3a38689..0000000000 --- a/ui/mage/fire/gear_sets/p3_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":96635,"gems":[95347,76697],"reforging":137}, - {"id":96453,"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":96638,"enchant":4806,"gems":[76660,76697],"reforging":154}, - {"id":95014,"enchant":4892,"gems":[76697],"reforging":137}, - {"id":96637,"enchant":4419,"gems":[76660,76697,76641],"reforging":137}, - {"id":96452,"randomSuffix":-336,"enchant":4414,"gems":[76697,0],"upgradeStep":"UpgradeStepTwo"}, - {"id":96634,"enchant":4433,"gems":[76660,0],"tinker":4898}, - {"id":94996,"gems":[76641,76641,76697],"reforging":140}, - {"id":95030,"enchant":4825,"gems":[76660,76697,76697],"reforging":152}, - {"id":95004,"enchant":4429,"gems":[76697,76641]}, - {"id":96529,"gems":[76697],"upgradeStep":"UpgradeStepTwo"}, - {"id":95019,"gems":[76641],"reforging":152}, - {"id":96516,"upgradeStep":"UpgradeStepTwo"}, - {"id":96413,"reforging":137,"upgradeStep":"UpgradeStepTwo"}, - {"id":96610,"enchant":4442,"gems":[76697,76697],"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":96562,"enchant":4434,"gems":[76660],"reforging":154,"upgradeStep":"UpgradeStepTwo"} - ] - } diff --git a/ui/mage/fire/inputs.tsx b/ui/mage/fire/inputs.tsx deleted file mode 100644 index ff2f15901b..0000000000 --- a/ui/mage/fire/inputs.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import * as InputHelpers from '../../core/components/input_helpers'; -import { Spec } from '../../core/proto/common'; - -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -export const MageRotationConfig = { - inputs: [ - // ******************************************************** - // FIRE INPUTS - // ******************************************************** - InputHelpers.makeRotationNumberInput({ - fieldName: 'combustAlwaysSend', - label: 'Combust Threshold - Always send', - labelTooltip: 'The value at which Combustion should be sent regardless of other conditions. (Very RNG dependent)', - changeEmitter: player => player.rotationChangeEmitter, - getValue: player => player.getSimpleRotation().combustAlwaysSend, - positive: true, - }), - InputHelpers.makeRotationNumberInput({ - fieldName: 'combustBloodlust', - label: 'Combust Threshold - Bloodlust', - labelTooltip: 'The value at which Combustion should be cast when Bloodlust is running.', - changeEmitter: player => player.rotationChangeEmitter, - getValue: player => player.getSimpleRotation().combustBloodlust, - positive: true, - }), - InputHelpers.makeRotationNumberInput({ - fieldName: 'combustPostAlter', - label: 'Combust Threshold - Alter Time', - labelTooltip: 'The value at which Combustion should be cast after Alter Time was used.', - changeEmitter: player => player.rotationChangeEmitter, - getValue: player => player.getSimpleRotation().combustPostAlter, - positive: true, - }), - InputHelpers.makeRotationNumberInput({ - fieldName: 'combustNoAlter', - label: 'Combust Threshold - No CDs', - labelTooltip: 'The value at which Combustion should be cast when you have no Alter Time window up.', - changeEmitter: player => player.rotationChangeEmitter, - getValue: player => player.getSimpleRotation().combustNoAlter, - positive: true, - }), - InputHelpers.makeRotationNumberInput({ - fieldName: 'combustEndOfCombat', - label: 'Combust Threshold - End of combat', - labelTooltip: 'The value at which Combustion should be cast when combat is about to end.', - changeEmitter: player => player.rotationChangeEmitter, - getValue: player => player.getSimpleRotation().combustEndOfCombat, - positive: true, - }), - ], -}; diff --git a/ui/mage/fire/presets.ts b/ui/mage/fire/presets.ts deleted file mode 100755 index 0fde3e69b5..0000000000 --- a/ui/mage/fire/presets.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { Encounter } from '../../core/encounter'; -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Profession, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { - FireMage_Rotation, - MageArmor, - FireMage_Options as MageOptions, -} from '../../core/proto/mage'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats, UnitStat, UnitStatPresets } from '../../core/proto_utils/stats'; -import FireApl from './apls/fire.apl.json'; -import P1PreBISGear from './gear_sets/p1_prebis.gear.json'; -import P1BISGear from './gear_sets/p1_bis.gear.json'; -import P2BISGear from './gear_sets/p2_bis.gear.json'; -import P3BISGear from './gear_sets/p3_bis.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. -export const P1_PREBIS = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBISGear); -export const P1_BIS = PresetUtils.makePresetGear('P1 - BIS', P1BISGear); -export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BISGear); -export const P3_BIS = PresetUtils.makePresetGear('P3 - BIS', P3BISGear); - -export const P1TrollDefaultSimpleRotation = FireMage_Rotation.create({ - combustAlwaysSend: 4000000, - combustBloodlust: 3700000, - combustPostAlter: 2600000, - combustNoAlter: 680000, - combustEndOfCombat: 320000, -}); -export const P1NoTrollDefaultSimpleRotation = FireMage_Rotation.create({ - ...P1TrollDefaultSimpleRotation, - combustPostAlter: 1750000, -}); - -export const P2TrollDefaultSimpleRotation = FireMage_Rotation.create({ - combustAlwaysSend: 5600000, - combustBloodlust: 4600000, - combustPostAlter: 2600000, - combustNoAlter: 460000, - combustEndOfCombat: 350000, -}); -export const P2NoTrollDefaultSimpleRotation = FireMage_Rotation.create({ - ...P2TrollDefaultSimpleRotation, - combustAlwaysSend: 5300000, - combustBloodlust: 4100000, - combustPostAlter: 2150000, -}); - -export const P3TrollDefaultSimpleRotation = FireMage_Rotation.create({ - combustAlwaysSend: 11000000, - combustBloodlust: 13000000, - combustPostAlter: 10000000, - combustNoAlter: 1100000, - combustEndOfCombat: 700000, -}); -export const P3NoTrollDefaultSimpleRotation = FireMage_Rotation.create({ - ...P3TrollDefaultSimpleRotation, - combustAlwaysSend: 11000000, - combustBloodlust: 13000000, - combustPostAlter: 10000000, -}); - -export const P1_SIMPLE_ROTATION_PRESET_DEFAULT = PresetUtils.makePresetSimpleRotation('P1 - Default', Spec.SpecFireMage, P1TrollDefaultSimpleRotation); -export const P1_SIMPLE_ROTATION_NO_TROLL = PresetUtils.makePresetSimpleRotation('P1 - Default (No Troll)', Spec.SpecFireMage, P1NoTrollDefaultSimpleRotation); -export const P2_SIMPLE_ROTATION_PRESET_DEFAULT = PresetUtils.makePresetSimpleRotation('P2 - Default', Spec.SpecFireMage, P2TrollDefaultSimpleRotation); -export const P2_SIMPLE_ROTATION_NO_TROLL = PresetUtils.makePresetSimpleRotation('P2 - Default (No Troll)', Spec.SpecFireMage, P2NoTrollDefaultSimpleRotation); -export const P3_SIMPLE_ROTATION_PRESET_DEFAULT = PresetUtils.makePresetSimpleRotation('P3 - Default', Spec.SpecFireMage, P3TrollDefaultSimpleRotation); -export const P3_SIMPLE_ROTATION_NO_TROLL = PresetUtils.makePresetSimpleRotation('P3 - Default (No Troll)', Spec.SpecFireMage, P3NoTrollDefaultSimpleRotation); - -export const P1_ROTATION_PRESET_APL = PresetUtils.makePresetAPLRotation('APL', FireApl); - -// export const FIRE_ROTATION_PRESET_CLEAVE = PresetUtils.makePresetAPLRotation('Cleave', FireCleaveApl); - -// Preset options for EP weights -export const DEFAULT_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level > 500', - Stats.fromMap({ - [Stat.StatIntellect]: 1.37, - [Stat.StatSpellPower]: 1.0, - [Stat.StatHitRating]: 1.2, - [Stat.StatCritRating]: 1.05, - [Stat.StatHasteRating]: 0.62, - [Stat.StatMasteryRating]: 0.79, - }), -); - -export const P1_PREBIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level < 500', - Stats.fromMap({ - [Stat.StatIntellect]: 1.37, - [Stat.StatSpellPower]: 1.0, - [Stat.StatHitRating]: 1.21, - [Stat.StatCritRating]: 0.94, - [Stat.StatHasteRating]: 0.95, - [Stat.StatMasteryRating]: 0.59, - }), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. -export const FireTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '111122', - }), -}; - -export const FireTalentsCleave = { - name: 'Cleave', - data: SavedTalents.create({ - talentsString: '111112', - }), -}; - -export const DefaultFireOptions = MageOptions.create({ - classOptions: { - defaultMageArmor: MageArmor.MageArmorMoltenArmor, - }, -}); - -export const DefaultFireConsumables = ConsumesSpec.create({ - flaskId: 76085, // Flask of the Warm Sun - foodId: 74650, // Mogu Fish Stew - potId: 76093, // Potion of the Jade Serpent - prepotId: 76093, // Potion of the Jade Serpent -}); - -export const ENCOUNTER_SINGLE_TARGET = PresetUtils.makePresetEncounter('Single Target', Encounter.defaultEncounterProto()); -export const ENCOUNTER_CLEAVE = PresetUtils.makePresetEncounter('Cleave (3 targets)', Encounter.defaultEncounterProto(3)); - -export const P1_PRESET_SINGLE_TARGET = PresetUtils.makePresetBuild('Single Target', { - talents: FireTalents, - encounter: ENCOUNTER_SINGLE_TARGET, -}); - -export const P1_PRESET_CLEAVE = PresetUtils.makePresetBuild('Cleave (3 targets)', { - talents: FireTalentsCleave, - encounter: ENCOUNTER_CLEAVE, -}); - -export const P2_PRESET_BUILD_DEFAULT = PresetUtils.makePresetBuild('P2 - Troll', { - gear: P2_BIS, - rotation: P2_SIMPLE_ROTATION_PRESET_DEFAULT -}); -export const P2_NO_TROLL_PRESET_BUILD_DEFAULT = PresetUtils.makePresetBuild('P2 - No-Troll', { - gear: P2_BIS, - rotation: P2_SIMPLE_ROTATION_NO_TROLL -}); - -export const P3_PRESET_BUILD_DEFAULT = PresetUtils.makePresetBuild('P3 - Troll', { - gear: P3_BIS, - rotation: P3_SIMPLE_ROTATION_PRESET_DEFAULT -}); -export const P3_NO_TROLL_PRESET_BUILD_DEFAULT = PresetUtils.makePresetBuild('P3 - No-Troll', { - gear: P3_BIS, - rotation: P3_SIMPLE_ROTATION_NO_TROLL -}); - -export const OtherDefaults = { - distanceFromTarget: 20, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, - race: Race.RaceTroll, -}; - -export const COMBUSTION_BREAKPOINT: UnitStatPresets = { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([ - ['11-tick - Combust', 4.986888], - ['12-tick - Combust', 15.008639], - ['13-tick - Combust', 25.07819], - ['14-tick - Combust', 35.043908], - ['15-tick - Combust', 45.032653], - ['16-tick - Combust', 54.918692], - ['17-tick - Combust', 64.880489], - ['18-tick - Combust', 74.978158], - ['19-tick - Combust', 85.01391], - ['20-tick - Combust', 95.121989], - ['21-tick - Combust', 105.128247], - ['22-tick - Combust', 114.822817], - ['23-tick - Combust', 124.971929], - ['24-tick - Combust', 135.017682], - ['25-tick - Combust', 144.798102], - ['26-tick - Combust', 154.777135], - ['27-tick - Combust', 164.900732], - ['28-tick - Combust', 175.103239], - ['29-tick - Combust', 185.306786], - ]), -}; diff --git a/ui/mage/fire/sim.tsx b/ui/mage/fire/sim.tsx deleted file mode 100755 index c0c50cf3b7..0000000000 --- a/ui/mage/fire/sim.tsx +++ /dev/null @@ -1,346 +0,0 @@ -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation, APLRotation_Type, APLValueVariable, SimpleRotation } from '../../core/proto/apl'; -import { Cooldowns, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { StatCapType } from '../../core/proto/ui'; -import { DEFAULT_CASTER_GEM_STATS, StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { DefaultDebuffs, DefaultRaidBuffs, MAGE_BREAKPOINTS } from '../presets'; -import * as Presets from './presets'; -import * as MageInputs from '../inputs'; -import * as FireInputs from './inputs'; - -const mageBombBreakpoints = MAGE_BREAKPOINTS.presets; -// const combustBreakpoints = Presets.COMBUSTION_BREAKPOINT.presets; - -const relevantMageBombBreakpoints = [ - mageBombBreakpoints.get('5-tick - Living Bomb')!, - mageBombBreakpoints.get('6-tick - Living Bomb')!, - // mageBombBreakpoints.get('7-tick - Living Bomb')!, - // mageBombBreakpoints.get('8-tick - Living Bomb')!, - // mageBombBreakpoints.get('13-tick - Nether Tempest')!, - // mageBombBreakpoints.get('14-tick - Nether Tempest')!, - // mageBombBreakpoints.get('15-tick - Nether Tempest')!, - // mageBombBreakpoints.get('16-tick - Nether Tempest')!, - // mageBombBreakpoints.get('17-tick - Nether Tempest')!, - // mageBombBreakpoints.get('18-tick - Nether Tempest')!, - // mageBombBreakpoints.get('19-tick - Nether Tempest')!, - // mageBombBreakpoints.get('20-tick - Nether Tempest')!, - // mageBombBreakpoints.get('21-tick - Nether Tempest')!, - // mageBombBreakpoints.get('22-tick - Nether Tempest')!, - // mageBombBreakpoints.get('23-tick - Nether Tempest')!, -]; - -// const relevantCombustionBreakpoints = [ -// ...relevantMageBombBreakpoints, -// combustBreakpoints.get('12-tick - Combust')!, -// combustBreakpoints.get('13-tick - Combust')!, -// combustBreakpoints.get('14-tick - Combust')!, -// combustBreakpoints.get('15-tick - Combust')!, -// combustBreakpoints.get('16-tick - Combust')!, -// combustBreakpoints.get('17-tick - Combust')!, -// combustBreakpoints.get('18-tick - Combust')!, -// combustBreakpoints.get('19-tick - Combust')!, -// ].sort(); - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecFireMage, { - cssClass: 'fire-mage-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Mage), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], - // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. - epReferenceStat: Stat.StatSpellPower, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [ - Stat.StatHealth, - Stat.StatMana, - Stat.StatStamina, - Stat.StatIntellect, - Stat.StatSpirit, - Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], - ), - gemStats: DEFAULT_CASTER_GEM_STATS, - - defaults: { - // Default equipped gear. - gear: Presets.P2_BIS.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.DEFAULT_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), - // Default soft caps for the Reforge optimizer - softCapBreakpoints: (() => { - const hasteSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { - breakpoints: [...relevantMageBombBreakpoints], - capType: StatCapType.TypeThreshold, - postCapEPs: [(Presets.DEFAULT_EP_PRESET.epWeights.getStat(Stat.StatMasteryRating) - 0.1) * Mechanics.HASTE_RATING_PER_HASTE_PERCENT], - }); - - return [hasteSoftCapConfig]; - })(), - // Default consumes settings. - consumables: Presets.DefaultFireConsumables, - // Default rotation settings. - rotationType: APLRotation_Type.TypeSimple, - simpleRotation: Presets.P1TrollDefaultSimpleRotation, - // Default talents. - talents: Presets.FireTalents.data, - // Default spec-specific settings. - specOptions: Presets.DefaultFireOptions, - other: Presets.OtherDefaults, - // Default raid/party buffs settings. - raidBuffs: DefaultRaidBuffs, - - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: DefaultDebuffs, - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [MageInputs.MageArmorInputs()], - // Inputs to include in the 'Rotation' section on the settings tab. - rotationInputs: FireInputs.MageRotationConfig, - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [OtherInputs.InputDelay, OtherInputs.DistanceFromTarget, OtherInputs.TankAssignment], - }, - itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: true, - }, - - presets: { - epWeights: [Presets.DEFAULT_EP_PRESET, Presets.P1_PREBIS_EP_PRESET], - // Preset rotations that the user can quickly select. - rotations: [ - Presets.P1_SIMPLE_ROTATION_PRESET_DEFAULT, - Presets.P1_SIMPLE_ROTATION_NO_TROLL, - Presets.P2_SIMPLE_ROTATION_PRESET_DEFAULT, - Presets.P2_SIMPLE_ROTATION_NO_TROLL, - Presets.P3_SIMPLE_ROTATION_PRESET_DEFAULT, - Presets.P3_SIMPLE_ROTATION_NO_TROLL, - Presets.P1_ROTATION_PRESET_APL, - ], - // Preset talents that the user can quickly select. - talents: [Presets.FireTalents, Presets.FireTalentsCleave], - // Preset gear configurations that the user can quickly select. - gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS], - - builds: [ - Presets.P2_PRESET_BUILD_DEFAULT, - Presets.P2_NO_TROLL_PRESET_BUILD_DEFAULT, - Presets.P3_PRESET_BUILD_DEFAULT, - Presets.P3_NO_TROLL_PRESET_BUILD_DEFAULT, - Presets.P1_PRESET_SINGLE_TARGET, - Presets.P1_PRESET_CLEAVE, - ], - }, - - autoRotation: (player: Player): APLRotation => { - // const numTargets = player.sim.encounter.targets.length; - // if (numTargets >= 3) { - // return Presets.FIRE_ROTATION_PRESET_CLEAVE.rotation.rotation!; - // } else { - return Presets.P1_SIMPLE_ROTATION_PRESET_DEFAULT.rotation.rotation!; - // } - }, - - simpleRotation: (player, simple): APLRotation => { - const rotation = APLRotation.clone(Presets.P1_ROTATION_PRESET_APL.rotation.rotation!); - - const { combustAlwaysSend = 0, combustBloodlust = 0, combustPostAlter = 0, combustNoAlter = 0, combustEndOfCombat = 0 } = simple; - const getVariableNamePrefix = (variable: string) => `Combust: Size - ${variable}`; - - const combustionSizeAlwaysSend = APLValueVariable.fromJson({ - name: getVariableNamePrefix('Just send it'), - value: { const: { val: String(combustAlwaysSend) } }, - }); - - const combustionSizeBloodlust = APLValueVariable.fromJson({ - name: getVariableNamePrefix('BL'), - value: { const: { val: String(combustBloodlust) } }, - }); - - const combustionSizePostAlter = APLValueVariable.fromJson({ - name: getVariableNamePrefix('Post-AT'), - value: { const: { val: String(combustPostAlter) } }, - }); - - const combustionSizeNoAlter = APLValueVariable.fromJson({ - name: getVariableNamePrefix('No AT'), - value: { const: { val: String(combustNoAlter) } }, - }); - - const combustionSizeEndOfCombat = APLValueVariable.fromJson({ - name: getVariableNamePrefix('End of Combat'), - value: { const: { val: String(combustEndOfCombat) } }, - }); - rotation.valueVariables[9] = combustionSizeAlwaysSend; - rotation.valueVariables[10] = combustionSizeBloodlust; - rotation.valueVariables[11] = combustionSizePostAlter; - rotation.valueVariables[12] = combustionSizeNoAlter; - rotation.valueVariables[13] = combustionSizeEndOfCombat; - - return APLRotation.create({ - simple: SimpleRotation.create({ - cooldowns: Cooldowns.create(), - }), - prepullActions: rotation.prepullActions, - priorityList: rotation.priorityList, - groups: rotation.groups, - valueVariables: rotation.valueVariables, - }); - }, - // Hide all the MCDs since the simple rotation handles them. - hiddenMCDs: [ - // Berserking - 26297, - // Bloodlust - 2825, - // Skull Banner - 114206, - // Stormlash Totem - 120668, - // Evocation - 12051, - // Flame Orb - 82731, - // Mana Gem - 36799, - // Mirror Image - 55342, - // Synapse Springs - 82174, 126734, - // Potion of the Jade Serpent - 76093, - // Alter Time - 108978, - // Presence of Mind - 12043, - // Arcane Torrent - 28730, - // Bloodfury - 33697, - ], - - raidSimPresets: [ - { - spec: Spec.SpecFireMage, - talents: Presets.FireTalents.data, - specOptions: Presets.DefaultFireOptions, - consumables: Presets.DefaultFireConsumables, - otherDefaults: Presets.OtherDefaults, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, - [Faction.Horde]: Race.RaceTroll, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.P1_PREBIS.gear, - 2: Presets.P1_BIS.gear, - }, - [Faction.Horde]: { - 1: Presets.P1_PREBIS.gear, - 2: Presets.P1_BIS.gear, - }, - }, - }, - ], -}); - -export class FireMageSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - const statSelectionPresets = [ - { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map( - [...MAGE_BREAKPOINTS.presets, ...Presets.COMBUSTION_BREAKPOINT.presets].sort( - (a, b) => a[1] - b[1], - ), - ), - }, - ]; - - this.reforger = new ReforgeOptimizer(this, { - statSelectionPresets: statSelectionPresets, - enableBreakpointLimits: true, - // updateSoftCaps: softCaps => { - // const raidBuffs = player.getRaid()?.getBuffs(); - // const hasBL = !!raidBuffs?.bloodlust; - // const hasBerserking = player.getRace() === Race.RaceTroll; - - // const modifyHaste = (oldHastePercent: number, modifier: number) => - // Number(formatToNumber(((oldHastePercent / 100 + 1) / modifier - 1) * 100, { maximumFractionDigits: 5 })); - - // this.individualConfig.defaults.softCapBreakpoints!.forEach(softCap => { - // const softCapToModify = softCaps.find(sc => sc.unitStat.equals(softCap.unitStat)); - // if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHastePercent) && softCapToModify) { - // const adjustedHastedBreakpoints = new Set([...softCap.breakpoints]); - // const hasCloseMatchingValue = (value: number) => - // [...adjustedHastedBreakpoints.values()].find(bp => bp.toFixed(2) === value.toFixed(2)); - - // softCap.breakpoints.forEach(breakpoint => { - // if (hasBL) { - // const blBreakpoint = modifyHaste(breakpoint, 1.3); - - // if (blBreakpoint > 0) { - // if (!hasCloseMatchingValue(blBreakpoint)) adjustedHastedBreakpoints.add(blBreakpoint); - // if (hasBerserking) { - // const berserkingBreakpoint = modifyHaste(blBreakpoint, 1.2); - // if (berserkingBreakpoint > 0 && !hasCloseMatchingValue(berserkingBreakpoint)) { - // adjustedHastedBreakpoints.add(berserkingBreakpoint); - // } - // } - // } - // } - // }); - // softCapToModify.breakpoints = [...adjustedHastedBreakpoints].sort((a, b) => a - b); - // } - // }); - // return softCaps; - // }, - // additionalSoftCapTooltipInformation: { - // [Stat.StatHasteRating]: () => { - // const raidBuffs = player.getRaid()?.getBuffs(); - // const hasBL = !!raidBuffs?.bloodlust; - // const hasBerserking = player.getRace() === Race.RaceTroll; - - // return ( - // <> - // {(hasBL || hasBerserking) && ( - // <> - //

Additional breakpoints have been created using the following cooldowns:

- //
    - // {hasBL &&
  • Bloodlust
  • } - // {hasBerserking &&
  • Berserking
  • } - //
- // - // )} - // - // ); - // }, - // }, - }); - } -} diff --git a/ui/mage/frost/apls/frost.apl.json b/ui/mage/frost/apls/frost.apl.json deleted file mode 100644 index 3037222676..0000000000 --- a/ui/mage/frost/apls/frost.apl.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":31687}}},"doAtValue":{"const":{"val":"-15s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":55342}}},"doAtValue":{"const":{"val":"-6.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":12051}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-3.5s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-2s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116}}},"doAtValue":{"const":{"val":"-2s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116257}}},"rhs":{"spellCastTime":{"spellId":{"spellId":12051}}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"45000"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":116011},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsReady":{"spellId":{"spellId":108978}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":112965},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}},{"auraIsActive":{"auraId":{"spellId":44549},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":108978}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"const":{"val":"75s"}}}}]}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":108978}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"const":{"val":"50s"}}}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":112965},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":12472},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"spellId":33697},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"itemId":76093},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"spellId":126734},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"spellId":26297},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"numEquippedStatProcTrinkets":{"statType1":3,"statType2":7,"statType3":6}},"rhs":{"const":{"val":"2"}}}}]}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":2825,"tag":-1},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"spellId":57724}}},"rhs":{"const":{"val":"180s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":108978}}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":112965},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":30455}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":44549},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":44614}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpMul","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"const":{"val":"3"}}}}}}]}},"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"strictMultidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":114923}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"condition":{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"spellIsReady":{"spellId":{"spellId":84714}}},"castSpell":{"spellId":{"spellId":84714}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":112965},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":108978}}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":30455}}}}, - {"action":{"castSpell":{"spellId":{"spellId":116}}}} - ] -} diff --git a/ui/mage/frost/apls/frost_aoe.apl.json b/ui/mage/frost/apls/frost_aoe.apl.json deleted file mode 100644 index b53bac1445..0000000000 --- a/ui/mage/frost/apls/frost_aoe.apl.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":31687}}},"doAtValue":{"const":{"val":"-15s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":12051}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":116011}}},"doAtValue":{"const":{"val":"-5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116257}}},"rhs":{"spellCastTime":{"spellId":{"spellId":12051}}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"45000"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":116011}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":116011},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":116011}}},"rhs":{"spellCastTime":{"spellId":{"spellId":116011}}}}}]}}]}},"castSpell":{"spellId":{"spellId":116011}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"spellIsReady":{"spellId":{"spellId":84714}}},"castSpell":{"spellId":{"spellId":84714}}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":112965},"includeReactionTime":true}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":30455}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":44549},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":44614}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpMul","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"const":{"val":"3"}}}}}}]}},"multidot":{"spellId":{"spellId":44457},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":44457}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"strictMultidot":{"spellId":{"spellId":114923},"maxDots":5,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":114923}}},"rhs":{"inputDelay":{}}}}}}}, - {"action":{"condition":{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":112948},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":112948}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":112965},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":30455}}}}, - {"action":{"channelSpell":{"spellId":{"spellId":10},"interruptIf":{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":84714}}},{"auraIsActive":{"auraId":{"spellId":112965},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"spellId":44549},"includeReactionTime":true}}]}}}}} - ] -} diff --git a/ui/mage/frost/gear_sets/p1_bis.gear.json b/ui/mage/frost/gear_sets/p1_bis.gear.json deleted file mode 100644 index 2666c81849..0000000000 --- a/ui/mage/frost/gear_sets/p1_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87008, "gems": [76885, 76642], "reforging": 167 }, - { "id": 87076, "reforging": 146 }, - { "id": 87011, "enchant": 4806, "gems": [76642], "reforging": 167 }, - { "id": 90512, "enchant": 4892, "reforging": 166 }, - { "id": 87010, "enchant": 4419, "gems": [76699, 76699] }, - { "id": 86958, "enchant": 4414, "gems": [0], "reforging": 153 }, - { "id": 87007, "enchant": 4430, "gems": [0], "reforging": 137, "tinker": 4898 }, - { "id": 86981, "gems": [76699, 76642, 76694] }, - { "id": 87174, "enchant": 4895, "gems": [76668, 76642] }, - { "id": 87162, "enchant": 4429, "gems": [76699], "reforging": 168 }, - { "id": 90511, "reforging": 116 }, - { "id": 86949, "reforging": 145 }, - { "id": 79331 }, - { "id": 87175 }, - { "id": 90513, "enchant": 4442, "gems": [76642], "reforging": 167 }, - { "id": 86960, "enchant": 4434, "reforging": 145 } - ] -} diff --git a/ui/mage/frost/gear_sets/p1_post_hof.gear.json b/ui/mage/frost/gear_sets/p1_post_hof.gear.json deleted file mode 100644 index fffa7e242d..0000000000 --- a/ui/mage/frost/gear_sets/p1_post_hof.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86970, "gems": [76885, 76694], "reforging": 165 }, - { "id": 87076 }, - { "id": 87038, "enchant": 4806, "gems": [76694], "reforging": 146 }, - { "id": 86971, "enchant": 4892, "reforging": 145 }, - { "id": 87010, "enchant": 4419, "gems": [76668, 76699], "reforging": 146 }, - { "id": 86958, "enchant": 4414, "gems": [0] }, - { "id": 87007, "enchant": 4430, "gems": [0], "reforging": 137, "tinker": 4898 }, - { "id": 86981, "gems": [76668, 76682, 76694] }, - { "id": 87009, "enchant": 4895, "gems": [76694], "reforging": 168 }, - { "id": 86969, "enchant": 4429, "gems": [76668], "reforging": 167 }, - { "id": 86949, "reforging": 145 }, - { "id": 89072 }, - { "id": 79331 }, - { "id": 87065 }, - { "id": 87066, "enchant": 4442 }, - { "id": 86960, "enchant": 4434, "reforging": 145 } - ] -} diff --git a/ui/mage/frost/gear_sets/p1_post_msv.gear.json b/ui/mage/frost/gear_sets/p1_post_msv.gear.json deleted file mode 100644 index 5e49504c29..0000000000 --- a/ui/mage/frost/gear_sets/p1_post_msv.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87073, "gems": [76885, 76682] }, - { "id": 87076, "reforging": 146 }, - { "id": 87038, "enchant": 4806, "gems": [76694], "reforging": 144 }, - { "id": 89936, "enchant": 4892, "reforging": 167 }, - { "id": 87027, "enchant": 4419, "gems": [76694, 76668], "reforging": 167 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 167 }, - { "id": 89931, "enchant": 4430, "gems": [76682, 0], "reforging": 167, "tinker": 4898 }, - { "id": 87064, "gems": [76668, 76682, 76694], "reforging": 168 }, - { "id": 89088, "enchant": 4895, "gems": [76694], "reforging": 146 }, - { "id": 88878, "enchant": 4429, "reforging": 145 }, - { "id": 89072 }, - { "id": 90859, "reforging": 168 }, - { "id": 79331 }, - { "id": 87065 }, - { "id": 87066, "enchant": 4442, "reforging": 144 }, - { "id": 84866, "enchant": 4434, "reforging": 167 } - ] -} diff --git a/ui/mage/frost/gear_sets/p1_prebis.gear.json b/ui/mage/frost/gear_sets/p1_prebis.gear.json deleted file mode 100644 index 8f60b98645..0000000000 --- a/ui/mage/frost/gear_sets/p1_prebis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86717, "gems": [76885, 76682], "reforging": 167 }, - { "id": 90596, "reforging": 145 }, - { "id": 89340, "enchant": 4806, "gems": [76668], "reforging": 138 }, - { "id": 86874, "enchant": 4892, "reforging": 165 }, - { "id": 86715, "enchant": 4419, "gems": [76668, 76668], "reforging": 144 }, - { "id": 86828, "enchant": 4414, "gems": [0] }, - { "id": 86718, "enchant": 4430, "gems": [0], "tinker": 4898 }, - { "id": 89062, "gems": [76682, 76694], "reforging": 145 }, - { "id": 86716, "enchant": 4895, "gems": [76694], "reforging": 168 }, - { "id": 86888, "enchant": 4429, "gems": [76668], "reforging": 165 }, - { "id": 90859, "reforging": 168 }, - { "id": 89072 }, - { "id": 79331 }, - { "id": 86907 }, - { "id": 86886, "enchant": 4442, "gems": [89882, 0], "reforging": 144 }, - { "id": 86829, "enchant": 4434, "reforging": 146 } - ] -} diff --git a/ui/mage/frost/gear_sets/p2_bis.gear.json b/ui/mage/frost/gear_sets/p2_bis.gear.json deleted file mode 100644 index 5e47641fba..0000000000 --- a/ui/mage/frost/gear_sets/p2_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87008, "gems": [76885, 76642], "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87076, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87011, "enchant": 4806, "gems": [76682], "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90512, "enchant": 4892, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87010, "enchant": 4419, "gems": [76699, 76699], "upgradeStep": "UpgradeStepTwo" }, - { "id": 86958, "enchant": 4414, "gems": [0], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87007, "enchant": 4430, "gems": [0], "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 86981, "gems": [76699, 76682, 76694], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87174, "enchant": 4895, "gems": [76694, 76682], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87162, "enchant": 4429, "gems": [76668], "reforging": 165, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90511, "reforging": 116, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86949, "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79331, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87175, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87164, "enchant": 4442, "gems": [89882, 76694], "reforging": 144, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86960, "enchant": 4434, "reforging": 145, "upgradeStep": "UpgradeStepTwo" } - ] -} diff --git a/ui/mage/frost/gear_sets/p3_bis.gear.json b/ui/mage/frost/gear_sets/p3_bis.gear.json deleted file mode 100644 index 213d9bdabc..0000000000 --- a/ui/mage/frost/gear_sets/p3_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":96635,"gems":[95347,76672],"reforging":140}, - {"id":96453,"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":96638,"enchant":4806,"gems":[76694,76672],"reforging":147}, - {"id":95014,"enchant":4892,"gems":[76672]}, - {"id":95039,"enchant":4419,"gems":[76694,76694,76694]}, - {"id":96506,"enchant":4414,"gems":[0],"upgradeStep":"UpgradeStepTwo"}, - {"id":96634,"enchant":4430,"gems":[76694,0],"reforging":146,"tinker":4898}, - {"id":96462,"gems":[76694,76672,76694],"reforging":154,"upgradeStep":"UpgradeStepTwo"}, - {"id":96636,"enchant":4895,"gems":[76672,76682],"reforging":147}, - {"id":95004,"enchant":4429,"gems":[76672,76682],"reforging":145}, - {"id":95019,"gems":[76682],"reforging":140}, - {"id":96529,"gems":[76682],"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":96455,"reforging":154,"upgradeStep":"UpgradeStepTwo"}, - {"id":96413,"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":96404,"enchant":4442,"gems":[76682,76694],"reforging":147,"upgradeStep":"UpgradeStepTwo"}, - {"id":96562,"enchant":4434,"gems":[76694],"reforging":147,"upgradeStep":"UpgradeStepTwo"} - ] -} diff --git a/ui/mage/frost/index.ts b/ui/mage/frost/index.ts deleted file mode 100644 index e2bf6a7fba..0000000000 --- a/ui/mage/frost/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { FrostMageSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.FrostMage, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new FrostMageSimUI(document.body, player); diff --git a/ui/mage/frost/inputs.ts b/ui/mage/frost/inputs.ts deleted file mode 100644 index 846447dacd..0000000000 --- a/ui/mage/frost/inputs.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -export const MageRotationConfig = { - inputs: [], -}; diff --git a/ui/mage/frost/presets.ts b/ui/mage/frost/presets.ts deleted file mode 100644 index 8b3843c21f..0000000000 --- a/ui/mage/frost/presets.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { Encounter } from '../../core/encounter'; -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Profession, Race, Stat } from '../../core/proto/common'; -import { FrostMage_Options as MageOptions, MageArmor } from '../../core/proto/mage'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import FrostApl from './apls/frost.apl.json'; -import FrostAoeApl from './apls/frost_aoe.apl.json'; -import P1PreBISGear from './gear_sets/p1_prebis.gear.json'; -import P1BISGear from './gear_sets/p1_bis.gear.json'; -import P2BSISGear from './gear_sets/p2_bis.gear.json'; -import P3BSISGear from './gear_sets/p3_bis.gear.json'; -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const P1_PREBIS = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBISGear); -export const P1_BIS = PresetUtils.makePresetGear('P1 - BIS', P1BISGear); -export const P2_BIS = PresetUtils.makePresetGear('P2 - BIS', P2BSISGear); -export const P3_BIS = PresetUtils.makePresetGear('P3 - BIS', P3BSISGear); - -export const ROTATION_PRESET_DEFAULT = PresetUtils.makePresetAPLRotation('Default', FrostApl); -export const ROTATION_PRESET_AOE = PresetUtils.makePresetAPLRotation('AOE', FrostAoeApl); -// export const ROTATION_PRESET_CLEAVE = PresetUtils.makePresetAPLRotation('Cleave', FrostCleaveApl); - -// Preset options for EP weights -export const P3_BIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level >= 517', - Stats.fromMap({ - [Stat.StatIntellect]: 1.23, - [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 1.55, - [Stat.StatCritRating]: 0.54, - [Stat.StatHasteRating]: 0.81, - [Stat.StatMasteryRating]: 0.52, - }), -); - -export const P1_BIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level >= 500', - Stats.fromMap({ - [Stat.StatIntellect]: 1.26, - [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 1.30, - [Stat.StatCritRating]: 0.61, - [Stat.StatHasteRating]: 0.74, - [Stat.StatMasteryRating]: 0.52, - }), -); - -export const P1_PREBIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level < 500', - Stats.fromMap({ - [Stat.StatIntellect]: 1.25, - [Stat.StatSpellPower]: 1.0, - [Stat.StatHitRating]: 1.55, - [Stat.StatCritRating]: 0.55, - [Stat.StatHasteRating]: 0.62, - [Stat.StatMasteryRating]: 0.5, - }), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. - -export const FrostDefaultTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '311122', - }), -}; - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76085, // Flask of the Warm Sun - foodId: 74650, // Mogu Fish Stew - potId: 76093, // Potion of the Jade Serpent - prepotId: 76093, // Potion of the Jade Serpent -}); - -export const FrostTalentsCleave = { - name: 'Cleave', - data: SavedTalents.create({ - talentsString: '311122', - }), -}; - -export const FrostTalentsAoE = { - name: 'AoE (5+)', - data: SavedTalents.create({ - talentsString: '311112', - }), -}; - -export const DefaultFrostOptions = MageOptions.create({ - classOptions: { - defaultMageArmor: MageArmor.MageArmorFrostArmor, - }, -}); - -export const OtherDefaults = { - distanceFromTarget: 20, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, - race: Race.RaceOrc, -}; - -export const ENCOUNTER_SINGLE_TARGET = PresetUtils.makePresetEncounter('Single Target', Encounter.defaultEncounterProto()); -export const ENCOUNTER_CLEAVE = PresetUtils.makePresetEncounter('Cleave', Encounter.defaultEncounterProto(2)); -export const ENCOUNTER_AOE = PresetUtils.makePresetEncounter('AoE (5+)', Encounter.defaultEncounterProto(5)); - -export const P1_PRESET_BUILD_DEFAULT = PresetUtils.makePresetBuild('Single Target', { - talents: FrostDefaultTalents, - rotation: ROTATION_PRESET_DEFAULT, - encounter: ENCOUNTER_SINGLE_TARGET, -}); - -export const P1_PRESET_BUILD_CLEAVE = PresetUtils.makePresetBuild('Cleave', { - talents: FrostTalentsCleave, - rotation: ROTATION_PRESET_DEFAULT, - encounter: ENCOUNTER_CLEAVE, -}); - -export const P1_PRESET_BUILD_AOE = PresetUtils.makePresetBuild('AoE (5+)', { - talents: FrostTalentsAoE, - rotation: ROTATION_PRESET_AOE, - encounter: ENCOUNTER_AOE, -}); diff --git a/ui/mage/frost/sim.ts b/ui/mage/frost/sim.ts deleted file mode 100644 index 2d4a978d37..0000000000 --- a/ui/mage/frost/sim.ts +++ /dev/null @@ -1,231 +0,0 @@ -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { StatCapType } from '../../core/proto/ui'; -import { DEFAULT_CASTER_GEM_STATS, StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { DefaultDebuffs, DefaultRaidBuffs, MAGE_BREAKPOINTS } from '../presets'; -import * as FrostInputs from './inputs'; -import * as Presets from './presets'; -import * as MageInputs from '../inputs'; - -const mageBombBreakpoints = MAGE_BREAKPOINTS.presets; -const livingBombBreakpoints = [ - mageBombBreakpoints.get('6-tick - Living Bomb')!, - mageBombBreakpoints.get('7-tick - Living Bomb')!, - mageBombBreakpoints.get('8-tick - Living Bomb')!, -]; -const netherTempestBreakpoints = [ - mageBombBreakpoints.get('15-tick - Nether Tempest')!, - mageBombBreakpoints.get('16-tick - Nether Tempest')!, - mageBombBreakpoints.get('17-tick - Nether Tempest')!, - mageBombBreakpoints.get('18-tick - Nether Tempest')!, - mageBombBreakpoints.get('19-tick - Nether Tempest')!, - mageBombBreakpoints.get('20-tick - Nether Tempest')!, - mageBombBreakpoints.get('21-tick - Nether Tempest')!, - mageBombBreakpoints.get('22-tick - Nether Tempest')!, - mageBombBreakpoints.get('23-tick - Nether Tempest')!, -]; - -const P2CritPostCapEPs = [ - 0.56 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, - 0.45 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, - 0.35 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, -]; -const P2HastePostCapEPs = [0.46 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; - -const P3CritPostCapEPs = [ - 0.51 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, - 0.44 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, - 0.38 * Mechanics.CRIT_RATING_PER_CRIT_PERCENT, -]; -const P3HastePostCapEPs = [0.48 * Mechanics.HASTE_RATING_PER_HASTE_PERCENT]; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecFrostMage, { - cssClass: 'frost-mage-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Mage), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], - // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. - epReferenceStat: Stat.StatSpellPower, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [ - Stat.StatHealth, - Stat.StatMana, - Stat.StatStamina, - Stat.StatIntellect, - Stat.StatSpirit, - Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - ], - [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], - ), - gemStats: DEFAULT_CASTER_GEM_STATS, - - defaults: { - // Default equipped gear. - gear: Presets.P2_BIS.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P1_BIS_EP_PRESET.epWeights, - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), - // Default soft caps for the Reforge optimizer - softCapBreakpoints: (() => { - const hasteSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { - breakpoints: livingBombBreakpoints, - capType: StatCapType.TypeThreshold, - postCapEPs: P2HastePostCapEPs, - }); - - const critSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellCritPercent, { - breakpoints: [23, 26, 28], - capType: StatCapType.TypeSoftCap, - postCapEPs: P2CritPostCapEPs, - }); - - return [critSoftCapConfig, hasteSoftCapConfig]; - })(), - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.FrostDefaultTalents.data, - // Default spec-specific settings. - specOptions: Presets.DefaultFrostOptions, - other: Presets.OtherDefaults, - // Default raid/party buffs settings. - raidBuffs: DefaultRaidBuffs, - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: DefaultDebuffs, - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [MageInputs.MageArmorInputs()], - // Inputs to include in the 'Rotation' section on the settings tab. - rotationInputs: FrostInputs.MageRotationConfig, - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [ - //Should add hymn of hope, revitalize, and - ], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [ - //FrostInputs.WaterElementalDisobeyChance, - OtherInputs.InputDelay, - OtherInputs.DistanceFromTarget, - OtherInputs.TankAssignment, - ], - }, - itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: true, - }, - - presets: { - epWeights: [Presets.P1_PREBIS_EP_PRESET, Presets.P1_BIS_EP_PRESET, Presets.P3_BIS_EP_PRESET], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_DEFAULT, Presets.ROTATION_PRESET_AOE], - // Preset talents that the user can quickly select. - talents: [Presets.FrostDefaultTalents, Presets.FrostTalentsCleave, Presets.FrostTalentsAoE], - // Preset gear configurations that the user can quickly select. - gear: [Presets.P1_PREBIS, Presets.P1_BIS, Presets.P2_BIS, Presets.P3_BIS], - - builds: [Presets.P1_PRESET_BUILD_DEFAULT, Presets.P1_PRESET_BUILD_CLEAVE, Presets.P1_PRESET_BUILD_AOE], - }, - - autoRotation: (player: Player): APLRotation => { - const numTargets = player.sim.encounter.targets.length; - if (numTargets >= 5) { - return Presets.ROTATION_PRESET_AOE.rotation.rotation!; - // } else if (numTargets >= 2) { - // return Presets.ROTATION_PRESET_CLEAVE.rotation.rotation!; - } else { - return Presets.ROTATION_PRESET_DEFAULT.rotation.rotation!; - } - }, - - raidSimPresets: [ - { - spec: Spec.SpecFrostMage, - talents: Presets.FrostDefaultTalents.data, - specOptions: Presets.DefaultFrostOptions, - consumables: Presets.DefaultConsumables, - otherDefaults: Presets.OtherDefaults, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceAlliancePandaren, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.P1_PREBIS.gear, - }, - [Faction.Horde]: { - 1: Presets.P1_PREBIS.gear, - }, - }, - }, - ], -}); - -export class FrostMageSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this, { - statSelectionPresets: [MAGE_BREAKPOINTS], - enableBreakpointLimits: true, - getEPDefaults: player => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - if (avgIlvl >= 517) { - return Presets.P3_BIS_EP_PRESET.epWeights; - } else if (avgIlvl >= 500) { - return Presets.P1_BIS_EP_PRESET.epWeights; - } - return Presets.P1_PREBIS_EP_PRESET.epWeights; - }, - updateSoftCaps: softCaps => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - - this.individualConfig.defaults.softCapBreakpoints!.forEach(softCap => { - const softCapToModify = softCaps.find(sc => sc.unitStat.equals(softCap.unitStat)); - if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHastePercent) && softCapToModify) { - const talents = player.getTalents(); - if (talents.livingBomb) { - softCapToModify.breakpoints = livingBombBreakpoints; - } else if (talents.netherTempest) { - softCapToModify.breakpoints = netherTempestBreakpoints; - } - if (avgIlvl >= 517) { - softCapToModify.postCapEPs = P3HastePostCapEPs; - } else { - softCapToModify.postCapEPs = P2HastePostCapEPs; - } - } - - if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellCritPercent) && softCapToModify) { - if (avgIlvl >= 517) { - softCapToModify.postCapEPs = P3CritPostCapEPs; - } else { - softCapToModify.postCapEPs = P2CritPostCapEPs; - } - } - }); - return softCaps; - }, - }); - } -} diff --git a/ui/mage/gear_sets/blank.gear.json b/ui/mage/gear_sets/blank.gear.json new file mode 100644 index 0000000000..9c53a135fe --- /dev/null +++ b/ui/mage/gear_sets/blank.gear.json @@ -0,0 +1 @@ +{"items": []} diff --git a/ui/mage/index.ts b/ui/mage/index.ts new file mode 100644 index 0000000000..1ea29da857 --- /dev/null +++ b/ui/mage/index.ts @@ -0,0 +1,12 @@ +import { Player } from '../core/player'; +import { PlayerSpecs } from '../core/player_specs'; +import { Spec } from '../core/proto/common'; +import { Sim } from '../core/sim'; +import { TypedEvent } from '../core/typed_event'; +import { MageSimUI } from './sim'; + +const sim = new Sim(); +const player = new Player(PlayerSpecs.Mage, sim); +sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); + +new MageSimUI(document.body, player); diff --git a/ui/mage/presets.ts b/ui/mage/presets.ts index 8d8b39f4a0..cdc14ff5dd 100644 --- a/ui/mage/presets.ts +++ b/ui/mage/presets.ts @@ -1,61 +1,62 @@ -import { Debuffs, PseudoStat, RaidBuffs } from '../core/proto/common'; -import { UnitStat, UnitStatPresets } from '../core/proto_utils/stats'; +import * as PresetUtils from '../core/preset_utils'; +import { Debuffs, PseudoStat, RaidBuffs, Stat, ConsumesSpec } from '../core/proto/common'; import { defaultRaidBuffMajorDamageCooldowns } from '../core/proto_utils/utils'; +import { Stats } from '../core/proto_utils/stats'; +import { SavedTalents } from '../core/proto/ui'; +import { Mage_Options as MageOptions } from '../core/proto/mage'; +import BlankAPL from './apls/blank.apl.json' +import BlankGear from './gear_sets/blank.gear.json'; -export const LIVING_BOMB_BREAKPOINTS: UnitStatPresets = { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([ - ['5-tick - Living Bomb', 12.507036], - ['6-tick - Living Bomb', 37.520061], - ['7-tick - Living Bomb', 62.469546], - ['8-tick - Living Bomb', 87.441436], - ['9-tick - Living Bomb', 112.539866], - ['10-tick - Living Bomb', 137.435713], - ['11-tick - Living Bomb', 162.58208], - ['12-tick - Living Bomb', 187.494038], - ]), -}; +// Preset options for this spec. +// Eventually we will import these values for the raid sim too, so its good to +// keep them in a separate file. + +export const BLANK_APL = PresetUtils.makePresetAPLRotation('Blank', BlankAPL) + +export const BLANK_GEARSET = PresetUtils.makePresetGear('Blank', BlankGear); -export const NETHER_TEMPEST_BREAKPOINTS: UnitStatPresets = { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([ - ['13-tick - Nether Tempest', 4.220959], - ['14-tick - Nether Tempest', 12.549253], - ['15-tick - Nether Tempest', 20.845936], - ['16-tick - Nether Tempest', 29.115575], - ['17-tick - Nether Tempest', 37.457064], - ['18-tick - Nether Tempest', 45.878942], - ['19-tick - Nether Tempest', 54.202028], - ['20-tick - Nether Tempest', 62.469563], - ['21-tick - Nether Tempest', 70.794222], - ['22-tick - Nether Tempest', 79.051062], - ['23-tick - Nether Tempest', 87.44146], - ['24-tick - Nether Tempest', 95.886424], - ['25-tick - Nether Tempest', 104.290134], - ['26-tick - Nether Tempest', 112.539896], - ['27-tick - Nether Tempest', 120.994524], - ['28-tick - Nether Tempest', 129.095127], - ['29-tick - Nether Tempest', 137.24798], - ['30-tick - Nether Tempest', 146.002521], - ]), +// Preset options for EP weights +export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( + 'A', + Stats.fromMap( + { + [Stat.StatAgility]: 1.0, + }, + { + [PseudoStat.PseudoStatMainHandDps]: 1.43, + [PseudoStat.PseudoStatOffHandDps]: 0.26, + }, + ), +); + +export const Talents = { + name: 'A', + data: SavedTalents.create({ + talentsString: '', + }), }; -export const MAGE_BREAKPOINTS: UnitStatPresets = { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([...LIVING_BOMB_BREAKPOINTS.presets, ...NETHER_TEMPEST_BREAKPOINTS.presets].sort((a, b) => a[1] - b[1])), +export const DefaultOptions = MageOptions.create({ + classOptions: { + + }, +}); + +export const OtherDefaults = { + distanceFromTarget: 20, }; +export const DefaultConsumables = ConsumesSpec.create({ + flaskId: 76084, // Flask of the Winds + foodId: 74648, // Skewered Eel + potId: 76089, // Potion of the Tol'vir + prepotId: 76089, // Potion of the Tol'vir +}); + export const DefaultRaidBuffs = RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - mindQuickening: true, - leaderOfThePack: true, - blessingOfMight: true, - unholyAura: true, - bloodlust: true, }); export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, + }); diff --git a/ui/mage/sim.tsx b/ui/mage/sim.tsx new file mode 100644 index 0000000000..b0f2323397 --- /dev/null +++ b/ui/mage/sim.tsx @@ -0,0 +1,126 @@ +import * as OtherInputs from '../core/components/inputs/other_inputs'; +import { ReforgeOptimizer } from '../core/components/suggest_reforges_action'; +import * as Mechanics from '../core/constants/mechanics'; +import { IndividualSimUI, registerSpecConfig } from '../core/individual_sim_ui'; +import { Player } from '../core/player'; +import { PlayerClasses } from '../core/player_classes'; +import { Mage } from '../core/player_classes/mage'; +import { APLRotation } from '../core/proto/apl'; +import { Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../core/proto/common'; +import { StatCapType } from '../core/proto/ui'; +import { DEFAULT_CASTER_GEM_STATS, StatCap, Stats, UnitStat } from '../core/proto_utils/stats'; +import { formatToNumber } from '../core/utils'; +import { DefaultDebuffs, DefaultRaidBuffs } from './presets'; +import * as Inputs from './inputs'; +import * as Presets from './presets'; +import * as MageInputs from './inputs'; + +const SPEC_CONFIG = registerSpecConfig(Spec.SpecMage, { + cssClass: 'mage-sim-ui', + cssScheme: PlayerClasses.getCssClass(Mage), + // List any known bugs / issues here and they'll be shown on the site. + knownIssues: [], + + // All stats for which EP should be calculated. + epStats: [Stat.StatIntellect, Stat.StatSpellPower], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. + epReferenceStat: Stat.StatSpellPower, + // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. + displayStats: UnitStat.createDisplayStatArray( + [ + Stat.StatHealth, + Stat.StatMana, + Stat.StatStamina, + Stat.StatIntellect, + Stat.StatSpirit, + Stat.StatSpellPower, + ], + [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], + ), + gemStats: DEFAULT_CASTER_GEM_STATS, + + defaults: { + // Default equipped gear. + gear: Presets.BLANK_GEARSET.gear, + // Default EP weights for sorting gear in the gear picker. + epWeights: Presets.P1_EP_PRESET.epWeights, + // Default consumes settings. + consumables: Presets.DefaultConsumables, + // Default talents. + talents: Presets.Talents.data, + // Default spec-specific settings. + specOptions: Presets.DefaultOptions, + other: Presets.OtherDefaults, + // Default raid/party buffs settings. + raidBuffs: DefaultRaidBuffs, + + partyBuffs: PartyBuffs.create({}), + individualBuffs: IndividualBuffs.create({}), + debuffs: DefaultDebuffs, + }, + + // IconInputs to include in the 'Player' section on the settings tab. + playerIconInputs: [MageInputs.MageArmorInputs()], + // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. + includeBuffDebuffInputs: [], + excludeBuffDebuffInputs: [], + // Inputs to include in the 'Other' section on the settings tab. + otherInputs: { + inputs: [OtherInputs.InputDelay, OtherInputs.DistanceFromTarget, OtherInputs.TankAssignment], + }, + itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], + encounterPicker: { + // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. + showExecuteProportion: true, + }, + + presets: { + epWeights: [], + // Preset rotations that the user can quickly select. + rotations: [], + // Preset talents that the user can quickly select. + talents: [], + // Preset gear configurations that the user can quickly select. + gear: [], + + builds: [], + }, + + autoRotation: (player: Player): APLRotation => { + // const numTargets = player.sim.encounter.targets.length; + // if (numTargets >= 2) { + // return Presets.ROTATION_PRESET_CLEAVE.rotation.rotation!; + // } else { + return Presets.BLANK_APL.rotation.rotation!; + // } + }, + + raidSimPresets: [ + { + spec: Spec.SpecMage, + talents: Presets.Talents.data, + specOptions: Presets.DefaultOptions, + consumables: Presets.DefaultConsumables, + otherDefaults: Presets.OtherDefaults, + defaultFactionRaces: { + [Faction.Unknown]: Race.RaceUnknown, + [Faction.Alliance]: Race.RaceGnome, + [Faction.Horde]: Race.RaceTroll, + }, + defaultGear: { + [Faction.Unknown]: {}, + [Faction.Alliance]: { + 1: Presets.BLANK_GEARSET.gear, + }, + [Faction.Horde]: { + 1: Presets.BLANK_GEARSET.gear, + }, + }, + }, + ], +}); + +export class MageSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { + super(parentElem, player, SPEC_CONFIG); + } +} diff --git a/ui/paladin/holy/presets.ts b/ui/paladin/holy/presets.ts index c7b0dfabf6..a9aac95e90 100644 --- a/ui/paladin/holy/presets.ts +++ b/ui/paladin/holy/presets.ts @@ -22,9 +22,6 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 1.375, [Stat.StatSpirit]: 1.125, [Stat.StatSpellPower]: 1, - [Stat.StatCritRating]: 0.75, - [Stat.StatHasteRating]: 0.85, - [Stat.StatMasteryRating]: 0.5, }), ); diff --git a/ui/paladin/holy/sim.ts b/ui/paladin/holy/sim.ts index 75eebd82ff..f2a279f418 100644 --- a/ui/paladin/holy/sim.ts +++ b/ui/paladin/holy/sim.ts @@ -15,12 +15,12 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecHolyPaladin, { knownIssues: [], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatHasteRating, Stat.StatCritRating, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatSpellPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatMana, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMasteryRating, Stat.StatArmor, Stat.StatStamina], + [Stat.StatHealth, Stat.StatMana, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatArmor, Stat.StatStamina], [PseudoStat.PseudoStatSpellHastePercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHitPercent], ), gemStats: DEFAULT_HYBRID_CASTER_GEM_STATS, diff --git a/ui/paladin/protection/presets.ts b/ui/paladin/protection/presets.ts index be02882ec2..32aabb21ea 100644 --- a/ui/paladin/protection/presets.ts +++ b/ui/paladin/protection/presets.ts @@ -25,13 +25,6 @@ export const P1_BALANCED_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatStrength]: 1.00, [Stat.StatStamina]: 0.91, - [Stat.StatHitRating]: 1.30, - [Stat.StatCritRating]: 0.44, - [Stat.StatHasteRating]: 0.89, - [Stat.StatExpertiseRating]: 0.90, - [Stat.StatDodgeRating]: 0.40, - [Stat.StatParryRating]: 0.35, - [Stat.StatMasteryRating]: 0.86, [Stat.StatArmor]: 0.48, [Stat.StatBonusArmor]: 0.48, [Stat.StatAttackPower]: 0.31, diff --git a/ui/paladin/protection/sim.ts b/ui/paladin/protection/sim.ts index d750c339fe..38c4d637fb 100644 --- a/ui/paladin/protection/sim.ts +++ b/ui/paladin/protection/sim.ts @@ -49,15 +49,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionPaladin, { Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatExpertiseRating, - Stat.StatHasteRating, Stat.StatArmor, Stat.StatBonusArmor, - Stat.StatDodgeRating, - Stat.StatParryRating, - Stat.StatMasteryRating, ], epPseudoStats: [PseudoStat.PseudoStatMainHandDps], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. @@ -72,12 +65,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionPaladin, { Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, - Stat.StatExpertiseRating, - Stat.StatMasteryRating, ], [ - PseudoStat.PseudoStatPhysicalHitPercent, - PseudoStat.PseudoStatPhysicalCritPercent, + PseudoStat.PseudoStatMeleeHitPercent, + PseudoStat.PseudoStatMeleeCritPercent, PseudoStat.PseudoStatMeleeHastePercent, PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, @@ -93,22 +84,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionPaladin, { // Default EP weights for sorting gear in the gear picker. // Values for now are pre-Cata initial WAG epWeights: Presets.P1_BALANCED_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - const hitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5); - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 15 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - - return hitCap.add(expCap); - })(), - softCapBreakpoints: (() => { - return [ - StatCap.fromStat(Stat.StatExpertiseRating, { - breakpoints: [7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION, 15 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION], - capType: StatCapType.TypeSoftCap, - postCapEPs: [0.57, 0], - }), - ]; - })(), // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. @@ -119,22 +94,12 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionPaladin, { // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - blessingOfMight: true, - bloodlust: true, - elementalOath: true, - powerWordFortitude: true, - serpentsSwiftness: true, - trueshotAura: true, + }), partyBuffs: PartyBuffs.create({}), individualBuffs: IndividualBuffs.create({}), debuffs: Debuffs.create({ - curseOfElements: true, - physicalVulnerability: true, - weakenedArmor: true, - weakenedBlows: true, + }), rotationType: APLRotation_Type.TypeAuto, }, @@ -206,12 +171,5 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionPaladin, { export class ProtectionPaladinSimUI extends IndividualSimUI { constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this, { - updateSoftCaps: softCaps => { - softCaps[0].postCapEPs[0] = player.getEpWeights().getStat(Stat.StatExpertiseRating) * 0.9; - return softCaps; - }, - }); } } diff --git a/ui/paladin/retribution/presets.ts b/ui/paladin/retribution/presets.ts index 49b69fa9e4..a7d0626d3f 100644 --- a/ui/paladin/retribution/presets.ts +++ b/ui/paladin/retribution/presets.ts @@ -23,11 +23,6 @@ export const P1_P2_EP_PRESET = PresetUtils.makePresetEpWeights( Stats.fromMap( { [Stat.StatStrength]: 1.0, - [Stat.StatHitRating]: 1.0, - [Stat.StatExpertiseRating]: 0.87, - [Stat.StatHasteRating]: 0.52, - [Stat.StatMasteryRating]: 0.51, - [Stat.StatCritRating]: 0.5, [Stat.StatAttackPower]: 0.44, }, { @@ -41,11 +36,6 @@ export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( Stats.fromMap( { [Stat.StatStrength]: 1.0, - [Stat.StatHitRating]: 0.68, - [Stat.StatExpertiseRating]: 0.68, - [Stat.StatHasteRating]: 0.67, - [Stat.StatMasteryRating]: 0.62, - [Stat.StatCritRating]: 0.56, [Stat.StatAttackPower]: 0.44, }, { @@ -59,12 +49,7 @@ export const PRERAID_EP_PRESET = PresetUtils.makePresetEpWeights( Stats.fromMap( { [Stat.StatStrength]: 1.0, - [Stat.StatHitRating]: 0.72, - [Stat.StatExpertiseRating]: 0.63, - [Stat.StatHasteRating]: 0.56, [Stat.StatAttackPower]: 0.44, - [Stat.StatMasteryRating]: 0.41, - [Stat.StatCritRating]: 0.38, }, { [PseudoStat.PseudoStatMainHandDps]: 1.77, diff --git a/ui/paladin/retribution/sim.ts b/ui/paladin/retribution/sim.ts index 5945591e48..167bca84f4 100644 --- a/ui/paladin/retribution/sim.ts +++ b/ui/paladin/retribution/sim.ts @@ -11,20 +11,11 @@ import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/util import * as PaladinInputs from '../inputs.js'; import * as Presets from './presets.js'; -const getStatCaps = () => { - const hitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5); - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - - return hitCap.add(expCap); -}; - const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { cssClass: 'retribution-paladin-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Paladin), // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [ - 'If reforging times out, click the gear icon next to the reforge button, check "Use custom EP weights" and then check Max for the hit cap to undershoot', - ], + knownIssues: [], overwriteDisplayStats: (player: Player) => { const playerStats = player.getCurrentStats(); @@ -55,20 +46,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { epStats: [ Stat.StatStrength, Stat.StatAttackPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatExpertiseRating, - Stat.StatMasteryRating, ], gemStats: [ Stat.StatStamina, Stat.StatStrength, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatExpertiseRating, - Stat.StatMasteryRating, ], epPseudoStats: [PseudoStat.PseudoStatMainHandDps], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. @@ -80,16 +61,14 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { Stat.StatAgility, Stat.StatIntellect, Stat.StatAttackPower, - Stat.StatExpertiseRating, Stat.StatSpellPower, Stat.StatMana, Stat.StatHealth, Stat.StatStamina, - Stat.StatMasteryRating, ], [ - PseudoStat.PseudoStatPhysicalHitPercent, - PseudoStat.PseudoStatPhysicalCritPercent, + PseudoStat.PseudoStatMeleeHitPercent, + PseudoStat.PseudoStatMeleeCritPercent, PseudoStat.PseudoStatMeleeHastePercent, PseudoStat.PseudoStatSpellHastePercent, PseudoStat.PseudoStatSpellCritPercent, @@ -102,8 +81,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { gear: Presets.P2_GEAR_PRESET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.P1_P2_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: getStatCaps(), // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. @@ -114,22 +91,11 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRetributionPaladin, { // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - blessingOfMight: true, - bloodlust: true, - elementalOath: true, - powerWordFortitude: true, - serpentsSwiftness: true, - trueshotAura: true, }), partyBuffs: PartyBuffs.create({}), individualBuffs: IndividualBuffs.create({}), debuffs: Debuffs.create({ - curseOfElements: true, - physicalVulnerability: true, - weakenedArmor: true, - weakenedBlows: true, + }), rotationType: APLRotation_Type.TypeAuto, }, diff --git a/ui/priest/discipline/presets.ts b/ui/priest/discipline/presets.ts index 8958845343..056ae43413 100644 --- a/ui/priest/discipline/presets.ts +++ b/ui/priest/discipline/presets.ts @@ -21,9 +21,6 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 0.11, [Stat.StatSpirit]: 0.47, [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 0.87, - [Stat.StatCritRating]: 0.74, - [Stat.StatHasteRating]: 1.65, [Stat.StatMP5]: 0.0, }), ); diff --git a/ui/priest/discipline/sim.ts b/ui/priest/discipline/sim.ts index a922c986ef..97bdb869b4 100644 --- a/ui/priest/discipline/sim.ts +++ b/ui/priest/discipline/sim.ts @@ -21,17 +21,13 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecDisciplinePriest, { Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, Stat.StatMP5, - Stat.StatMasteryRating, ], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatSpellPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5, Stat.StatMasteryRating], + [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5], [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), gemStats: DEFAULT_HYBRID_CASTER_GEM_STATS, diff --git a/ui/priest/holy/presets.ts b/ui/priest/holy/presets.ts index 6e2462e6f0..f761853e58 100644 --- a/ui/priest/holy/presets.ts +++ b/ui/priest/holy/presets.ts @@ -34,9 +34,6 @@ export const P1_EP_WEIGHTS = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 0.11, [Stat.StatSpirit]: 0.47, [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 0.87, - [Stat.StatCritRating]: 0.74, - [Stat.StatHasteRating]: 1.65, [Stat.StatMP5]: 0.0, }), ); diff --git a/ui/priest/holy/sim.ts b/ui/priest/holy/sim.ts index 2888572ba6..8da6c6fb1b 100644 --- a/ui/priest/holy/sim.ts +++ b/ui/priest/holy/sim.ts @@ -21,17 +21,13 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecHolyPriest, { Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, Stat.StatMP5, - Stat.StatMasteryRating, ], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatSpellPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5, Stat.StatMasteryRating], + [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5], [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), gemStats: DEFAULT_HYBRID_CASTER_GEM_STATS, diff --git a/ui/priest/shadow/presets.ts b/ui/priest/shadow/presets.ts index 96f7cc94b7..49453d2a69 100644 --- a/ui/priest/shadow/presets.ts +++ b/ui/priest/shadow/presets.ts @@ -24,10 +24,6 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 1.0, [Stat.StatSpirit]: 0.9, [Stat.StatSpellPower]: 0.98, - [Stat.StatHitRating]: 0.85, - [Stat.StatCritRating]: 0.46, - [Stat.StatHasteRating]: 0.49, - [Stat.StatMasteryRating]: 0.44, }), ); export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( @@ -36,10 +32,6 @@ export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 1.0, [Stat.StatSpirit]: 0.9, [Stat.StatSpellPower]: 0.98, - [Stat.StatHitRating]: 0.85, - [Stat.StatCritRating]: 0.46, - [Stat.StatHasteRating]: 0.59, - [Stat.StatMasteryRating]: 0.44, }), ); @@ -144,19 +136,12 @@ export const DefaultConsumables = ConsumesSpec.create({ export const DefaultRaidBuffs = RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - mindQuickening: true, - leaderOfThePack: true, - blessingOfMight: true, - unholyAura: true, - bloodlust: true, }); export const DefaultIndividualBuffs = IndividualBuffs.create({}); export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, + }); export const OtherDefaults = { diff --git a/ui/priest/shadow/sim.ts b/ui/priest/shadow/sim.ts index 8034a3101c..4083e5b100 100644 --- a/ui/priest/shadow/sim.ts +++ b/ui/priest/shadow/sim.ts @@ -21,7 +21,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecShadowPriest, { ], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatIntellect, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. @@ -33,8 +33,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecShadowPriest, { Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, ], [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), @@ -47,7 +45,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecShadowPriest, { return { talents: new Stats().withStat( - Stat.StatHitRating, + Stat.StatSpellHitRating, talentsDelta.getPseudoStat(PseudoStat.PseudoStatSpellHitPercent) * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, ), }; @@ -118,7 +116,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecShadowPriest, { otherDefaults: Presets.OtherDefaults, defaultFactionRaces: { [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, + [Faction.Alliance]: Race.RaceDraenei, [Faction.Horde]: Race.RaceTroll, }, defaultGear: { diff --git a/ui/raid/presets.ts b/ui/raid/presets.ts index 11ce4c8179..6a074d32f3 100644 --- a/ui/raid/presets.ts +++ b/ui/raid/presets.ts @@ -3,48 +3,35 @@ import { getSpecConfig, Player } from '../core/player.js'; import { PlayerClasses } from '../core/player_classes'; import { Spec } from '../core/proto/common.js'; import { BalanceDruidSimUI } from '../druid/balance/sim.js'; -import { FeralDruidSimUI } from '../druid/feral/sim.js'; -import { GuardianDruidSimUI } from '../druid/guardian/sim'; +import { FeralCatDruidSimUI } from '../druid/feralcat/sim.js'; +import { FeralBearDruidSimUI } from '../druid/feralbear/sim'; import { RestorationDruidSimUI } from '../druid/restoration/sim.js'; -import { BeastMasteryHunterSimUI } from '../hunter/beast_mastery/sim'; -import { MarksmanshipHunterSimUI } from '../hunter/marksmanship/sim'; -import { SurvivalHunterSimUI } from '../hunter/survival/sim'; -import { ArcaneMageSimUI } from '../mage/arcane/sim'; -import { FireMageSimUI } from '../mage/fire/sim'; -import { FrostMageSimUI } from '../mage/frost/sim'; +import { HunterSimUI } from '../hunter/sim.js'; +import { MageSimUI } from '../mage/sim'; import { HolyPaladinSimUI } from '../paladin/holy/sim.js'; import { ProtectionPaladinSimUI } from '../paladin/protection/sim.js'; import { RetributionPaladinSimUI } from '../paladin/retribution/sim.js'; import { DisciplinePriestSimUI } from '../priest/discipline/sim'; import { HolyPriestSimUI } from '../priest/holy/sim'; import { ShadowPriestSimUI } from '../priest/shadow/sim.js'; -import { AssassinationRogueSimUI } from '../rogue/assassination/sim'; -import { CombatRogueSimUI } from '../rogue/combat/sim'; -import { SubtletyRogueSimUI } from '../rogue/subtlety/sim'; +import { RogueSimUI } from '../rogue/sim.js'; import { ElementalShamanSimUI } from '../shaman/elemental/sim.js'; import { EnhancementShamanSimUI } from '../shaman/enhancement/sim.js'; import { RestorationShamanSimUI } from '../shaman/restoration/sim.js'; -import { AfflictionWarlockSimUI } from '../warlock/affliction/sim'; -import { DemonologyWarlockSimUI } from '../warlock/demonology/sim'; -import { DestructionWarlockSimUI } from '../warlock/destruction/sim'; -import { ArmsWarriorSimUI } from '../warrior/arms/sim'; -import { FuryWarriorSimUI } from '../warrior/fury/sim'; +import { WarlockSimUI } from '../warlock/sim.js'; +import { DPSWarriorSimUI } from '../warrior/dps/sim.js'; import { ProtectionWarriorSimUI } from '../warrior/protection/sim'; export const specSimFactories: Partial) => IndividualSimUI>> = { // Druid [Spec.SpecBalanceDruid]: (parentElem: HTMLElement, player: Player) => new BalanceDruidSimUI(parentElem, player), - [Spec.SpecFeralDruid]: (parentElem: HTMLElement, player: Player) => new FeralDruidSimUI(parentElem, player), + [Spec.SpecFeralCatDruid]: (parentElem: HTMLElement, player: Player) => new FeralCatDruidSimUI(parentElem, player), [Spec.SpecRestorationDruid]: (parentElem: HTMLElement, player: Player) => new RestorationDruidSimUI(parentElem, player), - [Spec.SpecGuardianDruid]: (parentElem: HTMLElement, player: Player) => new GuardianDruidSimUI(parentElem, player), + [Spec.SpecFeralBearDruid]: (parentElem: HTMLElement, player: Player) => new FeralBearDruidSimUI(parentElem, player), // Hunter - [Spec.SpecBeastMasteryHunter]: (parentElem: HTMLElement, player: Player) => new BeastMasteryHunterSimUI(parentElem, player), - [Spec.SpecMarksmanshipHunter]: (parentElem: HTMLElement, player: Player) => new MarksmanshipHunterSimUI(parentElem, player), - [Spec.SpecSurvivalHunter]: (parentElem: HTMLElement, player: Player) => new SurvivalHunterSimUI(parentElem, player), + [Spec.SpecHunter]: (parentElem: HTMLElement, player: Player) => new HunterSimUI(parentElem, player), // Mage - [Spec.SpecArcaneMage]: (parentElem: HTMLElement, player: Player) => new ArcaneMageSimUI(parentElem, player), - [Spec.SpecFireMage]: (parentElem: HTMLElement, player: Player) => new FireMageSimUI(parentElem, player), - [Spec.SpecFrostMage]: (parentElem: HTMLElement, player: Player) => new FrostMageSimUI(parentElem, player), + [Spec.SpecMage]: (parentElem: HTMLElement, player: Player) => new MageSimUI(parentElem, player), // Paladin [Spec.SpecHolyPaladin]: (parentElem: HTMLElement, player: Player) => new HolyPaladinSimUI(parentElem, player), [Spec.SpecProtectionPaladin]: (parentElem: HTMLElement, player: Player) => new ProtectionPaladinSimUI(parentElem, player), @@ -54,20 +41,15 @@ export const specSimFactories: Partial) => new HolyPriestSimUI(parentElem, player), [Spec.SpecShadowPriest]: (parentElem: HTMLElement, player: Player) => new ShadowPriestSimUI(parentElem, player), // Rogue - [Spec.SpecAssassinationRogue]: (parentElem: HTMLElement, player: Player) => new AssassinationRogueSimUI(parentElem, player), - [Spec.SpecCombatRogue]: (parentElem: HTMLElement, player: Player) => new CombatRogueSimUI(parentElem, player), - [Spec.SpecSubtletyRogue]: (parentElem: HTMLElement, player: Player) => new SubtletyRogueSimUI(parentElem, player), + [Spec.SpecRogue]: (parentElem: HTMLElement, player: Player) => new RogueSimUI(parentElem, player), // Shaman [Spec.SpecElementalShaman]: (parentElem: HTMLElement, player: Player) => new ElementalShamanSimUI(parentElem, player), [Spec.SpecEnhancementShaman]: (parentElem: HTMLElement, player: Player) => new EnhancementShamanSimUI(parentElem, player), [Spec.SpecRestorationShaman]: (parentElem: HTMLElement, player: Player) => new RestorationShamanSimUI(parentElem, player), // Warlock - [Spec.SpecAfflictionWarlock]: (parentElem: HTMLElement, player: Player) => new AfflictionWarlockSimUI(parentElem, player), - [Spec.SpecDemonologyWarlock]: (parentElem: HTMLElement, player: Player) => new DemonologyWarlockSimUI(parentElem, player), - [Spec.SpecDestructionWarlock]: (parentElem: HTMLElement, player: Player) => new DestructionWarlockSimUI(parentElem, player), + [Spec.SpecWarlock]: (parentElem: HTMLElement, player: Player) => new WarlockSimUI(parentElem, player), // Warrior - [Spec.SpecArmsWarrior]: (parentElem: HTMLElement, player: Player) => new ArmsWarriorSimUI(parentElem, player), - [Spec.SpecFuryWarrior]: (parentElem: HTMLElement, player: Player) => new FuryWarriorSimUI(parentElem, player), + [Spec.SpecDPSWarrior]: (parentElem: HTMLElement, player: Player) => new DPSWarriorSimUI(parentElem, player), [Spec.SpecProtectionWarrior]: (parentElem: HTMLElement, player: Player) => new ProtectionWarriorSimUI(parentElem, player), }; diff --git a/ui/rogue/apls/blank.apl.json b/ui/rogue/apls/blank.apl.json new file mode 100644 index 0000000000..725b143fed --- /dev/null +++ b/ui/rogue/apls/blank.apl.json @@ -0,0 +1,4 @@ +{ + "type": "TypeAPL", + "priorityList": [] +} diff --git a/ui/rogue/assassination/apls/assassination.apl.json b/ui/rogue/assassination/apls/assassination.apl.json deleted file mode 100644 index cdd46b3db7..0000000000 --- a/ui/rogue/assassination/apls/assassination.apl.json +++ /dev/null @@ -1,30 +0,0 @@ - { - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"activateAura":{"auraId":{"spellId":1784}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"castSpell":{"spellId":{"spellId":2825,"tag":-1}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":79140}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"30s"}}}}]}},"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"or":{"vals":[{"dotIsActive":{"spellId":{"spellId":1943}}},{"auraIsActive":{"auraId":{"spellId":5171}}}]}},"castSpell":{"spellId":{"spellId":79140}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":5171}}},{"dotIsActive":{"spellId":{"spellId":1943}}}]}},{"or":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":79140}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"spellTimeToReady":{"spellId":{"spellId":79140}}}}},{"isExecutePhase":{"threshold":"E35"}}]}}]}}]}},"castSpell":{"spellId":{"spellId":121471}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":5171}}},{"or":{"vals":[{"dotIsActive":{"spellId":{"spellId":703}}},{"dotIsActive":{"spellId":{"spellId":1943}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":79140}}}]}},{"spellCanCast":{"spellId":{"spellId":126734}}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":5171}}}}},"castSpell":{"spellId":{"spellId":5171}}}}, - {"action":{"groupReference":{"groupName":"Damaging Finisher"}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":79140}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLt","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"60"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":121153},"includeReactionTime":true}}}},{"gcdIsReady":{}}]}},"castSpell":{"spellId":{"spellId":1856}}}}, - {"action":{"groupReference":{"groupName":"Generators"}}}, - {"action":{"condition":{"not":{"val":{"spellIsReady":{"spellId":{"spellId":1856}}}}},"castSpell":{"spellId":{"spellId":14185}}}}, - {"action":{"condition":{"variableRef":{"name":"Cast Tricks"}},"castSpell":{"spellId":{"spellId":57934}}}} - ], - "groups": [ - {"name":"Damaging Finisher","actions":[{"action":{"condition":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":703}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":1943}}}}}]}},"castSpell":{"spellId":{"spellId":1943}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"2s"}}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"Anticipation Talented"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":1943}}}},{"action":{"condition":{"variableRef":{"name":"Should Cast Envenom"}},"castSpell":{"spellId":{"spellId":32645}}}}]}, - {"name":"Generators","actions":[{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"0"}}}},{"auraIsActive":{"auraId":{"spellId":5171}}},{"dotIsActive":{"spellId":{"spellId":1943}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1784}}}}},{"gcdIsReady":{}}]}},"castSpell":{"spellId":{"spellId":137619}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"1"}}}},{"not":{"val":{"or":{"vals":[{"dotIsActive":{"spellId":{"spellId":703}}},{"dotIsActive":{"spellId":{"spellId":1943}}}]}}}}]}},"castSpell":{"spellId":{"spellId":703}}}},{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":111240}}}},{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}},{"and":{"vals":[{"variableRef":{"name":"Anticipation Talented"}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}}]}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":121471},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}}]}}]}},"castSpell":{"spellId":{"spellId":1329}}}}]} - ], - "valueVariables": [ - {"name":"Anticipation Talented","value":{"auraIsKnown":{"auraId":{"spellId":114015}}}}, - {"name":"Anticipation Stacks","value":{"and":{"vals":[{"variableRef":{"name":"Anticipation Talented"}},{"auraNumStacks":{"auraId":{"spellId":114015}}}]}}}, - {"name":"Should Cast Envenom","value":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"4s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpGe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"4s"}}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":32645}}},"rhs":{"const":{"val":"1s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"50"}}}}]}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":121471}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":121153}}}}},{"not":{"val":{"variableRef":{"name":"Anticipation Talented"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E35"}}}}]}}]}}}, - {"name":"Cast Tricks","value":{"const":{"val":"false"}}} - ] -} diff --git a/ui/rogue/assassination/gear_sets/p2_assassination.gear.json b/ui/rogue/assassination/gear_sets/p2_assassination.gear.json deleted file mode 100644 index f934192fa3..0000000000 --- a/ui/rogue/assassination/gear_sets/p2_assassination.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":87126,"gems":[76884,76680],"reforging":159,"upgradeStep":"UpgradeStepTwo"}, - {"id":89917,"reforging":152,"upgradeStep":"UpgradeStepTwo"}, - {"id":87128,"enchant":4804,"gems":[76680],"reforging":161,"upgradeStep":"UpgradeStepTwo"}, - {"id":86963,"enchant":4421,"reforging":144,"upgradeStep":"UpgradeStepTwo"}, - {"id":87124,"enchant":4419,"gems":[76670,76670],"upgradeStep":"UpgradeStepTwo"}, - {"id":86954,"enchant":4416,"gems":[0],"reforging":154,"upgradeStep":"UpgradeStepTwo"}, - {"id":87125,"enchant":4433,"gems":[0],"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":87180,"gems":[76680,76692],"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":90504,"enchant":4822,"gems":[76692,76680],"reforging":137,"upgradeStep":"UpgradeStepTwo"}, - {"id":86984,"enchant":4428,"gems":[76670],"upgradeStep":"UpgradeStepTwo"}, - {"id":86974,"upgradeStep":"UpgradeStepTwo"}, - {"id":90503,"reforging":154,"upgradeStep":"UpgradeStepTwo"}, - {"id":87057,"upgradeStep":"UpgradeStepTwo"}, - {"id":87167,"upgradeStep":"UpgradeStepTwo"}, - {"id":87166,"enchant":4444,"gems":[89873,76692],"reforging":159,"upgradeStep":"UpgradeStepTwo"}, - {"id":87166,"enchant":4444,"gems":[0,76692],"reforging":158,"upgradeStep":"UpgradeStepTwo"} - ] -} diff --git a/ui/rogue/assassination/gear_sets/p3_assassination.gear.json b/ui/rogue/assassination/gear_sets/p3_assassination.gear.json deleted file mode 100644 index e65ff4ee29..0000000000 --- a/ui/rogue/assassination/gear_sets/p3_assassination.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":96742,"gems":[95346,76670],"reforging":152}, - {"id":96815,"gems":[76670],"reforging":137}, - {"id":96683,"enchant":4804,"gems":[76692,76670],"reforging":140}, - {"id":96833,"enchant":4424,"gems":[76680]}, - {"id":96679,"enchant":4419,"gems":[76692,76670,76680],"reforging":159}, - {"id":96764,"enchant":4416,"gems":[0],"reforging":154}, - {"id":96680,"enchant":4433,"gems":[76692,0],"reforging":161,"tinker":4898}, - {"id":94998,"gems":[76680,76680,76692]}, - {"id":96682,"enchant":4822,"gems":[76670,76680],"reforging":152}, - {"id":96903,"enchant":4428,"gems":[76670]}, - {"id":96740,"reforging":152}, - {"id":96885,"gems":[76670],"reforging":154}, - {"id":96741,"reforging":161}, - {"id":94511,"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":96976,"enchant":4444,"gems":[76670,76692],"reforging":161}, - {"id":96976,"enchant":4444,"gems":[76670,76692],"reforging":161} - ] -} diff --git a/ui/rogue/assassination/gear_sets/preraid_assassination.gear.json b/ui/rogue/assassination/gear_sets/preraid_assassination.gear.json deleted file mode 100644 index 631474990d..0000000000 --- a/ui/rogue/assassination/gear_sets/preraid_assassination.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":90411,"gems":[76884,76604],"reforging":139}, - {"id":90432,"reforging":140}, - {"id":89341,"enchant":4804,"gems":[76604],"reforging":140}, - {"id":89076,"enchant":4421,"reforging":139}, - {"id":90420,"enchant":4419,"gems":[76626,76614],"reforging":140}, - {"id":88884,"enchant":4416,"gems":[0],"reforging":140}, - {"id":85828,"enchant":4433,"gems":[76614,0],"reforging":146}, - {"id":90451,"gems":[76626,76626],"reforging":146}, - {"id":89090,"enchant":4822,"gems":[76626],"reforging":146}, - {"id":90442,"enchant":4428,"reforging":140}, - {"id":90437,"reforging":140}, - {"id":90861,"reforging":140}, - {"id":81267,"reforging":147}, - {"id":79328}, - {"id":84967,"enchant":4444,"reforging":146}, - {"id":84967,"enchant":4444,"reforging":146} - ] -} diff --git a/ui/rogue/assassination/index.ts b/ui/rogue/assassination/index.ts deleted file mode 100644 index a262960582..0000000000 --- a/ui/rogue/assassination/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { AssassinationRogueSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.AssassinationRogue, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new AssassinationRogueSimUI(document.body, player); diff --git a/ui/rogue/assassination/inputs.ts b/ui/rogue/assassination/inputs.ts deleted file mode 100644 index 47588684c9..0000000000 --- a/ui/rogue/assassination/inputs.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. diff --git a/ui/rogue/assassination/presets.ts b/ui/rogue/assassination/presets.ts deleted file mode 100644 index 269e761807..0000000000 --- a/ui/rogue/assassination/presets.ts +++ /dev/null @@ -1,68 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, PseudoStat, Stat } from '../../core/proto/common'; -import { AssassinationRogue_Options as RogueOptions, RogueOptions_PoisonOptions } from '../../core/proto/rogue'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import AssassinationApl from './apls/assassination.apl.json'; -import PreraidGear from './gear_sets/preraid_assassination.gear.json' -import P2Gear from './gear_sets/p2_assassination.gear.json' -import P3Gear from './gear_sets/p3_assassination.gear.json' - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const PRERAID_GEARSET = PresetUtils.makePresetGear('P1 Preraid', PreraidGear); -export const P2_GEARSET = PresetUtils.makePresetGear('P2', P2Gear); -export const P3_GEARSET = PresetUtils.makePresetGear('P3', P3Gear); - -export const ROTATION_PRESET_ASSASSINATION = PresetUtils.makePresetAPLRotation('Assassination', AssassinationApl); - -// Preset options for EP weights -export const ASN_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Asn', - Stats.fromMap( - { - [Stat.StatAgility]: 1.0, - [Stat.StatCritRating]: 0.37, - [Stat.StatHitRating]: 0.46, - [Stat.StatHasteRating]: 0.35, - [Stat.StatMasteryRating]: 0.41, - [Stat.StatExpertiseRating]: 0.42, - }, - { - [PseudoStat.PseudoStatMainHandDps]: 1.37, - [PseudoStat.PseudoStatOffHandDps]: 0.30, - }, - ), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/tbc/talent-calc and copy the numbers in the url. - -export const AssassinationTalentsDefault = { - name: 'Assassination', - data: SavedTalents.create({ - talentsString: '321232', - }), -}; - -export const DefaultOptions = RogueOptions.create({ - classOptions: { - lethalPoison: RogueOptions_PoisonOptions.DeadlyPoison, - applyPoisonsManually: false, - startingOverkillDuration: 20, - vanishBreakTime: 0.1, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76084, // Flask of the Winds - foodId: 74648, // Skewered Eel - potId: 76089, // Potion of the Tol'vir - prepotId: 76089, // Potion of the Tol'vir -}); - -export const OtherDefaults = { - distanceFromTarget: 5, -}; diff --git a/ui/rogue/assassination/sim.ts b/ui/rogue/assassination/sim.ts deleted file mode 100644 index 8df8e3269c..0000000000 --- a/ui/rogue/assassination/sim.ts +++ /dev/null @@ -1,179 +0,0 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs.js'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action.js'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; -import { RogueOptions_PoisonOptions } from '../../core/proto/rogue'; -import { StatCapType } from '../../core/proto/ui'; -import { StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as RogueInputs from '../inputs'; -import * as Presets from './presets'; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecAssassinationRogue, { - cssClass: 'assassination-rogue-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Rogue), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatAgility, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating, Stat.StatExpertiseRating], - epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps], - // Reference stat against which to calculate EP. - epReferenceStat: Stat.StatAgility, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatStrength, Stat.StatAttackPower, Stat.StatMasteryRating, Stat.StatExpertiseRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatMeleeHastePercent], - ), - - defaults: { - // Default equipped gear. - gear: Presets.P2_GEARSET.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.ASN_EP_PRESET.epWeights, - // Stat caps for reforge optimizer - statCaps: (() => { - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - return expCap; - })(), - softCapBreakpoints: (() => { - const meleeHitSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, { - breakpoints: [7.5, 26.5], - capType: StatCapType.TypeSoftCap, - postCapEPs: [0.21 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, 0], - }); - - return [meleeHitSoftCapConfig]; - })(), - other: Presets.OtherDefaults, - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.AssassinationTalentsDefault.data, - // Default spec-specific settings. - specOptions: Presets.DefaultOptions, - // Default raid/party buffs settings. - raidBuffs: RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - blessingOfKings: true, - trueshotAura: true, - swiftbladesCunning: true, - blessingOfMight: true, - bloodlust: true, - }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - masterPoisoner: true, - }), - }, - - playerInputs: { - inputs: [RogueInputs.ApplyPoisonsManually()], - }, - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [RogueInputs.LethalPoison()], - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [ - BuffDebuffInputs.CritBuff, - BuffDebuffInputs.AttackPowerBuff, - BuffDebuffInputs.MasteryBuff, - BuffDebuffInputs.StatsBuff, - BuffDebuffInputs.AttackSpeedBuff, - - BuffDebuffInputs.MajorHasteBuff, - BuffDebuffInputs.StormLashTotem, - BuffDebuffInputs.Skullbanner, - BuffDebuffInputs.ShatteringThrow, - BuffDebuffInputs.TricksOfTheTrade, - BuffDebuffInputs.UnholyFrenzy, - - BuffDebuffInputs.SpellDamageDebuff, - BuffDebuffInputs.MajorArmorDebuff, - BuffDebuffInputs.PhysicalDamageDebuff, - ], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [OtherInputs.InFrontOfTarget, OtherInputs.InputDelay], - }, - itemSwapSlots: [ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2, ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: true, - }, - - presets: { - epWeights: [Presets.ASN_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.AssassinationTalentsDefault], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_ASSASSINATION], - // Preset gear configurations that the user can quickly select. - gear: [Presets.PRERAID_GEARSET, Presets.P2_GEARSET, Presets.P3_GEARSET], - }, - - autoRotation: (player: Player): APLRotation => { - const numTargets = player.sim.encounter.targets.length; - if (numTargets >= 5) { - return Presets.ROTATION_PRESET_ASSASSINATION.rotation.rotation!; - } else { - return Presets.ROTATION_PRESET_ASSASSINATION.rotation.rotation!; - } - }, - - raidSimPresets: [ - { - spec: Spec.SpecAssassinationRogue, - talents: Presets.AssassinationTalentsDefault.data, - specOptions: Presets.DefaultOptions, - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceHuman, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.P2_GEARSET.gear, - }, - [Faction.Horde]: { - 1: Presets.P2_GEARSET.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class AssassinationRogueSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this); - - // Poison selection - this.player.changeEmitter.on(c => { - const options = this.player.getSpecOptions(); - if (!options.classOptions!.applyPoisonsManually) { - options.classOptions!.lethalPoison = RogueOptions_PoisonOptions.DeadlyPoison; - } - this.player.setSpecOptions(c, options); - }); - this.sim.encounter.changeEmitter.on(c => { - const options = this.player.getSpecOptions(); - if (!options.classOptions!.applyPoisonsManually) { - options.classOptions!.lethalPoison = RogueOptions_PoisonOptions.DeadlyPoison; - } - this.player.setSpecOptions(c, options); - }); - } -} diff --git a/ui/rogue/combat/apls/combat.apl.json b/ui/rogue/combat/apls/combat.apl.json deleted file mode 100644 index 5cfd055c33..0000000000 --- a/ui/rogue/combat/apls/combat.apl.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":13877}}},"doAtValue":{"const":{"val":"-1s"}},"hide":true}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"activateAura":{"auraId":{"spellId":1784}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"castSpell":{"spellId":{"spellId":2825,"tag":-1}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":51690}}},{"auraIsActive":{"auraId":{"spellId":13750}}}]}},"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":5171}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":13750}}}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"40"}}}}]}}]}},"castSpell":{"spellId":{"spellId":51690}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"math":{"op":"OpMul","lhs":{"variableRef":{"name":"KS CD In One Finisher"}},"rhs":{"const":{"val":"1"}}}},"rhs":{"const":{"val":"15s"}}}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":13750}}},{"castSpell":{"spellId":{"spellId":121471}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":84747}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"50"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":1856}}},{"castSpell":{"spellId":{"spellId":8676}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"auraIsInactive":{"auraId":{"spellId":5171}}}]}},"castSpell":{"spellId":{"spellId":5171}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":84617}}}]}},"groupReference":{"groupName":"5PtFinisher"}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":114015}}},{"cmp":{"op":"OpLe","lhs":{"auraNumStacks":{"auraId":{"spellId":114015}}},"rhs":{"const":{"val":"3"}}}}]}}]}},"groupReference":{"groupName":"Generator"}}}, - {"action":{"condition":{"not":{"val":{"spellIsReady":{"spellId":{"spellId":1856}}}}},"castSpell":{"spellId":{"spellId":14185}}}}, - {"action":{"condition":{"variableRef":{"name":"Cast Tricks"}},"castSpell":{"spellId":{"spellId":57934}}}} - ], - "groups": [ - {"name":"5PtFinisher","actions":[{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"2s"}}}},"castSpell":{"spellId":{"spellId":5171}}}},{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"2s"}}}},"castSpell":{"spellId":{"spellId":1943}}}},{"action":{"castSpell":{"spellId":{"spellId":2098}}}}]}, - {"name":"Generator","actions":[{"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"0"}}}},"castSpell":{"spellId":{"spellId":137619}}}},{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":84617}}},"rhs":{"const":{"val":"3s"}}}},"castSpell":{"spellId":{"spellId":84617}}}},{"action":{"castSpell":{"spellId":{"spellId":1752}}}}]} - ], - "valueVariables": [ - {"name":"Approx Energy to 5Pt","value":{"math":{"op":"OpMul","lhs":{"spellCurrentCost":{"spellId":{"spellId":1752}}},"rhs":{"const":{"val":"4"}}}}}, - {"name":"Max Time to 5Pt","value":{"math":{"op":"OpSub","lhs":{"math":{"op":"OpDiv","lhs":{"variableRef":{"name":"Approx Energy to 5Pt"}},"rhs":{"energyRegenPerSecond":{}}}},"rhs":{"const":{"val":"12.5"}}}}}, - {"name":"KS CD In One Finisher","value":{"math":{"op":"OpSub","lhs":{"spellTimeToReady":{"spellId":{"spellId":51690}}},"rhs":{"variableRef":{"name":"Max Time to 5Pt"}}}}}, - {"name":"Cast Tricks","value":{"const":{"val":"false"}}} - ] -} diff --git a/ui/rogue/combat/gear_sets/p2_combat.gear.json b/ui/rogue/combat/gear_sets/p2_combat.gear.json deleted file mode 100644 index 1e0bbcc591..0000000000 --- a/ui/rogue/combat/gear_sets/p2_combat.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":87126,"gems":[76884,76680],"reforging":160,"upgradeStep":"UpgradeStepTwo"}, - {"id":89917,"upgradeStep":"UpgradeStepTwo"}, - {"id":87128,"enchant":4804,"gems":[76680],"reforging":161,"upgradeStep":"UpgradeStepTwo"}, - {"id":87044,"enchant":4421,"reforging":161,"upgradeStep":"UpgradeStepTwo"}, - {"id":87124,"enchant":4419,"gems":[76666,76666],"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":86954,"enchant":4416,"gems":[0],"reforging":147,"upgradeStep":"UpgradeStepTwo"}, - {"id":87125,"enchant":4430,"gems":[0],"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":87180,"gems":[76680,76692],"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":90504,"enchant":4822,"gems":[76692,76680],"reforging":138,"upgradeStep":"UpgradeStepTwo"}, - {"id":86943,"enchant":4428,"gems":[76666],"reforging":146,"upgradeStep":"UpgradeStepTwo"}, - {"id":86974,"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":90503,"reforging":147,"upgradeStep":"UpgradeStepTwo"}, - {"id":87167,"upgradeStep":"UpgradeStepTwo"}, - {"id":87057,"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":86988,"enchant":4444,"gems":[89873,76692],"reforging":160,"upgradeStep":"UpgradeStepTwo"}, - {"id":86988,"enchant":4444,"gems":[0,76692],"reforging":145,"upgradeStep":"UpgradeStepTwo"} - ] -} diff --git a/ui/rogue/combat/gear_sets/p3_combat.gear.json b/ui/rogue/combat/gear_sets/p3_combat.gear.json deleted file mode 100644 index cfad49017b..0000000000 --- a/ui/rogue/combat/gear_sets/p3_combat.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":96742,"gems":[95346,76699]}, - {"id":96815,"gems":[76699],"reforging":138}, - {"id":96683,"enchant":4804,"gems":[76666,76699],"reforging":138}, - {"id":95015,"enchant":4894,"gems":[76699],"reforging":147}, - {"id":96679,"enchant":4419,"gems":[76666,76699,76642],"reforging":160}, - {"id":96912,"randomSuffix":-340,"enchant":4416,"gems":[76699,0]}, - {"id":96680,"enchant":4430,"gems":[76666,0],"reforging":160,"tinker":4898}, - {"id":94998,"gems":[76642,76642,76699],"reforging":145}, - {"id":96682,"enchant":4822,"gems":[76699,76642]}, - {"id":95007,"enchant":4428,"gems":[76699,76642],"reforging":161}, - {"id":95021,"gems":[76642],"reforging":140}, - {"id":96885,"gems":[76699],"reforging":147}, - {"id":96741,"reforging":160}, - {"id":96781,"reforging":167}, - {"id":96907,"enchant":4444,"gems":[76666,76699],"reforging":144}, - {"id":96907,"enchant":4444,"gems":[76666,76699],"reforging":144} - ] -} diff --git a/ui/rogue/combat/gear_sets/preraid_combat.gear.json b/ui/rogue/combat/gear_sets/preraid_combat.gear.json deleted file mode 100644 index a05c56ef46..0000000000 --- a/ui/rogue/combat/gear_sets/preraid_combat.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":90411,"gems":[76884,76666],"reforging":138}, - {"id":90432,"reforging":145}, - {"id":84913,"enchant":4804,"gems":[76666]}, - {"id":89076,"enchant":4421,"reforging":139}, - {"id":90420,"enchant":4419,"gems":[76627,76614],"reforging":138}, - {"id":84972,"enchant":4416,"gems":[0],"reforging":168}, - {"id":85828,"enchant":4430,"gems":[76614,0],"reforging":145}, - {"id":90451,"gems":[76627,76692],"reforging":145}, - {"id":84868,"enchant":4822,"gems":[76692,76692],"reforging":147}, - {"id":90442,"enchant":4428,"reforging":139}, - {"id":90437,"reforging":139}, - {"id":89070,"reforging":139}, - {"id":86043}, - {"id":79328}, - {"id":84893,"enchant":4444,"reforging":145}, - {"id":84893,"enchant":4444,"reforging":145} - ] -} diff --git a/ui/rogue/combat/index.ts b/ui/rogue/combat/index.ts deleted file mode 100644 index e2918785d5..0000000000 --- a/ui/rogue/combat/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { CombatRogueSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.CombatRogue, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new CombatRogueSimUI(document.body, player); diff --git a/ui/rogue/combat/inputs.ts b/ui/rogue/combat/inputs.ts deleted file mode 100644 index 47588684c9..0000000000 --- a/ui/rogue/combat/inputs.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. diff --git a/ui/rogue/combat/presets.ts b/ui/rogue/combat/presets.ts deleted file mode 100644 index a68f8dfde3..0000000000 --- a/ui/rogue/combat/presets.ts +++ /dev/null @@ -1,68 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, PseudoStat, Stat } from '../../core/proto/common'; -import { CombatRogue_Options as RogueOptions, RogueOptions_PoisonOptions } from '../../core/proto/rogue'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import CombatApl from './apls/combat.apl.json'; -import PreraidGear from './gear_sets/preraid_combat.gear.json'; -import P2Gear from './gear_sets/p2_combat.gear.json'; -import P3Gear from './gear_sets/p3_combat.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const PRERAID_GEARSET = PresetUtils.makePresetGear('P1 Preraid', PreraidGear); -export const P2_GEARSET = PresetUtils.makePresetGear('P2', P2Gear); -export const P3_GEARSET = PresetUtils.makePresetGear('P3', P3Gear); - -export const ROTATION_PRESET_COMBAT = PresetUtils.makePresetAPLRotation('Combat', CombatApl); - -// Preset options for EP weights -export const CBAT_STANDARD_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Combat', - Stats.fromMap( - { - [Stat.StatAgility]: 1.0, - [Stat.StatCritRating]: 0.29, - [Stat.StatHitRating]: 0.7, - [Stat.StatHasteRating]: 0.39, - [Stat.StatMasteryRating]: 0.32, - [Stat.StatExpertiseRating]: 0.56, - }, - { - [PseudoStat.PseudoStatMainHandDps]: 1.63, - [PseudoStat.PseudoStatOffHandDps]: 0.45, - }, - ), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. - -export const CombatTalents = { - name: 'Combat', - data: SavedTalents.create({ - talentsString: '321233', - }), -}; - -export const DefaultOptions = RogueOptions.create({ - classOptions: { - lethalPoison: RogueOptions_PoisonOptions.DeadlyPoison, - applyPoisonsManually: false, - startingOverkillDuration: 20, - vanishBreakTime: 0.1, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76084, // Flask of the Winds - foodId: 74648, // Skewered Eel - potId: 76089, // Potion of the Tol'vir - prepotId: 76089, // Potion of the Tol'vir -}); - -export const OtherDefaults = { - distanceFromTarget: 5, -}; diff --git a/ui/rogue/gear_sets/blank.gear.json b/ui/rogue/gear_sets/blank.gear.json new file mode 100644 index 0000000000..9c53a135fe --- /dev/null +++ b/ui/rogue/gear_sets/blank.gear.json @@ -0,0 +1 @@ +{"items": []} diff --git a/ui/rogue/index.ts b/ui/rogue/index.ts new file mode 100644 index 0000000000..186a042c06 --- /dev/null +++ b/ui/rogue/index.ts @@ -0,0 +1,12 @@ +import { Player } from '../core/player'; +import { PlayerSpecs } from '../core/player_specs'; +import { Spec } from '../core/proto/common'; +import { Sim } from '../core/sim'; +import { TypedEvent } from '../core/typed_event'; +import { RogueSimUI } from './sim'; + +const sim = new Sim(); +const player = new Player(PlayerSpecs.Rogue, sim); +sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); + +new RogueSimUI(document.body, player); diff --git a/ui/rogue/presets.ts b/ui/rogue/presets.ts new file mode 100644 index 0000000000..a67104b8e0 --- /dev/null +++ b/ui/rogue/presets.ts @@ -0,0 +1,59 @@ +import * as PresetUtils from '../core/preset_utils'; +import { ConsumesSpec, PseudoStat, Stat } from '../core/proto/common'; +import { RogueOptions_PoisonOptions, Rogue_Options as RogueOptions } from '../core/proto/rogue'; +import { SavedTalents } from '../core/proto/ui'; +import { Stats } from '../core/proto_utils/stats'; +import BlankAPL from './apls/blank.apl.json' +import BlankGear from './gear_sets/blank.gear.json'; + +// Preset options for this spec. +// Eventually we will import these values for the raid sim too, so its good to +// keep them in a separate file. + +export const BLANK_APL = PresetUtils.makePresetAPLRotation('Blank', BlankAPL) + +export const BLANK_GEARSET = PresetUtils.makePresetGear('Blank', BlankGear); + +// Preset options for EP weights +export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( + 'Sub', + Stats.fromMap( + { + [Stat.StatAgility]: 1.0, + }, + { + [PseudoStat.PseudoStatMainHandDps]: 1.43, + [PseudoStat.PseudoStatOffHandDps]: 0.26, + }, + ), +); + +// Default talents. Uses the wowhead calculator format, make the talents on +// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. + +export const Talents = { + name: 'A', + data: SavedTalents.create({ + talentsString: '', + }), +}; + +export const DefaultOptions = RogueOptions.create({ + classOptions: { + lethalPoison: RogueOptions_PoisonOptions.DeadlyPoison, + applyPoisonsManually: false, + startingOverkillDuration: 20, + vanishBreakTime: 0.1, + }, +}); + +export const DefaultConsumables = ConsumesSpec.create({ + flaskId: 76084, // Flask of the Winds + foodId: 74648, // Skewered Eel + potId: 76089, // Potion of the Tol'vir + prepotId: 76089, // Potion of the Tol'vir +}); + +export const OtherDefaults = { + distanceFromTarget: 5, +}; diff --git a/ui/rogue/combat/sim.ts b/ui/rogue/sim.ts similarity index 53% rename from ui/rogue/combat/sim.ts rename to ui/rogue/sim.ts index 77842b9d0e..f3b720f18d 100644 --- a/ui/rogue/combat/sim.ts +++ b/ui/rogue/sim.ts @@ -1,78 +1,59 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat, WeaponType } from '../../core/proto/common'; -import { RogueOptions_PoisonOptions } from '../../core/proto/rogue'; -import { StatCapType } from '../../core/proto/ui'; -import { StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as RogueInputs from '../inputs'; +import * as BuffDebuffInputs from '../core/components/inputs/buffs_debuffs'; +import * as OtherInputs from '../core/components/inputs/other_inputs'; +import * as Mechanics from '../core/constants/mechanics.js'; +import { IndividualSimUI, registerSpecConfig } from '../core/individual_sim_ui'; +import { Player } from '../core/player'; +import { PlayerClasses } from '../core/player_classes'; +import { APLRotation } from '../core/proto/apl'; +import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../core/proto/common'; +import { RogueOptions_PoisonOptions } from '../core/proto/rogue'; +import { UnitStat } from '../core/proto_utils/stats'; +import { defaultRaidBuffMajorDamageCooldowns } from '../core/proto_utils/utils'; +import * as RogueInputs from './inputs'; +import * as Inputs from './inputs'; import * as Presets from './presets'; -const SPEC_CONFIG = registerSpecConfig(Spec.SpecCombatRogue, { - cssClass: 'combat-rogue-sim-ui', +const SPEC_CONFIG = registerSpecConfig(Spec.SpecRogue, { + cssClass: 'rogue-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Rogue), // List any known bugs / issues here and they'll be shown on the site. knownIssues: [], // All stats for which EP should be calculated. - epStats: [Stat.StatAgility, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating, Stat.StatExpertiseRating], + epStats: [Stat.StatAgility], epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps], // Reference stat against which to calculate EP. epReferenceStat: Stat.StatAgility, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatStrength, Stat.StatAttackPower, Stat.StatMasteryRating, Stat.StatExpertiseRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatMeleeHastePercent], + [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatStrength, Stat.StatAttackPower], + [PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatMeleeCritPercent, PseudoStat.PseudoStatMeleeHastePercent], ), defaults: { // Default equipped gear. - gear: Presets.P2_GEARSET.gear, + gear: Presets.BLANK_GEARSET.gear, // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.CBAT_STANDARD_EP_PRESET.epWeights, - // Stat caps for reforge optimizer - statCaps: (() => { - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - return expCap; - })(), - softCapBreakpoints: (() => { - const meleeHitSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, { - breakpoints: [7.5, 26.5], - capType: StatCapType.TypeSoftCap, - // These are set by the active EP weight in the updateSoftCaps callback - postCapEPs: [0.3 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, 0], - }); - - return [meleeHitSoftCapConfig]; - })(), + epWeights: Presets.P1_EP_PRESET.epWeights, other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. - talents: Presets.CombatTalents.data, + talents: Presets.Talents.data, // Default spec-specific settings. specOptions: Presets.DefaultOptions, // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(), - blessingOfKings: true, - trueshotAura: true, - swiftbladesCunning: true, - blessingOfMight: true, - bloodlust: true, }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), + partyBuffs: PartyBuffs.create({ + + }), + individualBuffs: IndividualBuffs.create({ + + }), debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - masterPoisoner: true, + }), }, @@ -112,28 +93,23 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecCombatRogue, { }, presets: { - epWeights: [Presets.CBAT_STANDARD_EP_PRESET], + epWeights: [Presets.P1_EP_PRESET], // Preset talents that the user can quickly select. - talents: [Presets.CombatTalents], + talents: [Presets.Talents], // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_COMBAT], + rotations: [], // Preset gear configurations that the user can quickly select. - gear: [Presets.PRERAID_GEARSET, Presets.P2_GEARSET, Presets.P3_GEARSET], + gear: [], }, - autoRotation: (player: Player): APLRotation => { - const numTargets = player.sim.encounter.targets.length; - if (numTargets >= 2) { - return Presets.ROTATION_PRESET_COMBAT.rotation.rotation!; - } else { - return Presets.ROTATION_PRESET_COMBAT.rotation.rotation!; - } + autoRotation: (player: Player): APLRotation => { + return Presets.BLANK_APL.rotation.rotation!; }, raidSimPresets: [ { - spec: Spec.SpecCombatRogue, - talents: Presets.CombatTalents.data, + spec: Spec.SpecRogue, + talents: Presets.Talents.data, specOptions: Presets.DefaultOptions, consumables: Presets.DefaultConsumables, defaultFactionRaces: { @@ -144,10 +120,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecCombatRogue, { defaultGear: { [Faction.Unknown]: {}, [Faction.Alliance]: { - 1: Presets.P2_GEARSET.gear, + 1: Presets.BLANK_GEARSET.gear, }, [Faction.Horde]: { - 1: Presets.P2_GEARSET.gear, + 1: Presets.BLANK_GEARSET.gear, }, }, otherDefaults: Presets.OtherDefaults, @@ -155,12 +131,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecCombatRogue, { ], }); -export class CombatRogueSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { +export class RogueSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - this.reforger = new ReforgeOptimizer(this, {}); - this.player.changeEmitter.on(c => { const options = this.player.getSpecOptions(); if (!options.classOptions!.applyPoisonsManually) { diff --git a/ui/rogue/subtlety/apls/subtlety.apl.json b/ui/rogue/subtlety/apls/subtlety.apl.json deleted file mode 100644 index 53159d5b8d..0000000000 --- a/ui/rogue/subtlety/apls/subtlety.apl.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"activateAura":{"auraId":{"spellId":1784}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":14183}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":5171}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"castSpell":{"spellId":{"spellId":2825,"tag":-1}}}}, - {"action":{"condition":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023},"includeReactionTime":true}},"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":51713},"includeReactionTime":true}},"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}}}, - {"action":{"castSpell":{"spellId":{"spellId":121471}}}}, - {"action":{"condition":{"auraIsInactive":{"auraId":{"spellId":5171},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":5171}}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},"groupReference":{"groupName":"5PtFinisher"}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":51713}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":51713}}},"rhs":{"const":{"val":"3.5s"}}}}]}},{"dotIsActive":{"spellId":{"spellId":1943}}},{"auraIsActive":{"auraId":{"spellId":5171},"includeReactionTime":true}}]}},"waitUntil":{"condition":{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"80"}}}}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":51713}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":51713}}},"rhs":{"const":{"val":"3.5s"}}}}]}},{"dotIsActive":{"spellId":{"spellId":1943}}},{"auraIsActive":{"auraId":{"spellId":5171},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"80"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":51713}}},{"castSpell":{"spellId":{"spellId":8676}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023}}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713},"includeReactionTime":true}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":51713}}},"rhs":{"const":{"val":"5s"}}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}},{"spellIsReady":{"spellId":{"spellId":1856}}}]}},"waitUntil":{"condition":{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"80"}}}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023}}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713},"includeReactionTime":true}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":51713}}},"rhs":{"const":{"val":"5s"}}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}}]}},"castSpell":{"spellId":{"spellId":1856}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023}}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713},"includeReactionTime":true}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":51713}}},"rhs":{"const":{"val":"5s"}}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"spellIsReady":{"spellId":{"spellId":58984}}}]}},"waitUntil":{"condition":{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"80"}}}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023}}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713},"includeReactionTime":true}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":51713}}},"rhs":{"const":{"val":"5s"}}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":1856}}}}}]}},"castSpell":{"spellId":{"spellId":58984}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":114015}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":114015}}},"rhs":{"const":{"val":"3"}}}}]}}]}},"groupReference":{"groupName":"Generator"}}}, - {"action":{"condition":{"not":{"val":{"spellIsReady":{"spellId":{"spellId":1856}}}}},"castSpell":{"spellId":{"spellId":14185}}}}, - {"action":{"condition":{"variableRef":{"name":"Cast Tricks"}},"castSpell":{"spellId":{"spellId":57934}}}} - ], - "groups": [ - {"name":"5PtFinisher","actions":[{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"2s"}}}},"castSpell":{"spellId":{"spellId":5171}}}},{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"2s"}}}},"castSpell":{"spellId":{"spellId":1943}}}},{"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"4s"}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"4s"}}}}]}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"spellId":51713}}},"rhs":{"const":{"val":"3s"}}}}]}},"castSpell":{"spellId":{"spellId":2098}}}}]}, - {"name":"Generator","actions":[{"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"0"}}}},"castSpell":{"spellId":{"spellId":137619}}}},{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"3"}}}},"castSpell":{"spellId":{"spellId":14183}}}},{"action":{"castSpell":{"spellId":{"spellId":8676}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":16511}}},"rhs":{"const":{"val":"3s"}}}},{"or":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":1943}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713}}}}}]}}]}},"castSpell":{"spellId":{"spellId":16511,"tag":1}}}},{"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1784}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713}}}}}]}},"castSpell":{"spellId":{"spellId":53}}}}]} - ], - "valueVariables": [ - {"name":"Cast Tricks","value":{"const":{"val":"false"}}} - ] -} diff --git a/ui/rogue/subtlety/gear_sets/p2_subtlety.gear.json b/ui/rogue/subtlety/gear_sets/p2_subtlety.gear.json deleted file mode 100644 index 45233a411f..0000000000 --- a/ui/rogue/subtlety/gear_sets/p2_subtlety.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":87126,"gems":[76884,76680],"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":89917,"reforging":166,"upgradeStep":"UpgradeStepTwo"}, - {"id":87128,"enchant":4804,"gems":[76680],"reforging":159,"upgradeStep":"UpgradeStepTwo"}, - {"id":86963,"enchant":4421,"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":87124,"enchant":4419,"gems":[76666,76666],"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":86954,"enchant":4416,"gems":[0],"reforging":146,"upgradeStep":"UpgradeStepTwo"}, - {"id":87125,"enchant":4430,"gems":[0],"reforging":138,"upgradeStep":"UpgradeStepTwo"}, - {"id":87180,"gems":[76680,76692],"reforging":138,"upgradeStep":"UpgradeStepTwo"}, - {"id":90504,"enchant":4822,"gems":[76692,76680],"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":86943,"enchant":4428,"gems":[76692],"upgradeStep":"UpgradeStepTwo"}, - {"id":90503,"upgradeStep":"UpgradeStepTwo"}, - {"id":86974,"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":87167,"upgradeStep":"UpgradeStepTwo"}, - {"id":87057,"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":87166,"enchant":4444,"gems":[89873,76692],"reforging":158,"upgradeStep":"UpgradeStepTwo"}, - {"id":87166,"enchant":4444,"gems":[0,76692],"reforging":167,"upgradeStep":"UpgradeStepTwo"} - ] -} diff --git a/ui/rogue/subtlety/gear_sets/p3_subtlety.gear.json b/ui/rogue/subtlety/gear_sets/p3_subtlety.gear.json deleted file mode 100644 index a507f8e8dd..0000000000 --- a/ui/rogue/subtlety/gear_sets/p3_subtlety.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":96742,"gems":[95346,76666],"reforging":166}, - {"id":96815,"gems":[76666],"reforging":138}, - {"id":96683,"enchant":4804,"gems":[76692,76666],"reforging":138}, - {"id":95015,"enchant":4424,"gems":[76692]}, - {"id":96679,"enchant":4419,"gems":[76692,76666,76680],"reforging":160}, - {"id":96764,"enchant":4416,"gems":[0]}, - {"id":96680,"enchant":4430,"gems":[76692,0],"reforging":160,"tinker":4898}, - {"id":94998,"gems":[76680,76680,76692],"reforging":167}, - {"id":96682,"enchant":4822,"gems":[76666,76680],"reforging":166}, - {"id":96903,"enchant":4428,"gems":[76666],"reforging":167}, - {"id":96885,"gems":[76666]}, - {"id":96740,"reforging":166}, - {"id":96741,"reforging":160}, - {"id":94511,"reforging":138,"upgradeStep":"UpgradeStepTwo"}, - {"id":96976,"enchant":4444,"gems":[76666,76692],"reforging":159}, - {"id":96976,"enchant":4444,"gems":[76666,76692],"reforging":158} - ] -} diff --git a/ui/rogue/subtlety/gear_sets/preraid_subtlety.gear.json b/ui/rogue/subtlety/gear_sets/preraid_subtlety.gear.json deleted file mode 100644 index 92bac015fc..0000000000 --- a/ui/rogue/subtlety/gear_sets/preraid_subtlety.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":90411,"gems":[76884,76666],"reforging":139}, - {"id":90432,"reforging":138}, - {"id":89341,"enchant":4804,"gems":[76600],"reforging":139}, - {"id":89076,"enchant":4424,"reforging":138}, - {"id":90420,"enchant":4419,"gems":[76626,76614],"reforging":138}, - {"id":88884,"enchant":4416,"gems":[0],"reforging":138}, - {"id":85828,"enchant":4431,"gems":[76614,0],"reforging":167}, - {"id":90451,"gems":[76626,76626],"reforging":168}, - {"id":84868,"enchant":4822,"gems":[76626,76626],"reforging":146}, - {"id":90442,"enchant":4428,"reforging":139}, - {"id":90437,"reforging":139}, - {"id":89070,"reforging":139}, - {"id":86043}, - {"id":79328}, - {"id":84967,"enchant":4444,"reforging":168}, - {"id":84967,"enchant":4444,"reforging":168} - ] -} diff --git a/ui/rogue/subtlety/index.ts b/ui/rogue/subtlety/index.ts deleted file mode 100644 index f02211a77f..0000000000 --- a/ui/rogue/subtlety/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { SubtletyRogueSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.SubtletyRogue, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new SubtletyRogueSimUI(document.body, player); diff --git a/ui/rogue/subtlety/inputs.ts b/ui/rogue/subtlety/inputs.ts deleted file mode 100644 index 20c61ef915..0000000000 --- a/ui/rogue/subtlety/inputs.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as InputHelpers from '../../core/components/input_helpers'; -import { Player } from '../../core/player'; -import { Spec } from '../../core/proto/common'; -import i18n from '../../i18n/config'; - -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. - -export const HonorAmongThievesCritRate = InputHelpers.makeSpecOptionsNumberInput({ - fieldName: 'honorAmongThievesCritRate', - label: i18n.t('rotation_tab.options.rogue.subtlety.honor_of_thieves_crit_rate.label'), - labelTooltip: i18n.t('rotation_tab.options.rogue.subtlety.honor_of_thieves_crit_rate.tooltip'), - showWhen: (player: Player) => false, -}); diff --git a/ui/rogue/subtlety/presets.ts b/ui/rogue/subtlety/presets.ts deleted file mode 100644 index 9b5eab9e18..0000000000 --- a/ui/rogue/subtlety/presets.ts +++ /dev/null @@ -1,69 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, PseudoStat, Stat } from '../../core/proto/common'; -import { RogueOptions_PoisonOptions, SubtletyRogue_Options as RogueOptions } from '../../core/proto/rogue'; -import { SavedTalents } from '../../core/proto/ui'; -import { Stats } from '../../core/proto_utils/stats'; -import SubtletyApl from './apls/subtlety.apl.json'; -import PreraidGear from './gear_sets/preraid_subtlety.gear.json'; -import P2Gear from './gear_sets/p2_subtlety.gear.json'; -import P3Gear from './gear_sets/p3_subtlety.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const PRERAID_GEARSET = PresetUtils.makePresetGear('P1 Preraid', PreraidGear); -export const P2_T14_GEARSET = PresetUtils.makePresetGear('P2', P2Gear); -export const P3_T15_GEARSET = PresetUtils.makePresetGear('P3', P3Gear); - -export const ROTATION_PRESET_SUBTLETY = PresetUtils.makePresetAPLRotation('Subtlety', SubtletyApl); - -// Preset options for EP weights -export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Sub', - Stats.fromMap( - { - [Stat.StatAgility]: 1.0, - [Stat.StatCritRating]: 0.31, - [Stat.StatHitRating]: 0.54, - [Stat.StatHasteRating]: 0.32, - [Stat.StatMasteryRating]: 0.26, - [Stat.StatExpertiseRating]: 0.35, - }, - { - [PseudoStat.PseudoStatMainHandDps]: 1.43, - [PseudoStat.PseudoStatOffHandDps]: 0.26, - }, - ), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. - -export const SubtletyTalents = { - name: 'Subtlety', - data: SavedTalents.create({ - talentsString: '321233', - }), -}; - -export const DefaultOptions = RogueOptions.create({ - classOptions: { - lethalPoison: RogueOptions_PoisonOptions.DeadlyPoison, - applyPoisonsManually: false, - startingOverkillDuration: 20, - vanishBreakTime: 0.1, - }, - honorAmongThievesCritRate: 400, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76084, // Flask of the Winds - foodId: 74648, // Skewered Eel - potId: 76089, // Potion of the Tol'vir - prepotId: 76089, // Potion of the Tol'vir -}); - -export const OtherDefaults = { - distanceFromTarget: 5, -}; diff --git a/ui/rogue/subtlety/sim.ts b/ui/rogue/subtlety/sim.ts deleted file mode 100644 index 18cdd61bf0..0000000000 --- a/ui/rogue/subtlety/sim.ts +++ /dev/null @@ -1,181 +0,0 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; -import { RogueOptions_PoisonOptions } from '../../core/proto/rogue'; -import { StatCapType } from '../../core/proto/ui'; -import { StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as RogueInputs from '../inputs'; -import * as SubInputs from './inputs'; -import * as Presets from './presets'; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecSubtletyRogue, { - cssClass: 'subtlety-rogue-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Rogue), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatAgility, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating, Stat.StatExpertiseRating], - epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps], - // Reference stat against which to calculate EP. - epReferenceStat: Stat.StatAgility, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatAgility, Stat.StatStrength, Stat.StatAttackPower, Stat.StatMasteryRating, Stat.StatExpertiseRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatMeleeHastePercent], - ), - - defaults: { - // Default equipped gear. - gear: Presets.P2_T14_GEARSET.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P1_EP_PRESET.epWeights, - // Stat caps for reforge optimizer - statCaps: (() => { - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - return expCap; - })(), - softCapBreakpoints: (() => { - const meleeHitSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, { - breakpoints: [7.5, 26.5], - capType: StatCapType.TypeSoftCap, - postCapEPs: [0.2 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, 0], - }); - - return [meleeHitSoftCapConfig]; - })(), - other: Presets.OtherDefaults, - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.SubtletyTalents.data, - // Default spec-specific settings. - specOptions: Presets.DefaultOptions, - // Default raid/party buffs settings. - raidBuffs: RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - blessingOfKings: true, - trueshotAura: true, - swiftbladesCunning: true, - blessingOfMight: true, - bloodlust: true, - }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: Debuffs.create({ - weakenedArmor: true, - physicalVulnerability: true, - masterPoisoner: true, - }), - }, - - playerInputs: { - inputs: [RogueInputs.ApplyPoisonsManually()], - }, - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [RogueInputs.LethalPoison()], - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [ - BuffDebuffInputs.CritBuff, - BuffDebuffInputs.AttackPowerBuff, - BuffDebuffInputs.MasteryBuff, - BuffDebuffInputs.StatsBuff, - BuffDebuffInputs.AttackSpeedBuff, - - BuffDebuffInputs.MajorHasteBuff, - BuffDebuffInputs.StormLashTotem, - BuffDebuffInputs.Skullbanner, - BuffDebuffInputs.ShatteringThrow, - BuffDebuffInputs.TricksOfTheTrade, - BuffDebuffInputs.UnholyFrenzy, - - BuffDebuffInputs.SpellDamageDebuff, - BuffDebuffInputs.MajorArmorDebuff, - BuffDebuffInputs.PhysicalDamageDebuff, - ], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [SubInputs.HonorAmongThievesCritRate, OtherInputs.InFrontOfTarget, OtherInputs.InputDelay], - }, - itemSwapSlots: [ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2, ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: false, - }, - - presets: { - epWeights: [Presets.P1_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.SubtletyTalents], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_PRESET_SUBTLETY], - // Preset gear configurations that the user can quickly select. - gear: [Presets.PRERAID_GEARSET, Presets.P2_T14_GEARSET, Presets.P3_T15_GEARSET], - }, - - autoRotation: (player: Player): APLRotation => { - const numTargets = player.sim.encounter.targets.length; - if (numTargets >= 5) { - return Presets.ROTATION_PRESET_SUBTLETY.rotation.rotation!; - } else { - // TODO: Need a sub rotation here - return Presets.ROTATION_PRESET_SUBTLETY.rotation.rotation!; - } - }, - - raidSimPresets: [ - { - spec: Spec.SpecSubtletyRogue, - talents: Presets.SubtletyTalents.data, - specOptions: Presets.DefaultOptions, - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceHuman, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.P2_T14_GEARSET.gear, - }, - [Faction.Horde]: { - 1: Presets.P2_T14_GEARSET.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class SubtletyRogueSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - // Auto Reforging - this.reforger = new ReforgeOptimizer(this, {}); - - this.player.changeEmitter.on(c => { - const options = this.player.getSpecOptions(); - if (!options.classOptions!.applyPoisonsManually) { - options.classOptions!.lethalPoison = RogueOptions_PoisonOptions.DeadlyPoison; - } - this.player.setSpecOptions(c, options); - }); - this.sim.encounter.changeEmitter.on(c => { - const options = this.player.getSpecOptions(); - if (!options.classOptions!.applyPoisonsManually) { - options.classOptions!.lethalPoison = RogueOptions_PoisonOptions.DeadlyPoison; - } - this.player.setSpecOptions(c, options); - }); - } -} diff --git a/ui/shaman/elemental/presets.ts b/ui/shaman/elemental/presets.ts index 81a89bf1ca..e7f3af7b24 100644 --- a/ui/shaman/elemental/presets.ts +++ b/ui/shaman/elemental/presets.ts @@ -38,11 +38,7 @@ export const EP_PRESET_DEFAULT = PresetUtils.makePresetEpWeights( Stats.fromMap({ [Stat.StatIntellect]: 1.0, [Stat.StatSpellPower]: 0.82, - [Stat.StatCritRating]: 0.37, - [Stat.StatHasteRating]: 0.47, - [Stat.StatHitRating]: 1.1, [Stat.StatSpirit]: 1.1, - [Stat.StatMasteryRating]: 0.44, }), ); @@ -51,11 +47,7 @@ export const EP_PRESET_P3 = PresetUtils.makePresetEpWeights( Stats.fromMap({ [Stat.StatIntellect]: 1.0, [Stat.StatSpellPower]: 0.82, - [Stat.StatCritRating]: 0.41, - [Stat.StatHasteRating]: 0.46, - [Stat.StatHitRating]: 1.25, [Stat.StatSpirit]: 1.25, - [Stat.StatMasteryRating]: 0.49, }), ); @@ -64,11 +56,7 @@ export const EP_PRESET_AOE = PresetUtils.makePresetEpWeights( Stats.fromMap({ [Stat.StatIntellect]: 1.0, [Stat.StatSpellPower]: 0.74, - [Stat.StatCritRating]: 0.71, - [Stat.StatHasteRating]: 0.48, - [Stat.StatHitRating]: 1.18, [Stat.StatSpirit]: 1.18, - [Stat.StatMasteryRating]: 0.73, }), ); @@ -123,14 +111,10 @@ export const OtherDefaults = { export const DefaultRaidBuffs = RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(Class.ClassShaman), - blessingOfKings: true, - leaderOfThePack: true, - serpentsSwiftness: true, - bloodlust: true, }); export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, + }); export const DefaultConsumables = ConsumesSpec.create({ diff --git a/ui/shaman/elemental/sim.ts b/ui/shaman/elemental/sim.ts index 94392554b1..7a9049fd17 100644 --- a/ui/shaman/elemental/sim.ts +++ b/ui/shaman/elemental/sim.ts @@ -38,7 +38,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecElementalShaman, { ], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower], // Reference stat against which to calculate EP. epReferenceStat: Stat.StatIntellect, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. @@ -50,8 +50,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecElementalShaman, { Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, - Stat.StatExpertiseRating, - Stat.StatMasteryRating, ], [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), @@ -61,10 +59,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecElementalShaman, { gear: Presets.P3_PRESET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.EP_PRESET_P3.epWeights, - // Default stat caps for the Reforge optimizer - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. @@ -143,6 +137,5 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecElementalShaman, { export class ElementalShamanSimUI extends IndividualSimUI { constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - this.reforger = new ReforgeOptimizer(this); } } diff --git a/ui/shaman/enhancement/presets.ts b/ui/shaman/enhancement/presets.ts index d365f0f890..c37aead4bb 100644 --- a/ui/shaman/enhancement/presets.ts +++ b/ui/shaman/enhancement/presets.ts @@ -38,18 +38,13 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatIntellect]: 0.04, [Stat.StatAgility]: 1.0, - [Stat.StatHitRating]: 0.97, - [Stat.StatCritRating]: 0.41, - [Stat.StatHasteRating]: 0.42, [Stat.StatAttackPower]: 0.4, - [Stat.StatExpertiseRating]: 0.97, - [Stat.StatMasteryRating]: 0.46, }, { [PseudoStat.PseudoStatMainHandDps]: 0.88, [PseudoStat.PseudoStatOffHandDps]: 0.76, [PseudoStat.PseudoStatSpellHitPercent]: 0.57 * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, - [PseudoStat.PseudoStatPhysicalHitPercent]: 0.39 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, + [PseudoStat.PseudoStatMeleeHitPercent]: 0.39 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, }, ), ); @@ -60,18 +55,13 @@ export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatIntellect]: 0.04, [Stat.StatAgility]: 1.0, - [Stat.StatHitRating]: 0.89, - [Stat.StatCritRating]: 0.44, - [Stat.StatHasteRating]: 0.52, [Stat.StatAttackPower]: 0.4, - [Stat.StatExpertiseRating]: 1.02, - [Stat.StatMasteryRating]: 0.54, }, { [PseudoStat.PseudoStatMainHandDps]: 0.67, [PseudoStat.PseudoStatOffHandDps]: 0.52, [PseudoStat.PseudoStatSpellHitPercent]: 0.32 * Mechanics.SPELL_HIT_RATING_PER_HIT_PERCENT, - [PseudoStat.PseudoStatPhysicalHitPercent]: 0.565 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, + [PseudoStat.PseudoStatMeleeHitPercent]: 0.565 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, }, ), ); @@ -127,15 +117,9 @@ export const DefaultConsumables = ConsumesSpec.create({ export const DefaultRaidBuffs = RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(Class.ClassShaman), - blessingOfKings: true, - leaderOfThePack: true, - trueshotAura: true, - bloodlust: true, - elementalOath: true, + }); export const DefaultDebuffs = Debuffs.create({ - physicalVulnerability: true, - weakenedArmor: true, - masterPoisoner: true, + }); diff --git a/ui/shaman/enhancement/sim.ts b/ui/shaman/enhancement/sim.ts index 41c3b3fa44..ac2b596f12 100644 --- a/ui/shaman/enhancement/sim.ts +++ b/ui/shaman/enhancement/sim.ts @@ -68,16 +68,11 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecEnhancementShaman, { Stat.StatAgility, Stat.StatIntellect, Stat.StatAttackPower, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatExpertiseRating, - Stat.StatMasteryRating, ], epPseudoStats: [ PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps, - PseudoStat.PseudoStatPhysicalHitPercent, + PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatSpellHitPercent, ], // Reference stat against which to calculate EP. @@ -91,13 +86,11 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecEnhancementShaman, { Stat.StatAgility, Stat.StatIntellect, Stat.StatAttackPower, - Stat.StatExpertiseRating, Stat.StatSpellPower, - Stat.StatMasteryRating, ], [ - PseudoStat.PseudoStatPhysicalHitPercent, - PseudoStat.PseudoStatPhysicalCritPercent, + PseudoStat.PseudoStatMeleeHitPercent, + PseudoStat.PseudoStatMeleeCritPercent, PseudoStat.PseudoStatMeleeHastePercent, PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, @@ -110,14 +103,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecEnhancementShaman, { gear: Presets.P3_PRESET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.P3_EP_PRESET.epWeights, - // Default stat caps for the Reforge optimizer - statCaps: (() => { - const physHitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5); - const spellHitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - - return physHitCap.add(spellHitCap.add(expCap)); - })(), other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, @@ -196,7 +181,5 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecEnhancementShaman, { export class EnhancementShamanSimUI extends IndividualSimUI { constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this); } } diff --git a/ui/shaman/restoration/presets.ts b/ui/shaman/restoration/presets.ts index fa1e9d4933..2f1fc74551 100644 --- a/ui/shaman/restoration/presets.ts +++ b/ui/shaman/restoration/presets.ts @@ -26,8 +26,6 @@ export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatIntellect]: 0.22, [Stat.StatSpirit]: 0.05, [Stat.StatSpellPower]: 1, - [Stat.StatCritRating]: 0.67, - [Stat.StatHasteRating]: 1.29, [Stat.StatMP5]: 0.08, }), ); diff --git a/ui/shaman/restoration/sim.ts b/ui/shaman/restoration/sim.ts index e42fefa0a5..ab820b37d0 100644 --- a/ui/shaman/restoration/sim.ts +++ b/ui/shaman/restoration/sim.ts @@ -17,12 +17,12 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecRestorationShaman, { warnings: [], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMP5, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatSpellPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5, Stat.StatMasteryRating], + [Stat.StatHealth, Stat.StatMana, Stat.StatStamina, Stat.StatIntellect, Stat.StatSpirit, Stat.StatSpellPower, Stat.StatMP5], [PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], ), // modifyDisplayStats: (player: Player) => { diff --git a/ui/warlock/affliction/apls/default.apl.json b/ui/warlock/affliction/apls/default.apl.json deleted file mode 100644 index d473235c32..0000000000 --- a/ui/warlock/affliction/apls/default.apl.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1.6s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":48181}}},"doAtValue":{"const":{"val":"-1.6s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":126734}}},"rhs":{"const":{"val":"6s"}}}},{"auraIsActive":{"auraId":{"spellId":126734}}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":138963}}}}}]}},{"auraIsActive":{"auraId":{"spellId":138963}}}]}},"castSpell":{"spellId":{"spellId":57933,"tag":-1}}}}, - {"action":{"condition":{"variableRef":{"name":"should-dark-soul"}},"castSpell":{"spellId":{"spellId":113860}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"63s"}}}},{"isExecutePhase":{"threshold":"E20"}},{"and":{"vals":[{"or":{"vals":[{"allTrinketStatProcsActive":{"statType1":3,"statType2":14,"statType3":6}},{"auraIsActive":{"auraId":{"itemId":76093}}}]}},{"isExecutePhase":{"threshold":"E25"}}]}}]}},"castSpell":{"spellId":{"spellId":18540}}}}, - {"action":{"condition":{"variableRef":{"name":"should-potion"}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"can-proc-more"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":113860}}},"rhs":{"const":{"val":"13s"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113860}}},"rhs":{"const":{"val":"55s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":113860}}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"can-proc-more"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":113860}}},"rhs":{"const":{"val":"13s"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113860}}},"rhs":{"const":{"val":"115s"}}}},{"auraIsActive":{"auraId":{"spellId":113860}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"22s"}}}},{"auraIsActive":{"auraId":{"itemId":76093}}}]}},"castSpell":{"spellId":{"spellId":74497}}}}, - {"action":{"castSpell":{"spellId":{"spellId":111897}}}}, - {"action":{"condition":{"variableRef":{"name":"should-sbss"}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":74434}}},{"castSpell":{"spellId":{"spellId":86121,"tag":2}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"variableRef":{"name":"should-not-haunt"}}]}},{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"math":{"op":"OpSub","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"channelClipDelay":{}}}}}},{"variableRef":{"name":"all-dots-active"}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"and":{"vals":[{"gcdIsReady":{}},{"cmp":{"op":"OpGe","lhs":{"spellChanneledTicks":{"spellId":{"spellId":1120}}},"rhs":{"const":{"val":"2"}}}}]}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"3"}}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"variableRef":{"name":"time-until-buffs-end"}}}},{"variableRef":{"name":"all-dots-active"}},{"cmp":{"op":"OpLt","lhs":{"afflictionCurrentSnapshot":{"spellId":{"spellId":980}}},"rhs":{"const":{"val":"45%"}}}},{"cmp":{"op":"OpLt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"30%"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E25"}}}},{"cmp":{"op":"OpGt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"and":{"vals":[{"gcdIsReady":{}},{"cmp":{"op":"OpGe","lhs":{"spellChanneledTicks":{"spellId":{"spellId":1120}}},"rhs":{"const":{"val":"2"}}}}]}},"allowRecast":true}}}, - {"action":{"condition":{"or":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":980}}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"variableRef":{"name":"GCD-duration"}}}}]}},"castSpell":{"spellId":{"spellId":980}}}}, - {"action":{"condition":{"not":{"val":{"dotIsActive":{"spellId":{"spellId":172}}}}},"castSpell":{"spellId":{"spellId":172}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":30108}}},"rhs":{"spellCastTime":{"spellId":{"spellId":30108}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":30108}}}}},{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"math":{"op":"OpMul","lhs":{"variableRef":{"name":"GCD-duration"}},"rhs":{"const":{"val":"2"}}}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":30108}}},"rhs":{"math":{"op":"OpMul","lhs":{"variableRef":{"name":"GCD-duration"}},"rhs":{"const":{"val":"2"}}}}}}]}}]}},"castSpell":{"spellId":{"spellId":30108}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":48181}}},"rhs":{"const":{"val":"1s"}}}},{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"0"}}}},{"not":{"val":{"spellInFlight":{"spellId":{"spellId":48181}}}}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"spellChanneledTicks":{"spellId":{"spellId":1120}}},"rhs":{"const":{"val":"2"}}}}]}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":48181}}},"rhs":{"math":{"op":"OpAdd","lhs":{"spellCastTime":{"spellId":{"spellId":48181}}},"rhs":{"math":{"op":"OpAdd","lhs":{"spellTravelTime":{"spellId":{"spellId":48181}}},"rhs":{"const":{"val":"2s"}}}}}}}},{"not":{"val":{"spellInFlight":{"spellId":{"spellId":48181}}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}},{"not":{"val":{"variableRef":{"name":"should-not-haunt"}}}}]}},"castSpell":{"spellId":{"spellId":48181}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"anyTrinketStatProcsAvailable":{"statType1":7,"statType2":-1,"statType3":-1,"minIcdSeconds":50}},{"or":{"vals":[{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":126659}}},{"auraIsInactive":{"auraId":{"spellId":126659},"includeReactionTime":true}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138703}}},{"auraIsInactive":{"auraId":{"spellId":138703},"includeReactionTime":true}}]}}]}}]}},"channelSpell":{"spellId":{"spellId":103103},"interruptIf":{"gcdIsReady":{}},"allowRecast":true}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":1454}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"or":{"vals":[{"gcdIsReady":{}}]}}}}}, - {"action":{"channelSpell":{"spellId":{"spellId":103103},"interruptIf":{"or":{"vals":[{"gcdIsReady":{}}]}}}}}, - {"action":{"castSpell":{"spellId":{"spellId":1454}}}} - ], - "valueVariables": [ - {"name":"all-dots-active","value":{"and":{"vals":[{"dotIsActive":{"spellId":{"spellId":980}}},{"dotIsActive":{"spellId":{"spellId":172}}},{"dotIsActive":{"spellId":{"spellId":30108}}}]}}}, - {"name":"no-dots-active","value":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":980}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":172}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":30108}}}}}]}}}, - {"name":"should-potion","value":{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellTimeToCharge":{"spellId":{"spellId":113860}}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"27s"}}}}]}}}, - {"name":"should-dark-soul","value":{"or":{"vals":[{"and":{"vals":[{"anyTrinketStatProcsActive":{"statType1":3,"statType2":7,"statType3":6,"minIcdSeconds":50}},{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"40s"}}}},{"cmp":{"op":"OpGt","lhs":{"numEquippedStatProcTrinkets":{"statType1":3,"statType2":7,"statType3":6,"minIcdSeconds":50}},"rhs":{"const":{"val":"0"}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"23s"}}}},{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":113860}}},"rhs":{"const":{"val":"2"}}}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":138786}}},{"auraIsActive":{"auraId":{"spellId":138786},"includeReactionTime":true}}]}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":138898}}},{"auraIsActive":{"auraId":{"spellId":138898},"includeReactionTime":true}}]}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":139133}}},{"auraIsActive":{"auraId":{"spellId":139133},"includeReactionTime":true}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138963}}},{"auraIsActive":{"auraId":{"spellId":138963},"includeReactionTime":true}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"0s"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":138963}}},"rhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}}}}]}}]}}]}}}, - {"name":"GCD-duration","value":{"spellGcdHastedDuration":{"spellId":{"spellId":1454}}}}, - {"name":"can-proc-more","value":{"anyTrinketStatProcsAvailable":{"statType1":7,"statType2":6,"statType3":3}}}, - {"name":"should-sbss","value":{"or":{"vals":[{"variableRef":{"name":"no-dots-active"}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"40%"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"20%"}}}},{"not":{"val":{"variableRef":{"name":"can-proc-more"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":138790}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":138786}}},"rhs":{"const":{"val":"10"}}}}]}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-2%"}}}},{"cmp":{"op":"OpLe","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"variableRef":{"name":"GCD-duration"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"const":{"val":"31s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"0%"}}}},{"cmp":{"op":"OpLe","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"variableRef":{"name":"GCD-duration"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}}]}}]}}}, - {"name":"time-until-buffs-end","value":{"min":{"vals":[{"trinketProcsMinRemainingTime":{"statType1":3,"statType2":6,"statType3":7}},{"anyStatBuffCooldownsMinDuration":{"statType1":3,"statType2":7,"statType3":14}}]}}}, - {"name":"should-not-haunt","value":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-2%"}}}},{"cmp":{"op":"OpGt","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"const":{"val":"2s"}}}},"rhs":{"variableRef":{"name":"time-until-buffs-end"}}}},{"cmp":{"op":"OpLe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"1"}}}}]}}}, - {"name":"dots-min-time","value":{"min":{"vals":[{"dotRemainingTime":{"spellId":{"spellId":980}}},{"dotRemainingTime":{"spellId":{"spellId":30108}}},{"dotRemainingTime":{"spellId":{"spellId":172}}}]}}} - ] -} diff --git a/ui/warlock/affliction/apls/multitarget.apl.json b/ui/warlock/affliction/apls/multitarget.apl.json deleted file mode 100644 index 87881f3fe2..0000000000 --- a/ui/warlock/affliction/apls/multitarget.apl.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1.6s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":48181}}},"doAtValue":{"const":{"val":"-1.6s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":126734}}},"rhs":{"const":{"val":"6s"}}}},{"auraIsActive":{"auraId":{"spellId":126734}}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":138963}}}}}]}},{"auraIsActive":{"auraId":{"spellId":138963}}}]}},"castSpell":{"spellId":{"spellId":57933,"tag":-1}}}}, - {"action":{"condition":{"variableRef":{"name":"should-dark-soul"}},"castSpell":{"spellId":{"spellId":113860}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"63s"}}}},{"isExecutePhase":{"threshold":"E20"}},{"and":{"vals":[{"or":{"vals":[{"allTrinketStatProcsActive":{"statType1":3,"statType2":14,"statType3":6}},{"auraIsActive":{"auraId":{"itemId":76093}}}]}},{"isExecutePhase":{"threshold":"E25"}}]}}]}},"castSpell":{"spellId":{"spellId":18540}}}}, - {"action":{"condition":{"variableRef":{"name":"should-potion"}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"can-proc-more"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":113860}}},"rhs":{"const":{"val":"13s"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113860}}},"rhs":{"const":{"val":"55s"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":113860}}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"can-proc-more"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":113860}}},"rhs":{"const":{"val":"13s"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113860}}},"rhs":{"const":{"val":"115s"}}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"22s"}}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"auraIsActive":{"auraId":{"itemId":76093}}}]}}]}},"castSpell":{"spellId":{"spellId":74497}}}}, - {"action":{"castSpell":{"spellId":{"spellId":111897}}}}, - {"action":{"condition":{"variableRef":{"name":"should-sbss"}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":74434}}},{"castSpell":{"spellId":{"spellId":86121,"tag":2}}},{"cancelAura":{"auraId":{"spellId":86211}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"variableRef":{"name":"should-not-haunt"}}]}},{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"0"}}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"math":{"op":"OpSub","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"channelClipDelay":{}}}}}},{"variableRef":{"name":"all-dots-active"}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"and":{"vals":[{"gcdIsReady":{}},{"cmp":{"op":"OpGe","lhs":{"spellChanneledTicks":{"spellId":{"spellId":1120}}},"rhs":{"const":{"val":"2"}}}}]}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"3"}}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"cmp":{"op":"OpLt","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"variableRef":{"name":"time-until-buffs-end"}}}},{"variableRef":{"name":"all-dots-active"}},{"not":{"val":{"variableRef":{"name":"should-swap"}}}},{"cmp":{"op":"OpLt","lhs":{"afflictionCurrentSnapshot":{"spellId":{"spellId":980}}},"rhs":{"const":{"val":"45%"}}}},{"cmp":{"op":"OpLt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"30%"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E25"}}}},{"cmp":{"op":"OpGt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"and":{"vals":[{"gcdIsReady":{}},{"cmp":{"op":"OpGe","lhs":{"spellChanneledTicks":{"spellId":{"spellId":1120}}},"rhs":{"const":{"val":"2"}}}}]}},"allowRecast":true}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"variableRef":{"name":"GCD-duration"}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":980}}}}}]}},{"auraIsInactive":{"auraId":{"spellId":86211}}}]}},"castSpell":{"spellId":{"spellId":980}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"auraIsInactive":{"auraId":{"spellId":86211}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":172}}},"rhs":{"const":{"val":"3s"}}}}]}},{"and":{"vals":[{"auraIsInactive":{"auraId":{"spellId":86211}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":113860},"includeReactionTime":true}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":172}}},"rhs":{"const":{"val":"6s"}}}}]}},{"and":{"vals":[{"auraIsInactive":{"auraId":{"spellId":86211},"includeReactionTime":true}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":172}}}}}]}}]}},"castSpell":{"spellId":{"spellId":172}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":30108}}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":30108}}},"rhs":{"const":{"val":"3s"}}}},{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"math":{"op":"OpMul","lhs":{"variableRef":{"name":"GCD-duration"}},"rhs":{"const":{"val":"2"}}}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":30108}}},"rhs":{"math":{"op":"OpMul","lhs":{"variableRef":{"name":"GCD-duration"}},"rhs":{"const":{"val":"2"}}}}}}]}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860},"includeReactionTime":true}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":126734}}},"rhs":{"const":{"val":"3s"}}}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":30108}}},"rhs":{"const":{"val":"11s"}}}},{"auraIsActive":{"auraId":{"spellId":126734},"includeReactionTime":true}}]}}]}},{"auraIsInactive":{"auraId":{"spellId":86211}}}]}},"castSpell":{"spellId":{"spellId":30108}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":30108}}},"rhs":{"const":{"val":"3s"}}}},{"auraIsInactive":{"auraId":{"spellId":86211}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":30108}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":48181}}},"rhs":{"const":{"val":"1s"}}}},{"cmp":{"op":"OpEq","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"0"}}}},{"not":{"val":{"spellInFlight":{"spellId":{"spellId":48181}}}}},{"not":{"val":{"variableRef":{"name":"should-swap"}}}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"spellChanneledTicks":{"spellId":{"spellId":1120}}},"rhs":{"const":{"val":"2"}}}}]}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":48181}}},"rhs":{"math":{"op":"OpAdd","lhs":{"spellCastTime":{"spellId":{"spellId":48181}}},"rhs":{"math":{"op":"OpAdd","lhs":{"spellTravelTime":{"spellId":{"spellId":48181}}},"rhs":{"const":{"val":"2s"}}}}}}}},{"not":{"val":{"spellInFlight":{"spellId":{"spellId":48181}}}}},{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"should-swap"}}}},{"and":{"vals":[{"dotIsActiveOnAllTargets":{"spellId":{"spellId":980}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"spellGcdHastedDuration":{"spellId":{"spellId":48181}}}}}]}}]}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}},{"not":{"val":{"variableRef":{"name":"should-not-haunt"}}}}]}},"castSpell":{"spellId":{"spellId":48181}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"should-swap"}}}},{"spellIsReady":{"spellId":{"spellId":26297}}}]}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":86211}}}}},{"anyTrinketStatProcsAvailable":{"statType1":7,"statType2":-1,"statType3":-1,"minIcdSeconds":50}},{"or":{"vals":[{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":126659}}},{"auraIsInactive":{"auraId":{"spellId":126659},"includeReactionTime":true}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138703}}},{"auraIsInactive":{"auraId":{"spellId":138703},"includeReactionTime":true}}]}}]}}]}},"channelSpell":{"spellId":{"spellId":103103},"interruptIf":{"gcdIsReady":{}},"allowRecast":true}}}, - {"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"should-swap"}},{"or":{"vals":[{"and":{"vals":[{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":126734}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":126734}}},"rhs":{"math":{"op":"OpAdd","lhs":{"const":{"val":"2s"}},"rhs":{"spellGcdHastedDuration":{"spellId":{"spellId":86121,"tag":1}}}}}}}]}},{"auraIsKnown":{"auraId":{"spellId":126734}}}]}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":126734}}}}},{"cmp":{"op":"OpLt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"0%"}}}}]}},{"not":{"val":{"and":{"vals":[{"spellIsReady":{"spellId":{"spellId":126734}}},{"auraIsActive":{"auraId":{"spellId":113860},"includeReactionTime":true}}]}}}}]}},"castSpell":{"spellId":{"spellId":86121,"tag":1}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":86211},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":26297}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":26297}}},"rhs":{"const":{"val":"2s"}}}},{"auraIsActive":{"auraId":{"spellId":26297}}}]}},{"cmp":{"op":"OpLt","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"const":{"val":"2s"}}}}]}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":86213},"target":{"type":"NextTarget"}}},{"warlockNextExhaleTarget":{}}]}}}, - {"action":{"condition":{"not":{"val":{"dotIsActiveOnAllTargets":{"spellId":{"spellId":980}}}}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":86213},"target":{"type":"NextTarget"}}},{"warlockNextExhaleTarget":{}}]}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"should-swap"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"spellGcdHastedDuration":{"spellId":{"spellId":1454}}}}}]}},{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":1454}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"spellGcdHastedDuration":{"spellId":{"spellId":1120}}}}},{"isExecutePhase":{"threshold":"E20"}}]}},{"not":{"val":{"variableRef":{"name":"should-swap"}}}}]}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"gcdIsReady":{}}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"variableRef":{"name":"GCD-duration"}}}},{"not":{"val":{"variableRef":{"name":"should-swap"}}}}]}}]}},"channelSpell":{"spellId":{"spellId":103103},"interruptIf":{"cmp":{"op":"OpGt","lhs":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":103103}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}}}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"variableRef":{"name":"GCD-duration"}}}}]}},"wait":{"duration":{"math":{"op":"OpSub","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"afflictionExhaleWindow":{}}}}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"afflictionExhaleWindow":{}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":86213},"target":{"type":"NextTarget"}}},{"warlockNextExhaleTarget":{}}]}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"spellIsChanneling":{"spellId":{"spellId":1120}}},{"cmp":{"op":"OpLe","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"or":{"vals":[{"gcdIsReady":{}}]}},"allowRecast":true}}}, - {"action":{"condition":{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"not":{"val":{"variableRef":{"name":"should-swap"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}},"rhs":{"channelClipDelay":{}}}}}}]}}]}},"channelSpell":{"spellId":{"spellId":1120},"interruptIf":{"or":{"vals":[{"gcdIsReady":{}}]}}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":103103}}},"rhs":{"const":{"val":"35%"}}}},{"spellIsChanneling":{"spellId":{"spellId":103103}}}]}},"channelSpell":{"spellId":{"spellId":103103},"interruptIf":{"gcdIsReady":{}},"allowRecast":true}}}, - {"action":{"channelSpell":{"spellId":{"spellId":103103},"interruptIf":{"or":{"vals":[{"gcdIsReady":{}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":86211}}},"rhs":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":103103}}},"rhs":{"channelClipDelay":{}}}}}},{"auraIsActive":{"auraId":{"spellId":86211},"includeReactionTime":true}}]}}]}}}}}, - {"action":{"castSpell":{"spellId":{"spellId":1454}}}} - ], - "valueVariables": [ - {"name":"all-dots-active","value":{"and":{"vals":[{"dotIsActive":{"spellId":{"spellId":980}}},{"dotIsActive":{"spellId":{"spellId":172}}},{"dotIsActive":{"spellId":{"spellId":30108}}}]}}}, - {"name":"no-dots-active","value":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":980}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":172}}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":30108}}}}}]}}}, - {"name":"should-potion","value":{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113860}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"spellTimeToCharge":{"spellId":{"spellId":113860}}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"27s"}}}}]}}}, - {"name":"should-dark-soul","value":{"or":{"vals":[{"and":{"vals":[{"anyTrinketStatProcsActive":{"statType1":3,"statType2":7,"statType3":6,"minIcdSeconds":50}},{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"40s"}}}},{"cmp":{"op":"OpGt","lhs":{"numEquippedStatProcTrinkets":{"statType1":3,"statType2":7,"statType3":6,"minIcdSeconds":50}},"rhs":{"const":{"val":"0"}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"23s"}}}},{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":113860}}},"rhs":{"const":{"val":"2"}}}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":138786}}},{"auraIsActive":{"auraId":{"spellId":138786},"includeReactionTime":true}}]}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":138898}}},{"auraIsActive":{"auraId":{"spellId":138898},"includeReactionTime":true}}]}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":139133}}},{"auraIsActive":{"auraId":{"spellId":139133},"includeReactionTime":true}}]}},{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"should-sbss"}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}}]}},{"auraIsKnown":{"auraId":{"spellId":137590}}},{"auraIsActive":{"auraId":{"spellId":137590},"includeReactionTime":true}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138963}}},{"auraIsActive":{"auraId":{"spellId":138963},"includeReactionTime":true}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-25%"}}}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"0s"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":138963}}},"rhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}}}}]}}]}}]}}}, - {"name":"GCD-duration","value":{"spellGcdHastedDuration":{"spellId":{"spellId":1454}}}}, - {"name":"should-swap","value":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"not":{"val":{"dotIsActiveOnAllTargets":{"spellId":{"spellId":980}}}}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"remainingTime":{}}}}]}}]}}}, - {"name":"can-proc-more","value":{"anyTrinketStatProcsAvailable":{"statType1":7,"statType2":6,"statType3":3}}}, - {"name":"should-sbss","value":{"or":{"vals":[{"variableRef":{"name":"no-dots-active"}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"40%"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"20%"}}}},{"not":{"val":{"variableRef":{"name":"can-proc-more"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":138790}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":138786}}},"rhs":{"const":{"val":"10"}}}}]}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-2%"}}}},{"cmp":{"op":"OpLe","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"variableRef":{"name":"GCD-duration"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":980}}},"rhs":{"const":{"val":"32s"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"1%"}}}},{"cmp":{"op":"OpLe","lhs":{"variableRef":{"name":"time-until-buffs-end"}},"rhs":{"variableRef":{"name":"GCD-duration"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":980}}},"rhs":{"const":{"val":"-50%"}}}},{"anyTrinketStatProcsActive":{"statType1":3,"statType2":6,"statType3":7,"minIcdSeconds":50}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"variableRef":{"name":"dots-min-time"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"variableRef":{"name":"dots-min-time"}},"rhs":{"const":{"val":"6s"}}}}]}}]}}}, - {"name":"time-until-buffs-end","value":{"min":{"vals":[{"trinketProcsMinRemainingTime":{"statType1":3,"statType2":6,"statType3":7}},{"anyStatBuffCooldownsMinDuration":{"statType1":3,"statType2":7,"statType3":14}}]}}}, - {"name":"should-not-haunt","value":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":86121,"tag":1}}},"rhs":{"const":{"val":"-2%"}}}},{"cmp":{"op":"OpGt","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpAdd","lhs":{"math":{"op":"OpMul","lhs":{"const":{"val":"2"}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":1120}}}}},"rhs":{"channelClipDelay":{}}}},"rhs":{"const":{"val":"2s"}}}},"rhs":{"variableRef":{"name":"time-until-buffs-end"}}}},{"cmp":{"op":"OpLe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"1"}}}}]}}}, - {"name":"dots-min-time","value":{"min":{"vals":[{"dotRemainingTime":{"spellId":{"spellId":980}}},{"dotRemainingTime":{"spellId":{"spellId":30108}}},{"dotRemainingTime":{"spellId":{"spellId":172}}}]}}} - ] -} diff --git a/ui/warlock/affliction/gear_sets/p1.gear.json b/ui/warlock/affliction/gear_sets/p1.gear.json deleted file mode 100644 index 5cb36e5e4a..0000000000 --- a/ui/warlock/affliction/gear_sets/p1.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87188, "gems": [76885, 76642], "reforging": 145 }, - { "id": 87028, "reforging": 145 }, - { "id": 87191, "enchant": 4806, "gems": [76642], "reforging": 167 }, - { "id": 90512, "enchant": 4892, "reforging": 168 }, - { "id": 87169, "enchant": 4419, "gems": [76667, 76699], "reforging": 138 }, - { "id": 86958, "enchant": 4414, "gems": [0], "reforging": 154 }, - { "id": 87187, "enchant": 4433, "gems": [0], "reforging": 140, "tinker": 4898 }, - { "id": 86981, "gems": [76667, 76642, 76699], "reforging": 140 }, - { "id": 87189, "enchant": 4825, "gems": [76667] }, - { "id": 87162, "enchant": 4429, "gems": [76699] }, - { "id": 86949, "reforging": 145 }, - { "id": 90511, "reforging": 119 }, - { "id": 87175 }, - { "id": 87065 }, - { "id": 90513, "enchant": 4442, "gems": [76642], "reforging": 144 }, - { "id": 86960, "enchant": 4434, "reforging": 145 } - ] -} diff --git a/ui/warlock/affliction/gear_sets/p2.gear.json b/ui/warlock/affliction/gear_sets/p2.gear.json deleted file mode 100644 index 65e8968803..0000000000 --- a/ui/warlock/affliction/gear_sets/p2.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":87188,"gems":[76885,76642],"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":87028,"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":87191,"enchant":4806,"gems":[76642],"reforging":138,"upgradeStep":"UpgradeStepTwo"}, - {"id":90512,"enchant":4892,"upgradeStep":"UpgradeStepTwo"}, - {"id":87169,"enchant":4419,"gems":[76667,76700],"reforging":167,"upgradeStep":"UpgradeStepTwo"}, - {"id":86958,"enchant":4414,"gems":[0],"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":87187,"enchant":4433,"gems":[0],"upgradeStep":"UpgradeStepTwo","tinker":4898}, - {"id":86981,"gems":[76667,76642,76700],"reforging":140,"upgradeStep":"UpgradeStepTwo"}, - {"id":87189,"enchant":4825,"gems":[76671],"upgradeStep":"UpgradeStepTwo"}, - {"id":87162,"enchant":4429,"gems":[76699],"upgradeStep":"UpgradeStepTwo"}, - {"id":86949,"reforging":145,"upgradeStep":"UpgradeStepTwo"}, - {"id":90511,"reforging":119,"upgradeStep":"UpgradeStepTwo"}, - {"id":87175,"upgradeStep":"UpgradeStepTwo"}, - {"id":87065,"upgradeStep":"UpgradeStepTwo"}, - {"id":87164,"enchant":4442,"gems":[89882,76699],"reforging":144,"upgradeStep":"UpgradeStepTwo"}, - {"id":86960,"enchant":4434,"reforging":145,"upgradeStep":"UpgradeStepTwo"} - ] -} diff --git a/ui/warlock/affliction/gear_sets/p3.gear.json b/ui/warlock/affliction/gear_sets/p3.gear.json deleted file mode 100644 index 382c1cca67..0000000000 --- a/ui/warlock/affliction/gear_sets/p3.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":96887,"gems":[95347,76643]}, - {"id":96825,"reforging":147}, - {"id":96729,"enchant":4806,"gems":[76672,76700],"reforging":147}, - {"id":95014,"enchant":4423,"gems":[76700],"reforging":140}, - {"id":96728,"enchant":4419,"gems":[76672,76700,76643],"reforging":138}, - {"id":96824,"randomSuffix":-340,"enchant":4414,"gems":[76700,0],"reforging":154}, - {"id":96854,"enchant":4430,"gems":[76700,76643,0],"reforging":140,"tinker":4898}, - {"id":96834,"gems":[76672,76700,76700],"reforging":140}, - {"id":95030,"enchant":4825,"gems":[76671,76700,76700]}, - {"id":95004,"enchant":4429,"gems":[76700,76643],"reforging":145}, - {"id":95019,"gems":[76643],"reforging":140}, - {"id":96901,"gems":[76643],"reforging":145}, - {"id":96785,"reforging":140}, - {"id":96930}, - {"id":96890,"enchant":4442,"gems":[76672,76700]}, - {"id":96934,"enchant":4434,"gems":[76672],"reforging":147} - ] -} diff --git a/ui/warlock/affliction/gear_sets/preraid.gear.json b/ui/warlock/affliction/gear_sets/preraid.gear.json deleted file mode 100644 index e0ec12dc3b..0000000000 --- a/ui/warlock/affliction/gear_sets/preraid.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 77533, "gems": [76885, 77542, 77543] }, - { "id": 90596, "reforging": 145 }, - { "id": 91781, "enchant": 4806, "gems": [76699], "reforging": 168 }, - { "id": 81575, "enchant": 4892, "reforging": 167 }, - { "id": 82437, "enchant": 4419, "gems": [76699, 76642], "reforging": 168 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 167 }, - { "id": 82438, "enchant": 4433, "gems": [76642, 0], "reforging": 167, "tinker": 4898 }, - { "id": 89062, "gems": [76642, 76699], "reforging": 138 }, - { "id": 91777, "enchant": 4825, "gems": [76667, 76642], "reforging": 168 }, - { "id": 81699, "enchant": 4429, "gems": [76699], "reforging": 145 }, - { "id": 90859, "reforging": 167 }, - { "id": 90591, "reforging": 145 }, - { "id": 79331 }, - { "id": 81192 }, - { "id": 81691, "enchant": 4442, "reforging": 145 }, - {} - ] -} diff --git a/ui/warlock/affliction/index.ts b/ui/warlock/affliction/index.ts deleted file mode 100644 index 1694985db7..0000000000 --- a/ui/warlock/affliction/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { AfflictionWarlockSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.AfflictionWarlock, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new AfflictionWarlockSimUI(document.body, player); diff --git a/ui/warlock/affliction/inputs.ts b/ui/warlock/affliction/inputs.ts deleted file mode 100644 index 4562655c27..0000000000 --- a/ui/warlock/affliction/inputs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import * as InputHelpers from '../../core/components/input_helpers'; -import { Player } from '../../core/player'; -import { Spec } from '../../core/proto/common'; -import i18n from '../../i18n/config'; - - -export const ExhaleWindow = InputHelpers.makeSpecOptionsNumberInput({ - fieldName: 'exhaleWindow', - label: i18n.t('rotation_tab.options.warlock.affliction.exhale_window.label'), - labelTooltip: i18n.t('rotation_tab.options.warlock.affliction.exhale_window.tooltip'), - showWhen: (player: Player) => true, -}); diff --git a/ui/warlock/affliction/presets.ts b/ui/warlock/affliction/presets.ts deleted file mode 100644 index 8ea6196b77..0000000000 --- a/ui/warlock/affliction/presets.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { Encounter } from '../../core/encounter'; -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Debuffs, IndividualBuffs, Profession, Race, RaidBuffs, Stat } from '../../core/proto/common'; -import { SavedTalents } from '../../core/proto/ui'; -import { - AfflictionWarlock_Options as WarlockOptions, - WarlockOptions_Summon as Summon, -} from '../../core/proto/warlock'; -import { Stats } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import { WARLOCK_BREAKPOINTS } from '../presets'; -import DefaultApl from './apls/default.apl.json'; -import MultiTargetApl from './apls/multitarget.apl.json' -import P1Gear from './gear_sets/p1.gear.json'; -import P2Gear from './gear_sets/p2.gear.json'; -import P3Gear from './gear_sets/p3.gear.json'; -import PreraidGear from './gear_sets/preraid.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const PRERAID_PRESET = PresetUtils.makePresetGear('Pre-raid', PreraidGear); -export const P1_PRESET = PresetUtils.makePresetGear('P1 - BIS', P1Gear); -export const P2_PRESET = PresetUtils.makePresetGear('P2 - BIS', P2Gear); -export const P3_PRESET = PresetUtils.makePresetGear('P3 (Tentative)', P3Gear); - -export const APL_Default = PresetUtils.makePresetAPLRotation('Single Target', DefaultApl); -export const APL_Multitarget = PresetUtils.makePresetAPLRotation('Multi Target', MultiTargetApl); - -// Preset options for EP weights -export const P1_BIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level < 512', - Stats.fromMap({ - [Stat.StatIntellect]: 1.23, - [Stat.StatSpellPower]: 1.0, - [Stat.StatHitRating]: 0.93, - [Stat.StatCritRating]: 0.54, - [Stat.StatHasteRating]: 0.83, - [Stat.StatMasteryRating]: 0.67, - }), -); - -export const P2_BIS_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level >= 512', - Stats.fromMap({ - [Stat.StatIntellect]: 1.23, - [Stat.StatSpellPower]: 1.0, - [Stat.StatHitRating]: 0.90, - [Stat.StatCritRating]: 0.56, - [Stat.StatHasteRating]: 0.73, - [Stat.StatMasteryRating]: 0.68, - }), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wotlk.wowhead.com/talent-calc and copy the numbers in the url. - -export const AfflictionTalents = { - name: 'Affliction', - data: SavedTalents.create({ - talentsString: '231211', - }), -}; - -export const DefaultOptions = WarlockOptions.create({ - classOptions: { - summon: Summon.Felhunter, - }, - exhaleWindow: 250, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76085, // Flask of the Warm Sun - foodId: 74650, // Mogu Fish Stew - potId: 76093, //Potion of the Jade Serpent - prepotId: 76093, // Potion of the Jade Serpent -}); - -export const DefaultRaidBuffs = RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - leaderOfThePack: true, - blessingOfMight: true, - bloodlust: true, - moonkinAura: true, - unholyAura: true, -}); - -export const DefaultIndividualBuffs = IndividualBuffs.create({}); - -export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, - weakenedArmor: true, - physicalVulnerability: true, -}); - -export const OtherDefaults = { - race: Race.RaceTroll, - distanceFromTarget: 25, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, - channelClipDelay: 150, -}; - -export const AFFLICTION_BREAKPOINTS = WARLOCK_BREAKPOINTS; - -const ENCOUNTER_SINGLETARGET = PresetUtils.makePresetEncounter('Single Target Dummy', Encounter.defaultEncounterProto()); -const ENCOUNTER_MULTITARGET = PresetUtils.makePresetEncounter('Multitarget', Encounter.defaultEncounterProto(3)); - -export const PRESET_SINGLETARGET = PresetUtils.makePresetBuild('Single Target', { - talents: AfflictionTalents, - rotation: APL_Default, - encounter: ENCOUNTER_SINGLETARGET, -}); - -export const PRESET_MULTITARGET = PresetUtils.makePresetBuild('Multi Target', { - talents: AfflictionTalents, - rotation: APL_Multitarget, - encounter: ENCOUNTER_MULTITARGET, -}); diff --git a/ui/warlock/affliction/sim.tsx b/ui/warlock/affliction/sim.tsx deleted file mode 100644 index e20430ccf3..0000000000 --- a/ui/warlock/affliction/sim.tsx +++ /dev/null @@ -1,289 +0,0 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics.js'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Faction, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { StatCapType } from '../../core/proto/ui'; -import { DEFAULT_CASTER_GEM_STATS, StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { formatToNumber } from '../../core/utils'; -import * as WarlockInputs from '../inputs'; -import * as AffInputs from './inputs'; -import * as Presets from './presets'; - -const relevantDotBreakpoints = [ - // Presets.AFFLICTION_BREAKPOINTS.presets.get('8-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('14-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('11-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('15-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('9-tick - Unstable Affliction')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('12-tick - Corruption')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('16-tick - Agony')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('10-tick - Unstable Affliction')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('17-tick - Agony')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('13-tick - Corruption')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('18-tick - Agony')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('14-tick - Corruption')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('11-tick - Unstable Affliction')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('19-tick - Agony')!, - Presets.AFFLICTION_BREAKPOINTS.presets.get('15-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('20-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('12-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('21-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('16-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('13-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('22-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('17-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('23-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('14-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('18-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('24-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('25-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('19-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('15-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('26-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('20-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('27-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('16-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('21-tick - Corruption')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('28-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('17-tick - Unstable Affliction')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('29-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('30-tick - Agony')!, - // Presets.AFFLICTION_BREAKPOINTS.presets.get('31-tick - Agony')!, -]; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecAfflictionWarlock, { - cssClass: 'affliction-warlock-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Warlock), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], - // Reference stat against which to calculate EP. DPS classes use either spell power or attack power. - epReferenceStat: Stat.StatSpellPower, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [ - Stat.StatHealth, - Stat.StatMana, - Stat.StatStamina, - Stat.StatIntellect, - Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - Stat.StatMP5, - ], - [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], - ), - gemStats: DEFAULT_CASTER_GEM_STATS, - - defaults: { - // Default equipped gear. - gear: Presets.P2_PRESET.gear, - - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P2_BIS_EP_PRESET.epWeights, - // Default stat caps for the Reforge optimizer - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), - // Default soft caps for the Reforge optimizer - softCapBreakpoints: (() => { - const hasteSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { - breakpoints: relevantDotBreakpoints, - capType: StatCapType.TypeSoftCap, - postCapEPs: relevantDotBreakpoints.map( - () => (Presets.P1_BIS_EP_PRESET.epWeights.getStat(Stat.StatMasteryRating) - 0.05) * Mechanics.HASTE_RATING_PER_HASTE_PERCENT, - ), - }); - - return [hasteSoftCapConfig]; - })(), - // Default consumes settings. - consumables: Presets.DefaultConsumables, - - // Default talents. - talents: Presets.AfflictionTalents.data, - // Default spec-specific settings. - specOptions: Presets.DefaultOptions, - - // Default buffs and debuffs settings. - raidBuffs: Presets.DefaultRaidBuffs, - - partyBuffs: PartyBuffs.create({}), - - individualBuffs: Presets.DefaultIndividualBuffs, - - debuffs: Presets.DefaultDebuffs, - - other: Presets.OtherDefaults, - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [WarlockInputs.PetInput()], - - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [BuffDebuffInputs.AttackSpeedBuff, BuffDebuffInputs.MajorArmorDebuff, BuffDebuffInputs.PhysicalDamageDebuff], - excludeBuffDebuffInputs: [], - petConsumeInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [ - AffInputs.ExhaleWindow, - OtherInputs.InputDelay, - OtherInputs.DistanceFromTarget, - OtherInputs.TankAssignment, - OtherInputs.ChannelClipDelay, - ], - }, - itemSwapSlots: [ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand, ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: false, - }, - - presets: { - epWeights: [Presets.P1_BIS_EP_PRESET, Presets.P2_BIS_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.AfflictionTalents], - // Preset rotations that the user can quickly select. - rotations: [Presets.APL_Default, Presets.APL_Multitarget], - // Preset configurations (encounter, rotation, talents) - builds: [Presets.PRESET_SINGLETARGET, Presets.PRESET_MULTITARGET], - - // Preset gear configurations that the user can quickly select. - gear: [Presets.PRERAID_PRESET, Presets.P1_PRESET, Presets.P2_PRESET, Presets.P3_PRESET], - itemSwaps: [], - }, - - autoRotation: (_player: Player): APLRotation => { - const numTargets = _player.sim.encounter.targets.length; - - if (numTargets > 1) return Presets.APL_Multitarget.rotation.rotation!; - - return Presets.APL_Default.rotation.rotation!; - }, - - raidSimPresets: [ - { - spec: Spec.SpecAfflictionWarlock, - talents: Presets.AfflictionTalents.data, - specOptions: Presets.DefaultOptions, - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceHuman, - [Faction.Horde]: Race.RaceTroll, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.PRERAID_PRESET.gear, - 2: Presets.P1_PRESET.gear, - }, - [Faction.Horde]: { - 1: Presets.PRERAID_PRESET.gear, - 2: Presets.P1_PRESET.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class AfflictionWarlockSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - const statSelectionPresets = [ - { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: Presets.AFFLICTION_BREAKPOINTS.presets, - }, - ]; - - this.reforger = new ReforgeOptimizer(this, { - statSelectionPresets, - enableBreakpointLimits: true, - getEPDefaults: player => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - if (avgIlvl >= 512) { - return Presets.P2_BIS_EP_PRESET.epWeights; - } - return Presets.P1_BIS_EP_PRESET.epWeights; - }, - // updateSoftCaps: softCaps => { - // const raidBuffs = player.getRaid()?.getBuffs(); - // const hasBL = !!raidBuffs?.bloodlust; - // const hasBerserking = player.getRace() === Race.RaceTroll; - - // const modifyHaste = (oldHastePercent: number, modifier: number) => - // Number(formatToNumber(((oldHastePercent / 100 + 1) / modifier - 1) * 100, { maximumFractionDigits: 5 })); - - // this.individualConfig.defaults.softCapBreakpoints!.forEach(softCap => { - // const softCapToModify = softCaps.find(sc => sc.unitStat.equals(softCap.unitStat)); - // if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHastePercent) && softCapToModify) { - // const adjustedHasteBreakpoints = new Set([...softCap.breakpoints]); - // const hasCloseMatchingValue = (value: number) => - // [...adjustedHasteBreakpoints.values()].find(bp => bp.toFixed(2) === value.toFixed(2)); - - // softCap.breakpoints.forEach(breakpoint => { - // const dsMiseryBreakpoint = modifyHaste(breakpoint, 1.3); - // if (dsMiseryBreakpoint > 0 && !hasCloseMatchingValue(dsMiseryBreakpoint)) { - // adjustedHasteBreakpoints.add(dsMiseryBreakpoint); - // } - // if (hasBL) { - // const blBreakpoint = modifyHaste(breakpoint, 1.3); - - // if (blBreakpoint > 0) { - // if (!hasCloseMatchingValue(blBreakpoint)) adjustedHasteBreakpoints.add(blBreakpoint); - - // const dsMiseryBlBreakpoint = modifyHaste(blBreakpoint, 1.3); - // if (dsMiseryBlBreakpoint > 0 && !hasCloseMatchingValue(dsMiseryBlBreakpoint)) { - // adjustedHasteBreakpoints.add(dsMiseryBlBreakpoint); - // } - - // if (hasBerserking) { - // const berserkingBreakpoint = modifyHaste(blBreakpoint, 1.2); - // if (berserkingBreakpoint > 0 && !hasCloseMatchingValue(berserkingBreakpoint)) { - // adjustedHasteBreakpoints.add(berserkingBreakpoint); - // } - // } - // } - // } - // }); - // softCapToModify.breakpoints = [...adjustedHasteBreakpoints].sort((a, b) => a - b); - // } - // }); - // return softCaps; - // }, - // additionalSoftCapTooltipInformation: { - // [Stat.StatHasteRating]: () => { - // const raidBuffs = player.getRaid()?.getBuffs(); - // const hasBL = !!raidBuffs?.bloodlust; - // const hasBerserking = player.getRace() === Race.RaceTroll; - - // return ( - // <> - // {(hasBL || hasBerserking) && ( - // <> - //

Additional breakpoints have been created using the following cooldowns:

- //
    - // {
  • Dark Soul: Misery
  • } - // {hasBL &&
  • Bloodlust
  • } - // {hasBerserking &&
  • Berserking
  • } - //
- // - // )} - // - // ); - // }, - // }, - }); - } -} diff --git a/ui/warlock/apls/blank.apl.json b/ui/warlock/apls/blank.apl.json new file mode 100644 index 0000000000..725b143fed --- /dev/null +++ b/ui/warlock/apls/blank.apl.json @@ -0,0 +1,4 @@ +{ + "type": "TypeAPL", + "priorityList": [] +} diff --git a/ui/warlock/demonology/apls/default.apl.json b/ui/warlock/demonology/apls/default.apl.json deleted file mode 100644 index 461eb3408c..0000000000 --- a/ui/warlock/demonology/apls/default.apl.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}},"hide":true}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":105174}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"not":{"val":{"dotIsActive":{"spellId":{"spellId":172}}}}},"castSpell":{"spellId":{"spellId":172}}}}, - {"action":{"castSpell":{"spellId":{"spellId":89751}}}}, - {"action":{"castSpell":{"spellId":{"spellId":111898}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"61s"}}}},{"isExecutePhase":{"threshold":"E20"}}]}},"castSpell":{"spellId":{"spellId":18540}}}}, - {"action":{"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":113861}}},"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":113861}}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":113861}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113861}}},"rhs":{"const":{"val":"10s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":113861}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":104316}}},"rhs":{"const":{"val":"1s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":113861}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"trinketProcsMinRemainingTime":{"statType1":7,"statType2":3,"statType3":-1,"minIcdSeconds":40}},"rhs":{"const":{"val":"15s"}}}}]}},{"and":{"vals":[{"not":{"val":{"auraIsActive":{"auraId":{"spellId":113861}}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"spellId":2825,"tag":-1}}},"rhs":{"const":{"val":"15s"}}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"22s"}}}}]}},"castSpell":{"spellId":{"spellId":113861}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"spellId":113861}}},"rhs":{"const":{"val":"18s"}}}},{"auraIsActive":{"auraId":{"spellId":26297}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"itemId":76093}}},"rhs":{"const":{"val":"18s"}}}}]}},{"not":{"val":{"variableRef":{"name":"GCD Drops SF"}}}}]}},"castSpell":{"spellId":{"spellId":104316}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":103958}}},{"auraIsInactive":{"auraId":{"spellId":113861}}},{"cmp":{"op":"OpLe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"600"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"30s"}}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":103958}}},"rhs":{"const":{"val":"2s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"400"}}}}]}},{}]}},"castSpell":{"spellId":{"spellId":103958}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":113861}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":113861}}},"rhs":{"const":{"val":"10s"}}}},{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":47960}}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"200"}}}},{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},{"cmp":{"op":"OpLt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"20s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"30s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"500"}}}}]}},{"variableRef":{"name":"UVLOS Doom"}}]}},"castSpell":{"spellId":{"spellId":103958}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":103958}}},"groupReference":{"groupName":"Meta GCD"}}}, - {"action":{"groupReference":{"groupName":"Non-Meta GCD"}}} - ], - "groups": [ - {"name":"HOG: 2 stacks / 1 & expire soon","actions":[{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":105174}}},"rhs":{"const":{"val":"2"}}}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":105174}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":105174}}},"rhs":{"const":{"val":"2.5s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":105174}}}}]}, - {"name":"Non-Meta GCD","actions":[{"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},"multidot":{"spellId":{"spellId":172},"maxDots":1,"maxOverlap":{"dotTickFrequency":{"spellId":{"spellId":172}}}}}},{"action":{"groupReference":{"groupName":"HOG: 2 stacks / 1 & expire soon"}}},{"action":{"condition":{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"SF Drops SF"}}}},{"or":{"vals":[{"isExecutePhase":{"threshold":"E25"}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":122355}}},"rhs":{"const":{"val":"1"}}}}]}},{"auraIsActive":{"auraId":{"spellId":122355}}}]}},"castSpell":{"spellId":{"spellId":6353}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"30%"}}}},{"not":{"val":{"variableRef":{"name":"GCD Drops SF"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":103958}}}}}]}},"castSpell":{"spellId":{"spellId":1454}}}},{"action":{"condition":{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"SB Drops SF"}}}}]}},"castSpell":{"spellId":{"spellId":686}}}},{"action":{"condition":{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"GCD Drops SF"}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":172}}},"rhs":{"const":{"val":"7s"}}}}]}},"castSpell":{"spellId":{"spellId":172}}}},{"action":{"condition":{"and":{"vals":[{"not":{"val":{"variableRef":{"name":"GCD Drops SF"}}}},{"cmp":{"op":"OpLe","lhs":{"currentMana":{}},"rhs":{"const":{"val":"250000"}}}},{"dotIsActive":{"spellId":{"spellId":47960}}}]}},"castSpell":{"spellId":{"spellId":1454}}}},{"action":{"condition":{"dotIsActive":{"spellId":{"spellId":47960}}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":105174}}},{"waitUntil":{"condition":{"gcdIsReady":{}}}},{"castSpell":{"spellId":{"spellId":103958}}}]}}},{"action":{"castSpell":{"spellId":{"spellId":686}}}},{"action":{"castSpell":{"spellId":{"spellId":1454}}}}]}, - {"name":"Meta GCD","actions":[{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":603}}},"rhs":{"const":{"val":"25%"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":603}}},"rhs":{"const":{"val":"0%"}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":603}}},"rhs":{"math":{"op":"OpAdd","lhs":{"dotBaseDuration":{"spellId":{"spellId":603}}},"rhs":{"const":{"val":"2s"}}}}}},{"auraIsActive":{"auraId":{"spellId":2825,"tag":-1}}}]}},{"variableRef":{"name":"UVLOS Doom"}}]}},"castSpell":{"spellId":{"spellId":603}}}},{"action":{"multidot":{"spellId":{"spellId":603},"maxDots":1,"maxOverlap":{"dotTickFrequency":{"spellId":{"spellId":603}}}}}},{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":172}}},"rhs":{"const":{"val":"4s"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":172}}},"rhs":{"const":{"val":"0%"}}}}]}},"castSpell":{"spellId":{"spellId":103964}}}},{"action":{"groupReference":{"groupName":"HOG: 2 stacks / 1 & expire soon"}}},{"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":122355}}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":113861}}},"rhs":{"spellCastTime":{"spellId":{"spellId":104027}}}}},{"isExecutePhase":{"threshold":"E25"}}]}},{"cmp":{"op":"OpGe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"104"}}}}]}},"castSpell":{"spellId":{"spellId":104027}}}},{"action":{"castSpell":{"spellId":{"spellId":103964}}}}]} - ], - "valueVariables": [ - {"name":"SF: Has 1 stack","value":{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":47960},"includeReactionTime":true}},"rhs":{"const":{"val":"1"}}}}}, - {"name":"SF: Math 1.3+GCD","value":{"math":{"op":"OpAdd","lhs":{"const":{"val":"1.3s"}},"rhs":{"gcdTimeToReady":{}}}}}, - {"name":"GCD Drops SF","value":{"and":{"vals":[{"variableRef":{"name":"SF: Has 1 stack"}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":47960}}},"rhs":{"math":{"op":"OpAdd","lhs":{"variableRef":{"name":"SF: Math 1.3+GCD"}},"rhs":{"spellGcdHastedDuration":{"spellId":{"spellId":172}}}}}}}]}}}, - {"name":"SF Drops SF","value":{"and":{"vals":[{"variableRef":{"name":"SF: Has 1 stack"}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":47960}}},"rhs":{"math":{"op":"OpAdd","lhs":{"variableRef":{"name":"SF: Math 1.3+GCD"}},"rhs":{"spellCastTime":{"spellId":{"spellId":6353}}}}}}}]}}}, - {"name":"SB Drops SF","value":{"and":{"vals":[{"variableRef":{"name":"SF: Has 1 stack"}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":47960}}},"rhs":{"math":{"op":"OpAdd","lhs":{"variableRef":{"name":"SF: Math 1.3+GCD"}},"rhs":{"spellCastTime":{"spellId":{"spellId":686}}}}}}}]}}}, - {"name":"UVLOS Doom","value":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138963}}},{"auraIsActive":{"auraId":{"spellId":138963},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":603}}},"rhs":{"math":{"op":"OpMul","lhs":{"dotBaseDuration":{"spellId":{"spellId":603}}},"rhs":{"const":{"val":"0.33"}}}}}}]}}} - ] -} diff --git a/ui/warlock/demonology/gear_sets/p1.gear.json b/ui/warlock/demonology/gear_sets/p1.gear.json deleted file mode 100644 index 9fa53809a9..0000000000 --- a/ui/warlock/demonology/gear_sets/p1.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87188, "gems": [76885, 76682], "reforging": 167 }, - { "id": 87028, "reforging": 138 }, - { "id": 87191, "enchant": 4806, "gems": [76682], "reforging": 138 }, - { "id": 90512, "enchant": 4892, "reforging": 168 }, - { "id": 87190, "enchant": 4419, "gems": [76668, 76668], "reforging": 144 }, - { "id": 86958, "gems": [0], "reforging": 140 }, - { "id": 87187, "enchant": 4433, "gems": [0], "tinker": 4898 }, - { "id": 86981, "gems": [76668, 76682, 76694] }, - { "id": 86989, "enchant": 4825, "gems": [76628, 76682], "reforging": 145 }, - { "id": 86969, "enchant": 4429, "gems": [76602], "reforging": 167 }, - { "id": 86949, "reforging": 145 }, - { "id": 90511, "reforging": 115 }, - { "id": 87175 }, - { "id": 87065 }, - { "id": 87164, "enchant": 4442, "gems": [89882], "reforging": 146 }, - { "id": 86960, "enchant": 4434, "reforging": 145 } - ] -} diff --git a/ui/warlock/demonology/gear_sets/p2.gear.json b/ui/warlock/demonology/gear_sets/p2.gear.json deleted file mode 100644 index c536779a67..0000000000 --- a/ui/warlock/demonology/gear_sets/p2.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87188, "gems": [76885, 76643], "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87028, "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87191, "enchant": 4806, "gems": [76643], "reforging": 167, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90512, "enchant": 4892, "reforging": 168, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87190, "enchant": 4419, "gems": [76700, 76700], "reforging": 144, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86958, "enchant": 4414, "gems": [0], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87187, "enchant": 4433, "gems": [0], "reforging": 140, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 86981, "gems": [76700, 76643, 76700], "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86989, "enchant": 4825, "gems": [76668, 76643], "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86969, "enchant": 4429, "gems": [76700], "reforging": 138, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86949, "reforging": 145, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90511, "reforging": 119, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79331, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87065, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87164, "enchant": 4442, "gems": [89882, 76634], "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86960, "enchant": 4434, "reforging": 145, "upgradeStep": "UpgradeStepTwo" } - ] -} diff --git a/ui/warlock/demonology/gear_sets/preraid.gear.json b/ui/warlock/demonology/gear_sets/preraid.gear.json deleted file mode 100644 index c9f6655e1e..0000000000 --- a/ui/warlock/demonology/gear_sets/preraid.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 77533, "gems": [76885, 77547, 77542] }, - { "id": 90596, "reforging": 145 }, - { "id": 91781, "enchant": 4806, "gems": [76672], "reforging": 168 }, - { "id": 81575, "enchant": 4892, "reforging": 167, "tinker": 4897 }, - { "id": 82437, "enchant": 4419, "gems": [76672, 76682], "reforging": 165 }, - { "id": 88893, "enchant": 4414, "gems": [0], "reforging": 167 }, - { "id": 82438, "enchant": 4433, "gems": [76682, 0], "reforging": 167, "tinker": 4898 }, - { "id": 89062, "gems": [76682, 76672], "reforging": 145 }, - { "id": 91777, "enchant": 4825, "gems": [76672, 76682], "reforging": 168 }, - { "id": 81699, "enchant": 4429, "gems": [76672], "reforging": 145 }, - { "id": 90859, "reforging": 168 }, - { "id": 90591, "reforging": 145 }, - { "id": 79331 }, - { "id": 81263, "reforging": 138 }, - { "id": 81691, "enchant": 4442, "reforging": 167 }, - {} - ] -} diff --git a/ui/warlock/demonology/index.ts b/ui/warlock/demonology/index.ts deleted file mode 100644 index 533b2a62d1..0000000000 --- a/ui/warlock/demonology/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { DemonologyWarlockSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.DemonologyWarlock, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new DemonologyWarlockSimUI(document.body, player); diff --git a/ui/warlock/demonology/inputs.ts b/ui/warlock/demonology/inputs.ts deleted file mode 100644 index f7ead76db0..0000000000 --- a/ui/warlock/demonology/inputs.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. \ No newline at end of file diff --git a/ui/warlock/demonology/presets.ts b/ui/warlock/demonology/presets.ts deleted file mode 100644 index d5bcce5ac7..0000000000 --- a/ui/warlock/demonology/presets.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Debuffs, IndividualBuffs, Profession, PseudoStat, Race, RaidBuffs, Stat } from '../../core/proto/common'; -import { SavedTalents } from '../../core/proto/ui'; -import { - DemonologyWarlock_Options as WarlockOptions, - WarlockOptions_Summon as Summon, -} from '../../core/proto/warlock'; -import { Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import { WARLOCK_BREAKPOINTS } from '../presets'; -import DefaultAPL from './apls/default.apl.json'; -import P1Gear from './gear_sets/p1.gear.json'; -import P2Gear from './gear_sets/p2.gear.json'; -import PreraidGear from './gear_sets/preraid.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const PRERAID_PRESET = PresetUtils.makePresetGear('Pre-raid', PreraidGear); -export const P1_PRESET = PresetUtils.makePresetGear('P1 - BIS', P1Gear); -export const P2_PRESET = PresetUtils.makePresetGear('P2 - BIS', P2Gear); - -export const APL_Default = PresetUtils.makePresetAPLRotation('Incinerate', DefaultAPL); - -// Preset options for EP weights -export const DEFAULT_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Default', - Stats.fromMap({ - [Stat.StatIntellect]: 1.24, - [Stat.StatSpellPower]: 1.0, - [Stat.StatHitRating]: 4, - [Stat.StatCritRating]: 0.60, - [Stat.StatHasteRating]: 0.66, - [Stat.StatMasteryRating]: 0.63, - }), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wotlk.wowhead.com/talent-calc and copy the numbers in the url. -export const DemonologyTalentsDefaultP1 = { - name: 'Default P1', - data: SavedTalents.create({ - talentsString: '231221', - }), -}; - -export const DefaultOptions = WarlockOptions.create({ - classOptions: { - summon: Summon.Felguard, - detonateSeed: false, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76085, // Flask of the Warm Sun - foodId: 74650, // Mogu Fish Stew - potId: 76093, //Potion of the Jade Serpent - prepotId: 76093, // Potion of the Jade Serpent -}); - -export const DefaultRaidBuffs = RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - leaderOfThePack: true, - blessingOfMight: true, - bloodlust: true, - moonkinAura: true, - unholyAura: true, -}); - -export const DefaultIndividualBuffs = IndividualBuffs.create({}); - -export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, - weakenedArmor: true, - physicalVulnerability: true, -}); - -export const OtherDefaults = { - race: Race.RaceTroll, - distanceFromTarget: 25, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, - channelClipDelay: 150, -}; - -export const PRSET_BUILD_P1 = PresetUtils.makePresetBuild('Default P1', { - talents: DemonologyTalentsDefaultP1, - rotation: APL_Default, -}); - -export const DEMONOLOGY_BREAKPOINTS = { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([ - ...[...WARLOCK_BREAKPOINTS.presets!], - ['16-tick - Immo Aura', 3.35918], - ['8-tick - Immolate:Inferno', 7.12373], - ['17-tick - Immo Aura', 9.95053], - ['18-tick - Immo Aura', 16.61809], - ['9-tick - Immolate:Inferno', 21.43291], - ['19-tick - Immo Aura', 23.38064], - ['20-tick - Immo Aura', 29.95453], - ['10-tick - Immolate:Inferno', 35.71591], - ['21-tick - Immo Aura', 36.70542], - ['22-tick - Immo Aura', 43.3692], - ['11-tick - Immolate:Inferno', 50.03752], - ['23-tick - Immo Aura', 50.03753], - ['24-tick - Immo Aura', 56.6171], - ['25-tick - Immo Aura', 63.26533], - ['12-tick - Immolate:Inferno', 64.24857], - ['26-tick - Immo Aura', 69.92356], - ['27-tick - Immo Aura', 76.52254], - ['13-tick - Immolate:Inferno', 78.6246], - ['28-tick - Immo Aura', 83.31809], - ['29-tick - Immo Aura', 89.93356], - ['14-tick - Immolate:Inferno', 92.86404], - ['30-tick - Immo Aura', 96.65687], - ['31-tick - Immo Aura', 103.45884], - ['15-tick - Immolate:Inferno', 107.11082], - ['32-tick - Immo Aura', 109.86363], - // ['33-tick - Immo Aura', 116.68477], - // ['16-tick - Immolate:Inferno', 121.48396], - // ['34-tick - Immo Aura', 123.46374], - // ['35-tick - Immo Aura', 130.14965], - // ['17-tick - Immolate:Inferno', 135.7564], - // ['36-tick - Immo Aura', 136.68645], - // ['37-tick - Immo Aura', 143.60542], - // ['38-tick - Immo Aura', 149.68795], - // ['18-tick - Immolate:Inferno', 149.8959], - // ['39-tick - Immo Aura', 156.73948], - // ['40-tick - Immo Aura', 163.50468], - // ['19-tick - Immolate:Inferno', 164.20082], - // ['41-tick - Immo Aura', 169.90561], - // ['42-tick - Immo Aura', 176.62525], - // ['20-tick - Immolate:Inferno', 178.68094], - // ['43-tick - Immo Aura', 183.68802], - // ['21-tick - Immolate:Inferno', 192.8258], - // ['22-tick - Immolate:Inferno', 207.21969], - // ['23-tick - Immolate:Inferno', 221.37122], - // ['24-tick - Immolate:Inferno', 235.75829], - ]), -}; diff --git a/ui/warlock/demonology/sim.tsx b/ui/warlock/demonology/sim.tsx deleted file mode 100644 index d1619cf8c9..0000000000 --- a/ui/warlock/demonology/sim.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import * as Mechanics from '../../core/constants/mechanics'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Faction, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { StatCapType } from '../../core/proto/ui'; -import { DEFAULT_CASTER_GEM_STATS, StatCap, Stats, UnitStat } from '../../core/proto_utils/stats'; -import * as WarlockInputs from '../inputs'; -import { WARLOCK_BREAKPOINTS } from '../presets'; -import * as Presets from './presets'; -import { formatToNumber } from '../../core/utils'; - -const hasteBreakpoints = WARLOCK_BREAKPOINTS.presets; - -const MIN_HASTE_PERCENT_BREAKPOINT_THRESHOLD = hasteBreakpoints.get('8-tick - Shadowflame')!; -const MAX_P2_HASTE_PERCENT_BREAKPOINT_THRESHOLD = 26.0; -const MAX_P3_HASTE_PERCENT_BREAKPOINT_THRESHOLD = hasteBreakpoints.get('9-tick - Shadowflame')!; -const defaultHasteBreakpoints = [ - hasteBreakpoints.get('8-tick - Shadowflame')!, - hasteBreakpoints.get('6-tick - Doom')!, - hasteBreakpoints.get('9-tick - Shadowflame')!, - hasteBreakpoints.get('10-tick - Shadowflame')!, - hasteBreakpoints.get('7-tick - Doom')!, - hasteBreakpoints.get('11-tick - Shadowflame')!, - hasteBreakpoints.get('8-tick - Doom')!, - hasteBreakpoints.get('12-tick - Shadowflame')!, - hasteBreakpoints.get('9-tick - Doom')!, -]; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecDemonologyWarlock, { - cssClass: 'demonology-warlock-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Warlock), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], - // Reference stat against which to calculate EP. DPS classes use either spell power or attack power. - epReferenceStat: Stat.StatSpellPower, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [ - Stat.StatHealth, - Stat.StatMana, - Stat.StatStamina, - Stat.StatIntellect, - Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, - Stat.StatMP5, - ], - [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], - ), - gemStats: DEFAULT_CASTER_GEM_STATS, - - defaults: { - // Default equipped gear. - gear: Presets.P2_PRESET.gear, - - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.DEFAULT_EP_PRESET.epWeights, - // Default stat caps for the RPeforge optimizer - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), - // Default soft caps for the Reforge optimizer - softCapBreakpoints: (() => { - const hasteSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent, { - breakpoints: defaultHasteBreakpoints, - capType: StatCapType.TypeThreshold, - postCapEPs: [(Presets.DEFAULT_EP_PRESET.epWeights.getStat(Stat.StatCritRating) - 0.01) * Mechanics.HASTE_RATING_PER_HASTE_PERCENT], - }); - - return [hasteSoftCapConfig]; - })(), - // Default consumes settings. - consumables: Presets.DefaultConsumables, - - // Default talents. - talents: Presets.DemonologyTalentsDefaultP1.data, - // Default spec-specific settings. - specOptions: Presets.DefaultOptions, - - // Default buffs and debuffs settings. - raidBuffs: Presets.DefaultRaidBuffs, - - partyBuffs: PartyBuffs.create({}), - - individualBuffs: Presets.DefaultIndividualBuffs, - - debuffs: Presets.DefaultDebuffs, - - other: Presets.OtherDefaults, - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [WarlockInputs.PetInput()], - - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [BuffDebuffInputs.AttackSpeedBuff, BuffDebuffInputs.MajorArmorDebuff, BuffDebuffInputs.PhysicalDamageDebuff], - excludeBuffDebuffInputs: [], - petConsumeInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [OtherInputs.InputDelay, OtherInputs.DistanceFromTarget, OtherInputs.TankAssignment, OtherInputs.ChannelClipDelay], - }, - itemSwapSlots: [ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2, ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: false, - }, - - presets: { - epWeights: [Presets.DEFAULT_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.DemonologyTalentsDefaultP1], - // Preset rotations that the user can quickly select. - rotations: [Presets.APL_Default], - - // Preset gear configurations that the user can quickly select. - gear: [Presets.PRERAID_PRESET, Presets.P1_PRESET, Presets.P2_PRESET], - itemSwaps: [], - - builds: [Presets.PRSET_BUILD_P1], - }, - - autoRotation: (_player: Player): APLRotation => { - return Presets.APL_Default.rotation.rotation!; - }, - - raidSimPresets: [ - { - spec: Spec.SpecDemonologyWarlock, - talents: Presets.DemonologyTalentsDefaultP1.data, - specOptions: Presets.DefaultOptions, - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceHuman, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.PRERAID_PRESET.gear, - 2: Presets.P1_PRESET.gear, - }, - [Faction.Horde]: { - 1: Presets.PRERAID_PRESET.gear, - 2: Presets.P1_PRESET.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class DemonologyWarlockSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - const statSelectionPresets = [ - { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: Presets.DEMONOLOGY_BREAKPOINTS.presets, - }, - ]; - - this.reforger = new ReforgeOptimizer(this, { - statSelectionPresets, - enableBreakpointLimits: true, - updateSoftCaps: softCaps => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - const raidBuffs = player.getRaid()?.getBuffs(); - const hasBL = !!raidBuffs?.bloodlust; - const hasBerserking = player.getRace() === Race.RaceTroll; - - const modifyHaste = (oldHastePercent: number, modifier: number) => - Number(formatToNumber(((oldHastePercent / 100 + 1) / modifier - 1) * 100, { maximumFractionDigits: 5 })); - - this.individualConfig.defaults.softCapBreakpoints!.forEach(softCap => { - const softCapToModify = softCaps.find(sc => sc.unitStat.equals(softCap.unitStat)); - if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHastePercent) && softCapToModify) { - const adjustedHasteBreakpoints = new Set([...softCap.breakpoints]); - const hasCloseMatchingValue = (value: number) => [...adjustedHasteBreakpoints.values()].find(bp => bp.toFixed(2) === value.toFixed(2)); - - softCap.breakpoints.forEach(breakpoint => { - if (hasBL) { - const blBreakpoint = modifyHaste(breakpoint, 1.3); - - if (blBreakpoint > 0) { - if (!hasCloseMatchingValue(blBreakpoint)) adjustedHasteBreakpoints.add(blBreakpoint); - if (hasBerserking) { - const berserkingBreakpoint = modifyHaste(blBreakpoint, 1.2); - if (berserkingBreakpoint > 0 && !hasCloseMatchingValue(berserkingBreakpoint)) { - adjustedHasteBreakpoints.add(berserkingBreakpoint); - } - } - } - } - }); - softCapToModify.breakpoints = [...adjustedHasteBreakpoints] - .filter( - bp => - bp >= MIN_HASTE_PERCENT_BREAKPOINT_THRESHOLD && - bp <= (avgIlvl >= 525 ? MAX_P3_HASTE_PERCENT_BREAKPOINT_THRESHOLD : MAX_P2_HASTE_PERCENT_BREAKPOINT_THRESHOLD), - ) - .sort((a, b) => a - b); - } - }); - return softCaps; - }, - additionalSoftCapTooltipInformation: { - [Stat.StatHasteRating]: () => { - const raidBuffs = player.getRaid()?.getBuffs(); - const hasBL = !!raidBuffs?.bloodlust; - const hasBerserking = player.getRace() === Race.RaceTroll; - - return ( - <> - {(hasBL || hasBerserking) && ( - <> -

Additional Doom/Shadowflame breakpoints have been created using the following cooldowns:

-
    - {hasBL &&
  • Bloodlust
  • } - {hasBerserking &&
  • Berserking
  • } -
- - )} - - ); - }, - }, - }); - } -} diff --git a/ui/warlock/destruction/apls/default.apl.json b/ui/warlock/destruction/apls/default.apl.json deleted file mode 100644 index 921993ae6b..0000000000 --- a/ui/warlock/destruction/apls/default.apl.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-1.75s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":29722}}},"doAtValue":{"const":{"val":"-1.75s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":113858}}},{"castSpell":{"spellId":{"spellId":26297}}},{"castSpell":{"spellId":{"spellId":348}}},{"castSpell":{"spellId":{"spellId":104232}}}]}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"80"}}}},{"isExecutePhase":{"threshold":"E20"}},{"and":{"vals":[{"or":{"vals":[{"allTrinketStatProcsActive":{"statType1":3,"statType2":14,"statType3":6}},{"auraIsActive":{"auraId":{"itemId":76093},"includeReactionTime":true}}]}},{"isExecutePhase":{"threshold":"E25"}}]}}]}},"castSpell":{"spellId":{"spellId":18540}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":113858}}},"rhs":{"const":{"val":"5"}}}},{"allTrinketStatProcsActive":{"statType1":3,"statType2":-1,"statType3":-1}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"55"}}}},{"anyTrinketStatProcsActive":{"statType1":3,"statType2":14,"statType3":-1,"minIcdSeconds":45}}]}}]}}]}},{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"27"}}}}]}},"castSpell":{"spellId":{"itemId":76093}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"22s"}}}},{"cmp":{"op":"OpEq","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113858}}},"rhs":{"const":{"val":"0s"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellNumCharges":{"spellId":{"spellId":113858}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"spellTimeToCharge":{"spellId":{"spellId":113858}}},"rhs":{"const":{"val":"57s"}}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"77s"}}}}]}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"auraId":{"itemId":76093}}},"rhs":{"const":{"val":"20s"}}}}]}},"castSpell":{"spellId":{"spellId":113858}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":113858},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"itemId":76093},"includeReactionTime":true}},{"anyTrinketStatProcsActive":{"statType1":3,"statType2":14,"statType3":-1}}]}},"castSpell":{"spellId":{"spellId":33697}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":113858},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"itemId":76093},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"66"}}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":113858},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"itemId":76093},"includeReactionTime":true}}]}}]}},"castSpell":{"spellId":{"spellId":126734}}}}, - {"action":{"castSpell":{"spellId":{"spellId":111897}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"isExecutePhase":{"threshold":"E20"}},{"cmp":{"op":"OpGe","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"30"}}}}]}}]}},"castSpell":{"spellId":{"spellId":80240},"target":{"type":"NextTarget"}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":104232}}}}},{"or":{"vals":[{"auraIcdIsReady":{"auraId":{"spellId":126577},"includeReactionTime":true}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}}]}},"castSpell":{"spellId":{"spellId":104232}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},{"auraIsActive":{"auraId":{"spellId":80240},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":17877}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"auraIsActive":{"auraId":{"spellId":80240},"includeReactionTime":true}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":80240},"includeReactionTime":true}},"rhs":{"const":{"val":"3"}}}}]}},{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"isExecutePhase":{"threshold":"E20"}}]}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":117828}}},"rhs":{"const":{"val":"3"}}}},{"cmp":{"op":"OpGt","lhs":{"currentGenericResource":{}},"rhs":{"const":{"val":"30"}}}}]}}]}},"castSpell":{"spellId":{"spellId":116858}}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"spellNumCharges":{"spellId":{"spellId":17962}}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":17962}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"multidot":{"spellId":{"spellId":348},"maxDots":3,"maxOverlap":{"math":{"op":"OpAdd","lhs":{"dotTickFrequency":{"spellId":{"spellId":348}}},"rhs":{"spellCastTime":{"spellId":{"spellId":348}}}}}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":348}}},"rhs":{"dotTickFrequency":{"spellId":{"spellId":348}}}}},{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":348}}},"rhs":{"auraRemainingTime":{"auraId":{"spellId":113858}}}}}]}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"spellId":{"spellId":348}}},"rhs":{"const":{"val":"7.5"}}}}]}}]}},"castSpell":{"spellId":{"spellId":348}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":117828}}},"rhs":{"const":{"val":"3"}}}},{"or":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":116858}}},"rhs":{"auraRemainingTime":{"auraId":{"itemId":76093}}}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":116858}}},"rhs":{"auraRemainingTime":{"auraId":{"spellId":114206,"tag":-1}}}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":116858}}},"rhs":{"auraRemainingTime":{"auraId":{"spellId":126734}}}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":116858}}},"rhs":{"auraRemainingTime":{"auraId":{"spellId":113858}}}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":116858}}},"rhs":{"trinketProcsMinRemainingTime":{"statType1":3,"statType2":11,"statType3":14,"minIcdSeconds":30}}}},{"cmp":{"op":"OpGt","lhs":{"numStatBuffCooldowns":{"statType1":3,"statType2":14,"statType3":11}},"rhs":{"const":{"val":"2"}}}}]}}]}}]}}]}},"castSpell":{"spellId":{"spellId":116858}}}}, - {"action":{"condition":{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":113858},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"itemId":76093},"includeReactionTime":true}},{"anyStatBuffCooldownsActive":{"statType1":3,"statType2":6,"statType3":11}}]}}]}},"castSpell":{"spellId":{"spellId":17877}}}}, - {"action":{"condition":{"auraIsInactive":{"auraId":{"spellId":117828},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":17962}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":117828},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":29722}}}}, - {"action":{"castSpell":{"spellId":{"spellId":17962}}}}, - {"action":{"castSpell":{"spellId":{"spellId":29722}}}} - ] -} diff --git a/ui/warlock/destruction/gear_sets/p1-prebis.gear.json b/ui/warlock/destruction/gear_sets/p1-prebis.gear.json deleted file mode 100644 index 1b32c2f5ef..0000000000 --- a/ui/warlock/destruction/gear_sets/p1-prebis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 77533, "gems": [76885, 77547, 77542] }, - { "id": 90596, "reforging": 147 }, - { "id": 91781, "enchant": 4806, "gems": [76672], "reforging": 153 }, - { "id": 81575, "enchant": 4892, "reforging": 137 }, - { "id": 82437, "enchant": 4419, "gems": [76672, 76682], "reforging": 151 }, - { "id": 88893, "enchant": 4414, "gems": [0] }, - { "id": 82438, "enchant": 4433, "gems": [76682, 0], "reforging": 168, "tinker": 4898 }, - { "id": 89062, "gems": [76682, 76672], "reforging": 147 }, - { "id": 91777, "enchant": 4825, "gems": [76672, 76682], "reforging": 153 }, - { "id": 81699, "enchant": 4429, "gems": [76672], "reforging": 147 }, - { "id": 90859 }, - { "id": 90591, "reforging": 146 }, - { "id": 79331 }, - { "id": 81192 }, - { "id": 81691, "enchant": 4442, "reforging": 144 }, - {} - ] -} diff --git a/ui/warlock/destruction/gear_sets/p1.gear.json b/ui/warlock/destruction/gear_sets/p1.gear.json deleted file mode 100644 index b402d6770f..0000000000 --- a/ui/warlock/destruction/gear_sets/p1.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87188, "gems": [76885, 76682] }, - { "id": 87028, "reforging": 140 }, - { "id": 87191, "enchant": 4806, "gems": [76682] }, - { "id": 90512, "enchant": 4892, "reforging": 151 }, - { "id": 87169, "enchant": 4419, "gems": [76694, 76672], "reforging": 137 }, - { "id": 86948, "enchant": 4414, "gems": [0], "reforging": 151 }, - { "id": 87187, "enchant": 4433, "gems": [0], "reforging": 154, "tinker": 4898 }, - { "id": 86981, "gems": [76672, 76682, 76694], "reforging": 154 }, - { "id": 87189, "enchant": 4825, "gems": [76694], "reforging": 152 }, - { "id": 86969, "enchant": 4427, "gems": [76672], "reforging": 137 }, - { "id": 86949, "reforging": 147 }, - { "id": 90511, "reforging": 119 }, - { "id": 87175 }, - { "id": 87065, "reforging": 154 }, - { "id": 90513, "enchant": 4442, "gems": [76682], "reforging": 144 }, - { "id": 86960, "enchant": 4434, "reforging": 147 } - ] -} diff --git a/ui/warlock/destruction/gear_sets/p2.gear.json b/ui/warlock/destruction/gear_sets/p2.gear.json deleted file mode 100644 index 9e0cb454b2..0000000000 --- a/ui/warlock/destruction/gear_sets/p2.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87188, "gems": [76885, 76682], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87028, "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87191, "enchant": 4806, "gems": [76682], "upgradeStep": "UpgradeStepTwo" }, - { "id": 90512, "enchant": 4892, "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87169, "enchant": 4419, "gems": [76694, 76672], "upgradeStep": "UpgradeStepTwo" }, - { "id": 86948, "enchant": 4414, "gems": [0], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87187, "enchant": 4433, "gems": [0], "reforging": 154, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 86981, "gems": [76672, 76682, 76694], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87189, "enchant": 4825, "gems": [76694], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87162, "enchant": 4429, "gems": [76672], "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86949, "reforging": 147, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90511, "reforging": 119, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87175, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87065, "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87164, "enchant": 4442, "gems": [89882, 76694], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86960, "enchant": 4434, "reforging": 147, "upgradeStep": "UpgradeStepTwo" } - ] -} diff --git a/ui/warlock/destruction/index.ts b/ui/warlock/destruction/index.ts deleted file mode 100644 index b4611ec415..0000000000 --- a/ui/warlock/destruction/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { DestructionWarlockSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.DestructionWarlock, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new DestructionWarlockSimUI(document.body, player); diff --git a/ui/warlock/destruction/inputs.ts b/ui/warlock/destruction/inputs.ts deleted file mode 100644 index 47588684c9..0000000000 --- a/ui/warlock/destruction/inputs.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. diff --git a/ui/warlock/destruction/presets.ts b/ui/warlock/destruction/presets.ts deleted file mode 100644 index 2e783264c1..0000000000 --- a/ui/warlock/destruction/presets.ts +++ /dev/null @@ -1,89 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Debuffs, IndividualBuffs, Profession, Race, RaidBuffs, Stat } from '../../core/proto/common'; -import { SavedTalents } from '../../core/proto/ui'; -import { - DestructionWarlock_Options as WarlockOptions, - WarlockOptions_Summon as Summon, -} from '../../core/proto/warlock'; -import { Stats } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import { WARLOCK_BREAKPOINTS } from '../presets'; -import DefaultApl from './apls/default.apl.json'; -import P1Gear from './gear_sets/p1.gear.json'; -import P2Gear from './gear_sets/p2.gear.json'; -import P1PreBisGear from './gear_sets/p1-prebis.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const P1_PREBIS_PRESET = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBisGear); -export const P1_PRESET = PresetUtils.makePresetGear('P1 - BIS', P1Gear); -export const P2_PRESET = PresetUtils.makePresetGear('P2 - BIS', P2Gear); -export const DEFAULT_APL = PresetUtils.makePresetAPLRotation('Default', DefaultApl); - -// Preset options for EP weights -export const DEFAULT_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Default', - Stats.fromMap({ - [Stat.StatIntellect]: 1.24, - [Stat.StatSpellPower]: 1, - [Stat.StatHitRating]: 0.93, - [Stat.StatCritRating]: 0.55, - [Stat.StatHasteRating]: 0.50, - [Stat.StatMasteryRating]: 0.61, - }), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wotlk.wowhead.com/talent-calc and copy the numbers in the url. - -export const DestructionTalents = { - name: 'Destruction', - data: SavedTalents.create({ - talentsString: '221211', - }), -}; - -export const DefaultOptions = WarlockOptions.create({ - classOptions: { - summon: Summon.Imp, - detonateSeed: false, - }, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76085, // Flask of the Warm Sun - foodId: 74650, // Mogu Fish Stew - potId: 76093, //Potion of the Jade Serpent - prepotId: 76093, // Potion of the Jade Serpent -}); - -export const DefaultRaidBuffs = RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(), - arcaneBrilliance: true, - blessingOfKings: true, - leaderOfThePack: true, - blessingOfMight: true, - bloodlust: true, - moonkinAura: true, - unholyAura: true, -}); - -export const DefaultIndividualBuffs = IndividualBuffs.create({}); - -export const DefaultDebuffs = Debuffs.create({ - curseOfElements: true, - weakenedArmor: true, - physicalVulnerability: true, -}); - -export const OtherDefaults = { - race: Race.RaceTroll, - distanceFromTarget: 25, - profession1: Profession.Engineering, - profession2: Profession.Tailoring, - channelClipDelay: 150, -}; - -export const DESTRUCTION_BREAKPOINTS = WARLOCK_BREAKPOINTS; diff --git a/ui/warlock/gear_sets/blank.gear.json b/ui/warlock/gear_sets/blank.gear.json new file mode 100644 index 0000000000..9c53a135fe --- /dev/null +++ b/ui/warlock/gear_sets/blank.gear.json @@ -0,0 +1 @@ +{"items": []} diff --git a/ui/warlock/index.ts b/ui/warlock/index.ts new file mode 100644 index 0000000000..859ca88426 --- /dev/null +++ b/ui/warlock/index.ts @@ -0,0 +1,12 @@ +import { Player } from '../core/player'; +import { PlayerSpecs } from '../core/player_specs'; +import { Spec } from '../core/proto/common'; +import { Sim } from '../core/sim'; +import { TypedEvent } from '../core/typed_event'; +import { WarlockSimUI } from './sim'; + +const sim = new Sim(); +const player = new Player(PlayerSpecs.Warlock, sim); +sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); + +new WarlockSimUI(document.body, player); diff --git a/ui/warlock/inputs.ts b/ui/warlock/inputs.ts index 2fd41d0a30..2b0da94292 100644 --- a/ui/warlock/inputs.ts +++ b/ui/warlock/inputs.ts @@ -15,11 +15,6 @@ export const PetInput = () => values: [ { value: Summon.NoSummon, tooltip: 'No Pet' }, { actionId: ActionId.fromSpellId(691), value: Summon.Felhunter }, - { - actionId: ActionId.fromSpellId(30146), - value: Summon.Felguard, - showWhen: (player: Player) => player.getSpec() == Spec.SpecDemonologyWarlock, - }, { actionId: ActionId.fromSpellId(688), value: Summon.Imp }, { actionId: ActionId.fromSpellId(712), value: Summon.Succubus }, { actionId: ActionId.fromSpellId(697), value: Summon.Voidwalker }, diff --git a/ui/warlock/presets.ts b/ui/warlock/presets.ts index ced9b18586..bd245ffb91 100644 --- a/ui/warlock/presets.ts +++ b/ui/warlock/presets.ts @@ -1,91 +1,56 @@ -import { PseudoStat } from '../core/proto/common'; -import { UnitStat } from '../core/proto_utils/stats'; +import * as PresetUtils from '../core/preset_utils'; +import { ConsumesSpec, PseudoStat, Stat } from '../core/proto/common'; +import { Warlock_Options as WarlockOptions } from '../core/proto/warlock'; +import { SavedTalents } from '../core/proto/ui'; +import { Stats } from '../core/proto_utils/stats'; +import BlankAPL from './apls/blank.apl.json' +import BlankGear from './gear_sets/blank.gear.json'; -export const WARLOCK_BREAKPOINTS = { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: new Map([ - // Sources: - // https://docs.google.com/spreadsheets/d/14_Mctm52qXwzF5Kqxv8W8yBXLSh2iuIEwBebeAGai_o/edit?gid=497073075#gid=497073075 - ['8-tick - Unstable Affliction', 7.15243], - ['7-tick - Shadowflame', 8.28372], - ['6-tick - Immolate', 9.99084], - ['5-tick - Doom', 12.49859], - ['14-tick - Agony', 12.51759], - ['11-tick - Corruption', 16.65209], - ['15-tick - Agony', 20.80943], - ['9-tick - Unstable Affliction', 21.39606], - ['8-tick - Shadowflame', 24.92194], - ['12-tick - Corruption', 27.75472], - ['16-tick - Agony', 29.15726], - ['7-tick - Immolate', 30.01084], - ['10-tick - Unstable Affliction', 35.73126], - ['6-tick - Doom', 37.49485], - ['17-tick - Agony', 37.50431], - ['13-tick - Corruption', 38.93714], - ['9-tick - Shadowflame', 41.74346], - ['18-tick - Agony', 45.82575], - ['8-tick - Immolate', 49.96252], - ['14-tick - Corruption', 49.98126], - ['11-tick - Unstable Affliction', 49.98126], - ['19-tick - Agony', 54.14259], - ['10-tick - Shadowflame', 58.35315], - ['15-tick - Corruption', 61.09546], - ['7-tick - Doom', 62.50474], - ['20-tick - Agony', 62.53557], - ['12-tick - Unstable Affliction', 64.27106], - ['9-tick - Immolate', 70.01985], - ['21-tick - Agony', 70.86717], - ['16-tick - Corruption', 72.19115], - ['11-tick - Shadowflame', 74.97816], - ['13-tick - Unstable Affliction', 78.6512], - ['22-tick - Agony', 79.13123], - ['17-tick - Corruption', 83.40213], - ['8-tick - Doom', 87.48828], - ['23-tick - Agony', 87.52932], - ['10-tick - Immolate', 90.05386], - ['12-tick - Shadowflame', 91.75459], - ['14-tick - Unstable Affliction', 92.7711], - ['18-tick - Corruption', 94.45797], - ['24-tick - Agony', 95.79052], - ['25-tick - Agony', 104.18583], - ['19-tick - Corruption', 105.65555], - ['15-tick - Unstable Affliction', 107.14658], - ['11-tick - Immolate', 110.01052], - ['26-tick - Agony', 112.427], - ['9-tick - Doom', 112.50974], - ['20-tick - Corruption', 116.56743], - ['27-tick - Agony', 120.87247], - ['16-tick - Unstable Affliction', 121.3614], - ['21-tick - Corruption', 127.66081], - ['28-tick - Agony', 129.22639], - ['12-tick - Immolate', 129.97319], - ['17-tick - Unstable Affliction', 135.7101], - ['29-tick - Agony', 137.38875], - ['10-tick - Doom', 137.51089], - ['30-tick - Agony', 145.85129], - ['13-tick - Immolate', 150.10423], - ['31-tick - Agony', 154.2912], - ['11-tick - Doom', 162.49016], - // ['14-tick - Immolate', 169.90556], - // ['12-tick - Doom', 187.49402], - // ['15-tick - Immolate', 189.99519], - // ['16-tick - Immolate', 210.07755], - // ['13-tick - Doom', 212.53256], - // ['17-tick - Immolate', 229.8516], - // ['14-tick - Doom', 237.49579], - // ['18-tick - Immolate', 249.85427], - // ['15-tick - Doom', 262.53777], - // ['19-tick - Immolate', 270.14193], - // ['16-tick - Doom', 287.54684], - // ['20-tick - Immolate', 289.8636], - // ['21-tick - Immolate', 310.11626], - // ['17-tick - Doom', 312.48454], - // ['22-tick - Immolate', 330.10759], - // ['18-tick - Doom', 337.50913], - // ['23-tick - Immolate', 350.1126], - // ['19-tick - Doom', 362.4634], - // ['20-tick - Doom', 387.56706], - // ['21-tick - Doom', 412.55768], - // ['22-tick - Doom', 437.53809], - ]), +// Preset options for this spec. +// Eventually we will import these values for the raid sim too, so its good to +// keep them in a separate file. + +export const BLANK_APL = PresetUtils.makePresetAPLRotation('Blank', BlankAPL) + +export const BLANK_GEARSET = PresetUtils.makePresetGear('Blank', BlankGear); + +// Preset options for EP weights +export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( + 'Sub', + Stats.fromMap( + { + [Stat.StatAgility]: 1.0, + }, + { + [PseudoStat.PseudoStatMainHandDps]: 1.43, + [PseudoStat.PseudoStatOffHandDps]: 0.26, + }, + ), +); + +// Default talents. Uses the wowhead calculator format, make the talents on +// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. + +export const Talents = { + name: 'A', + data: SavedTalents.create({ + talentsString: '', + }), +}; + +export const DefaultOptions = WarlockOptions.create({ + classOptions: { + + }, +}); + +export const DefaultConsumables = ConsumesSpec.create({ + flaskId: 76084, // Flask of the Winds + foodId: 74648, // Skewered Eel + potId: 76089, // Potion of the Tol'vir + prepotId: 76089, // Potion of the Tol'vir +}); + +export const OtherDefaults = { + distanceFromTarget: 5, }; diff --git a/ui/warlock/destruction/sim.ts b/ui/warlock/sim.ts similarity index 54% rename from ui/warlock/destruction/sim.ts rename to ui/warlock/sim.ts index abe795effb..2806728b56 100644 --- a/ui/warlock/destruction/sim.ts +++ b/ui/warlock/sim.ts @@ -1,18 +1,19 @@ -import * as BuffDebuffInputs from '../../core/components/inputs/buffs_debuffs'; -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import { HASTE_RATING_PER_HASTE_PERCENT } from '../../core/constants/mechanics'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Faction, ItemSlot, PartyBuffs, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; -import { DEFAULT_CASTER_GEM_STATS, Stats, UnitStat } from '../../core/proto_utils/stats'; -import { TypedEvent } from '../../core/typed_event'; -import * as WarlockInputs from '../inputs'; +import * as BuffDebuffInputs from '../core/components/inputs/buffs_debuffs'; +import * as OtherInputs from '../core/components/inputs/other_inputs'; +import { ReforgeOptimizer } from '../core/components/suggest_reforges_action'; +import { HASTE_RATING_PER_HASTE_PERCENT } from '../core/constants/mechanics'; +import { IndividualSimUI, registerSpecConfig } from '../core/individual_sim_ui'; +import { Player } from '../core/player'; +import { PlayerClasses } from '../core/player_classes'; +import { APLRotation } from '../core/proto/apl'; +import { Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../core/proto/common'; +import { DEFAULT_CASTER_GEM_STATS, Stats, UnitStat } from '../core/proto_utils/stats'; +import { defaultRaidBuffMajorDamageCooldowns } from '../core/proto_utils/utils'; +import { TypedEvent } from '../core/typed_event'; +import * as WarlockInputs from './inputs'; import * as Presets from './presets'; -const modifyDisplayStats = (player: Player) => { +const modifyDisplayStats = (player: Player) => { let stats = new Stats(); TypedEvent.freezeAllAndDo(() => { @@ -21,7 +22,7 @@ const modifyDisplayStats = (player: Player) => { return {}; } - stats = stats.addStat(Stat.StatMP5, (currentStats[Stat.StatMP5] * currentStats[Stat.StatHasteRating]) / HASTE_RATING_PER_HASTE_PERCENT / 100); + stats = stats.addStat(Stat.StatMP5, (currentStats[Stat.StatMP5] * currentStats[Stat.StatSpellHasteRating]) / HASTE_RATING_PER_HASTE_PERCENT / 100); }); return { @@ -29,14 +30,14 @@ const modifyDisplayStats = (player: Player) => { }; }; -const SPEC_CONFIG = registerSpecConfig(Spec.SpecDestructionWarlock, { +const SPEC_CONFIG = registerSpecConfig(Spec.SpecWarlock, { cssClass: 'destruction-warlock-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Warlock), // List any known bugs / issues here and they'll be shown on the site. knownIssues: [], // All stats for which EP should be calculated. - epStats: [Stat.StatIntellect, Stat.StatSpellPower, Stat.StatHitRating, Stat.StatCritRating, Stat.StatHasteRating, Stat.StatMasteryRating], + epStats: [Stat.StatIntellect, Stat.StatSpellPower], // Reference stat against which to calculate EP. DPS classes use either spell power or attack power. epReferenceStat: Stat.StatSpellPower, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. @@ -47,8 +48,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecDestructionWarlock, { Stat.StatStamina, Stat.StatIntellect, Stat.StatSpellPower, - Stat.StatMasteryRating, - Stat.StatExpertiseRating, Stat.StatMP5, ], [PseudoStat.PseudoStatSpellHitPercent, PseudoStat.PseudoStatSpellCritPercent, PseudoStat.PseudoStatSpellHastePercent], @@ -58,30 +57,31 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecDestructionWarlock, { modifyDisplayStats, defaults: { // Default equipped gear. - gear: Presets.P2_PRESET.gear, + gear: Presets.BLANK_GEARSET.gear, // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.DEFAULT_EP_PRESET.epWeights, - // Default stat caps for the Reforge optimizer - statCaps: (() => { - return new Stats().withPseudoStat(PseudoStat.PseudoStatSpellHitPercent, 15); - })(), + epWeights: Presets.P1_EP_PRESET.epWeights, // Default consumes settings. consumables: Presets.DefaultConsumables, // Default talents. - talents: Presets.DestructionTalents.data, + talents: Presets.Talents.data, // Default spec-specific settings. specOptions: Presets.DefaultOptions, // Default buffs and debuffs settings. - raidBuffs: Presets.DefaultRaidBuffs, + raidBuffs: RaidBuffs.create({ + ...defaultRaidBuffMajorDamageCooldowns(), + }), + partyBuffs: PartyBuffs.create({ - partyBuffs: PartyBuffs.create({}), + }), + individualBuffs: IndividualBuffs.create({ - individualBuffs: Presets.DefaultIndividualBuffs, + }), + debuffs: Debuffs.create({ - debuffs: Presets.DefaultDebuffs, + }), other: Presets.OtherDefaults, }, @@ -104,25 +104,25 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecDestructionWarlock, { }, presets: { - epWeights: [Presets.DEFAULT_EP_PRESET], + epWeights: [], // Preset talents that the user can quickly select. - talents: [Presets.DestructionTalents], + talents: [], // Preset rotations that the user can quickly select. - rotations: [Presets.DEFAULT_APL], + rotations: [], // Preset gear configurations that the user can quickly select. - gear: [Presets.P1_PREBIS_PRESET, Presets.P1_PRESET, Presets.P2_PRESET], + gear: [], itemSwaps: [], }, - autoRotation: (_player: Player): APLRotation => { - return Presets.DEFAULT_APL.rotation.rotation!; + autoRotation: (_player: Player): APLRotation => { + return Presets.BLANK_APL.rotation.rotation!; }, raidSimPresets: [ { - spec: Spec.SpecDestructionWarlock, - talents: Presets.DestructionTalents.data, + spec: Spec.SpecWarlock, + talents: Presets.Talents.data, specOptions: Presets.DefaultOptions, consumables: Presets.DefaultConsumables, defaultFactionRaces: { @@ -133,10 +133,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecDestructionWarlock, { defaultGear: { [Faction.Unknown]: {}, [Faction.Alliance]: { - 1: Presets.P1_PRESET.gear, + 1: Presets.BLANK_GEARSET.gear, }, [Faction.Horde]: { - 1: Presets.P1_PRESET.gear, + 1: Presets.BLANK_GEARSET.gear, }, }, otherDefaults: Presets.OtherDefaults, @@ -144,19 +144,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecDestructionWarlock, { ], }); -export class DestructionWarlockSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { +export class WarlockSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - - const statSelectionPresets = [ - { - unitStat: UnitStat.fromPseudoStat(PseudoStat.PseudoStatSpellHastePercent), - presets: Presets.DESTRUCTION_BREAKPOINTS.presets, - }, - ]; - - this.reforger = new ReforgeOptimizer(this, { - statSelectionPresets, - }); } } diff --git a/ui/warrior/arms/apls/arms.apl.json b/ui/warrior/arms/apls/arms.apl.json deleted file mode 100644 index d426c23234..0000000000 --- a/ui/warrior/arms/apls/arms.apl.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":6673}}},"doAtValue":{"const":{"val":"-60s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":2457}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":1249459}}},"doAtValue":{"const":{"val":"-.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":1250619}}},"doAtValue":{"const":{"val":"-.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":2825,"tag":-1}}},"doAtValue":{"const":{"val":"0s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":114206,"tag":-1}}},"doAtValue":{"const":{"val":"0s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":1250619}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"1.4s"}}}},{"cmp":{"op":"OpGe","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":".1s"}}}}]}},"castSpell":{"spellId":{"spellId":6552}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"isExecutePhase":{"threshold":"E20"}},{"or":{"vals":[{"and":{"vals":[{"anyTrinketStatProcsActive":{"statType2":6,"statType3":-1,"minIcdSeconds":54}},{"cmp":{"op":"OpGe","lhs":{"trinketProcsMinRemainingTime":{"statType2":6,"statType3":-1,"minIcdSeconds":54}},"rhs":{"const":{"val":"10s"}}}}]}},{"cmp":{"op":"OpEq","lhs":{"numEquippedStatProcTrinkets":{"statType2":6,"statType3":-1,"minIcdSeconds":54}},"rhs":{"const":{"val":"0"}}}}]}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"numStatBuffCooldowns":{"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"1"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"trinketProcsMaxRemainingIcd":{"statType2":6,"statType3":-1,"minIcdSeconds":54}},"rhs":{"math":{"op":"OpSub","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}}}},{"spellIsReady":{"spellId":{"itemId":81268}}}]}}]}},{"spellIsReady":{"spellId":{"spellId":1719}}},{"spellIsReady":{"spellId":{"spellId":12292}}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"25s"}}}}}}]}},"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":12880}}},"rhs":{"const":{"val":"250ms"}}}},{"or":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"spellIsReady":{"spellId":{"spellId":118000}}},{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},{"spellIsKnown":{"spellId":{"spellId":46924}}},{"spellIsChanneling":{"spellId":{"spellId":46924}}}]}}]}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"6s"}}}}}}]}},"castSpell":{"spellId":{"spellId":18499}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"185s"}}}},{"auraIsActive":{"auraId":{"spellId":2825,"tag":-1},"includeReactionTime":true}}]}},{"auraIsInactive":{"auraId":{"spellId":114206,"tag":-1}}}]}},{"variableRef":{"name":"Execute + potion/end 15s"}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"10s"}}}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"10s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"11s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":114206}}}}, - {"action":{"groupReference":{"groupName":"On UsUwU and BloodbUwU"}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"60s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"1.5s"}}}}]}},{"variableRef":{"name":"Execute + potion/end 15s"}}]}},{"or":{"vals":[{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":12292}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":12292}}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"1.5s"}}}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":5308}}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":118000}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"95s"}}}},{"auraIsKnown":{"auraId":{"spellId":123144}}}]}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"185s"}}}},{"variableRef":{"name":"Execute + Potion"}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"12s"}}}}}}]}},"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":1250616}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"and":{"vals":[{"not":{"val":{"dotIsActive":{"targetUnit":{"type":"Target"},"spellId":{"spellId":115768}}}}},{"not":{"val":{"dotIsActive":{"targetUnit":{"type":"Target","index":1},"spellId":{"spellId":115768}}}}},{"not":{"val":{"dotIsActive":{"targetUnit":{"type":"Target","index":2},"spellId":{"spellId":115768}}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},{"spellIsReady":{"spellId":{"spellId":46924}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"targetUnit":{"type":"Target"},"spellId":{"spellId":115768}}},"rhs":{"const":{"val":"2s"}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"targetUnit":{"type":"Target","index":1},"spellId":{"spellId":115768}}},"rhs":{"const":{"val":"2s"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target"}}},"rhs":{"const":{"val":"10%"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"10%"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"10%"}}}}]}},{"or":{"vals":[{"auraIsKnown":{"auraId":{"spellId":58356}}},{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target"}}},"rhs":{"const":{"val":"0%"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"0%"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"0%"}}}}]}}]}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"10%"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"10%"}}}},{"cmp":{"op":"OpGt","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":3}}},"rhs":{"const":{"val":"10%"}}}}]}}]}}]}}]}},"castSpell":{"spellId":{"spellId":6343}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"groupReference":{"groupName":"AoE BladestUwU"}}}, - {"action":{"groupReference":{"groupName":"Off GCDOwO"}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":1250616},"includeReactionTime":true}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"not":{"val":{"spellCanCast":{"spellId":{"spellId":12294}}}}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":1464}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":123142}}}}},{"variableRef":{"name":"Potion is active"}}]}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3s"}}}},{"and":{"vals":[{"variableRef":{"name":"Last CS GCDOwO"}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":86346}}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":138759},"includeReactionTime":true}},"rhs":{"const":{"val":"10"}}}},{"auraIsKnown":{"auraId":{"spellId":138759}}}]}}]}},"castSpell":{"spellId":{"spellId":5308}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"isExecutePhase":{"threshold":"E20"}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"26.5s"}}}},{"auraIsActive":{"auraId":{"itemId":76095},"includeReactionTime":true}}]}}]}},"castSpell":{"spellId":{"spellId":86346}}}}, - {"action":{"groupReference":{"groupName":"Mortal StOwO"}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"3s"}}}},{"not":{"val":{"spellIsKnown":{"spellId":{"spellId":118000}}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":86346}}},{"castSpell":{"spellId":{"spellId":78}}}]}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"groupReference":{"groupName":"ST BladestUwU"}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":86346}}}}}]}},"castSpell":{"spellId":{"spellId":107570,"tag":1}}}}, - {"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"auraIsKnown":{"auraId":{"spellId":58356}}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"7"}}}}]}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"5"}}}},{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target"}}},"rhs":{"const":{"val":"-20%"}}}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"-20%"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target"}}},"rhs":{"const":{"val":"-20%"}}}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"-20%"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"-20%"}}}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"-20%"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":6343}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"auraIsActive":{"auraId":{"spellId":1719},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":5308}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":1250616},"includeReactionTime":true}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"Long Last CS GCDOwO"}}}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":86346}}}}}]}},{"or":{"vals":[{"auraIsKnown":{"auraId":{"spellId":58384}}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}}]}}]}},"castSpell":{"spellId":{"spellId":1464}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}},{"auraIsKnown":{"auraId":{"spellId":58356}}}]}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":58356}}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target"}}},"rhs":{"const":{"val":"-20%"}}}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"-20%"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target"}}},"rhs":{"const":{"val":"-20%"}}}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"-20%"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":1}}},"rhs":{"const":{"val":"-20%"}}}},{"cmp":{"op":"OpGe","lhs":{"dotPercentIncrease":{"spellId":{"spellId":115768},"targetUnit":{"type":"Target","index":2}}},"rhs":{"const":{"val":"-20%"}}}}]}}]}}]}}]}},"castSpell":{"spellId":{"spellId":6343}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1s"}}}},{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":1719},"includeReactionTime":true}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}}]}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},"castSpell":{"spellId":{"spellId":86346}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"4"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}}]}},"castSpell":{"spellId":{"spellId":1464}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"6"}}}},"castSpell":{"spellId":{"spellId":6343}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":5308}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":6544}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"Last CS GCDOwO"}},{"and":{"vals":[{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":1719},"includeReactionTime":true}},{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":138126}}},{"auraIsActive":{"auraId":{"spellId":138127},"includeReactionTime":true}}]}}]}},{"variableRef":{"name":"Long Last CS GCDOwO"}}]}}]}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"5s"}}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":60503}}},"rhs":{"const":{"val":"0"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"3.5s"}}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":60503}}},"rhs":{"const":{"val":"3"}}}}]}},{"cmp":{"op":"OpEq","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"2s"}}}}]}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":138759},"includeReactionTime":true}},"rhs":{"const":{"val":"10"}}}},{"auraIsKnown":{"auraId":{"spellId":138759}}},{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}},{"auraIsActive":{"auraId":{"spellId":1250616},"includeReactionTime":true}},{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"or":{"vals":[{"auraIsKnown":{"auraId":{"spellId":58384}}},{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"5"}}}}]}}]}}]}},"castSpell":{"spellId":{"spellId":1464}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},{"auraIsInactive":{"auraId":{"spellId":139958},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":5308}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsInactive":{"auraId":{"spellId":1719},"includeReactionTime":true}},{"or":{"vals":[{"auraIsInactive":{"auraId":{"spellId":138127},"includeReactionTime":true}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":138126}}}}}]}},{"auraIsActive":{"auraId":{"spellId":60503}}}]}},"castSpell":{"spellId":{"spellId":7384}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}}]}},"castSpell":{"spellId":{"spellId":1464}}}}, - {"action":{"castSpell":{"spellId":{"spellId":5308}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":60503},"includeReactionTime":true}},"castSpell":{"spellId":{"spellId":7384}}}}, - {"action":{"condition":{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},"castSpell":{"spellId":{"spellId":1464}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"spellIsKnown":{"spellId":{"spellId":46924}}},{"spellIsChanneling":{"spellId":{"spellId":46924}}},{"cmp":{"op":"OpGe","lhs":{"dotRemainingTime":{"spellId":{"spellId":46924}}},"rhs":{"gcdTimeToReady":{}}}}]}},{"cmp":{"op":"OpLt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"10"}}}}]}},"castSpell":{"spellId":{"spellId":6673}}}}, - {"action":{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":46924}}}}, - {"action":{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":1249459}}}} - ], - "groups": [ - {"name":"On UsUwU and BloodbUwU","actions":[{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"130s"}}}},{"variableRef":{"name":"Execute + Potion"}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"15s"}}}}}}]}},"castSpell":{"spellId":{"spellId":33697}}}},{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"125s"}}}},{"variableRef":{"name":"Execute + Potion"}},{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"20s"}}}}}}]}},"castAllStatBuffCooldowns":{"statType2":-1,"statType3":-1}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"numStatBuffCooldowns":{"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":126734}}}},{"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"72s"}}}},{"variableRef":{"name":"Execute + potion/end 15s"}}]}},{"cmp":{"op":"OpEq","lhs":{"numStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"1"}}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},{"not":{"val":{"spellIsKnown":{"spellId":{"spellId":46924}}}}}]}}]}},"strictSequence":{"actions":[{"castAllStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},{"castSpell":{"spellId":{"spellId":12292}}}]}}},{"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"72s"}}}},{"variableRef":{"name":"Execute + potion/end 15s"}}]}},{"cmp":{"op":"OpLe","lhs":{"numStatBuffCooldowns":{"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpEq","lhs":{"numStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"0"}}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},{"not":{"val":{"spellIsKnown":{"spellId":{"spellId":46924}}}}}]}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":126734}}},{"castSpell":{"spellId":{"spellId":12292}}}]}}},{"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"72s"}}}},{"variableRef":{"name":"Execute + potion/end 15s"}}]}},{"cmp":{"op":"OpGe","lhs":{"numStatBuffCooldowns":{"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":12292}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"1"}}}},{"not":{"val":{"spellCanCast":{"spellId":{"itemId":93256}}}}},{"not":{"val":{"spellCanCast":{"spellId":{"itemId":93261}}}}}]}},"castSpell":{"spellId":{"spellId":126734}}}}]}, - {"name":"AoE BladestUwU","actions":[{"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"variableRef":{"name":"Execute + Potion"}},{"variableRef":{"name":"Not: Execute / Potion"}}]}},{"cmp":{"op":"OpEq","lhs":{"numStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"0"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":126734}}},{"castSpell":{"spellId":{"spellId":12292}}},{"castSpell":{"spellId":{"spellId":46924}}}]}}},{"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"Execute + Potion"}},{"cmp":{"op":"OpEq","lhs":{"numStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castAllStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},{"castSpell":{"spellId":{"spellId":12292}}},{"castSpell":{"spellId":{"spellId":46924}}}]}}},{"action":{"condition":{"and":{"vals":[{"variableRef":{"name":"Not: Execute / Potion"}},{"cmp":{"op":"OpEq","lhs":{"numStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castAllStatBuffCooldowns":{"statType1":6,"statType2":-1,"statType3":-1}},{"castSpell":{"spellId":{"spellId":12292}}},{"castSpell":{"spellId":{"spellId":46924}}}]}}},{"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":18499}}},{"castSpell":{"spellId":{"spellId":46924}}}]}}}]}, - {"name":"ST BladestUwU","actions":[{"action":{"condition":{"and":{"vals":[{"not":{"val":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"isExecutePhase":{"threshold":"E20"}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"30"}}}}]}}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":12292},"includeReactionTime":true}},{"isExecutePhase":{"threshold":"E20"}}]}},{"or":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":86346}}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"3s"}}}}]}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"70"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":78}}},{"channelSpell":{"spellId":{"spellId":46924},"interruptIf":{"and":{"vals":[{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":12294}}},{"and":{"vals":[{"spellIsReady":{"spellId":{"spellId":86346}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},{"gcdIsReady":{}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":6673}}}}}]}}}}]}}},{"action":{"condition":{"and":{"vals":[{"not":{"val":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}},{"isExecutePhase":{"threshold":"E20"}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"30"}}}}]}}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":12292},"includeReactionTime":true}},{"isExecutePhase":{"threshold":"E20"}}]}},{"or":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":86346}}}}},{"cmp":{"op":"OpGe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"3s"}}}}]}}]}},"channelSpell":{"spellId":{"spellId":46924},"interruptIf":{"and":{"vals":[{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":12294}}},{"and":{"vals":[{"spellIsReady":{"spellId":{"spellId":86346}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},{"gcdIsReady":{}},{"not":{"val":{"spellCanCast":{"spellId":{"spellId":6673}}}}}]}}}}}]}, - {"name":"Mortal StOwO","actions":[{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"targetUnit":{"type":"Target","index":2},"spellId":{"spellId":115768}}},"rhs":{"dotRemainingTime":{"targetUnit":{"type":"Target"},"spellId":{"spellId":115768}}}}},{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"targetUnit":{"type":"Target","index":2},"spellId":{"spellId":115768}}},"rhs":{"dotRemainingTime":{"targetUnit":{"type":"Target","index":1},"spellId":{"spellId":115768}}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}}]}},"castSpell":{"spellId":{"spellId":12294},"target":{"type":"Target","index":2}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"dotRemainingTime":{"targetUnit":{"type":"Target","index":1},"spellId":{"spellId":115768}}},"rhs":{"dotRemainingTime":{"targetUnit":{"type":"Target"},"spellId":{"spellId":115768}}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"3"}}}}]}},"castSpell":{"spellId":{"spellId":12294},"target":{"type":"Target","index":1}}}},{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"targetUnit":{"type":"Target","index":1},"spellId":{"spellId":115768}}},"rhs":{"const":{"val":"3s"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}}]}},"castSpell":{"spellId":{"spellId":12294},"target":{"type":"Target","index":1}}}},{"action":{"castSpell":{"spellId":{"spellId":12294}}}}]}, - {"name":"Off GCDOwO","actions":[{"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}},{"or":{"vals":[{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"variableRef":{"name":"Ending RagUwU"}}]}}]}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"110"}}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"spellTimeToReady":{"spellId":{"spellId":1250619}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"math":{"op":"OpSub","lhs":{"maxRage":{}},"rhs":{"const":{"val":"35"}}}}}},{"cmp":{"op":"OpGe","lhs":{"autoTimeToNext":{}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},{"not":{"val":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":86346}}},"rhs":{"gcdTimeToReady":{}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":12294}}},"rhs":{"gcdTimeToReady":{}}}},{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}}]}}}},{"auraIsActive":{"auraId":{"spellId":1250616},"includeReactionTime":true}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}}]}},"castSpell":{"spellId":{"spellId":845}}}},{"action":{"condition":{"and":{"vals":[{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}},{"or":{"vals":[{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},{"variableRef":{"name":"Ending RagUwU"}}]}}]}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"110"}}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"spellTimeToReady":{"spellId":{"spellId":1250619}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"math":{"op":"OpSub","lhs":{"maxRage":{}},"rhs":{"const":{"val":"35"}}}}}},{"cmp":{"op":"OpGe","lhs":{"autoTimeToNext":{}},"rhs":{"const":{"val":"1.5s"}}}}]}}]}},{"not":{"val":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"spellTimeToReady":{"spellId":{"spellId":86346}}},"rhs":{"gcdTimeToReady":{}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":12294}}},"rhs":{"gcdTimeToReady":{}}}},{"auraIsInactive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346},"includeReactionTime":true}}]}}}},{"or":{"vals":[{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"auraIsActive":{"auraId":{"spellId":1250616},"includeReactionTime":true}}]}},{"or":{"vals":[{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"1.4s"}}}},{"cmp":{"op":"OpGe","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":".1s"}}}}]}},{"spellIsReady":{"spellId":{"spellId":12294}}}]}}]}},"castSpell":{"spellId":{"spellId":78}}}}]} - ], - "valueVariables": [ - {"name":"Ending RagUwU","value":{"cmp":{"op":"OpEq","lhs":{"maxRage":{}},"rhs":{"const":{"val":"100"}}}}}, - {"name":"Last CS GCDOwO","value":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1s"}}}}]}}}, - {"name":"Long Last CS GCDOwO","value":{"and":{"vals":[{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":86346}}},"rhs":{"const":{"val":"1.5s"}}}}]}}}, - {"name":"Is execute phase","value":{"isExecutePhase":{"threshold":"E20"}}}, - {"name":"end 15s","value":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"math":{"op":"OpAdd","lhs":{"gcdTimeToReady":{}},"rhs":{"const":{"val":"15s"}}}}}}}, - {"name":"Can pot","value":{"spellCanCast":{"spellId":{"otherId":"OtherActionPotion"}}}}, - {"name":"Potion is active","value":{"auraIsActive":{"auraId":{"itemId":76095}}}}, - {"name":"Execute + Potion","value":{"and":{"vals":[{"variableRef":{"name":"Is execute phase"}},{"variableRef":{"name":"Potion is active"}}]}}}, - {"name":"Execute + potion/end 15s","value":{"and":{"vals":[{"variableRef":{"name":"Is execute phase"}},{"or":{"vals":[{"variableRef":{"name":"end 15s"}},{"variableRef":{"name":"Potion is active"}}]}}]}}}, - {"name":"Not: Execute / Potion","value":{"or":{"vals":[{"not":{"val":{"variableRef":{"name":"Is execute phase"}}}},{"not":{"val":{"variableRef":{"name":"Can pot"}}}}]}}} - ] -} diff --git a/ui/warrior/arms/gear_sets/p1_arms_bis.gear.json b/ui/warrior/arms/gear_sets/p1_arms_bis.gear.json deleted file mode 100644 index d2ba47dd81..0000000000 --- a/ui/warrior/arms/gear_sets/p1_arms_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - {"id":87192,"gems":[76886,76575],"reforging":137}, - {"id":86967,"reforging":165}, - {"id":86986,"enchant":4803,"gems":[76595]}, - {"id":87026,"enchant":4424,"reforging":161}, - {"id":87193,"enchant":4419,"gems":[76631,76631],"reforging":154}, - {"id":90506,"enchant":4415,"gems":[76631],"reforging":166}, - {"id":87194,"enchant":4432,"gems":[76631],"reforging":161,"tinker":4898}, - {"id":87186,"enchant":4223,"gems":[76575,76631]}, - {"id":87195,"enchant":4823,"gems":[76595],"reforging":166}, - {"id":87015,"enchant":4429,"gems":[76631],"reforging":165}, - {"id":87158}, - {"id":86957,"reforging":152}, - {"id":87072,"reforging":152}, - {"id":79327}, - {"id":87176,"enchant":4444,"gems":[89881],"reforging":168}, - {} - ] -} diff --git a/ui/warrior/arms/gear_sets/p1_prebis.gear.json b/ui/warrior/arms/gear_sets/p1_prebis.gear.json deleted file mode 100644 index 02ee5e9a09..0000000000 --- a/ui/warrior/arms/gear_sets/p1_prebis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 86673, "gems": [76886, 76641], "reforging": 137 }, - { "id": 90592, "reforging": 165 }, - { "id": 89345, "enchant": 4803, "gems": [76697] }, - { "id": 89074, "enchant": 4894, "reforging": 165 }, - { "id": 86672, "enchant": 4419, "gems": [76697, 76697], "reforging": 151 }, - { "id": 88879, "enchant": 4415, "gems": [0], "reforging": 158 }, - { "id": 86671, "enchant": 4432, "gems": [0], "reforging": 161, "tinker": 4898 }, - { "id": 89055, "gems": [76641, 76697], "reforging": 165 }, - { "id": 86670, "enchant": 4823, "gems": [76661], "reforging": 166 }, - { "id": 88862, "enchant": 4429 }, - { "id": 89069, "reforging": 158 }, - { "id": 90862, "reforging": 159 }, - { "id": 79327 }, - { "id": 86802, "reforging": 152 }, - { "id": 86905, "enchant": 4444, "gems": [89881, 0], "reforging": 165 }, - {} - ] -} diff --git a/ui/warrior/arms/gear_sets/p2_arms_bis.gear.json b/ui/warrior/arms/gear_sets/p2_arms_bis.gear.json deleted file mode 100644 index 47f26e138f..0000000000 --- a/ui/warrior/arms/gear_sets/p2_arms_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 87192, "gems": [76886, 76641], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86967, "reforging": 165, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86986, "enchant": 4803, "gems": [76661], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87026, "enchant": 4424, "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87193, "enchant": 4419, "gems": [76697, 76697], "reforging": 151, "upgradeStep": "UpgradeStepTwo" }, - { "id": 90506, "enchant": 4415, "gems": [76697], "reforging": 166, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87194, "enchant": 4432, "gems": [76697], "reforging": 161, "upgradeStep": "UpgradeStepTwo", "tinker": 4898 }, - { "id": 89919, "enchant": 4223, "gems": [76697, 76641, 76697], "reforging": 158, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87195, "enchant": 4823, "gems": [76661], "reforging": 159, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87015, "enchant": 4429, "gems": [76697], "upgradeStep": "UpgradeStepTwo" }, - { "id": 87158, "reforging": 140, "upgradeStep": "UpgradeStepTwo" }, - { "id": 86957, "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87072, "reforging": 152, "upgradeStep": "UpgradeStepTwo" }, - { "id": 79327, "upgradeStep": "UpgradeStepTwo" }, - { "id": 87176, "enchant": 4444, "gems": [89881, 76697], "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/warrior/arms/gear_sets/p3_arms_bis.gear.json b/ui/warrior/arms/gear_sets/p3_arms_bis.gear.json deleted file mode 100644 index 5a8e4e6161..0000000000 --- a/ui/warrior/arms/gear_sets/p3_arms_bis.gear.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { "id": 96522, "gems": [95346, 76697], "reforging": 154, "upgradeStep": "UpgradeStepTwo" }, - { "id": 96420, "upgradeStep": "UpgradeStepTwo" }, - { "id": 96734, "enchant": 4803, "gems": [76661, 76697], "reforging": 159 }, - { "id": 95017, "enchant": 4424, "gems": [76697], "reforging": 154 }, - { "id": 96731, "enchant": 4419, "gems": [76659, 76697, 76641], "reforging": 159 }, - { "id": 96476, "randomSuffix": -336, "enchant": 4415, "gems": [76697, 76697], "upgradeStep": "UpgradeStepTwo" }, - { "id": 96732, "enchant": 4432, "gems": [76661, 76697], "reforging": 140, "tinker": 4898 }, - { "id": 95003, "enchant": 4223, "gems": [76641, 76641, 76697] }, - { "id": 96733, "enchant": 4823, "gems": [76697, 76641] }, - { "id": 95012, "enchant": 4429, "gems": [76697, 76641], "reforging": 161 }, - { "id": 96500, "gems": [76697], "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 95022, "gems": [76697], "reforging": 152 }, - { "id": 96470, "reforging": 137, "upgradeStep": "UpgradeStepTwo" }, - { "id": 96501, "upgradeStep": "UpgradeStepTwo" }, - { "id": 96553, "enchant": 4444, "gems": [76661, 76697], "upgradeStep": "UpgradeStepTwo" }, - {} - ] -} diff --git a/ui/warrior/arms/index.ts b/ui/warrior/arms/index.ts deleted file mode 100644 index a4fd7caa07..0000000000 --- a/ui/warrior/arms/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { ArmsWarriorSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.ArmsWarrior, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new ArmsWarriorSimUI(document.body, player); diff --git a/ui/warrior/arms/inputs.ts b/ui/warrior/arms/inputs.ts deleted file mode 100644 index 47588684c9..0000000000 --- a/ui/warrior/arms/inputs.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Configuration for spec-specific UI elements on the settings tab. -// These don't need to be in a separate file but it keeps things cleaner. diff --git a/ui/warrior/arms/presets.ts b/ui/warrior/arms/presets.ts deleted file mode 100644 index 4e5da539cc..0000000000 --- a/ui/warrior/arms/presets.ts +++ /dev/null @@ -1,88 +0,0 @@ -import * as PresetUtils from '../../core/preset_utils'; -import { ConsumesSpec, Profession, PseudoStat, Race, Stat } from '../../core/proto/common'; -import { SavedTalents } from '../../core/proto/ui'; -import { ArmsWarrior_Options as WarriorOptions } from '../../core/proto/warrior'; -import { Stats } from '../../core/proto_utils/stats'; -import ArmsApl from './apls/arms.apl.json'; -import P1ArmsBisGear from './gear_sets/p1_arms_bis.gear.json'; -import P2ArmsBisGear from './gear_sets/p2_arms_bis.gear.json'; -import P3ArmsBisGear from './gear_sets/p3_arms_bis.gear.json'; -import P1PreBisGear from './gear_sets/p1_prebis.gear.json'; - -// Preset options for this spec. -// Eventually we will import these values for the raid sim too, so its good to -// keep them in a separate file. - -export const P1_PREBIS_PRESET = PresetUtils.makePresetGear('P1 - Pre-BIS', P1PreBisGear); -export const P1_ARMS_BIS_PRESET = PresetUtils.makePresetGear('P1 - BIS', P1ArmsBisGear); -export const P2_ARMS_BIS_PRESET = PresetUtils.makePresetGear('P2 - BIS', P2ArmsBisGear); -export const P3_ARMS_BIS_PRESET = PresetUtils.makePresetGear('P3 - BIS', P3ArmsBisGear); - -export const ROTATION_ARMS = PresetUtils.makePresetAPLRotation('Default', ArmsApl); - -// Preset options for EP weights -export const P1_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level < 500', - Stats.fromMap( - { - [Stat.StatStrength]: 1, - [Stat.StatAttackPower]: 0.45, - [Stat.StatExpertiseRating]: 1.2, - [Stat.StatHitRating]: 1.4, - [Stat.StatCritRating]: 0.59, - [Stat.StatHasteRating]: 0.32, - [Stat.StatMasteryRating]: 0.39, - }, - { - [PseudoStat.PseudoStatMainHandDps]: 3.71, - [PseudoStat.PseudoStatOffHandDps]: 0, - }, - ), -); - -export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( - 'Item Level >= 500', - Stats.fromMap( - { - [Stat.StatStrength]: 1, - [Stat.StatAttackPower]: 0.45, - [Stat.StatExpertiseRating]: 1.39, - [Stat.StatHitRating]: 1.88, - [Stat.StatCritRating]: 0.65, - [Stat.StatHasteRating]: 0.30, - [Stat.StatMasteryRating]: 0.49, - }, - { - [PseudoStat.PseudoStatMainHandDps]: 3.54, - [PseudoStat.PseudoStatOffHandDps]: 0, - }, - ), -); - -// Default talents. Uses the wowhead calculator format, make the talents on -// https://wowhead.com/wotlk/talent-calc and copy the numbers in the url. - -export const ArmsTalents = { - name: 'Default', - data: SavedTalents.create({ - talentsString: '113132', - }), -}; - -export const DefaultOptions = WarriorOptions.create({ - classOptions: {}, -}); - -export const DefaultConsumables = ConsumesSpec.create({ - flaskId: 76088, // Flask of Winter's Bite - foodId: 74646, // Black Pepper Ribs and Shrimp - potId: 76095, // Potion of Mogu Power - prepotId: 76095, // Potion of Mogu Power -}); - -export const OtherDefaults = { - race: Race.RaceOrc, - profession1: Profession.Engineering, - profession2: Profession.Blacksmithing, - distanceFromTarget: 25, -}; diff --git a/ui/warrior/arms/sim.ts b/ui/warrior/arms/sim.ts deleted file mode 100644 index bdb89fa6e0..0000000000 --- a/ui/warrior/arms/sim.ts +++ /dev/null @@ -1,162 +0,0 @@ -import * as OtherInputs from '../../core/components/inputs/other_inputs'; -import { ReforgeOptimizer } from '../../core/components/suggest_reforges_action'; -import * as Mechanics from '../../core/constants/mechanics'; -import { IndividualSimUI, registerSpecConfig } from '../../core/individual_sim_ui'; -import { Player } from '../../core/player'; -import { PlayerClasses } from '../../core/player_classes'; -import { APLRotation } from '../../core/proto/apl'; -import { Class, Debuffs, Faction, IndividualBuffs, ItemSlot, PartyBuffs, PseudoStat, Race, RaidBuffs, Spec, Stat } from '../../core/proto/common'; -import { Stats, UnitStat } from '../../core/proto_utils/stats'; -import { defaultRaidBuffMajorDamageCooldowns } from '../../core/proto_utils/utils'; -import * as WarriorInputs from '../inputs'; -import * as Presets from './presets'; - -const SPEC_CONFIG = registerSpecConfig(Spec.SpecArmsWarrior, { - cssClass: 'arms-warrior-sim-ui', - cssScheme: PlayerClasses.getCssClass(PlayerClasses.Warrior), - // List any known bugs / issues here and they'll be shown on the site. - knownIssues: [], - - // All stats for which EP should be calculated. - epStats: [ - Stat.StatStrength, - Stat.StatAgility, - Stat.StatAttackPower, - Stat.StatExpertiseRating, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, - ], - epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps], - // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. - epReferenceStat: Stat.StatStrength, - // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. - displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, Stat.StatExpertiseRating, Stat.StatMasteryRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatMeleeHastePercent], - ), - // modifyDisplayStats: (player: Player) => { - // let stats = new Stats(); - // if (!player.getInFrontOfTarget()) { - // // When behind target, dodge is the only outcome affected by Expertise. - // stats = stats.addStat(Stat.StatExpertise, player.getTalents().weaponMastery * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - // } - // return { - // talents: stats, - // }; - // }, - - defaults: { - // Default equipped gear. - gear: Presets.P2_ARMS_BIS_PRESET.gear, - // Default EP weights for sorting gear in the gear picker. - epWeights: Presets.P1_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - const hitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5); - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - - return hitCap.add(expCap); - })(), - other: Presets.OtherDefaults, - // Default consumes settings. - consumables: Presets.DefaultConsumables, - // Default talents. - talents: Presets.ArmsTalents.data, - // Default spec-specific settings. - specOptions: Presets.DefaultOptions, - // Default raid/party buffs settings. - raidBuffs: RaidBuffs.create({ - ...defaultRaidBuffMajorDamageCooldowns(Class.ClassWarrior), - darkIntent: true, - trueshotAura: true, - unleashedRage: true, - moonkinAura: true, - blessingOfMight: true, - bloodlust: true, - }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), - debuffs: Debuffs.create({ - physicalVulnerability: true, - weakenedArmor: true, - masterPoisoner: true, - }), - }, - - // IconInputs to include in the 'Player' section on the settings tab. - playerIconInputs: [], - // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. - includeBuffDebuffInputs: [], - excludeBuffDebuffInputs: [], - // Inputs to include in the 'Other' section on the settings tab. - otherInputs: { - inputs: [ - WarriorInputs.StanceSnapshot(), - OtherInputs.DistanceFromTarget, - OtherInputs.InputDelay, - OtherInputs.TankAssignment, - OtherInputs.InFrontOfTarget, - ], - }, - itemSwapSlots: [ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2, ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand], - encounterPicker: { - // Whether to include 'Execute Duration (%)' in the 'Encounter' section of the settings tab. - showExecuteProportion: true, - }, - - presets: { - epWeights: [Presets.P1_EP_PRESET, Presets.P2_EP_PRESET], - // Preset talents that the user can quickly select. - talents: [Presets.ArmsTalents], - // Preset rotations that the user can quickly select. - rotations: [Presets.ROTATION_ARMS], - // Preset gear configurations that the user can quickly select. - gear: [Presets.P1_PREBIS_PRESET, Presets.P1_ARMS_BIS_PRESET, Presets.P2_ARMS_BIS_PRESET, Presets.P3_ARMS_BIS_PRESET], - }, - - autoRotation: (_player: Player): APLRotation => { - return Presets.ROTATION_ARMS.rotation.rotation!; - }, - - raidSimPresets: [ - { - spec: Spec.SpecArmsWarrior, - talents: Presets.ArmsTalents.data, - specOptions: Presets.DefaultOptions, - consumables: Presets.DefaultConsumables, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.P1_ARMS_BIS_PRESET.gear, - }, - [Faction.Horde]: { - 1: Presets.P1_ARMS_BIS_PRESET.gear, - }, - }, - otherDefaults: Presets.OtherDefaults, - }, - ], -}); - -export class ArmsWarriorSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { - super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this, { - getEPDefaults: player => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - if (avgIlvl >= 500) { - return Presets.P2_EP_PRESET.epWeights; - } - return Presets.P1_EP_PRESET.epWeights; - }, - }); - } -} diff --git a/ui/warrior/fury/apls/default.apl.json b/ui/warrior/dps/apls/default.apl.json similarity index 100% rename from ui/warrior/fury/apls/default.apl.json rename to ui/warrior/dps/apls/default.apl.json diff --git a/ui/warrior/fury/gear_sets/p1_fury_smf.gear.json b/ui/warrior/dps/gear_sets/p1_fury_smf.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/p1_fury_smf.gear.json rename to ui/warrior/dps/gear_sets/p1_fury_smf.gear.json diff --git a/ui/warrior/fury/gear_sets/p1_fury_tg.gear.json b/ui/warrior/dps/gear_sets/p1_fury_tg.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/p1_fury_tg.gear.json rename to ui/warrior/dps/gear_sets/p1_fury_tg.gear.json diff --git a/ui/warrior/fury/gear_sets/p2_fury_smf.gear.json b/ui/warrior/dps/gear_sets/p2_fury_smf.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/p2_fury_smf.gear.json rename to ui/warrior/dps/gear_sets/p2_fury_smf.gear.json diff --git a/ui/warrior/fury/gear_sets/p2_fury_tg.gear.json b/ui/warrior/dps/gear_sets/p2_fury_tg.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/p2_fury_tg.gear.json rename to ui/warrior/dps/gear_sets/p2_fury_tg.gear.json diff --git a/ui/warrior/fury/gear_sets/p3_fury_tg.gear.json b/ui/warrior/dps/gear_sets/p3_fury_tg.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/p3_fury_tg.gear.json rename to ui/warrior/dps/gear_sets/p3_fury_tg.gear.json diff --git a/ui/warrior/fury/gear_sets/preraid_fury_smf.gear.json b/ui/warrior/dps/gear_sets/preraid_fury_smf.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/preraid_fury_smf.gear.json rename to ui/warrior/dps/gear_sets/preraid_fury_smf.gear.json diff --git a/ui/warrior/fury/gear_sets/preraid_fury_tg.gear.json b/ui/warrior/dps/gear_sets/preraid_fury_tg.gear.json similarity index 100% rename from ui/warrior/fury/gear_sets/preraid_fury_tg.gear.json rename to ui/warrior/dps/gear_sets/preraid_fury_tg.gear.json diff --git a/ui/druid/feral/index.ts b/ui/warrior/dps/index.ts similarity index 66% rename from ui/druid/feral/index.ts rename to ui/warrior/dps/index.ts index 15958c022d..a7da90b8cc 100644 --- a/ui/druid/feral/index.ts +++ b/ui/warrior/dps/index.ts @@ -3,10 +3,10 @@ import { PlayerSpecs } from '../../core/player_specs'; import { Spec } from '../../core/proto/common'; import { Sim } from '../../core/sim'; import { TypedEvent } from '../../core/typed_event'; -import { FeralDruidSimUI } from './sim'; +import { DPSWarriorSimUI } from './sim'; const sim = new Sim(); -const player = new Player(PlayerSpecs.FeralDruid, sim); +const player = new Player(PlayerSpecs.DPSWarrior, sim); sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); -new FeralDruidSimUI(document.body, player); +new DPSWarriorSimUI(document.body, player); diff --git a/ui/warrior/fury/inputs.ts b/ui/warrior/dps/inputs.ts similarity index 52% rename from ui/warrior/fury/inputs.ts rename to ui/warrior/dps/inputs.ts index a03430d8f5..d3fa961b9b 100644 --- a/ui/warrior/fury/inputs.ts +++ b/ui/warrior/dps/inputs.ts @@ -7,7 +7,7 @@ import { WarriorSyncType } from '../../core/proto/warrior'; import { Stats } from '../../core/proto_utils/stats'; import i18n from '../../i18n/config.js'; -export const SyncTypeInput = InputHelpers.makeSpecOptionsEnumInput({ +export const SyncTypeInput = InputHelpers.makeSpecOptionsEnumInput({ fieldName: 'syncType', label: i18n.t('settings_tab.other.sync_type.label'), labelTooltip: i18n.t('settings_tab.other.sync_type.tooltip'), @@ -16,18 +16,3 @@ export const SyncTypeInput = InputHelpers.makeSpecOptionsEnumInput({ - fieldName: 'useItemSwapBonusStats', - label: i18n.t('settings_tab.other.assume_prepull_mastery_elixir.label'), - labelTooltip: i18n.t('settings_tab.other.assume_prepull_mastery_elixir.tooltip'), - getValue: player => player.getSpecOptions().useItemSwapBonusStats, - setValue: (eventID, player, newVal) => { - const newMessage = player.getSpecOptions(); - newMessage.useItemSwapBonusStats = newVal; - - const bonusStats = newVal ? new Stats().withStat(Stat.StatMasteryRating, 225 + (player.hasProfession(Profession.Alchemy) ? 40 : 0)) : new Stats(); - player.itemSwapSettings.setBonusStats(eventID, bonusStats); - player.setSpecOptions(eventID, newMessage); - }, -}); diff --git a/ui/warrior/fury/presets.ts b/ui/warrior/dps/presets.ts similarity index 88% rename from ui/warrior/fury/presets.ts rename to ui/warrior/dps/presets.ts index d071842b7e..c207b10bc3 100644 --- a/ui/warrior/fury/presets.ts +++ b/ui/warrior/dps/presets.ts @@ -2,7 +2,7 @@ import { Player } from '../../core/player'; import * as PresetUtils from '../../core/preset_utils'; import { ConsumesSpec, HandType, ItemSlot, Profession, PseudoStat, Race, Spec, Stat } from '../../core/proto/common'; import { SavedTalents } from '../../core/proto/ui'; -import { FuryWarrior_Options as WarriorOptions } from '../../core/proto/warrior'; +import { DPSWarrior_Options as WarriorOptions } from '../../core/proto/warrior'; import { Stats } from '../../core/proto_utils/stats'; import DefaultFuryApl from './apls/default.apl.json'; import P2FurySMFGear from './gear_sets/p2_fury_smf.gear.json'; @@ -19,11 +19,11 @@ import PreraidFuryTGGear from './gear_sets/preraid_fury_tg.gear.json'; // Handlers for spec specific load checks const FURY_SMF_PRESET_OPTIONS = { - onLoad: (player: Player) => { + onLoad: (player: Player) => { PresetUtils.makeSpecChangeWarningToast( [ { - condition: (player: Player) => + condition: (player: Player) => player.getEquippedItem(ItemSlot.ItemSlotMainHand)?.item.handType === HandType.HandTypeTwoHand, message: 'Check your gear: You have a two-handed weapon equipped, but the selected option is for one-handed weapons.', }, @@ -37,7 +37,7 @@ const FURY_TG_PRESET_OPTIONS = { PresetUtils.makeSpecChangeWarningToast( [ { - condition: (player: Player) => + condition: (player: Player) => player.getEquippedItem(ItemSlot.ItemSlotMainHand)?.item.handType === HandType.HandTypeOneHand, message: 'Check your gear: You have a one-handed weapon equipped, but the selected option is for two-handed weapons.', }, @@ -66,10 +66,6 @@ export const P1_FURY_SMF_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatAgility]: 0.06, [Stat.StatAttackPower]: 0.45, [Stat.StatExpertiseRating]: 1.19, - [Stat.StatHitRating]: 1.37, - [Stat.StatCritRating]: 0.94, - [Stat.StatHasteRating]: 0.41, - [Stat.StatMasteryRating]: 0.59, }, { [PseudoStat.PseudoStatMainHandDps]: 2.15, @@ -87,10 +83,6 @@ export const P1_FURY_TG_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatAgility]: 0.07, [Stat.StatAttackPower]: 0.45, [Stat.StatExpertiseRating]: 1.42, - [Stat.StatHitRating]: 1.62, - [Stat.StatCritRating]: 1.07, - [Stat.StatHasteRating]: 0.41, - [Stat.StatMasteryRating]: 0.7, }, { [PseudoStat.PseudoStatMainHandDps]: 2.59, @@ -108,10 +100,6 @@ export const P3_FURY_TG_EP_PRESET = PresetUtils.makePresetEpWeights( [Stat.StatAgility]: 0.07, [Stat.StatAttackPower]: 0.45, [Stat.StatExpertiseRating]: 1.89, - [Stat.StatHitRating]: 2.15, - [Stat.StatCritRating]: 0.96, - [Stat.StatHasteRating]: 0.53, - [Stat.StatMasteryRating]: 0.9, }, { [PseudoStat.PseudoStatMainHandDps]: 2.56, diff --git a/ui/warrior/fury/sim.ts b/ui/warrior/dps/sim.ts similarity index 68% rename from ui/warrior/fury/sim.ts rename to ui/warrior/dps/sim.ts index 2b3a1a7096..4de08a95cc 100644 --- a/ui/warrior/fury/sim.ts +++ b/ui/warrior/dps/sim.ts @@ -16,7 +16,7 @@ import * as Presets from './presets'; const P2HitPostCapEPs = [0, 0]; const P3HitPostCapEPs = [0.42 * Mechanics.PHYSICAL_HIT_RATING_PER_HIT_PERCENT, 0]; -const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { +const SPEC_CONFIG = registerSpecConfig(Spec.SpecDPSWarrior, { cssClass: 'fury-warrior-sim-ui', cssScheme: PlayerClasses.getCssClass(PlayerClasses.Warrior), // List any known bugs / issues here and they'll be shown on the site. @@ -28,18 +28,14 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { Stat.StatAgility, Stat.StatAttackPower, Stat.StatExpertiseRating, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, - Stat.StatMasteryRating, ], epPseudoStats: [PseudoStat.PseudoStatMainHandDps, PseudoStat.PseudoStatOffHandDps], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. epReferenceStat: Stat.StatStrength, // Which stats to display in the Character Stats section, at the bottom of the left-hand sidebar. displayStats: UnitStat.createDisplayStatArray( - [Stat.StatHealth, Stat.StatStamina, Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, Stat.StatExpertiseRating, Stat.StatMasteryRating], - [PseudoStat.PseudoStatPhysicalHitPercent, PseudoStat.PseudoStatPhysicalCritPercent, PseudoStat.PseudoStatMeleeHastePercent], + [Stat.StatHealth, Stat.StatStamina, Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, Stat.StatExpertiseRating], + [PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatMeleeHastePercent], ), // modifyDisplayStats: (player: Player) => { // //let stats = new Stats(); @@ -57,20 +53,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { gear: Presets.P2_BIS_FURY_TG_PRESET.gear, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.P1_FURY_TG_EP_PRESET.epWeights, - // Stat caps for reforge optimizer - statCaps: (() => { - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 7.5 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - return expCap; - })(), - softCapBreakpoints: (() => { - const meleeHitSoftCapConfig = StatCap.fromPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, { - breakpoints: [7.5, 27], - capType: StatCapType.TypeSoftCap, - postCapEPs: P2HitPostCapEPs, - }); - - return [meleeHitSoftCapConfig]; - })(), other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, @@ -81,19 +63,15 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(Class.ClassWarrior), - darkIntent: true, - trueshotAura: true, - unleashedRage: true, - moonkinAura: true, - blessingOfMight: true, - bloodlust: true, }), - partyBuffs: PartyBuffs.create({}), - individualBuffs: IndividualBuffs.create({}), + partyBuffs: PartyBuffs.create({ + + }), + individualBuffs: IndividualBuffs.create({ + + }), debuffs: Debuffs.create({ - physicalVulnerability: true, - weakenedArmor: true, - masterPoisoner: true, + }), }, @@ -111,7 +89,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { OtherInputs.InputDelay, OtherInputs.TankAssignment, OtherInputs.InFrontOfTarget, - FuryInputs.AssumePrepullMasteryElixir, ], }, itemSwapSlots: [ItemSlot.ItemSlotTrinket1, ItemSlot.ItemSlotTrinket2, ItemSlot.ItemSlotMainHand, ItemSlot.ItemSlotOffHand], @@ -139,19 +116,19 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { builds: [Presets.P1_PRESET_BUILD_SMF, Presets.P1_PRESET_BUILD_TG], }, - autoRotation: (_player: Player): APLRotation => { + autoRotation: (_player: Player): APLRotation => { return Presets.FURY_DEFAULT_ROTATION.rotation.rotation!; }, raidSimPresets: [ { - spec: Spec.SpecFuryWarrior, + spec: Spec.SpecDPSWarrior, talents: Presets.FurySMFTalents.data, specOptions: Presets.DefaultOptions, consumables: Presets.DefaultConsumables, defaultFactionRaces: { [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceWorgen, + [Faction.Alliance]: Race.RaceHuman, [Faction.Horde]: Race.RaceTroll, }, defaultGear: { @@ -174,35 +151,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecFuryWarrior, { ], }); -export class FuryWarriorSimUI extends IndividualSimUI { - constructor(parentElem: HTMLElement, player: Player) { +export class DPSWarriorSimUI extends IndividualSimUI { + constructor(parentElem: HTMLElement, player: Player) { super(parentElem, player, SPEC_CONFIG); - - this.reforger = new ReforgeOptimizer(this, { - updateSoftCaps: softCaps => { - const avgIlvl = player.getGear().getAverageItemLevel(false); - - this.individualConfig.defaults.softCapBreakpoints!.forEach(softCap => { - const softCapToModify = softCaps.find(sc => sc.unitStat.equals(softCap.unitStat)); - if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent) && softCapToModify) { - if (avgIlvl >= 517) { - softCapToModify.postCapEPs = P3HitPostCapEPs; - } else { - softCapToModify.postCapEPs = P2HitPostCapEPs; - } - } - - // TODO: Setup Crit soft cap for P3 - // if (softCap.unitStat.equalsPseudoStat(PseudoStat.PseudoStatPhysicalCritPercent) && softCapToModify) { - // if (avgIlvl >= 517) { - // softCapToModify.postCapEPs = P3CritPostCapEPs; - // } else { - // softCapToModify.postCapEPs = P2CritPostCapEPs; - // } - // } - }); - return softCaps; - }, - }); } } diff --git a/ui/warrior/fury/index.ts b/ui/warrior/fury/index.ts deleted file mode 100644 index 452848d3c8..0000000000 --- a/ui/warrior/fury/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Player } from '../../core/player'; -import { PlayerSpecs } from '../../core/player_specs'; -import { Spec } from '../../core/proto/common'; -import { Sim } from '../../core/sim'; -import { TypedEvent } from '../../core/typed_event'; -import { FuryWarriorSimUI } from './sim'; - -const sim = new Sim(); -const player = new Player(PlayerSpecs.FuryWarrior, sim); -sim.raid.setPlayer(TypedEvent.nextEventID(), 0, player); - -new FuryWarriorSimUI(document.body, player); diff --git a/ui/warrior/inputs.ts b/ui/warrior/inputs.ts index 80288a53a6..8dfe6039ad 100644 --- a/ui/warrior/inputs.ts +++ b/ui/warrior/inputs.ts @@ -7,7 +7,7 @@ import i18n from '../i18n/config.js'; // Arms/Fury only -export const StanceSnapshot = () => +export const StanceSnapshot = () => InputHelpers.makeSpecOptionsBooleanInput({ fieldName: 'stanceSnapshot', label: i18n.t('settings_tab.other.stance_snapshot.label'), diff --git a/ui/warrior/protection/presets.ts b/ui/warrior/protection/presets.ts index 3fcea76564..d4774959be 100644 --- a/ui/warrior/protection/presets.ts +++ b/ui/warrior/protection/presets.ts @@ -45,13 +45,6 @@ export const P2_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatStrength]: 1, [Stat.StatStamina]: 1.07, - [Stat.StatHitRating]: 1.78, - [Stat.StatCritRating]: 0.7, - [Stat.StatHasteRating]: 0.11, - [Stat.StatExpertiseRating]: 1.77, - [Stat.StatDodgeRating]: 0.82, - [Stat.StatParryRating]: 0.82, - [Stat.StatMasteryRating]: 0.19, [Stat.StatAttackPower]: 0.33, [Stat.StatArmor]: 0.55, [Stat.StatBonusArmor]: 0.55, @@ -68,13 +61,6 @@ export const P2_OFFENSIVE_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatStrength]: 1, [Stat.StatStamina]: 0.36, - [Stat.StatHitRating]: 1.62, - [Stat.StatCritRating]: 0.82, - [Stat.StatHasteRating]: 0.18, - [Stat.StatExpertiseRating]: 1.61, - [Stat.StatDodgeRating]: 0.6, - [Stat.StatParryRating]: 0.63, - [Stat.StatMasteryRating]: 0.07, [Stat.StatAttackPower]: 0.4, [Stat.StatArmor]: 0.18, [Stat.StatBonusArmor]: 0.18, @@ -91,13 +77,6 @@ export const P3_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatStrength]: 1.00, [Stat.StatStamina]: 0.83, - [Stat.StatHitRating]: 2.40, - [Stat.StatCritRating]: 0.82, - [Stat.StatHasteRating]: 0.15, - [Stat.StatExpertiseRating]: 2.44, - [Stat.StatDodgeRating]: 1.04, - [Stat.StatParryRating]: 1.12, - [Stat.StatMasteryRating]: 0.23, [Stat.StatAttackPower]: 0.24, [Stat.StatArmor]: 0.64, [Stat.StatBonusArmor]: 0.64, @@ -114,13 +93,6 @@ export const P3_OFFENSIVE_EP_PRESET = PresetUtils.makePresetEpWeights( { [Stat.StatStrength]: 1.00, [Stat.StatStamina]: 0.37, - [Stat.StatHitRating]: 2.51, - [Stat.StatCritRating]: 1.12, - [Stat.StatHasteRating]: 0.27, - [Stat.StatExpertiseRating]: 2.54, - [Stat.StatDodgeRating]: 0.99, - [Stat.StatParryRating]: 1.11, - [Stat.StatMasteryRating]: 0.11, [Stat.StatAttackPower]: 0.30, [Stat.StatArmor]: 0.27, [Stat.StatBonusArmor]: 0.27, diff --git a/ui/warrior/protection/sim.ts b/ui/warrior/protection/sim.ts index fbc378da7d..56bc82398e 100644 --- a/ui/warrior/protection/sim.ts +++ b/ui/warrior/protection/sim.ts @@ -25,15 +25,8 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionWarrior, { Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, - Stat.StatExpertiseRating, - Stat.StatHitRating, - Stat.StatCritRating, - Stat.StatHasteRating, Stat.StatArmor, Stat.StatBonusArmor, - Stat.StatDodgeRating, - Stat.StatParryRating, - Stat.StatMasteryRating, ], epPseudoStats: [PseudoStat.PseudoStatMainHandDps], // Reference stat against which to calculate EP. I think all classes use either spell power or attack power. @@ -48,12 +41,10 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionWarrior, { Stat.StatStrength, Stat.StatAgility, Stat.StatAttackPower, - Stat.StatExpertiseRating, - Stat.StatMasteryRating, ], [ - PseudoStat.PseudoStatPhysicalHitPercent, - PseudoStat.PseudoStatPhysicalCritPercent, + PseudoStat.PseudoStatMeleeHitPercent, + PseudoStat.PseudoStatMeleeHitPercent, PseudoStat.PseudoStatMeleeHastePercent, PseudoStat.PseudoStatBlockPercent, PseudoStat.PseudoStatDodgePercent, @@ -69,13 +60,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionWarrior, { itemSwap: Presets.P2_ITEM_SWAP.itemSwap, // Default EP weights for sorting gear in the gear picker. epWeights: Presets.P2_EP_PRESET.epWeights, - // Default stat caps for the Reforge Optimizer - statCaps: (() => { - const hitCap = new Stats().withPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent, 7.5); - const expCap = new Stats().withStat(Stat.StatExpertiseRating, 15 * 4 * Mechanics.EXPERTISE_PER_QUARTER_PERCENT_REDUCTION); - - return hitCap.add(expCap); - })(), other: Presets.OtherDefaults, // Default consumes settings. consumables: Presets.DefaultConsumables, @@ -86,22 +70,11 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecProtectionWarrior, { // Default raid/party buffs settings. raidBuffs: RaidBuffs.create({ ...defaultRaidBuffMajorDamageCooldowns(Class.ClassWarrior), - arcaneBrilliance: true, - blessingOfKings: true, - blessingOfMight: true, - bloodlust: true, - elementalOath: true, - powerWordFortitude: true, - serpentsSwiftness: true, - trueshotAura: true, }), partyBuffs: PartyBuffs.create({}), individualBuffs: IndividualBuffs.create({}), debuffs: Debuffs.create({ - curseOfElements: true, - physicalVulnerability: true, - weakenedArmor: true, - weakenedBlows: true, + }), },