From ba0729a05efedebd53410763e0a6f7e269ca5a13 Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 10:05:28 -0500 Subject: [PATCH 1/8] Initial Tank cleanup --- ui/tank_warrior/apls/p1.apl.json | 8 ++++ ui/tank_warrior/apls/phase_4.apl.json | 35 --------------- ui/tank_warrior/gear_sets/blank.gear.json | 3 -- ui/tank_warrior/gear_sets/p0.bis.gear.json | 21 +++++++++ ui/tank_warrior/gear_sets/p1.bis.gear.json | 21 +++++++++ .../gear_sets/placeholder.gear.json | 19 -------- ui/tank_warrior/presets.ts | 44 +++++++------------ ui/tank_warrior/sim.ts | 12 +---- 8 files changed, 68 insertions(+), 95 deletions(-) create mode 100644 ui/tank_warrior/apls/p1.apl.json delete mode 100644 ui/tank_warrior/apls/phase_4.apl.json delete mode 100644 ui/tank_warrior/gear_sets/blank.gear.json create mode 100644 ui/tank_warrior/gear_sets/p0.bis.gear.json create mode 100644 ui/tank_warrior/gear_sets/p1.bis.gear.json delete mode 100644 ui/tank_warrior/gear_sets/placeholder.gear.json diff --git a/ui/tank_warrior/apls/p1.apl.json b/ui/tank_warrior/apls/p1.apl.json new file mode 100644 index 000000000..e9e08b803 --- /dev/null +++ b/ui/tank_warrior/apls/p1.apl.json @@ -0,0 +1,8 @@ +{ + "type": "TypeAPL", + "prepullActions": [], + "priorityList": [ + {"action":{"autocastOtherCooldowns":{}}}, + {"action":{"castSpell":{"spellId":{"spellId":11597,"rank":5}}}} + ] +} diff --git a/ui/tank_warrior/apls/phase_4.apl.json b/ui/tank_warrior/apls/phase_4.apl.json deleted file mode 100644 index be42906f5..000000000 --- a/ui/tank_warrior/apls/phase_4.apl.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":71}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":24427}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}}}, - {"action":{"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"61s"}}}},"castSpell":{"spellId":{"spellId":24427}}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionDefensiveEquip"}}}}, - {"action":{"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentHealthPercent":{}},"rhs":{"const":{"val":"50"}}}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpGe","lhs":{},"rhs":{"const":{"val":"35"}}}}]}},"castSpell":{"spellId":{"spellId":20569,"tag":1,"rank":5}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"35"}}}},"castSpell":{"spellId":{"spellId":25286,"tag":1,"rank":9}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":11581,"rank":6}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":440488}}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":14201}}}}},"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":413380}}},{"auraIsActive":{"auraId":{"spellId":413399}}}]}},"castSpell":{"spellId":{"spellId":11605,"rank":4}}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":460171}}}}},"castSpell":{"spellId":{"spellId":23925,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":426978}}},"castSpell":{"spellId":{"spellId":23925,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":440488}}}}, - {"action":{"castSpell":{"spellId":{"spellId":23925,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":11581,"rank":6}}}}, - {"action":{"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"castSpell":{"spellId":{"spellId":11601,"rank":5}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":412507}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":11574,"rank":7}}}}}]}},"castSpell":{"spellId":{"spellId":11574,"rank":7}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":403195}}},"castSpell":{"spellId":{"spellId":11597,"rank":5}}}}, - {"hide":true,"action":{"condition":{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11581,"rank":6}}}}},"castSpell":{"spellId":{"spellId":11581,"rank":6}}}}, - {"action":{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":20572}}}} - ] -} diff --git a/ui/tank_warrior/gear_sets/blank.gear.json b/ui/tank_warrior/gear_sets/blank.gear.json deleted file mode 100644 index 2feb21015..000000000 --- a/ui/tank_warrior/gear_sets/blank.gear.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "items": [] -} diff --git a/ui/tank_warrior/gear_sets/p0.bis.gear.json b/ui/tank_warrior/gear_sets/p0.bis.gear.json new file mode 100644 index 000000000..909a4e77c --- /dev/null +++ b/ui/tank_warrior/gear_sets/p0.bis.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":16731}, + {}, + {"id":16733}, + {}, + {"id":16730}, + {"id":16735}, + {"id":16737}, + {"id":16736}, + {"id":16732}, + {"id":16734}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] +} diff --git a/ui/tank_warrior/gear_sets/p1.bis.gear.json b/ui/tank_warrior/gear_sets/p1.bis.gear.json new file mode 100644 index 000000000..595f20b26 --- /dev/null +++ b/ui/tank_warrior/gear_sets/p1.bis.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":16866}, + {}, + {"id":16868}, + {}, + {"id":16865}, + {"id":16861}, + {"id":16863}, + {"id":16864}, + {"id":16867}, + {"id":16862}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] +} \ No newline at end of file diff --git a/ui/tank_warrior/gear_sets/placeholder.gear.json b/ui/tank_warrior/gear_sets/placeholder.gear.json deleted file mode 100644 index 601acc7dc..000000000 --- a/ui/tank_warrior/gear_sets/placeholder.gear.json +++ /dev/null @@ -1,19 +0,0 @@ -{"items": [ - {"id":18421}, - {"id":19540}, - {"id":14817}, - {"id":15138,"enchant":247}, - {"id":14811,"enchant":866}, - {"id":18458}, - {"id":15063,"enchant":904}, - {"id":18393}, - {"id":8309}, - {"id":6423,"enchant":849}, - {"id":2951}, - {"id":9533}, - {"id":13515}, - {"id":18473}, - {"id":22317,"enchant":7210}, - {"id":14812}, - {"id":16996} -]} \ No newline at end of file diff --git a/ui/tank_warrior/presets.ts b/ui/tank_warrior/presets.ts index 7d9ae4f60..74bc0a7ef 100644 --- a/ui/tank_warrior/presets.ts +++ b/ui/tank_warrior/presets.ts @@ -23,38 +23,35 @@ import { } from '../core/proto/common.js'; import { SavedTalents } from '../core/proto/ui.js'; import { TankWarrior_Options as TankWarriorOptions, WarriorShout, WarriorStance } from '../core/proto/warrior.js'; -import Phase4APL from './apls/phase_4.apl.json'; -import BlankGear from './gear_sets/blank.gear.json'; +import P1APL from './apls/p1.apl.json'; +import P0BISGear from './gear_sets/p0.bis.gear.json'; +import P1BISGear from './gear_sets/p1.bis.gear.json'; /////////////////////////////////////////////////////////////////////////// // Gear Presets /////////////////////////////////////////////////////////////////////////// -export const GearBlank = PresetUtils.makePresetGear('Blank', BlankGear); +export const GearP0BIS = PresetUtils.makePresetGear('Pre-BiS', P0BISGear); +export const GearP1BIS = PresetUtils.makePresetGear('P1 BiS', P1BISGear); -export const GearPresets = {}; +export const GearPresets = { + [Phase.Phase1]: [GearP0BIS, GearP1BIS], +}; -export const DefaultGear = GearBlank; +export const DefaultGear = GearP0BIS; /////////////////////////////////////////////////////////////////////////// // APL Presets /////////////////////////////////////////////////////////////////////////// -export const APLPhase4 = PresetUtils.makePresetAPLRotation('P4 Prot/Fury', Phase4APL, { customCondition: player => player.getLevel() === 60 }); +export const APLP1Prot = PresetUtils.makePresetAPLRotation('Protection', P1APL, { customCondition: player => player.getLevel() === 60 }); export const APLPresets = { - [Phase.Phase1]: [], - [Phase.Phase2]: [], - [Phase.Phase3]: [], - [Phase.Phase4]: [APLPhase4], - [Phase.Phase5]: [], + [Phase.Phase1]: [APLP1Prot], }; export const DefaultAPLs: Record = { - 25: APLPresets[Phase.Phase1][0], - 40: APLPresets[Phase.Phase2][0], - 50: APLPresets[Phase.Phase3][0], - 60: APLPresets[Phase.Phase4][0], + 60: APLPresets[Phase.Phase1][0], }; /////////////////////////////////////////////////////////////////////////// @@ -64,26 +61,17 @@ export const DefaultAPLs: Record = { // Default talents. Uses the wowhead calculator format, make the talents on // https://wowhead.com/classic/talent-calc and copy the numbers in the url. -export const TalentsPhase4Prot = PresetUtils.makePresetTalents('60 Prot', SavedTalents.create({ talentsString: '20304300302-03-55200110530201051' }), { - customCondition: player => player.getLevel() === 60, -}); - -export const TalentsPhase4Fury = PresetUtils.makePresetTalents('60 Fury', SavedTalents.create({ talentsString: '33302300302-05050005505010051' }), { +export const TalentsP1Prot = PresetUtils.makePresetTalents('Protection', SavedTalents.create({ talentsString: '20304300302-03-55200110530201051' }), { customCondition: player => player.getLevel() === 60, }); export const TalentPresets = { - [Phase.Phase1]: [], - [Phase.Phase2]: [], - [Phase.Phase3]: [], - [Phase.Phase4]: [TalentsPhase4Prot, TalentsPhase4Fury], - [Phase.Phase5]: [], + [Phase.Phase1]: [TalentsP1Prot], }; -export const DefaultTalents = TalentPresets[Phase.Phase4][0]; +export const DefaultTalents = TalentPresets[Phase.Phase1][0]; -export const PresetBuildTanky = PresetUtils.makePresetBuild('Tanky', { gear: DefaultGear, talents: TalentsPhase4Prot, rotation: DefaultAPLs[60] }); -export const PresetBuildDamage = PresetUtils.makePresetBuild('Damage', { gear: DefaultGear, talents: TalentsPhase4Fury, rotation: DefaultAPLs[60] }); +export const PresetBuildTanky = PresetUtils.makePresetBuild('Tanky', { gear: DefaultGear, talents: TalentsP1Prot, rotation: DefaultAPLs[60] }); /////////////////////////////////////////////////////////////////////////// // Options Presets diff --git a/ui/tank_warrior/sim.ts b/ui/tank_warrior/sim.ts index 70105d6f5..c5a7c8049 100644 --- a/ui/tank_warrior/sim.ts +++ b/ui/tank_warrior/sim.ts @@ -134,26 +134,18 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecTankWarrior, { presets: { // Preset talents that the user can quickly select. talents: [ - ...Presets.TalentPresets[Phase.Phase5], - ...Presets.TalentPresets[Phase.Phase4], - ...Presets.TalentPresets[Phase.Phase3], - ...Presets.TalentPresets[Phase.Phase2], ...Presets.TalentPresets[Phase.Phase1], ], // Preset rotations that the user can quickly select. rotations: [ - ...Presets.APLPresets[Phase.Phase5], - ...Presets.APLPresets[Phase.Phase4], - ...Presets.APLPresets[Phase.Phase3], - ...Presets.APLPresets[Phase.Phase2], ...Presets.APLPresets[Phase.Phase1], ], // Preset gear configurations that the user can quickly select. gear: [ - Presets.DefaultGear, + ...Presets.GearPresets[Phase.Phase1], ], // Preset builds that the user can quickly select. - builds: [Presets.PresetBuildTanky, Presets.PresetBuildDamage], + builds: [Presets.PresetBuildTanky], }, autoRotation: player => { From bc4f8fadaa23cbbbc16696c835417e0888d2c2af Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 10:18:51 -0500 Subject: [PATCH 2/8] Initial DPS cleanup --- ui/warrior/apls/p1.apl.json | 8 ++ ui/warrior/apls/phase_1_arms.apl.json | 16 ---- ui/warrior/apls/phase_2_arms.apl.json | 22 ----- ui/warrior/apls/phase_2_fury.apl.json | 25 ------ ui/warrior/apls/phase_3_arms.apl.json | 23 ----- ui/warrior/apls/phase_3_fury.apl.json | 34 -------- ui/warrior/apls/phase_3_glad.apl.json | 34 -------- ui/warrior/apls/phase_4_fury.apl.json | 35 -------- ui/warrior/apls/phase_4_glad.apl.json | 30 ------- ui/warrior/apls/phase_5_2h.apl.json | 28 ------ ui/warrior/apls/phase_5_dw.apl.json | 30 ------- ui/warrior/gear_sets/blank.gear.json | 1 - ui/warrior/gear_sets/p0.bis.gear.json | 22 +++++ ui/warrior/gear_sets/p1.bis.gear.json | 21 +++++ ui/warrior/presets.ts | 117 ++++---------------------- ui/warrior/sim.ts | 54 ++---------- 16 files changed, 74 insertions(+), 426 deletions(-) create mode 100644 ui/warrior/apls/p1.apl.json delete mode 100644 ui/warrior/apls/phase_1_arms.apl.json delete mode 100644 ui/warrior/apls/phase_2_arms.apl.json delete mode 100644 ui/warrior/apls/phase_2_fury.apl.json delete mode 100644 ui/warrior/apls/phase_3_arms.apl.json delete mode 100644 ui/warrior/apls/phase_3_fury.apl.json delete mode 100644 ui/warrior/apls/phase_3_glad.apl.json delete mode 100644 ui/warrior/apls/phase_4_fury.apl.json delete mode 100644 ui/warrior/apls/phase_4_glad.apl.json delete mode 100644 ui/warrior/apls/phase_5_2h.apl.json delete mode 100644 ui/warrior/apls/phase_5_dw.apl.json delete mode 100644 ui/warrior/gear_sets/blank.gear.json create mode 100644 ui/warrior/gear_sets/p0.bis.gear.json create mode 100644 ui/warrior/gear_sets/p1.bis.gear.json diff --git a/ui/warrior/apls/p1.apl.json b/ui/warrior/apls/p1.apl.json new file mode 100644 index 000000000..e9e08b803 --- /dev/null +++ b/ui/warrior/apls/p1.apl.json @@ -0,0 +1,8 @@ +{ + "type": "TypeAPL", + "prepullActions": [], + "priorityList": [ + {"action":{"autocastOtherCooldowns":{}}}, + {"action":{"castSpell":{"spellId":{"spellId":11597,"rank":5}}}} + ] +} diff --git a/ui/warrior/apls/phase_1_arms.apl.json b/ui/warrior/apls/phase_1_arms.apl.json deleted file mode 100644 index 0f0ec298b..000000000 --- a/ui/warrior/apls/phase_1_arms.apl.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2687}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"condition":{"spellCanCast":{"spellId":{"spellId":7384,"rank":1}}},"castSpell":{"spellId":{"spellId":7384,"rank":1}}}}, - {"action":{"condition":{"spellCanCast":{"spellId":{"spellId":402911}}},"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"remainingTime":{}},"rhs":{"auraRemainingTime":{"auraId":{"spellId":425418}}}}},"castSpell":{"spellId":{"spellId":5308,"rank":1}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"79"}}}},"castSpell":{"spellId":{"spellId":429765},"target":{"type":"Target"}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"40"}}}},{"cmp":{"op":"OpGt","lhs":{"auraRemainingTime":{"auraId":{"spellId":425418}}},"rhs":{"const":{"val":"5"}}}}]}},"castSpell":{"spellId":{"spellId":429765}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"95"}}}},{"cmp":{"op":"OpLt","lhs":{"autoTimeToNext":{"autoType":"Melee"}},"rhs":{"gcdTimeToReady":{}}}}]}},"castSpell":{"spellId":{"spellId":1608,"tag":1,"rank":4}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"65"}}}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"spellIsReady":{"spellId":{"spellId":20572}}},"castSpell":{"spellId":{"spellId":20572}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/apls/phase_2_arms.apl.json b/ui/warrior/apls/phase_2_arms.apl.json deleted file mode 100644 index 1699d55f3..000000000 --- a/ui/warrior/apls/phase_2_arms.apl.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-20s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-0.5s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}},"castSpell":{"spellId":{"spellId":18499}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":7887,"rank":2}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":2457}}},{"castSpell":{"spellId":{"spellId":7887,"rank":2}}},{"castSpell":{"spellId":{"spellId":2458}}}]}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"castSpell":{"spellId":{"spellId":12294,"rank":1}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":413399}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":8820,"rank":2}}},"rhs":{"const":{"val":"0.1s"}}}}]}},"castSpell":{"spellId":{"spellId":8820,"rank":2}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":12294,"rank":1}}},"rhs":{"const":{"val":"1.5s"}}}},"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":12294,"rank":1}}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":12294,"rank":1}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":1680}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}}]}},"castSpell":{"spellId":{"spellId":429765}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":20660,"rank":3}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11608,"tag":1,"rank":3}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11565,"tag":1,"rank":6}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/apls/phase_2_fury.apl.json b/ui/warrior/apls/phase_2_fury.apl.json deleted file mode 100644 index 7e46503cb..000000000 --- a/ui/warrior/apls/phase_2_fury.apl.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-20s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-0.5s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},"castSpell":{"spellId":{"spellId":437368}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"20s"}}}},"castSpell":{"spellId":{"spellId":437377}}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}},"castSpell":{"spellId":{"spellId":18499}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":20660,"rank":3}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":11565,"tag":1,"rank":6}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425418}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":413399}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":8820,"rank":2}}},"rhs":{"const":{"val":"0.1s"}}}}]}},"castSpell":{"spellId":{"spellId":8820,"rank":2}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":23894,"rank":4}}},"rhs":{"const":{"val":"1.5s"}}}},"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425418}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":23894,"rank":4}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":1680}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425418}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":429765}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425418}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":11608,"tag":1,"rank":3}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425418}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":11565,"tag":1,"rank":6}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/apls/phase_3_arms.apl.json b/ui/warrior/apls/phase_3_arms.apl.json deleted file mode 100644 index 799d757e6..000000000 --- a/ui/warrior/apls/phase_3_arms.apl.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-20s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-0.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"not":{"val":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":402877}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}}]}}}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":2458}}},{"castSpell":{"spellId":{"spellId":18499}}},{"castSpell":{"spellId":{"spellId":2457}}}]}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":11584,"rank":3}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"not":{"val":{"and":{"vals":[{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}}]}}}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":2458}}},{"castSpell":{"spellId":{"spellId":1680}}},{"castSpell":{"spellId":{"spellId":2457}}}]}}}, - {"action":{"castSpell":{"spellId":{"spellId":21551,"rank":2}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":413399}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":11604,"rank":3}}},"rhs":{"const":{"val":"0.1s"}}}}]}},"castSpell":{"spellId":{"spellId":11604,"rank":3}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":21551,"rank":2}}},"rhs":{"const":{"val":"1.5s"}}}},"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":21551,"rank":2}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"100"}}}}]}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":21551,"rank":2}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":1680}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}}]}},"castSpell":{"spellId":{"spellId":429765}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":20661,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11609,"tag":1,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/apls/phase_3_fury.apl.json b/ui/warrior/apls/phase_3_fury.apl.json deleted file mode 100644 index db8a94317..000000000 --- a/ui/warrior/apls/phase_3_fury.apl.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-20s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-0.5s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},"castSpell":{"spellId":{"spellId":437368}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"20s"}}}},"castSpell":{"spellId":{"spellId":437377}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"61s"}}}},"castSpell":{"spellId":{"spellId":24427}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"16s"}}}},"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"26s"}}}},"castSpell":{"spellId":{"spellId":20572}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"11s"}}}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":402877}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}}]}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":402877}}}}},{"cmp":{"op":"OpLt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"20"}}}}]}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":402877}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}}]}},"castSpell":{"spellId":{"spellId":18499}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":20661,"rank":4}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":426940}}},"rhs":{"const":{"val":"3"}}}},"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":403195}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":412513}}},{"auraIsActive":{"auraId":{"spellId":71}}}]}}]}},"castSpell":{"spellId":{"spellId":11596,"rank":4}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":413399}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":11604,"rank":3}}},"rhs":{"const":{"val":"0.1s"}}}}]}},"castSpell":{"spellId":{"spellId":11604,"rank":3}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":23894,"rank":4}}},"rhs":{"const":{"val":"1.5s"}}}},"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":23894,"rank":4}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":1680}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425418}}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425415}}},"rhs":{"const":{"val":"4"}}}}]}}]}},"castSpell":{"spellId":{"spellId":429765}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425418}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425415}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":11609,"tag":1,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425418}}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11609,"tag":1,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425418}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425415}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425418}}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/apls/phase_3_glad.apl.json b/ui/warrior/apls/phase_3_glad.apl.json deleted file mode 100644 index 86394ed3a..000000000 --- a/ui/warrior/apls/phase_3_glad.apl.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":412513}}},"doAtValue":{"const":{"val":"-20s"}}}, - {"action":{"castSpell":{"spellId":{"otherId":"OtherActionPotion"}}},"doAtValue":{"const":{"val":"-0.5s"}}} - ], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},"castSpell":{"spellId":{"spellId":437368}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"20s"}}}},"castSpell":{"spellId":{"spellId":437377}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"61s"}}}},"castSpell":{"spellId":{"spellId":24427}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"16s"}}}},"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"26s"}}}},"castSpell":{"spellId":{"spellId":20572}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"11s"}}}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":402877}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}}]}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":402877}}}}},{"cmp":{"op":"OpLt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"20"}}}}]}},"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":402877}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":402877}}}}}]}},"castSpell":{"spellId":{"spellId":18499}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":20661,"rank":4}}}}, - {"hide":true,"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":426940}}},"rhs":{"const":{"val":"3"}}}},"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":413399}}},{"cmp":{"op":"OpLt","lhs":{"spellCastTime":{"spellId":{"spellId":11604,"rank":3}}},"rhs":{"const":{"val":"0.1s"}}}}]}},"castSpell":{"spellId":{"spellId":11604,"rank":3}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":403195}}},{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":412513}}},{"auraIsActive":{"auraId":{"spellId":71}}}]}}]}},"castSpell":{"spellId":{"spellId":11596,"rank":4}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":23894,"rank":4}}},"rhs":{"const":{"val":"1.5s"}}}},"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"cmp":{"op":"OpGt","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":23894,"rank":4}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"spellId":1680}}},"rhs":{"const":{"val":"1.5s"}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425418}}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425415}}},"rhs":{"const":{"val":"4"}}}}]}}]}},"castSpell":{"spellId":{"spellId":429765}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425418}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425415}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":11609,"tag":1,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425418}}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"cmp":{"op":"OpGt","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11609,"tag":1,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":425418}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGt","lhs":{"auraNumStacks":{"auraId":{"spellId":425415}}},"rhs":{"const":{"val":"4"}}}}]}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":425418}}}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"50"}}}},{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":11566,"tag":1,"rank":7}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/apls/phase_4_fury.apl.json b/ui/warrior/apls/phase_4_fury.apl.json deleted file mode 100644 index 9ebab7203..000000000 --- a/ui/warrior/apls/phase_4_fury.apl.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":412513}}},"doAtValue":{"const":{"val":"-2s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":24427}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"2m25s"}}}}]}},"castSpell":{"spellId":{"itemId":13442}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":457816}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457816}}},"rhs":{"const":{"val":"4s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":457817}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457817}}},"rhs":{"const":{"val":"4s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"80"}}}}]}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"35s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"155s"}}}}]}},"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"211"}}}}]}},"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"61s"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"7m1s"}}}}]}},"castSpell":{"spellId":{"spellId":24427}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"205s"}}}}]}},"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"26s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"146s"}}}}]}},"castSpell":{"spellId":{"spellId":20572}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"205s"}}}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":20569,"tag":1,"rank":5}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"condition":{"cmp":{"op":"OpEq","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":25286,"tag":1,"rank":9}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":440113}}},{"auraIsActive":{"auraId":{"spellId":440114}}},{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"55"}}}}]}},"castSpell":{"spellId":{"spellId":20662,"rank":5}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":413380}}},{"auraIsActive":{"auraId":{"spellId":413399}}}]}},"castSpell":{"spellId":{"spellId":11605,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"isExecutePhase":{"threshold":"E20"}},"castSpell":{"spellId":{"spellId":20662,"rank":5}}}}, - {"action":{"castSpell":{"spellId":{"spellId":11585,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":412507}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":11574,"rank":7}}}}}]}},"castSpell":{"spellId":{"spellId":11574,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"auraIsActive":{"auraId":{"spellId":412513}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"60"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"auraIsActive":{"auraId":{"spellId":2458}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"60"}}}}]}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"castSpell":{"spellId":{"spellId":27584,"rank":3}}}} - ] -} diff --git a/ui/warrior/apls/phase_4_glad.apl.json b/ui/warrior/apls/phase_4_glad.apl.json deleted file mode 100644 index 3db156b0d..000000000 --- a/ui/warrior/apls/phase_4_glad.apl.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-2s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":412513}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"condition":{"not":{"val":{"auraIsActive":{"auraId":{"spellId":412513}}}}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":457816}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457816}}},"rhs":{"const":{"val":"4s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"65"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"2m25s"}}}}]}},"castSpell":{"spellId":{"itemId":13442}}}}, - {"action":{"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"35s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"155s"}}}}]}},"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"31s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"211"}}}}]}},"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"61s"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"7m1s"}}}}]}},"castSpell":{"spellId":{"spellId":24427}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"205s"}}}}]}},"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"26s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"146s"}}}}]}},"castSpell":{"spellId":{"spellId":20572}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"25s"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"205s"}}}}]}},"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":20569,"tag":1,"rank":5}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"castSpell":{"spellId":{"spellId":25286,"tag":1,"rank":9}}}}, - {"action":{"castSpell":{"spellId":{"spellId":20662,"rank":5}}}}, - {"action":{"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"and":{}},"castSpell":{"spellId":{"spellId":11585,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":412507}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":11574,"rank":7}}}}}]}},"castSpell":{"spellId":{"spellId":11574,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"auraIsActive":{"auraId":{"spellId":412513}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"34"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"castSpell":{"spellId":{"spellId":11597,"rank":5}}}}, - {"action":{"castSpell":{"spellId":{"spellId":402911}}}} - ] -} diff --git a/ui/warrior/apls/phase_5_2h.apl.json b/ui/warrior/apls/phase_5_2h.apl.json deleted file mode 100644 index 202d2233f..000000000 --- a/ui/warrior/apls/phase_5_2h.apl.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2687}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":412513}}},"doAtValue":{"const":{"val":"-2s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":24427}}},"doAtValue":{"const":{"val":"-1.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":457816}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457816}}},"rhs":{"const":{"val":"3s"}}}}]}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":457708}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457708}}},"rhs":{"const":{"val":"3s"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"castSpell":{"spellId":{"itemId":13442}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":412507}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":11574,"rank":7}}},"rhs":{"const":{"val":"0"}}}}]}},"castSpell":{"spellId":{"spellId":11574,"rank":7}}}}, - {"action":{"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":1719}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":1719}}}}}]}},"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":464241}}}}},{"auraIsActive":{"auraId":{"spellId":412513}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"35"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":464241}}}}},{"auraIsActive":{"auraId":{"spellId":2458}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"35"}}}}]}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"55"}}}},{"cmp":{"op":"OpLe","lhs":{"autoTimeToNext":{"autoType":"Melee"}},"rhs":{"const":{"val":"2.5"}}}}]}},"castSpell":{"spellId":{"spellId":20662,"rank":5}}}}, - {"action":{"condition":{"not":{"val":{"isExecutePhase":{"threshold":"E20"}}}},"castSpell":{"spellId":{"spellId":25286,"tag":1,"rank":9}}}}, - {"action":{"castSpell":{"spellId":{"spellId":11585,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":413399}}},{"auraIsActive":{"auraId":{"spellId":413399}}}]}},"castSpell":{"spellId":{"spellId":11605,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":429765}}}} - ] -} diff --git a/ui/warrior/apls/phase_5_dw.apl.json b/ui/warrior/apls/phase_5_dw.apl.json deleted file mode 100644 index 321920ac7..000000000 --- a/ui/warrior/apls/phase_5_dw.apl.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":2687}}},"doAtValue":{"const":{"val":"-5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":412513}}},"doAtValue":{"const":{"val":"-2s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":2458}}},"doAtValue":{"const":{"val":"-1s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":24427}}},"doAtValue":{"const":{"val":"-1s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":457817}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457817}}},"rhs":{"const":{"val":"3s"}}}}]}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457816}}},"rhs":{"const":{"val":"3s"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":457816}}},"rhs":{"const":{"val":"3s"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"auraIsActive":{"auraId":{"spellId":412513}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"60"}}}}]}},"castSpell":{"spellId":{"spellId":2458}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":464241}}},{"auraIsActive":{"auraId":{"spellId":2458}}},{"cmp":{"op":"OpLe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"60"}}}}]}},"castSpell":{"spellId":{"spellId":412513}}}}, - {"action":{"castSpell":{"spellId":{"spellId":2687}}}}, - {"action":{"castSpell":{"spellId":{"itemId":13442}}}}, - {"action":{"castSpell":{"spellId":{"spellId":426940}}}}, - {"action":{"castSpell":{"spellId":{"spellId":12328}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":1719}}}}, - {"action":{"castSpell":{"spellId":{"spellId":25286,"tag":1,"rank":9}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":412507}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":11574,"rank":7}}},"rhs":{"const":{"val":"0"}}}}]}},"castSpell":{"spellId":{"spellId":11574,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentRage":{}},"rhs":{"const":{"val":"75"}}}},{"cmp":{"op":"OpLe","lhs":{"autoTimeToNext":{"autoType":"Melee"}},"rhs":{"const":{"val":"2s"}}}}]}},"castSpell":{"spellId":{"spellId":20662,"rank":5}}}}, - {"action":{"castSpell":{"spellId":{"spellId":23894,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":11585,"rank":4}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":413399}}},{"auraIsActive":{"auraId":{"spellId":413399}}}]}},"castSpell":{"spellId":{"spellId":11605,"rank":4}}}}, - {"action":{"castSpell":{"spellId":{"spellId":1680}}}}, - {"action":{"castSpell":{"spellId":{"spellId":402911}}}}, - {"action":{"castSpell":{"spellId":{"spellId":27584,"rank":3}}}} - ] -} \ No newline at end of file diff --git a/ui/warrior/gear_sets/blank.gear.json b/ui/warrior/gear_sets/blank.gear.json deleted file mode 100644 index 4bcab0861..000000000 --- a/ui/warrior/gear_sets/blank.gear.json +++ /dev/null @@ -1 +0,0 @@ -{"items": []} \ No newline at end of file diff --git a/ui/warrior/gear_sets/p0.bis.gear.json b/ui/warrior/gear_sets/p0.bis.gear.json new file mode 100644 index 000000000..c45cbee9a --- /dev/null +++ b/ui/warrior/gear_sets/p0.bis.gear.json @@ -0,0 +1,22 @@ +{ + "items": [ + {"id":16731}, + {}, + {"id":16733}, + {}, + {"id":16730}, + {"id":16735}, + {"id":16737}, + {"id":16736}, + {"id":16732}, + {"id":16734}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] + } + \ No newline at end of file diff --git a/ui/warrior/gear_sets/p1.bis.gear.json b/ui/warrior/gear_sets/p1.bis.gear.json new file mode 100644 index 000000000..cf22bce0f --- /dev/null +++ b/ui/warrior/gear_sets/p1.bis.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":16866}, + {}, + {"id":16868}, + {}, + {"id":16865}, + {"id":16861}, + {"id":16863}, + {"id":16864}, + {"id":16867}, + {"id":16862}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] + } \ No newline at end of file diff --git a/ui/warrior/presets.ts b/ui/warrior/presets.ts index f2beb0e11..cb08d19d1 100644 --- a/ui/warrior/presets.ts +++ b/ui/warrior/presets.ts @@ -23,17 +23,9 @@ import { } from '../core/proto/common.js'; import { SavedTalents } from '../core/proto/ui.js'; import { Warrior_Options as WarriorOptions, WarriorShout, WarriorStance } from '../core/proto/warrior.js'; -import Phase1APLArms from './apls/phase_1_arms.apl.json'; -import Phase2APLArms from './apls/phase_2_arms.apl.json'; -import Phase2APLFury from './apls/phase_2_fury.apl.json'; -import Phase3APLArms from './apls/phase_3_arms.apl.json'; -import Phase3APLFury from './apls/phase_3_fury.apl.json'; -import Phase3APLGlad from './apls/phase_3_glad.apl.json'; -import Phase4APLFury from './apls/phase_4_fury.apl.json'; -import Phase4APLGlad from './apls/phase_4_glad.apl.json'; -import Phase5APL2H from './apls/phase_5_2h.apl.json'; -import Phase5APLDW from './apls/phase_5_dw.apl.json'; -import BlankGear from './gear_sets/blank.gear.json'; +import P1APL from './apls/p1.apl.json'; +import P0BISGear from './gear_sets/p0.bis.gear.json'; +import P1BISGear from './gear_sets/p1.bis.gear.json'; // Preset options for this spec. // Eventually we will import these values for the raid sim too, so its good to @@ -43,65 +35,27 @@ import BlankGear from './gear_sets/blank.gear.json'; // Gear Presets /////////////////////////////////////////////////////////////////////////// -export const GearBlank = PresetUtils.makePresetGear('Blank', BlankGear); +export const GearP0BIS = PresetUtils.makePresetGear('Pre-BiS', P0BISGear); +export const GearP1BIS = PresetUtils.makePresetGear('P1 BiS', P1BISGear); -export const GearPresets = {}; +export const GearPresets = { + [Phase.Phase1]: [GearP0BIS, GearP1BIS], +}; -export const DefaultGear = GearBlank; +export const DefaultGear = GearP0BIS; /////////////////////////////////////////////////////////////////////////// // APL Presets /////////////////////////////////////////////////////////////////////////// -export const APLPhase1Arms = PresetUtils.makePresetAPLRotation('P1 Arms', Phase1APLArms, { customCondition: player => player.getLevel() === 25 }); - -export const APLPhase2Arms = PresetUtils.makePresetAPLRotation('P2 Arms', Phase2APLArms, { customCondition: player => player.getLevel() === 40 }); -export const APLPhase2Fury = PresetUtils.makePresetAPLRotation('P2 Fury', Phase2APLFury, { customCondition: player => player.getLevel() === 40 }); - -export const APLPhase3Arms = PresetUtils.makePresetAPLRotation('P3 Arms', Phase3APLArms, { customCondition: player => player.getLevel() === 50 }); -export const APLPhase3Fury = PresetUtils.makePresetAPLRotation('P3 Fury', Phase3APLFury, { customCondition: player => player.getLevel() === 50 }); -export const APLPhase3Glad = PresetUtils.makePresetAPLRotation('P3 Glad', Phase3APLGlad, { customCondition: player => player.getLevel() === 50 }); - -export const APLPhase4Fury = PresetUtils.makePresetAPLRotation('P4 Fury', Phase4APLFury, { customCondition: player => player.getLevel() === 60 }); -export const APLPhase4Glad = PresetUtils.makePresetAPLRotation('P4 Glad', Phase4APLGlad, { customCondition: player => player.getLevel() === 60 }); -// No arms rotation right now -export const APLPhase4Arms = APLPhase4Fury; - -export const APLPhase52H = PresetUtils.makePresetAPLRotation('Phase 5 2H', Phase5APL2H, { - customCondition: player => player.getLevel() === 60, -}); -export const APLPhase5DW = PresetUtils.makePresetAPLRotation('Phase 5 DW', Phase5APLDW, { - customCondition: player => player.getLevel() === 60, -}); +export const APLP1DPS = PresetUtils.makePresetAPLRotation('DPS', P1APL, { customCondition: player => player.getLevel() === 60 }); export const APLPresets = { - [Phase.Phase1]: [APLPhase1Arms], - [Phase.Phase2]: [APLPhase2Arms, APLPhase2Fury], - [Phase.Phase3]: [APLPhase3Arms, APLPhase3Fury, APLPhase3Glad], - [Phase.Phase4]: [APLPhase4Arms, APLPhase4Fury, APLPhase4Glad], - [Phase.Phase5]: [APLPhase52H, APLPhase5DW], + [Phase.Phase1]: [APLP1DPS], }; -export const DefaultAPLs: Record> = { - 25: { - 0: APLPresets[Phase.Phase1][0], - 1: APLPresets[Phase.Phase1][0], - 2: APLPresets[Phase.Phase1][0], - }, - 40: { - 0: APLPresets[Phase.Phase2][0], - 1: APLPresets[Phase.Phase2][1], - 2: APLPresets[Phase.Phase2][0], - }, - 50: { - 0: APLPresets[Phase.Phase3][0], - 1: APLPresets[Phase.Phase3][1], - 2: APLPresets[Phase.Phase3][0], - }, - 60: { - 0: APLPresets[Phase.Phase5][0], // 2H - 1: APLPresets[Phase.Phase5][1], // DW - }, +export const DefaultAPLs: Record = { + 60: APLPresets[Phase.Phase1][0], }; /////////////////////////////////////////////////////////////////////////// @@ -111,54 +65,15 @@ export const DefaultAPLs: Record player.getLevel() === 25, -}); - -export const TalentsPhase2Arms = PresetUtils.makePresetTalents('40 Arms', SavedTalents.create({ talentsString: '303050213525100001' }), { - customCondition: player => player.getLevel() === 40, -}); -export const TalentsPhase2Fury = PresetUtils.makePresetTalents('40 Fury', SavedTalents.create({ talentsString: '-05050005405010051' }), { - customCondition: player => player.getLevel() === 40, -}); - -export const TalentsPhase3Arms = PresetUtils.makePresetTalents('50 Arms', SavedTalents.create({ talentsString: '303050213520105001-0505' }), { - customCondition: player => player.getLevel() === 50, -}); -export const TalentsPhase3Fury = PresetUtils.makePresetTalents('50 Fury', SavedTalents.create({ talentsString: '303040003-0505000540501003' }), { - customCondition: player => player.getLevel() === 50, -}); -// Glad talents are identical to fury at the moment -export const TalentsPhase3Glad = TalentsPhase3Fury; - -export const TalentsPhase4Fury = PresetUtils.makePresetTalents('60 Fury DW', SavedTalents.create({ talentsString: '20305020302-05050005525010051' }), { - customCondition: player => player.getLevel() === 60, -}); -export const TalentsPhase4Glad = PresetUtils.makePresetTalents('60 Glad', SavedTalents.create({ talentsString: '30305020302-05050005025012251' }), { - customCondition: player => player.getLevel() === 60, -}); - -export const TalentsPhase52H = PresetUtils.makePresetTalents('60 Fury 2H', SavedTalents.create({ talentsString: '20305020332-55020005025010051' }), { +export const TalentsP1DPS = PresetUtils.makePresetTalents('DPS', SavedTalents.create({ talentsString: '20305020302-05050005525010051' }), { customCondition: player => player.getLevel() === 60, }); export const TalentPresets = { - [Phase.Phase1]: [TalentsPhase1], - [Phase.Phase2]: [TalentsPhase2Arms, TalentsPhase2Fury], - [Phase.Phase3]: [TalentsPhase3Arms, TalentsPhase3Fury, TalentsPhase3Glad], - [Phase.Phase4]: [TalentsPhase4Fury, TalentsPhase4Glad], - [Phase.Phase5]: [TalentsPhase52H, TalentsPhase4Fury], + [Phase.Phase1]: [TalentsP1DPS], }; -export const DefaultTalents2H = TalentPresets[Phase.Phase5][0]; -export const DefaultTalentsDW = TalentPresets[Phase.Phase5][1]; -// export const DefaultTalentsGlad = TalentPresets[Phase.Phase4][3]; - -export const DefaultTalents = DefaultTalents2H; - -export const PresetBuild2H = PresetUtils.makePresetBuild('Two-Handed', { gear: DefaultGear, talents: DefaultTalents2H, rotation: DefaultAPLs[60][0] }); -export const PresetBuildDW = PresetUtils.makePresetBuild('Dual-Wield', { gear: DefaultGear, talents: DefaultTalentsDW, rotation: DefaultAPLs[60][1] }); -// export const PresetBuildGlad = PresetUtils.makePresetBuild('Glad', { gear: DefaultGearGlad, talents: DefaultTalentsGlad, rotation: DefaultAPLs[60][3] }); +export const DefaultTalents = TalentPresets[Phase.Phase1][0]; /////////////////////////////////////////////////////////////////////////// // Options Presets diff --git a/ui/warrior/sim.ts b/ui/warrior/sim.ts index 116160046..679267e7b 100644 --- a/ui/warrior/sim.ts +++ b/ui/warrior/sim.ts @@ -111,79 +111,39 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecWarrior, { presets: { // Preset talents that the user can quickly select. talents: [ - ...Presets.TalentPresets[Phase.Phase5], - ...Presets.TalentPresets[Phase.Phase4], - ...Presets.TalentPresets[Phase.Phase3], - ...Presets.TalentPresets[Phase.Phase2], ...Presets.TalentPresets[Phase.Phase1], ], // Preset rotations that the user can quickly select. rotations: [ - ...Presets.APLPresets[Phase.Phase5], - ...Presets.APLPresets[Phase.Phase4], - ...Presets.APLPresets[Phase.Phase3], - ...Presets.APLPresets[Phase.Phase2], ...Presets.APLPresets[Phase.Phase1], ], // Preset gear configurations that the user can quickly select. gear: [ - Presets.DefaultGear, + ...Presets.GearPresets[Phase.Phase1], ], // Preset builds that the user can quickly select. - builds: [Presets.PresetBuild2H, Presets.PresetBuildDW], + builds: [], }, autoRotation: player => { const level = player.getLevel(); const talentTree = player.getTalentTree(); - if (level < 60) { - return Presets.DefaultAPLs[level][talentTree].rotation.rotation!; - } - if (player.getEquippedItem(ItemSlot.ItemSlotMainHand)?._item.handType === HandType.HandTypeTwoHand) { - return Presets.DefaultAPLs[level][0].rotation.rotation!; + return Presets.DefaultAPLs[0].rotation.rotation!; } - return Presets.DefaultAPLs[level][1].rotation.rotation!; + return Presets.DefaultAPLs[0].rotation.rotation!; }, raidSimPresets: [ { spec: Spec.SpecWarrior, - tooltip: 'Arms Warrior', - defaultName: 'Arms', + tooltip: 'DPS Warrior', + defaultName: 'DPS', iconUrl: getSpecIcon(Class.ClassWarrior, 0), - talents: Presets.DefaultTalents2H.data, - specOptions: Presets.DefaultOptions, - consumes: Presets.DefaultConsumes, - defaultFactionRaces: { - [Faction.Unknown]: Race.RaceUnknown, - [Faction.Alliance]: Race.RaceHuman, - [Faction.Horde]: Race.RaceOrc, - }, - defaultGear: { - [Faction.Unknown]: {}, - [Faction.Alliance]: { - 1: Presets.DefaultGear.gear, - 2: Presets.DefaultGear.gear, - 3: Presets.DefaultGear.gear, - }, - [Faction.Horde]: { - 1: Presets.DefaultGear.gear, - 2: Presets.DefaultGear.gear, - 3: Presets.DefaultGear.gear, - }, - }, - }, - { - spec: Spec.SpecWarrior, - tooltip: 'Fury Warrior', - defaultName: 'Fury', - iconUrl: getSpecIcon(Class.ClassWarrior, 1), - - talents: Presets.DefaultTalentsDW.data, + talents: Presets.DefaultTalents.data, specOptions: Presets.DefaultOptions, consumes: Presets.DefaultConsumes, defaultFactionRaces: { From e7e40439ff78914f374b239fe08ebc1c39542bfd Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 10:31:00 -0500 Subject: [PATCH 3/8] Updated Warrior tests --- .../dps_warrior/TestP1DPSWarrior.results | 190 +++++++++++++++++ sim/warrior/dps_warrior/dps_warrior_test.go | 46 +--- .../tank_warrior/TestP1TankWarrior.results | 196 ++++++++++++++++++ sim/warrior/tank_warrior/tank_warrior_test.go | 20 +- 4 files changed, 406 insertions(+), 46 deletions(-) create mode 100644 sim/warrior/dps_warrior/TestP1DPSWarrior.results create mode 100644 sim/warrior/tank_warrior/TestP1TankWarrior.results diff --git a/sim/warrior/dps_warrior/TestP1DPSWarrior.results b/sim/warrior/dps_warrior/TestP1DPSWarrior.results new file mode 100644 index 000000000..eb4867fbf --- /dev/null +++ b/sim/warrior/dps_warrior/TestP1DPSWarrior.results @@ -0,0 +1,190 @@ +character_stats_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-CharacterStats-Default" + value: { + final_stats: 462.3 + final_stats: 318.55 + final_stats: 526.355 + final_stats: 102.35 + final_stats: 177.1 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 41.25 + final_stats: 0 + final_stats: 21 + final_stats: 0 + final_stats: 0 + final_stats: 1794.6 + final_stats: 0 + final_stats: 37.9275 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4843.1 + final_stats: 620 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 15.9275 + final_stats: 5 + final_stats: 0 + final_stats: 7072.55 + final_stats: 35 + final_stats: 68 + final_stats: 68 + final_stats: 68 + final_stats: 68 + final_stats: 384 + final_stats: 0 + final_stats: 0 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-StatWeights-Default" + value: { + weights: 0.35282 + weights: 0.21439 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.14747 + weights: 0 + weights: 3.90983 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Average-Default" + value: { + dps: 279.75214 + tps: 224.23004 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" + value: { + tps: 23.33333 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" + value: { + tps: 1.16667 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" + value: { + tps: 5 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 2.41 + tps: 105.05542 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 0.115 + tps: 17.71199 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 0.1875 + tps: 29.18709 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" + value: { + tps: 23.33333 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" + value: { + tps: 1.16667 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" + value: { + tps: 5 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 2.41 + tps: 105.05542 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 0.115 + tps: 17.71199 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 0.1875 + tps: 29.18709 + } +} +dps_results: { + key: "TestP1DPSWarrior-Phase1-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 209.40635 + tps: 168.01212 + } +} diff --git a/sim/warrior/dps_warrior/dps_warrior_test.go b/sim/warrior/dps_warrior/dps_warrior_test.go index 5ddd43481..5ed2da016 100644 --- a/sim/warrior/dps_warrior/dps_warrior_test.go +++ b/sim/warrior/dps_warrior/dps_warrior_test.go @@ -12,21 +12,21 @@ func init() { RegisterDpsWarrior() } -func TestDualWieldWarrior(t *testing.T) { +func TestP1DPSWarrior(t *testing.T) { core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator([]core.CharacterSuiteConfig{ { Class: proto.Class_ClassWarrior, - Phase: 5, + Phase: 1, Level: 60, Race: proto.Race_RaceOrc, OtherRaces: []proto.Race{proto.Race_RaceHuman}, - Talents: P4FuryTalents, - GearSet: core.GetGearSet("../../../ui/warrior/gear_sets", "blank"), - Rotation: core.GetAplRotation("../../../ui/warrior/apls", "phase_5_dw"), + Talents: P1Talents, + GearSet: core.GetGearSet("../../../ui/warrior/gear_sets", "p0.bis"), + Rotation: core.GetAplRotation("../../../ui/warrior/apls", "p1"), Buffs: core.FullBuffs, - Consumes: Phase4Consumes, - SpecOptions: core.SpecOptionsCombo{Label: "Fury", SpecOptions: PlayerOptionsFury}, + Consumes: P1Consumes, + SpecOptions: core.SpecOptionsCombo{Label: "DPS", SpecOptions: PlayerOptionsFury}, ItemFilter: ItemFilters, EPReferenceStat: proto.Stat_StatAttackPower, @@ -35,36 +35,10 @@ func TestDualWieldWarrior(t *testing.T) { })) } -func TestTwoHandedWarrior(t *testing.T) { - core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator([]core.CharacterSuiteConfig{ - { - Class: proto.Class_ClassWarrior, - Phase: 5, - Level: 60, - Race: proto.Race_RaceOrc, - OtherRaces: []proto.Race{proto.Race_RaceHuman}, - - Talents: P4FuryTalents, - GearSet: core.GetGearSet("../../../ui/warrior/gear_sets", "blank"), - Rotation: core.GetAplRotation("../../../ui/warrior/apls", "phase_5_2h"), - Buffs: core.FullBuffs, - Consumes: Phase4Consumes, - SpecOptions: core.SpecOptionsCombo{Label: "Arms", SpecOptions: PlayerOptionsArms}, - - ItemFilter: ItemFilters, - EPReferenceStat: proto.Stat_StatAttackPower, - StatsToWeigh: Stats, - }, - })) -} - -var P2ArmsTalents = "303050213525100001" -var P2FuryTalents = "-05050005405010051" -var P3ArmsTalents = "303050213520105001-0505" -var P4FuryTalents = "20305020302-05050005525010051" +var P1Talents = "20305020302-05050005525010051" -var Phase4Consumes = core.ConsumesCombo{ - Label: "P4-Consumes", +var P1Consumes = core.ConsumesCombo{ + Label: "P1-Consumes", Consumes: &proto.Consumes{ AgilityElixir: proto.AgilityElixir_ElixirOfTheMongoose, AttackPowerBuff: proto.AttackPowerBuff_JujuMight, diff --git a/sim/warrior/tank_warrior/TestP1TankWarrior.results b/sim/warrior/tank_warrior/TestP1TankWarrior.results new file mode 100644 index 000000000..cb51bc724 --- /dev/null +++ b/sim/warrior/tank_warrior/TestP1TankWarrior.results @@ -0,0 +1,196 @@ +character_stats_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-CharacterStats-Default" + value: { + final_stats: 462.3 + final_stats: 318.55 + final_stats: 526.355 + final_stats: 102.35 + final_stats: 177.1 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 41.25 + final_stats: 0 + final_stats: 21 + final_stats: 0 + final_stats: 0 + final_stats: 1794.6 + final_stats: 0 + final_stats: 33.9275 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 4843.1 + final_stats: 620 + final_stats: 10 + final_stats: 10.4 + final_stats: 0 + final_stats: 16.3275 + final_stats: 5.4 + final_stats: 0 + final_stats: 8272.55 + final_stats: 35 + final_stats: 68 + final_stats: 68 + final_stats: 68 + final_stats: 68 + final_stats: 384 + final_stats: 0 + final_stats: 0 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-StatWeights-Default" + value: { + weights: 0.25206 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.10552 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Average-Default" + value: { + dps: 200.93042 + tps: 302.77703 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 0.23399 + tps: 42.93425 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 0.01272 + tps: 4.24878 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-FullBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 0.06358 + tps: 19.53095 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 2.92545 + tps: 144.46153 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 0.14107 + tps: 38.35287 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-NoBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 0.18563 + tps: 56.45677 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 0.23436 + tps: 37.85919 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 0.01309 + tps: 2.82172 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-FullBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 0.06543 + tps: 12.10563 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 2.92545 + tps: 138.35598 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 0.14107 + tps: 36.99731 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-NoBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 0.18563 + tps: 48.70352 + } +} +dps_results: { + key: "TestP1TankWarrior-Phase1-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 172.06887 + tps: 259.70677 + } +} diff --git a/sim/warrior/tank_warrior/tank_warrior_test.go b/sim/warrior/tank_warrior/tank_warrior_test.go index 8d41b9aa1..27f44459d 100644 --- a/sim/warrior/tank_warrior/tank_warrior_test.go +++ b/sim/warrior/tank_warrior/tank_warrior_test.go @@ -12,21 +12,21 @@ func init() { RegisterTankWarrior() } -func TestTankWarrior(t *testing.T) { +func TestP1TankWarrior(t *testing.T) { core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator([]core.CharacterSuiteConfig{ { Class: proto.Class_ClassWarrior, - Phase: 4, + Phase: 1, Level: 60, Race: proto.Race_RaceOrc, OtherRaces: []proto.Race{proto.Race_RaceHuman}, - Talents: P4Talents, - GearSet: core.GetGearSet("../../../ui/tank_warrior/gear_sets", "placeholder"), - Rotation: core.GetAplRotation("../../../ui/tank_warrior/apls", "phase_4"), + Talents: P1Talents, + GearSet: core.GetGearSet("../../../ui/tank_warrior/gear_sets", "p0.bis"), + Rotation: core.GetAplRotation("../../../ui/tank_warrior/apls", "p1"), Buffs: core.FullBuffs, - Consumes: Phase4Consumes, - SpecOptions: core.SpecOptionsCombo{Label: "Arms", SpecOptions: PlayerOptionsBasic}, + Consumes: P1Consumes, + SpecOptions: core.SpecOptionsCombo{Label: "Protection", SpecOptions: PlayerOptionsBasic}, ItemFilter: ItemFilters, EPReferenceStat: proto.Stat_StatAttackPower, @@ -35,7 +35,7 @@ func TestTankWarrior(t *testing.T) { })) } -var P4Talents = "20304300302-03-55200110530201051" +var P1Talents = "20304300302-03-55200110530201051" var PlayerOptionsBasic = &proto.Player_TankWarrior{ TankWarrior: &proto.TankWarrior{ @@ -48,8 +48,8 @@ var warriorOptions = &proto.TankWarrior_Options{ StartingRage: 0, } -var Phase4Consumes = core.ConsumesCombo{ - Label: "P4-Consumes", +var P1Consumes = core.ConsumesCombo{ + Label: "P1-Consumes", Consumes: &proto.Consumes{ AgilityElixir: proto.AgilityElixir_ElixirOfTheMongoose, AttackPowerBuff: proto.AttackPowerBuff_JujuMight, From ba50ab5e885c55a82af05caa0b02ba0546804501 Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 16:24:11 -0500 Subject: [PATCH 4/8] Adjusted Warrior APL to avoid a use case bug found. Bug documented separately. --- sim/core/simsignals/api_test.go | 2 +- .../dps_warrior/TestP1DPSWarrior.results | 58 ++++++++++-------- .../tank_warrior/TestP1TankWarrior.results | 60 +++++++++---------- ui/tank_warrior/apls/p1.apl.json | 2 +- ui/warrior/apls/p1.apl.json | 2 +- 5 files changed, 65 insertions(+), 59 deletions(-) diff --git a/sim/core/simsignals/api_test.go b/sim/core/simsignals/api_test.go index 8d87da8fe..f51f2d100 100644 --- a/sim/core/simsignals/api_test.go +++ b/sim/core/simsignals/api_test.go @@ -18,7 +18,7 @@ func TestAbort(t *testing.T) { Level: 60, Race: proto.Race_RaceOrc, Class: proto.Class_ClassWarrior, - Equipment: core.GetGearSet("../../../ui/tank_warrior/gear_sets", "placeholder").GearSet, + Equipment: core.GetGearSet("../../../ui/tank_warrior/gear_sets", "p0.bis").GearSet, Rotation: &proto.APLRotation{}, Consumes: &proto.Consumes{}, Spec: &proto.Player_Warrior{ diff --git a/sim/warrior/dps_warrior/TestP1DPSWarrior.results b/sim/warrior/dps_warrior/TestP1DPSWarrior.results index eb4867fbf..1984c5aca 100644 --- a/sim/warrior/dps_warrior/TestP1DPSWarrior.results +++ b/sim/warrior/dps_warrior/TestP1DPSWarrior.results @@ -50,8 +50,8 @@ character_stats_results: { stat_weights_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-StatWeights-Default" value: { - weights: 0.35282 - weights: 0.21439 + weights: 0.49761 + weights: 0.26243 weights: 0 weights: 0 weights: 0 @@ -67,9 +67,9 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 0.14747 + weights: -0.09142 weights: 0 - weights: 3.90983 + weights: 3.0773 weights: 0 weights: 0 weights: 0 @@ -99,92 +99,98 @@ stat_weights_results: { dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Average-Default" value: { - dps: 279.75214 - tps: 224.23004 + dps: 252.15479 + tps: 220.34291 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - tps: 23.33333 + dps: 33.99834 + tps: 119.61369 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - tps: 1.16667 + dps: 30.8644 + tps: 31.88411 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - tps: 5 + dps: 78.32938 + tps: 73.13359 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 2.41 - tps: 105.05542 + dps: 15.19081 + tps: 104.56766 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 0.115 - tps: 17.71199 + dps: 12.89581 + tps: 17.50924 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Human-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 0.1875 - tps: 29.18709 + dps: 32.9784 + tps: 36.85281 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - tps: 23.33333 + dps: 36.5712 + tps: 121.67198 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - tps: 1.16667 + dps: 33.43726 + tps: 33.9424 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - tps: 5 + dps: 83.96505 + tps: 77.64213 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 2.41 - tps: 105.05542 + dps: 16.24178 + tps: 105.40844 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 0.115 - tps: 17.71199 + dps: 13.94678 + tps: 18.35001 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 0.1875 - tps: 29.18709 + dps: 35.86584 + tps: 39.16276 } } dps_results: { key: "TestP1DPSWarrior-Phase1-Lvl60-SwitchInFrontOfTarget-Default" value: { - dps: 209.40635 - tps: 168.01212 + dps: 200.34625 + tps: 176.81359 } } diff --git a/sim/warrior/tank_warrior/TestP1TankWarrior.results b/sim/warrior/tank_warrior/TestP1TankWarrior.results index cb51bc724..4d9233881 100644 --- a/sim/warrior/tank_warrior/TestP1TankWarrior.results +++ b/sim/warrior/tank_warrior/TestP1TankWarrior.results @@ -50,7 +50,7 @@ character_stats_results: { stat_weights_results: { key: "TestP1TankWarrior-Phase1-Lvl60-StatWeights-Default" value: { - weights: 0.25206 + weights: 0.4118 weights: 0 weights: 0 weights: 0 @@ -67,7 +67,7 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 - weights: 0.10552 + weights: 0.34766 weights: 0 weights: 0 weights: 0 @@ -99,98 +99,98 @@ stat_weights_results: { dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Average-Default" value: { - dps: 200.93042 - tps: 302.77703 + dps: 197.59846 + tps: 322.92702 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 0.23399 - tps: 42.93425 + dps: 26.25922 + tps: 151.69927 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 0.01272 - tps: 4.24878 + dps: 23.01814 + tps: 44.96815 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 0.06358 - tps: 19.53095 + dps: 33.13206 + tps: 64.84212 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 2.92545 - tps: 144.46153 + dps: 11.63948 + tps: 129.84277 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 0.14107 - tps: 38.35287 + dps: 9.27833 + tps: 24.42714 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Human-p0.bis-Protection-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 0.18563 - tps: 56.45677 + dps: 11.78536 + tps: 32.92882 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 0.23436 - tps: 37.85919 + dps: 28.19751 + tps: 149.59702 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 0.01309 - tps: 2.82172 + dps: 24.95643 + tps: 47.6159 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 0.06543 - tps: 12.10563 + dps: 36.01982 + tps: 67.90932 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 2.92545 - tps: 138.35598 + dps: 12.34613 + tps: 125.89922 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 0.14107 - tps: 36.99731 + dps: 9.98498 + tps: 25.23359 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-Settings-Orc-p0.bis-Protection-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 0.18563 - tps: 48.70352 + dps: 12.82153 + tps: 33.22788 } } dps_results: { key: "TestP1TankWarrior-Phase1-Lvl60-SwitchInFrontOfTarget-Default" value: { - dps: 172.06887 - tps: 259.70677 + dps: 166.45011 + tps: 274.27352 } } diff --git a/ui/tank_warrior/apls/p1.apl.json b/ui/tank_warrior/apls/p1.apl.json index e9e08b803..d8f90149b 100644 --- a/ui/tank_warrior/apls/p1.apl.json +++ b/ui/tank_warrior/apls/p1.apl.json @@ -3,6 +3,6 @@ "prepullActions": [], "priorityList": [ {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":11597,"rank":5}}}} + {"action":{"castSpell":{"spellId":{"spellId":11605,"rank":4}}}} ] } diff --git a/ui/warrior/apls/p1.apl.json b/ui/warrior/apls/p1.apl.json index e9e08b803..d8f90149b 100644 --- a/ui/warrior/apls/p1.apl.json +++ b/ui/warrior/apls/p1.apl.json @@ -3,6 +3,6 @@ "prepullActions": [], "priorityList": [ {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":11597,"rank":5}}}} + {"action":{"castSpell":{"spellId":{"spellId":11605,"rank":4}}}} ] } From 09b36e75fde4461ee87187c5b613fe9f36c23ea4 Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 16:41:38 -0500 Subject: [PATCH 5/8] Fixed spacing inconsistency in APL JSONs --- ui/tank_warrior/apls/p1.apl.json | 2 +- ui/warrior/apls/p1.apl.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/tank_warrior/apls/p1.apl.json b/ui/tank_warrior/apls/p1.apl.json index d8f90149b..95453a8f6 100644 --- a/ui/tank_warrior/apls/p1.apl.json +++ b/ui/tank_warrior/apls/p1.apl.json @@ -3,6 +3,6 @@ "prepullActions": [], "priorityList": [ {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":11605,"rank":4}}}} + {"action":{"castSpell":{"spellId":{"spellId":11605,"rank":4}}}} ] } diff --git a/ui/warrior/apls/p1.apl.json b/ui/warrior/apls/p1.apl.json index d8f90149b..95453a8f6 100644 --- a/ui/warrior/apls/p1.apl.json +++ b/ui/warrior/apls/p1.apl.json @@ -3,6 +3,6 @@ "prepullActions": [], "priorityList": [ {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":11605,"rank":4}}}} + {"action":{"castSpell":{"spellId":{"spellId":11605,"rank":4}}}} ] } From 1c7741918899884fd65f132ada84403a39375f16 Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 20:46:46 -0500 Subject: [PATCH 6/8] Initial Mage cleanup --- ui/mage/apls/p1.apl.json | 8 ++ ui/mage/apls/p1_arcane.apl.json | 15 --- ui/mage/apls/p1_fire.apl.json | 14 --- ui/mage/apls/p2_arcane.apl.json | 17 --- ui/mage/apls/p2_fire.apl.json | 18 ---- ui/mage/apls/p3_arcane.apl.json | 17 --- ui/mage/apls/p3_fire.apl.json | 19 ---- ui/mage/apls/p3_frost.apl.json | 19 ---- ui/mage/apls/p4_arcane.apl.json | 17 --- ui/mage/apls/p4_fire.apl.json | 24 ----- ui/mage/apls/p4_frost.apl.json | 24 ----- ui/mage/apls/p5_fire.apl.json | 25 ----- ui/mage/apls/p5_spellfrost.apl.json | 32 ------ ui/mage/gear_sets/blank.gear.json | 1 - ui/mage/gear_sets/p0.bis.gear.json | 21 ++++ ui/mage/gear_sets/p1.bis.gear.json | 21 ++++ ui/mage/presets.ts | 156 +++------------------------- ui/mage/sim.ts | 19 +--- 18 files changed, 71 insertions(+), 396 deletions(-) create mode 100644 ui/mage/apls/p1.apl.json delete mode 100644 ui/mage/apls/p1_arcane.apl.json delete mode 100644 ui/mage/apls/p1_fire.apl.json delete mode 100644 ui/mage/apls/p2_arcane.apl.json delete mode 100644 ui/mage/apls/p2_fire.apl.json delete mode 100644 ui/mage/apls/p3_arcane.apl.json delete mode 100644 ui/mage/apls/p3_fire.apl.json delete mode 100644 ui/mage/apls/p3_frost.apl.json delete mode 100644 ui/mage/apls/p4_arcane.apl.json delete mode 100644 ui/mage/apls/p4_fire.apl.json delete mode 100644 ui/mage/apls/p4_frost.apl.json delete mode 100644 ui/mage/apls/p5_fire.apl.json delete mode 100644 ui/mage/apls/p5_spellfrost.apl.json delete mode 100644 ui/mage/gear_sets/blank.gear.json create mode 100644 ui/mage/gear_sets/p0.bis.gear.json create mode 100644 ui/mage/gear_sets/p1.bis.gear.json diff --git a/ui/mage/apls/p1.apl.json b/ui/mage/apls/p1.apl.json new file mode 100644 index 000000000..e4c9b7842 --- /dev/null +++ b/ui/mage/apls/p1.apl.json @@ -0,0 +1,8 @@ +{ + "type": "TypeAPL", + "prepullActions": [], + "priorityList": [ + {"action":{"autocastOtherCooldowns":{}}}, + {"action":{"castSpell":{"spellId":{"spellId":133,"rank":1}}}} + ] +} diff --git a/ui/mage/apls/p1_arcane.apl.json b/ui/mage/apls/p1_arcane.apl.json deleted file mode 100644 index d550cb271..000000000 --- a/ui/mage/apls/p1_arcane.apl.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":400574}}},"doAtValue":{"const":{"val":"-2.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":400573}}},"rhs":{"const":{"val":"4"}}}},{"spellIsReady":{"spellId":{"spellId":401556}}}]}},"castSpell":{"spellId":{"spellId":400574}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"castSpell":{"spellId":{"spellId":400574}}}}, - {"hide":true,"action":{"castSpell":{"spellId":{"spellId":5145}}}} - ] -} diff --git a/ui/mage/apls/p1_fire.apl.json b/ui/mage/apls/p1_fire.apl.json deleted file mode 100644 index 65829fe56..000000000 --- a/ui/mage/apls/p1_fire.apl.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":12505}}},"doAtValue":{"const":{"val":"-6s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5"}}}},"castSpell":{"spellId":{"spellId":2948}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"condition":{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":8400}}}} - ] -} diff --git a/ui/mage/apls/p2_arcane.apl.json b/ui/mage/apls/p2_arcane.apl.json deleted file mode 100644 index 5aa42909e..000000000 --- a/ui/mage/apls/p2_arcane.apl.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":400574}}},"doAtValue":{"const":{"val":"-2.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425124}}}}}]}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":400573}}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":401556}}},{"spellIsReady":{"spellId":{"spellId":425124}}}]}}]}},"castSpell":{"spellId":{"spellId":400574}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"castSpell":{"spellId":{"spellId":425124}}}}, - {"action":{"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"auraIsActiveWithReactionTime":{"auraId":{"spellId":400589}}},"castSpell":{"spellId":{"spellId":8417,"rank":5}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":400573}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":400574}}}}, - {"action":{"castSpell":{"spellId":{"spellId":8417,"rank":5}}}} - ] -} diff --git a/ui/mage/apls/p2_fire.apl.json b/ui/mage/apls/p2_fire.apl.json deleted file mode 100644 index b700d9f3d..000000000 --- a/ui/mage/apls/p2_fire.apl.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":12523,"rank":4}}},"doAtValue":{"const":{"val":"-6s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5s"}}}}]}},"castSpell":{"spellId":{"spellId":8446,"rank":4}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400624}}},{"auraIsActive":{"auraId":{"spellId":48108}}}]}},"castSpell":{"spellId":{"spellId":12523,"rank":4}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":401502}}},"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":11129}}},{"auraIsActive":{"auraId":{"spellId":425121}}}]}},"castSpell":{"spellId":{"spellId":8402,"rank":7}}}}, - {"action":{"castSpell":{"spellId":{"spellId":8413,"rank":5}}}}, - {"action":{"castSpell":{"spellId":{"spellId":8446,"rank":4}}}} - ] -} diff --git a/ui/mage/apls/p3_arcane.apl.json b/ui/mage/apls/p3_arcane.apl.json deleted file mode 100644 index 7073167fc..000000000 --- a/ui/mage/apls/p3_arcane.apl.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":400574}}},"doAtValue":{"const":{"val":"-2.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425124}}}}}]}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":400573}}},"rhs":{"const":{"val":"4"}}}},{"or":{"vals":[{"spellIsReady":{"spellId":{"spellId":401556}}},{"spellIsReady":{"spellId":{"spellId":425124}}}]}}]}},"castSpell":{"spellId":{"spellId":400574}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"castSpell":{"spellId":{"spellId":425124}}}}, - {"action":{"castSpell":{"spellId":{"spellId":26297}}}}, - {"action":{"condition":{"auraIsActiveWithReactionTime":{"auraId":{"spellId":400589}}},"castSpell":{"spellId":{"spellId":10211,"rank":6}}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":400573}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":400574}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10211,"rank":6}}}} - ] -} diff --git a/ui/mage/apls/p3_fire.apl.json b/ui/mage/apls/p3_fire.apl.json deleted file mode 100644 index 8a1c3eda3..000000000 --- a/ui/mage/apls/p3_fire.apl.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":12525,"rank":6}}},"doAtValue":{"const":{"val":"-6s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5s"}}}}]}},"castSpell":{"spellId":{"spellId":10205,"rank":5}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400624}}},{"auraIsActive":{"auraId":{"spellId":48108}}}]}},"castSpell":{"spellId":{"spellId":12523,"rank":4}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"8"}}}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":401502}}},"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":11129}}},{"auraIsActive":{"auraId":{"spellId":425121}}}]}},"castSpell":{"spellId":{"spellId":10149,"rank":9}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10197,"rank":6}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10205,"rank":5}}}} - ] -} diff --git a/ui/mage/apls/p3_frost.apl.json b/ui/mage/apls/p3_frost.apl.json deleted file mode 100644 index b51343d4f..000000000 --- a/ui/mage/apls/p3_frost.apl.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":401502}}},"doAtValue":{"const":{"val":"-3s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"hide":true,"action":{"condition":{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":425121}}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":428739}}}}}]}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":401502}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":412532}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":401502}}}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":412532}}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":10180,"rank":9}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"hide":true,"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"8"}}}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"castSpell":{"spellId":{"spellId":412532}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10180,"rank":9}}}} - ] -} diff --git a/ui/mage/apls/p4_arcane.apl.json b/ui/mage/apls/p4_arcane.apl.json deleted file mode 100644 index 97ae39e3b..000000000 --- a/ui/mage/apls/p4_arcane.apl.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":400574}}},"doAtValue":{"const":{"val":"-2.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":456398,"tag":2}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":456398,"tag":2}}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":2139}}}}, - {"action":{"condition":{"not":{"val":{"spellIsReady":{"spellId":{"spellId":425121}}}}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":400615}}},"castSpell":{"spellId":{"spellId":10199,"rank":7}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"condition":{"auraIsActive":{"auraId":{"spellId":400589}}},"castSpell":{"spellId":{"spellId":10212,"rank":7}}}}, - {"action":{"castSpell":{"spellId":{"spellId":400574}}}} - ] -} diff --git a/ui/mage/apls/p4_fire.apl.json b/ui/mage/apls/p4_fire.apl.json deleted file mode 100644 index 90e0ed652..000000000 --- a/ui/mage/apls/p4_fire.apl.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":401502}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":25304,"rank":11}}},"doAtValue":{"const":{"val":"-3s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"castSpell":{"spellId":{"spellId":440802}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":456398,"tag":2}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":456398,"tag":2}}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":2139}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":400615}}},"castSpell":{"spellId":{"spellId":10199,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":428878}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":401502}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":25304,"rank":11}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"6s"}}}}]}},"castSpell":{"spellId":{"spellId":10207,"rank":7}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425121}}}}}]}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":425121}}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":428739}}}}}]}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":428739}}}}}]}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10181,"rank":10}}}} - ] -} diff --git a/ui/mage/apls/p4_frost.apl.json b/ui/mage/apls/p4_frost.apl.json deleted file mode 100644 index 90e0ed652..000000000 --- a/ui/mage/apls/p4_frost.apl.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":401502}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":25304,"rank":11}}},"doAtValue":{"const":{"val":"-3s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"castSpell":{"spellId":{"spellId":440802}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":456398,"tag":2}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":456398,"tag":2}}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":2139}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":400615}}},"castSpell":{"spellId":{"spellId":10199,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":428878}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":401502}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":25304,"rank":11}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"6s"}}}}]}},"castSpell":{"spellId":{"spellId":10207,"rank":7}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425121}}}}}]}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":425121}}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":428739}}}}}]}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":428739}}}}}]}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10181,"rank":10}}}} - ] -} diff --git a/ui/mage/apls/p5_fire.apl.json b/ui/mage/apls/p5_fire.apl.json deleted file mode 100644 index cc1d3478b..000000000 --- a/ui/mage/apls/p5_fire.apl.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":10150,"rank":10}}},"doAtValue":{"const":{"val":"-3s"}},"hide":true}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}},"doAtValue":{"const":{"val":"-3s"}},"hide":true}, - {"action":{"castSpell":{"spellId":{"spellId":428878}}},"doAtValue":{"const":{"val":"-2.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"condition":{"not":{"val":{"spellIsReady":{"spellId":{"spellId":425121}}}}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":456398,"tag":2}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":456398,"tag":2}}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":2139}}}}, - {"action":{"condition":{"or":{"vals":[{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400624}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":400615}}}}},{"auraIsActive":{"auraId":{"spellId":48108,"tag":1}}}]}},{"runeIsEquipped":{"runeId":{"spellId":400615}}}]}},"castSpell":{"spellId":{"spellId":10199,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":469237}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"move":{"rangeFromTarget":{"const":{"val":"15"}}}},{"castSpell":{"spellId":{"spellId":13021,"rank":5}}}]}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"6s"}}}}]}},"castSpell":{"spellId":{"spellId":10207,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400624}}},{"auraIsActiveWithReactionTime":{"auraId":{"spellId":48108}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":11129}}}}}]}},"castSpell":{"spellId":{"spellId":18809,"rank":8}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"1"}}}},"castSpell":{"spellId":{"spellId":11129}}}}, - {"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"numberTargets":{}},"rhs":{"const":{"val":"2"}}}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"spellCastTime":{"spellId":{"spellId":428878}}}}}]}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":467399}}},{"not":{"val":{"dotIsActive":{"spellId":{"spellId":10151,"rank":11}}}}},{"not":{"val":{"spellInFlight":{"spellId":{"spellId":10151,"rank":11}}}}}]}},"castSpell":{"spellId":{"spellId":10151,"rank":11}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10207,"rank":7}}}} - ] -} diff --git a/ui/mage/apls/p5_spellfrost.apl.json b/ui/mage/apls/p5_spellfrost.apl.json deleted file mode 100644 index da79c2421..000000000 --- a/ui/mage/apls/p5_spellfrost.apl.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "type": "TypeAPL", - "prepullActions": [ - {"action":{"castSpell":{"spellId":{"spellId":13033,"rank":4}}},"doAtValue":{"const":{"val":"-4.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":428878}}},"doAtValue":{"const":{"val":"-3s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":412532}}},"doAtValue":{"const":{"val":"-2.5s"}}}, - {"action":{"castSpell":{"spellId":{"spellId":10181,"rank":10}}},"doAtValue":{"const":{"val":"-2.5s"}}} - ], - "priorityList": [ - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":469238}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":13033,"rank":4}}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"15s"}}}}]}},"castSpell":{"spellId":{"spellId":13033,"rank":4}}}}, - {"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"15%"}}}},"castSpell":{"spellId":{"spellId":12051}}}}, - {"action":{"castSpell":{"spellId":{"itemId":231282}}}}, - {"action":{"castSpell":{"spellId":{"itemId":230243}}}}, - {"action":{"condition":{"or":{"vals":[{"not":{"val":{"auraIsKnown":{"auraId":{"itemId":231282}}}}},{"auraIsActive":{"auraId":{"itemId":231282}}},{"cmp":{"op":"OpGe","lhs":{"spellTimeToReady":{"spellId":{"itemId":231282}}},"rhs":{"const":{"val":"45s"}}}}]}},"castSpell":{"spellId":{"spellId":440802}}}}, - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"condition":{"and":{"vals":[{"auraIsKnown":{"auraId":{"spellId":456398,"tag":2}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":456398,"tag":2}}},"rhs":{"const":{"val":"1.5s"}}}}]}},"castSpell":{"spellId":{"spellId":2139}}}}, - {"action":{"condition":{"runeIsEquipped":{"runeId":{"spellId":400615}}},"castSpell":{"spellId":{"spellId":10199,"rank":7}}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"runeIsEquipped":{"runeId":{"spellId":428878}}},{"runeIsEquipped":{"runeId":{"spellId":428739}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":428878}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"runeIsEquipped":{"runeId":{"spellId":401502}}},{"runeIsEquipped":{"runeId":{"spellId":428739}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":401502}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"runeIsEquipped":{"runeId":{"spellId":412532}}},{"runeIsEquipped":{"runeId":{"spellId":428739}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":412532}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"action":{"condition":{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":400647}}},{"runeIsEquipped":{"runeId":{"spellId":428739}}},{"cmp":{"op":"OpEq","lhs":{"auraNumStacks":{"auraId":{"spellId":400647}}},"rhs":{"const":{"val":"1"}}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":10181,"rank":10}}},{"castSpell":{"spellId":{"spellId":428739}}}]}}}, - {"hide":true,"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":12873,"rank":3}}},"rhs":{"const":{"val":"6s"}}}}]}},"castSpell":{"spellId":{"spellId":10207,"rank":7}}}}, - {"hide":true,"action":{"condition":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":400613}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":425121}}}}}]}},"castSpell":{"spellId":{"spellId":400613}}}}, - {"hide":true,"action":{"castSpell":{"spellId":{"spellId":401556}}}}, - {"action":{"condition":{"and":{"vals":[{"not":{"val":{"spellIsReady":{"spellId":{"spellId":425121}}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":428739}}}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":440802}}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":440802}}}}}]}}]}},"castSpell":{"spellId":{"spellId":12472}}}}, - {"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"auraNumStacks":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpLt","lhs":{"auraRemainingTime":{"auraId":{"spellId":428878,"tag":1}}},"rhs":{"spellCastTime":{"spellId":{"spellId":428878}}}}}]}},"castSpell":{"spellId":{"spellId":428878}}}}, - {"action":{"castSpell":{"spellId":{"spellId":412532}}}}, - {"action":{"castSpell":{"spellId":{"spellId":401502}}}}, - {"action":{"castSpell":{"spellId":{"spellId":10181,"rank":10}}}} - ] -} diff --git a/ui/mage/gear_sets/blank.gear.json b/ui/mage/gear_sets/blank.gear.json deleted file mode 100644 index 4bcab0861..000000000 --- a/ui/mage/gear_sets/blank.gear.json +++ /dev/null @@ -1 +0,0 @@ -{"items": []} \ No newline at end of file diff --git a/ui/mage/gear_sets/p0.bis.gear.json b/ui/mage/gear_sets/p0.bis.gear.json new file mode 100644 index 000000000..314c15f7c --- /dev/null +++ b/ui/mage/gear_sets/p0.bis.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":16686}, + {}, + {"id":16689}, + {}, + {"id":16688}, + {"id":16683}, + {"id":16684}, + {"id":16685}, + {"id":16687}, + {"id":16682}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] +} \ No newline at end of file diff --git a/ui/mage/gear_sets/p1.bis.gear.json b/ui/mage/gear_sets/p1.bis.gear.json new file mode 100644 index 000000000..f77951798 --- /dev/null +++ b/ui/mage/gear_sets/p1.bis.gear.json @@ -0,0 +1,21 @@ +{ + "items": [ + {"id":16795}, + {}, + {"id":16797}, + {}, + {"id":16798}, + {"id":16799}, + {"id":16801}, + {"id":16802}, + {"id":16796}, + {"id":16800}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] +} \ No newline at end of file diff --git a/ui/mage/presets.ts b/ui/mage/presets.ts index 1861ae391..34dc1da3f 100644 --- a/ui/mage/presets.ts +++ b/ui/mage/presets.ts @@ -22,106 +22,35 @@ import { } from '../core/proto/common'; import { Mage_Options as MageOptions, Mage_Options_ArmorType as ArmorType } from '../core/proto/mage'; import { SavedTalents } from '../core/proto/ui'; -import Phase1APLArcane from './apls/p1_arcane.apl.json'; -import Phase1APLFire from './apls/p1_fire.apl.json'; -import Phase2APLArcane from './apls/p2_arcane.apl.json'; -import Phase2APLFire from './apls/p2_fire.apl.json'; -// import Phase3APLArcane from './apls/p3_arcane.apl.json'; -import Phase3APLFire from './apls/p3_fire.apl.json'; -import Phase3APLFrost from './apls/p3_frost.apl.json'; -import Phase4APLArcane from './apls/p4_arcane.apl.json'; -import Phase4APLFire from './apls/p4_fire.apl.json'; -import Phase4APLFrost from './apls/p4_frost.apl.json'; -import Phase5APLFire from './apls/p5_fire.apl.json'; -import Phase5APLSpellFrost from './apls/p5_spellfrost.apl.json'; -import BlankGear from './gear_sets/blank.gear.json'; +import P1APL from './apls/p1.apl.json'; +import P0BISGear from './gear_sets/p0.bis.gear.json'; +import P1BISGear from './gear_sets/p1.bis.gear.json'; /////////////////////////////////////////////////////////////////////////// // Gear Presets /////////////////////////////////////////////////////////////////////////// -export const GearBlank = PresetUtils.makePresetGear('Blank', BlankGear); +export const GearP0BIS = PresetUtils.makePresetGear('Pre-BiS', P0BISGear); +export const GearP1BIS = PresetUtils.makePresetGear('P1 BiS', P1BISGear); -export const GearPresets = {}; +export const GearPresets = { + [Phase.Phase1]: [GearP0BIS, GearP1BIS], +}; -export const DefaultGear = GearBlank; +export const DefaultGear = GearP0BIS; /////////////////////////////////////////////////////////////////////////// // APL Presets /////////////////////////////////////////////////////////////////////////// -export const APLArcanePhase1 = PresetUtils.makePresetAPLRotation('P1 Arcane', Phase1APLArcane, { - customCondition: player => player.getLevel() === 25, -}); -export const APLFirePhase1 = PresetUtils.makePresetAPLRotation('P1 Fire', Phase1APLFire, { - customCondition: player => player.getLevel() === 25, -}); - -export const APLArcanePhase2 = PresetUtils.makePresetAPLRotation('P2 Arcane', Phase2APLArcane, { - customCondition: player => player.getLevel() === 40, -}); -export const APLFirePhase2 = PresetUtils.makePresetAPLRotation('P2 Fire', Phase2APLFire, { - customCondition: player => player.getLevel() === 40, -}); - -// No new Phase 3 Arcane presets at the moment -export const APLArcanePhase3 = APLArcanePhase2; -export const APLFirePhase3 = PresetUtils.makePresetAPLRotation('P3 Fire', Phase3APLFire, { - customCondition: player => player.getLevel() === 50, -}); -export const APLFrostPhase3 = PresetUtils.makePresetAPLRotation('P3 Frost', Phase3APLFrost, { - customCondition: player => player.getLevel() === 50, -}); - -export const APLArcanePhase4 = PresetUtils.makePresetAPLRotation('P4 Arcane', Phase4APLArcane, { - customCondition: player => player.getLevel() >= 60, -}); -export const APLFirePhase4 = PresetUtils.makePresetAPLRotation('P4 Fire', Phase4APLFire, { - customCondition: player => player.getLevel() >= 60, -}); -export const APLFrostPhase4 = PresetUtils.makePresetAPLRotation('P4 Frost', Phase4APLFrost, { - customCondition: player => player.getLevel() >= 60, -}); - -export const APLFirePhase5 = PresetUtils.makePresetAPLRotation('P5 Fire', Phase5APLFire, { - customCondition: player => player.getLevel() >= 60, -}); -export const APLSpellfrostPhase5 = PresetUtils.makePresetAPLRotation('P5 Frost', Phase5APLSpellFrost, { - customCondition: player => player.getLevel() >= 60, -}); +export const APLP1DPS = PresetUtils.makePresetAPLRotation('DPS', P1APL, { customCondition: player => player.getLevel() === 60 }); export const APLPresets = { - [Phase.Phase1]: [APLArcanePhase1, APLFirePhase1, APLFirePhase1], - [Phase.Phase2]: [APLArcanePhase2, APLFirePhase2, APLFirePhase2], - [Phase.Phase3]: [APLArcanePhase3, APLFirePhase3, APLFrostPhase3], - [Phase.Phase4]: [APLArcanePhase4, APLFirePhase4, APLFrostPhase4], - [Phase.Phase5]: [APLFirePhase5, APLSpellfrostPhase5], + [Phase.Phase1]: [APLP1DPS], }; -export const DefaultAPLs: Record> = { - 25: { - 0: APLPresets[Phase.Phase1][0], - 1: APLPresets[Phase.Phase1][1], - 2: APLPresets[Phase.Phase1][2], - }, - 40: { - 0: APLPresets[Phase.Phase2][0], - 1: APLPresets[Phase.Phase2][1], - // Normally frost but frost is unfortunately just too bad to warrant including for now - 2: APLPresets[Phase.Phase2][2], - // Frostfire - 3: APLPresets[Phase.Phase2][2], - }, - 50: { - 0: APLPresets[Phase.Phase3][0], - 1: APLPresets[Phase.Phase3][1], - 2: APLPresets[Phase.Phase3][2], - }, - 60: { - 0: APLPresets[Phase.Phase5][1], - 1: APLPresets[Phase.Phase5][0], - 2: APLPresets[Phase.Phase5][1], - }, +export const DefaultAPLs: Record = { + 60: APLPresets[Phase.Phase1][0], }; /////////////////////////////////////////////////////////////////////////// @@ -131,68 +60,15 @@ export const DefaultAPLs: Record player.getLevel() === 25, -}); -export const TalentsFirePhase1 = PresetUtils.makePresetTalents('25 Fire', SavedTalents.create({ talentsString: '-5050020121' }), { - customCondition: player => player.getLevel() === 25, -}); - -export const TalentsArcanePhase2 = PresetUtils.makePresetTalents('40 Arcane', SavedTalents.create({ talentsString: '2250050310031531' }), { - customCondition: player => player.getLevel() === 40, -}); -export const TalentsFirePhase2 = PresetUtils.makePresetTalents('40 Fire', SavedTalents.create({ talentsString: '-5050020123033151' }), { - customCondition: player => player.getLevel() === 40, -}); - -// No new Phase 3 Arcane presets at the moment -export const TalentsArcanePhase3 = TalentsArcanePhase2; -export const TalentsFirePhase3 = PresetUtils.makePresetTalents('50 Fire', SavedTalents.create({ talentsString: '-0550020123033151-2035' }), { - customCondition: player => player.getLevel() === 50, -}); -export const TalentsFrostPhase3 = PresetUtils.makePresetTalents('50 Frost', SavedTalents.create({ talentsString: '-055-20350203100351051' }), { - customCondition: player => player.getLevel() === 50, -}); - -export const TalentsArcanePhase4 = PresetUtils.makePresetTalents('60 Arcane', SavedTalents.create({ talentsString: '0550050210031531-054-203500001' }), { - customCondition: player => player.getLevel() === 60, -}); -export const TalentsFirePhase4 = PresetUtils.makePresetTalents('60 Fire', SavedTalents.create({ talentsString: '21-5052300123033151-203500031' }), { - customCondition: player => player.getLevel() === 60, -}); -export const TalentsFrostfirePhase4 = PresetUtils.makePresetTalents('60 Frostfire', SavedTalents.create({ talentsString: '-0550320003021-2035020310035105' }), { - customCondition: player => player.getLevel() === 60, -}); - -export const TalentsArcanePhase5 = PresetUtils.makePresetTalents('60 Arcane', SavedTalents.create({ talentsString: '2500550010031531--2035020310004' }), { - customCondition: player => player.getLevel() === 60, -}); -export const TalentsFrostPhase5 = PresetUtils.makePresetTalents('60 Frost', SavedTalents.create({ talentsString: '250025001002--05350203100351051' }), { +export const TalentsP1DPS = PresetUtils.makePresetTalents('DPS', SavedTalents.create({ talentsString: '-0550320003021-2035020310035105' }), { customCondition: player => player.getLevel() === 60, }); export const TalentPresets = { - [Phase.Phase1]: [TalentsArcanePhase1, TalentsFirePhase1, TalentsFirePhase1], - [Phase.Phase2]: [TalentsArcanePhase2, TalentsFirePhase2, TalentsFirePhase2], - [Phase.Phase3]: [TalentsArcanePhase3, TalentsFirePhase3, TalentsFrostPhase3], - [Phase.Phase4]: [TalentsFrostfirePhase4], - [Phase.Phase5]: [TalentsArcanePhase5, TalentsFirePhase4, TalentsFrostPhase5], + [Phase.Phase1]: [TalentsP1DPS], }; -export const DefaultTalentsArcane = TalentPresets[Phase.Phase5][0]; -export const DefaultTalentsFire = TalentPresets[Phase.Phase5][1]; -export const DefaultTalentsFrostfire = TalentPresets[Phase.Phase4][0]; -export const DefaultTalentsFrost = TalentPresets[Phase.Phase5][2]; - -export const DefaultTalents = DefaultTalentsFire; - -export const PresetBuildArcane = PresetUtils.makePresetBuild('Arcane', { - gear: DefaultGear, - talents: DefaultTalentsArcane, - rotation: DefaultAPLs[60][0], -}); -export const PresetBuildFire = PresetUtils.makePresetBuild('Fire', { gear: DefaultGear, talents: DefaultTalentsFire, rotation: DefaultAPLs[60][1] }); -export const PresetBuildFrost = PresetUtils.makePresetBuild('Frost', { gear: DefaultGear, talents: DefaultTalentsFrost, rotation: DefaultAPLs[60][2] }); +export const DefaultTalents = TalentPresets[Phase.Phase1][0]; /////////////////////////////////////////////////////////////////////////// // Options diff --git a/ui/mage/sim.ts b/ui/mage/sim.ts index a8b0ca889..57a60af85 100644 --- a/ui/mage/sim.ts +++ b/ui/mage/sim.ts @@ -114,30 +114,21 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMage, { presets: { rotations: [ - ...Presets.APLPresets[Phase.Phase5], - ...Presets.APLPresets[Phase.Phase4], - ...Presets.APLPresets[Phase.Phase3], - ...Presets.APLPresets[Phase.Phase2], ...Presets.APLPresets[Phase.Phase1], ], talents: [ - ...Presets.TalentPresets[Phase.Phase5], - ...Presets.TalentPresets[Phase.Phase4], - ...Presets.TalentPresets[Phase.Phase3], - ...Presets.TalentPresets[Phase.Phase2], ...Presets.TalentPresets[Phase.Phase1], ], gear: [ - Presets.DefaultGear, + ...Presets.GearPresets[Phase.Phase1], ], - builds: [Presets.PresetBuildArcane, Presets.PresetBuildFire, Presets.PresetBuildFrost], }, autoRotation: player => { const specNumber = player.getTalentTree(); const level = player.getLevel(); - return Presets.DefaultAPLs[level][specNumber].rotation.rotation!; + return Presets.DefaultAPLs[level].rotation.rotation!; }, raidSimPresets: [ @@ -147,7 +138,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMage, { defaultName: 'Arcane', iconUrl: getSpecIcon(Class.ClassMage, 0), - talents: Presets.DefaultTalentsArcane.data, + talents: Presets.DefaultTalents.data, specOptions: Presets.DefaultOptions, consumes: Presets.DefaultConsumes, otherDefaults: Presets.OtherDefaults, @@ -172,7 +163,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMage, { defaultName: 'Fire', iconUrl: getSpecIcon(Class.ClassMage, 1), - talents: Presets.DefaultTalentsFire.data, + talents: Presets.DefaultTalents.data, specOptions: Presets.DefaultOptions, consumes: Presets.DefaultConsumes, otherDefaults: Presets.OtherDefaults, @@ -197,7 +188,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecMage, { defaultName: 'Frost', iconUrl: getSpecIcon(Class.ClassMage, 2), - talents: Presets.DefaultTalentsFrostfire.data, + talents: Presets.DefaultTalents.data, specOptions: Presets.DefaultOptions, consumes: Presets.DefaultConsumes, otherDefaults: Presets.OtherDefaults, From 75a2c5b67c33281571c7630364ca3d3ee6dfe625 Mon Sep 17 00:00:00 2001 From: Eric Taylor Date: Sun, 24 Nov 2024 20:56:04 -0500 Subject: [PATCH 7/8] Updated Mage tests --- sim/mage/TestArcane.results | 196 ------------------------------------ sim/mage/TestFire.results | 196 ------------------------------------ sim/mage/TestFrost.results | 196 ------------------------------------ sim/mage/TestP1Mage.results | 196 ++++++++++++++++++++++++++++++++++++ sim/mage/mage_test.go | 100 ++---------------- 5 files changed, 207 insertions(+), 677 deletions(-) delete mode 100644 sim/mage/TestArcane.results delete mode 100644 sim/mage/TestFire.results delete mode 100644 sim/mage/TestFrost.results create mode 100644 sim/mage/TestP1Mage.results diff --git a/sim/mage/TestArcane.results b/sim/mage/TestArcane.results deleted file mode 100644 index 017e8f275..000000000 --- a/sim/mage/TestArcane.results +++ /dev/null @@ -1,196 +0,0 @@ -character_stats_results: { - key: "TestArcane-Phase5-Lvl60-CharacterStats-Default" - value: { - final_stats: 172.5 - final_stats: 179.4 - final_stats: 265.8225 - final_stats: 221.95 - final_stats: 220.8 - final_stats: 150 - final_stats: 0 - final_stats: 40 - final_stats: 15 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 41.25 - final_stats: 0 - final_stats: 24.92876 - final_stats: 0 - final_stats: 0 - final_stats: 792.5 - final_stats: 0 - final_stats: 16.2 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 4688.475 - final_stats: 0 - final_stats: 0 - final_stats: 358.8 - final_stats: 540 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 3.2 - final_stats: 5 - final_stats: 0 - final_stats: 4148.225 - final_stats: 52 - final_stats: 85 - final_stats: 85 - final_stats: 85 - final_stats: 85 - final_stats: 384 - final_stats: 0 - final_stats: 35 - final_stats: 0 - } -} -stat_weights_results: { - key: "TestArcane-Phase5-Lvl60-StatWeights-Default" - value: { - weights: 0 - weights: 0 - weights: 0 - weights: 0.28967 - weights: 0 - weights: 0.43631 - weights: 0 - weights: 0.05906 - weights: 0.37724 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 4.93705 - weights: 2.55452 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Average-Default" - value: { - dps: 372.01945 - tps: 386.74766 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 371.0616 - tps: 648.00894 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 371.0616 - tps: 384.90897 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 388.44813 - tps: 404.27494 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 197.61902 - tps: 439.20185 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 197.61902 - tps: 209.69816 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Gnome-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 250.03264 - tps: 265.51076 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 369.74627 - tps: 635.6476 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 369.74627 - tps: 383.04134 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 399.77203 - tps: 416.03702 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 198.01526 - tps: 437.80854 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 198.01526 - tps: 210.00492 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-Settings-Troll-blank-Arcane-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 253.36293 - tps: 268.84104 - } -} -dps_results: { - key: "TestArcane-Phase5-Lvl60-SwitchInFrontOfTarget-Default" - value: { - dps: 369.60437 - tps: 383.11611 - } -} diff --git a/sim/mage/TestFire.results b/sim/mage/TestFire.results deleted file mode 100644 index 1899b21a0..000000000 --- a/sim/mage/TestFire.results +++ /dev/null @@ -1,196 +0,0 @@ -character_stats_results: { - key: "TestFire-Phase5-Lvl60-CharacterStats-Default" - value: { - final_stats: 172.5 - final_stats: 179.4 - final_stats: 265.8225 - final_stats: 221.95 - final_stats: 220.8 - final_stats: 150 - final_stats: 0 - final_stats: 40 - final_stats: 15 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 41.25 - final_stats: 0 - final_stats: 24.92876 - final_stats: 0 - final_stats: 0 - final_stats: 792.5 - final_stats: 0 - final_stats: 16.2 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 4262.25 - final_stats: 0 - final_stats: 0 - final_stats: 358.8 - final_stats: 540 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 3.2 - final_stats: 5 - final_stats: 0 - final_stats: 4148.225 - final_stats: 27 - final_stats: 60 - final_stats: 60 - final_stats: 60 - final_stats: 60 - final_stats: 384 - final_stats: 0 - final_stats: 35 - final_stats: 0 - } -} -stat_weights_results: { - key: "TestFire-Phase5-Lvl60-StatWeights-Default" - value: { - weights: 0 - weights: 0 - weights: 0 - weights: 0.61344 - weights: 0 - weights: 0.30638 - weights: 0 - weights: 0.30638 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 4.0745 - weights: 3.00611 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Average-Default" - value: { - dps: 315.27056 - tps: 237.16454 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Gnome-blank-Fire-p5_fire-FullBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 336.04823 - tps: 563.87387 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Gnome-blank-Fire-p5_fire-FullBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 336.04823 - tps: 251.66577 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Gnome-blank-Fire-p5_fire-FullBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 414.69838 - tps: 302.05805 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Gnome-blank-Fire-p5_fire-NoBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 138.88639 - tps: 316.15109 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Gnome-blank-Fire-p5_fire-NoBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 138.88639 - tps: 108.167 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Gnome-blank-Fire-p5_fire-NoBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 252.45459 - tps: 182.18519 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Troll-blank-Fire-p5_fire-FullBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 306.44466 - tps: 540.41754 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Troll-blank-Fire-p5_fire-FullBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 306.44466 - tps: 230.80658 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Troll-blank-Fire-p5_fire-FullBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 402.4679 - tps: 293.46973 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Troll-blank-Fire-p5_fire-NoBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 134.49457 - tps: 313.10452 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Troll-blank-Fire-p5_fire-NoBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 134.49457 - tps: 105.09412 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-Settings-Troll-blank-Fire-p5_fire-NoBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 257.27987 - tps: 185.73789 - } -} -dps_results: { - key: "TestFire-Phase5-Lvl60-SwitchInFrontOfTarget-Default" - value: { - dps: 306.69984 - tps: 230.9943 - } -} diff --git a/sim/mage/TestFrost.results b/sim/mage/TestFrost.results deleted file mode 100644 index fbbdfca19..000000000 --- a/sim/mage/TestFrost.results +++ /dev/null @@ -1,196 +0,0 @@ -character_stats_results: { - key: "TestFrost-Phase5-Lvl60-CharacterStats-Default" - value: { - final_stats: 172.5 - final_stats: 179.4 - final_stats: 265.8225 - final_stats: 221.95 - final_stats: 220.8 - final_stats: 150 - final_stats: 0 - final_stats: 40 - final_stats: 15 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 41.25 - final_stats: 0 - final_stats: 24.92876 - final_stats: 0 - final_stats: 0 - final_stats: 792.5 - final_stats: 0 - final_stats: 16.2 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 4262.25 - final_stats: 0 - final_stats: 0 - final_stats: 358.8 - final_stats: 540 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 3.2 - final_stats: 5 - final_stats: 0 - final_stats: 4148.225 - final_stats: 31 - final_stats: 64 - final_stats: 64 - final_stats: 64 - final_stats: 64 - final_stats: 384 - final_stats: 0 - final_stats: 35 - final_stats: 0 - } -} -stat_weights_results: { - key: "TestFrost-Phase5-Lvl60-StatWeights-Default" - value: { - weights: 0 - weights: 0 - weights: 0 - weights: 0.10653 - weights: 0 - weights: 0.46322 - weights: 0 - weights: 0.06157 - weights: 0.40165 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 5.49189 - weights: 2.56205 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Average-Default" - value: { - dps: 392.75219 - tps: 315.3999 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 399.58783 - tps: 587.87827 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 399.58783 - tps: 318.94962 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 400.34254 - tps: 322.31659 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 225.11332 - tps: 404.6202 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 225.11332 - tps: 183.3459 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Gnome-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 268.33572 - tps: 220.57852 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 390.98053 - tps: 580.85367 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 390.98053 - tps: 313.15673 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-FullBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 396.72646 - tps: 322.21705 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongMultiTarget" - value: { - dps: 224.67699 - tps: 406.5577 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-LongSingleTarget" - value: { - dps: 224.67699 - tps: 182.93016 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-Settings-Troll-blank-Frost-p5_spellfrost-NoBuffs-P5-Consumes-ShortSingleTarget" - value: { - dps: 267.36261 - tps: 219.59609 - } -} -dps_results: { - key: "TestFrost-Phase5-Lvl60-SwitchInFrontOfTarget-Default" - value: { - dps: 389.92099 - tps: 313.27487 - } -} diff --git a/sim/mage/TestP1Mage.results b/sim/mage/TestP1Mage.results new file mode 100644 index 000000000..960c03606 --- /dev/null +++ b/sim/mage/TestP1Mage.results @@ -0,0 +1,196 @@ +character_stats_results: { + key: "TestP1Mage-Phase1-Lvl60-CharacterStats-Default" + value: { + final_stats: 172.5 + final_stats: 179.4 + final_stats: 353.1075 + final_stats: 414 + final_stats: 311.65 + final_stats: 173 + final_stats: 0 + final_stats: 40 + final_stats: 15 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 41.25 + final_stats: 0 + final_stats: 28.1552 + final_stats: 0 + final_stats: 0 + final_stats: 792.5 + final_stats: 0 + final_stats: 16.2 + final_stats: 0 + final_stats: 0 + final_stats: 0 + final_stats: 7143 + final_stats: 0 + final_stats: 0 + final_stats: 1049.8 + final_stats: 540 + final_stats: 0 + final_stats: 5 + final_stats: 0 + final_stats: 3.2 + final_stats: 5 + final_stats: 0 + final_stats: 5021.075 + final_stats: 35 + final_stats: 68 + final_stats: 68 + final_stats: 68 + final_stats: 68 + final_stats: 384 + final_stats: 0 + final_stats: 35 + final_stats: 0 + } +} +stat_weights_results: { + key: "TestP1Mage-Phase1-Lvl60-StatWeights-Default" + value: { + weights: 0 + weights: 0 + weights: 0 + weights: 0.01055 + weights: 0 + weights: 0.13055 + weights: 0 + weights: 0.13055 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0.64435 + weights: 0.5321 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + weights: 0 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Average-Default" + value: { + dps: 54.83156 + tps: 62.0652 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 55.33731 + tps: 167.06291 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 55.33731 + tps: 60.92359 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 52.21493 + tps: 57.57093 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 30.66147 + tps: 212.32815 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 30.66147 + tps: 39.7448 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Gnome-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 29.57362 + tps: 33.03878 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 54.53749 + tps: 184.74762 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-FullBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 54.53749 + tps: 61.048 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-FullBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 51.44671 + tps: 58.02596 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongMultiTarget" + value: { + dps: 30.54926 + tps: 214.44915 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-NoBuffs-P1-Consumes-LongSingleTarget" + value: { + dps: 30.54926 + tps: 39.74425 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-Settings-Troll-p0.bis-DPS-p1-NoBuffs-P1-Consumes-ShortSingleTarget" + value: { + dps: 29.45515 + tps: 32.91712 + } +} +dps_results: { + key: "TestP1Mage-Phase1-Lvl60-SwitchInFrontOfTarget-Default" + value: { + dps: 54.63154 + tps: 61.86075 + } +} diff --git a/sim/mage/mage_test.go b/sim/mage/mage_test.go index 47b9863fd..964413bc5 100644 --- a/sim/mage/mage_test.go +++ b/sim/mage/mage_test.go @@ -12,21 +12,21 @@ func init() { RegisterMage() } -func TestArcane(t *testing.T) { +func TestP1Mage(t *testing.T) { core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator([]core.CharacterSuiteConfig{ { Class: proto.Class_ClassMage, - Phase: 5, + Phase: 1, Level: 60, Race: proto.Race_RaceTroll, OtherRaces: []proto.Race{proto.Race_RaceGnome}, - Talents: Phase5TalentsArcane, - GearSet: core.GetGearSet("../../ui/mage/gear_sets", "blank"), - Rotation: core.GetAplRotation("../../ui/mage/apls", "p5_spellfrost"), + Talents: P1Talents, + GearSet: core.GetGearSet("../../ui/mage/gear_sets", "p0.bis"), + Rotation: core.GetAplRotation("../../ui/mage/apls", "p1"), Buffs: core.FullBuffs, - Consumes: Phase5Consumes, - SpecOptions: core.SpecOptionsCombo{Label: "Arcane", SpecOptions: PlayerOptionsArcane}, + Consumes: P1Consumes, + SpecOptions: core.SpecOptionsCombo{Label: "DPS", SpecOptions: PlayerOptions}, ItemFilter: ItemFilters, EPReferenceStat: proto.Stat_StatSpellPower, @@ -35,79 +35,9 @@ func TestArcane(t *testing.T) { })) } -func TestFire(t *testing.T) { - core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator([]core.CharacterSuiteConfig{ - { - Class: proto.Class_ClassMage, - Phase: 5, - Level: 60, - Race: proto.Race_RaceTroll, - OtherRaces: []proto.Race{proto.Race_RaceGnome}, - - Talents: Phase5TalentsFire, - GearSet: core.GetGearSet("../../ui/mage/gear_sets", "blank"), - Rotation: core.GetAplRotation("../../ui/mage/apls", "p5_fire"), - Buffs: core.FullBuffs, - Consumes: Phase5Consumes, - SpecOptions: core.SpecOptionsCombo{Label: "Fire", SpecOptions: PlayerOptionsFire}, - - ItemFilter: ItemFilters, - EPReferenceStat: proto.Stat_StatSpellPower, - StatsToWeigh: Stats, - }, - })) -} - -func TestFrost(t *testing.T) { - core.RunTestSuite(t, t.Name(), core.FullCharacterTestSuiteGenerator([]core.CharacterSuiteConfig{ - { - Class: proto.Class_ClassMage, - Phase: 5, - Level: 60, - Race: proto.Race_RaceTroll, - OtherRaces: []proto.Race{proto.Race_RaceGnome}, - - Talents: phase5talentsfrost, - GearSet: core.GetGearSet("../../ui/mage/gear_sets", "blank"), - Rotation: core.GetAplRotation("../../ui/mage/apls", "p5_spellfrost"), - Buffs: core.FullBuffs, - Consumes: Phase5Consumes, - SpecOptions: core.SpecOptionsCombo{Label: "Frost", SpecOptions: PlayerOptionsFrost}, +var P1Talents = "-0550320003021-2035020310035105" - ItemFilter: ItemFilters, - EPReferenceStat: proto.Stat_StatSpellPower, - StatsToWeigh: Stats, - }, - })) -} - -var Phase1TalentsArcane = "22500502" -var Phase1TalentsFire = "-5050020121" - -var Phase2TalentsArcane = "2250050310031531" -var Phase2TalentsFire = "-5050020123033151" -var Phase2TalentsFrostfire = Phase2TalentsFire - -var Phase3TalentsFire = "-0550020123033151-2035" -var Phase3TalentsFrost = "-055-20350203100351051" - -var Phase4TalentsArcane = "0550050210031531-054-203500001" -var Phase4TalentsFire = "21-5052300123033151-203500031" -var Phase4TalentsFrost = "-0550320003021-2035020310035105" - -var Phase5TalentsArcane = "2500550010031531--2035020310004" -var Phase5TalentsFire = "21-5052300123033151-203500031" -var phase5talentsfrost = "250025001002--05350203100351051" - -var PlayerOptionsArcane = &proto.Player_Mage{ - Mage: &proto.Mage{ - Options: &proto.Mage_Options{ - Armor: proto.Mage_Options_MageArmor, - }, - }, -} - -var PlayerOptionsFire = &proto.Player_Mage{ +var PlayerOptions = &proto.Player_Mage{ Mage: &proto.Mage{ Options: &proto.Mage_Options{ Armor: proto.Mage_Options_MoltenArmor, @@ -115,16 +45,8 @@ var PlayerOptionsFire = &proto.Player_Mage{ }, } -var PlayerOptionsFrost = &proto.Player_Mage{ - Mage: &proto.Mage{ - Options: &proto.Mage_Options{ - Armor: proto.Mage_Options_IceArmor, - }, - }, -} - -var Phase5Consumes = core.ConsumesCombo{ - Label: "P5-Consumes", +var P1Consumes = core.ConsumesCombo{ + Label: "P1-Consumes", Consumes: &proto.Consumes{ DefaultPotion: proto.Potions_MajorManaPotion, Flask: proto.Flask_FlaskOfSupremePower, From 372466f0230c766fa718a6c1d2b4363c27f3780c Mon Sep 17 00:00:00 2001 From: root Date: Tue, 26 Nov 2024 09:20:22 -0700 Subject: [PATCH 8/8] First pass at shadow priest --- proto/priest.proto | 52 +--- sim/hunter/TestBM.results | 280 -------------------- sim/hunter/TestMM.results | 210 --------------- sim/hunter/TestSV.results | 210 --------------- sim/priest/devouring_plague.go | 9 +- sim/priest/dispersion.go | 63 ----- sim/priest/eye_of_the_void.go | 214 --------------- sim/priest/healing/healing_priest.go | 1 - sim/priest/healing/healing_priest_test.go | 7 +- sim/priest/holy_fire.go | 9 +- sim/priest/homunculi.go | 224 ---------------- sim/priest/mind_blast.go | 24 -- sim/priest/mind_flay.go | 14 +- sim/priest/mind_sear.go | 116 -------- sim/priest/mind_spike.go | 85 ------ sim/priest/penance.go | 105 -------- sim/priest/prayer_of_mending.go | 108 -------- sim/priest/priest.go | 78 +----- sim/priest/runes.go | 159 ----------- sim/priest/shadow/TestP1Shadow.results | 106 ++++---- sim/priest/shadow/shadow_priest.go | 1 - sim/priest/shadow_word_death.go | 61 ----- sim/priest/shadow_word_pain.go | 39 +-- sim/priest/shadowfiend.go | 248 ----------------- sim/priest/talents.go | 13 +- sim/priest/vampiric_touch.go | 103 ------- sim/priest/void_plague.go | 82 ------ sim/priest/void_zone.go | 86 ------ ui/healing_priest/inputs.ts | 10 +- ui/healing_priest/presets.ts | 2 - ui/healing_priest/sim.ts | 1 - ui/shadow_priest/apls/p1.apl.json | 15 +- ui/shadow_priest/gear_sets/p0.bis.gear.json | 38 +-- 33 files changed, 116 insertions(+), 2657 deletions(-) delete mode 100644 sim/hunter/TestBM.results delete mode 100644 sim/hunter/TestMM.results delete mode 100644 sim/hunter/TestSV.results delete mode 100644 sim/priest/dispersion.go delete mode 100644 sim/priest/eye_of_the_void.go delete mode 100644 sim/priest/homunculi.go delete mode 100644 sim/priest/mind_sear.go delete mode 100644 sim/priest/mind_spike.go delete mode 100644 sim/priest/penance.go delete mode 100644 sim/priest/prayer_of_mending.go delete mode 100644 sim/priest/runes.go delete mode 100644 sim/priest/shadow_word_death.go delete mode 100644 sim/priest/shadowfiend.go delete mode 100644 sim/priest/vampiric_touch.go delete mode 100644 sim/priest/void_plague.go delete mode 100644 sim/priest/void_zone.go diff --git a/proto/priest.proto b/proto/priest.proto index a611e0f4c..7bee8ad89 100644 --- a/proto/priest.proto +++ b/proto/priest.proto @@ -60,45 +60,6 @@ message PriestTalents { bool shadowform = 47; } -enum PriestRune { - PriestRuneNone = 0; - - RuneHelmDivineAegis = 431622; - RuneHelmEyeOfTheVoid = 402789; - RuneHelmPainAndSuffering = 413251; - - RuneCloakBindingHeal = 401937; - RuneCloakSoulWarding = 402000; - RuneCloakVampiricTouch = 402668; - - RuneChestSerendipity = 413248; - RuneChestStrengthOfSoul = 415739; - RuneChestTwistedFaith = 425198; - - RuneBracersDespair = 431670; - RuneBracersSurgeOfLight = 431664; - RuneBracersVoidZone = 431681; - - RuneHandsCircleOfHealing = 401946; - RuneHandsMindSear = 413259; - RuneHandsPenance = 402174; - RuneHandsShadowWordDeath = 401955; - - RuneWaistEmpoweredRenew = 425266; - RuneWaistMindSpike = 431655; - RuneWaistRenewedHope = 425280; - - RuneLegsHomunculi = 402799; - RuneLegsPowerWordBarrier = 425207; - RuneLegsPrayerOfMending = 401859; - RuneLegsSharedPain = 401969; - - RuneFeetDispersion = 425294; - RuneFeetPainSuppression = 402004; - RuneFeetSpiritOfTheRedeemer = 425284; - RuneFeetVoidPlague = 425204; -} - message ShadowPriest { message Rotation { } @@ -112,9 +73,8 @@ message ShadowPriest { bool use_shadowfiend = 1; Armor armor = 2; bool use_mind_blast = 4; - bool use_shadow_word_death = 5; - UnitReference power_infusion_target = 6; - double latency = 7 [deprecated = true]; // Latency between actions + UnitReference power_infusion_target = 5; + double latency = 6 [deprecated = true]; // Latency between actions } Options options = 3; } @@ -124,12 +84,8 @@ message HealingPriest { } message Options { - bool use_inner_fire = 3; - bool use_shadowfiend = 1; - UnitReference power_infusion_target = 2; - - // Number of times for rapture to proc each minute, ie when a PWS is fully absorbed. - double raptures_per_minute = 4; + bool use_inner_fire = 2; + UnitReference power_infusion_target = 1; } Options options = 3; } diff --git a/sim/hunter/TestBM.results b/sim/hunter/TestBM.results deleted file mode 100644 index 36900a9d3..000000000 --- a/sim/hunter/TestBM.results +++ /dev/null @@ -1,280 +0,0 @@ -character_stats_results: { - key: "TestBM-Phase2-Lvl40-CharacterStats-Default" - value: { - final_stats: 211.255 - final_stats: 332.695 - final_stats: 359.32325 - final_stats: 163.185 - final_stats: 191.015 - final_stats: 162 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 34.75 - final_stats: 0 - final_stats: 28.53276 - final_stats: 0 - final_stats: 0 - final_stats: 1127.95 - final_stats: 0 - final_stats: 30.08066 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 3272.775 - final_stats: 0 - final_stats: 0 - final_stats: 2503.39 - final_stats: 1281.39 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 4380.2325 - final_stats: 13 - final_stats: 56 - final_stats: 30 - final_stats: 30 - final_stats: 30 - final_stats: 263 - final_stats: 0 - final_stats: 35 - final_stats: 0 - } -} -stat_weights_results: { - key: "TestBM-Phase2-Lvl40-StatWeights-Default" - value: { - weights: 0 - weights: 0.50664 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0.13996 - weights: 4.3644 - weights: 3.36833 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0.07897 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Average-Default" - value: { - dps: 653.95169 - tps: 298.34077 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 938.88875 - tps: 912.66402 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 667.23482 - tps: 313.89596 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 701.09983 - tps: 319.47299 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 389.83157 - tps: 609.23817 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 199.49201 - tps: 112.68143 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 214.83784 - tps: 106.45497 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 787.77778 - tps: 681.30603 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 698.66246 - tps: 339.611 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 734.58089 - tps: 336.78729 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 295.57734 - tps: 561.83868 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 251.93539 - tps: 167.86977 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-NightElf-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 273.04179 - tps: 168.58356 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 920.3286 - tps: 894.1469 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 652.573 - tps: 298.23343 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 685.67111 - tps: 300.57623 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 394.08419 - tps: 603.97612 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 204.56596 - tps: 113.66426 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_melee-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 222.20253 - tps: 107.48562 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 764.88278 - tps: 717.87402 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 682.45237 - tps: 326.12824 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 718.89282 - tps: 322.33991 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 296.4647 - tps: 559.91976 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 253.84926 - tps: 166.05371 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-Settings-Orc-placeholder-Basic-p2_ranged_bm-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 274.46254 - tps: 167.6218 - } -} -dps_results: { - key: "TestBM-Phase2-Lvl40-SwitchInFrontOfTarget-Default" - value: { - dps: 632.37975 - tps: 278.24115 - } -} diff --git a/sim/hunter/TestMM.results b/sim/hunter/TestMM.results deleted file mode 100644 index 54e9f0763..000000000 --- a/sim/hunter/TestMM.results +++ /dev/null @@ -1,210 +0,0 @@ -character_stats_results: { - key: "TestMM-Phase4-Lvl60-CharacterStats-Default" - value: { - final_stats: 297.275 - final_stats: 507.265 - final_stats: 474.2485 - final_stats: 215.05 - final_stats: 246.675 - final_stats: 162 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 47.25 - final_stats: 3 - final_stats: 28.14833 - final_stats: 0 - final_stats: 0 - final_stats: 1602.54 - final_stats: 3 - final_stats: 34.58731 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 4665.75 - final_stats: 0 - final_stats: 0 - final_stats: 2852.53 - final_stats: 1870.53 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 6709.2541 - final_stats: 27 - final_stats: 86 - final_stats: 60 - final_stats: 60 - final_stats: 60 - final_stats: 384 - final_stats: 0 - final_stats: 35 - final_stats: 0 - } -} -stat_weights_results: { - key: "TestMM-Phase4-Lvl60-StatWeights-Default" - value: { - weights: 0 - weights: 0.15354 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0.12138 - weights: 7.19003 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-AllItems-DevilsaurEye-19991" - value: { - dps: 343.41085 - tps: 355.72397 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-AllItems-DevilsaurTooth-19992" - value: { - dps: 338.0538 - tps: 350.37503 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Average-Default" - value: { - dps: 337.33348 - tps: 349.70703 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 419.37663 - tps: 579.42693 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 274.78179 - tps: 282.80397 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 266.84113 - tps: 276.55328 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 174.1017 - tps: 414.45707 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 112.97901 - tps: 124.99678 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 111.38138 - tps: 115.74126 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 449.68521 - tps: 610.1654 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 296.74888 - tps: 304.78254 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 301.1019 - tps: 310.94522 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 173.0927 - tps: 413.95607 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 113.4107 - tps: 125.45386 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_ranged-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 116.07029 - tps: 120.43017 - } -} -dps_results: { - key: "TestMM-Phase4-Lvl60-SwitchInFrontOfTarget-Default" - value: { - dps: 224.48153 - tps: 236.67331 - } -} diff --git a/sim/hunter/TestSV.results b/sim/hunter/TestSV.results deleted file mode 100644 index a77972337..000000000 --- a/sim/hunter/TestSV.results +++ /dev/null @@ -1,210 +0,0 @@ -character_stats_results: { - key: "TestSV-Phase4-Lvl60-CharacterStats-Default" - value: { - final_stats: 297.275 - final_stats: 583.35475 - final_stats: 474.2485 - final_stats: 215.05 - final_stats: 246.675 - final_stats: 162 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 47.25 - final_stats: 3 - final_stats: 28.14833 - final_stats: 0 - final_stats: 0 - final_stats: 1678.62975 - final_stats: 3 - final_stats: 39.0254 - final_stats: 0 - final_stats: 0 - final_stats: 0 - final_stats: 4665.75 - final_stats: 0 - final_stats: 0 - final_stats: 3004.7095 - final_stats: 1922.7095 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 0 - final_stats: 5 - final_stats: 0 - final_stats: 6582.6644 - final_stats: 27 - final_stats: 86 - final_stats: 60 - final_stats: 60 - final_stats: 60 - final_stats: 384 - final_stats: 0 - final_stats: 35 - final_stats: 0 - } -} -stat_weights_results: { - key: "TestSV-Phase4-Lvl60-StatWeights-Default" - value: { - weights: 0 - weights: 0.23711 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0.13693 - weights: 7.55342 - weights: 1.10189 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - weights: 0 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-AllItems-DevilsaurEye-19991" - value: { - dps: 466.59017 - tps: 404.77075 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-AllItems-DevilsaurTooth-19992" - value: { - dps: 462.52818 - tps: 399.46188 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Average-Default" - value: { - dps: 460.30515 - tps: 398.87454 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 1324.90663 - tps: 1909.48506 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 459.93206 - tps: 397.14761 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 460.26913 - tps: 394.30809 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 758.08202 - tps: 1425.79955 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 178.18299 - tps: 169.04959 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Dwarf-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 180.93972 - tps: 162.40202 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 1325.62601 - tps: 1934.85365 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 455.40794 - tps: 396.73842 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-FullBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 456.19204 - tps: 391.57823 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongMultiTarget" - value: { - dps: 754.54603 - tps: 1415.54554 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-LongSingleTarget" - value: { - dps: 176.9543 - tps: 167.04892 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-Settings-Orc-placeholder-Weave-p4_weave-NoBuffs-P4-Consumes-ShortSingleTarget" - value: { - dps: 183.63139 - tps: 160.99185 - } -} -dps_results: { - key: "TestSV-Phase4-Lvl60-SwitchInFrontOfTarget-Default" - value: { - dps: 323.67628 - tps: 281.33173 - } -} diff --git a/sim/priest/devouring_plague.go b/sim/priest/devouring_plague.go index 4f3c5e9f4..dfe3a6373 100644 --- a/sim/priest/devouring_plague.go +++ b/sim/priest/devouring_plague.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const DevouringPlagueRanks = 6 @@ -16,6 +15,7 @@ var DevouringPlagueManaCost = [DevouringPlagueRanks + 1]float64{0, 215, 350, 495 var DevouringPlagueLevel = [DevouringPlagueRanks + 1]int{0, 20, 28, 36, 44, 52, 60} func (priest *Priest) registerDevouringPlagueSpell() { + //TO DO: Implement race requirement priest.DevouringPlague = make([]*core.Spell, DevouringPlagueRanks+1) cdTimer := priest.NewTimer() @@ -29,7 +29,6 @@ func (priest *Priest) registerDevouringPlagueSpell() { } func (priest *Priest) getDevouringPlagueConfig(rank int, cdTimer *core.Timer) core.SpellConfig { - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) var ticks int32 = 8 @@ -80,11 +79,7 @@ func (priest *Priest) getDevouringPlagueConfig(rank int, cdTimer *core.Timer) co dot.Snapshot(target, baseDotDamage, isRollover) }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - } + dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) }, }, diff --git a/sim/priest/dispersion.go b/sim/priest/dispersion.go deleted file mode 100644 index 53783d086..000000000 --- a/sim/priest/dispersion.go +++ /dev/null @@ -1,63 +0,0 @@ -package priest - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) registerDispersionSpell() { - if !priest.HasRune(proto.PriestRune_RuneFeetDispersion) { - return - } - - actionId := core.ActionID{SpellID: int32(proto.PriestRune_RuneFeetDispersion)} - - manaMetric := priest.NewManaMetrics(actionId) - - priest.DispersionAura = priest.GetOrRegisterAura(core.Aura{ - Label: "Dispersion", - ActionID: actionId, - Duration: time.Second * 6, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - core.StartPeriodicAction(sim, core.PeriodicActionOptions{ - Period: time.Second, - NumTicks: 6, - OnAction: func(sim *core.Simulation) { - manaGain := priest.MaxMana() * 0.06 - priest.AddMana(sim, manaGain, manaMetric) - }, - }) - }, - }) - - priest.Dispersion = priest.RegisterSpell(core.SpellConfig{ - ActionID: actionId, - Flags: SpellFlagPriest, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: time.Second * 120, - }, - }, - - ApplyEffects: func(sim *core.Simulation, _ *core.Unit, spell *core.Spell) { - priest.DispersionAura.Activate(sim) - priest.WaitUntil(sim, priest.DispersionAura.ExpiresAt()) - }, - }) - - priest.AddMajorCooldown(core.MajorCooldown{ - Spell: priest.Dispersion, - Priority: 1, - Type: core.CooldownTypeMana, - ShouldActivate: func(sim *core.Simulation, character *core.Character) bool { - return character.CurrentManaPercent() <= 0.01 - }, - }) -} diff --git a/sim/priest/eye_of_the_void.go b/sim/priest/eye_of_the_void.go deleted file mode 100644 index 3830b3427..000000000 --- a/sim/priest/eye_of_the_void.go +++ /dev/null @@ -1,214 +0,0 @@ -package priest - -import ( - "math" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (priest *Priest) registerEyeOfTheVoidCD() { - if !priest.HasRune(proto.PriestRune_RuneHelmEyeOfTheVoid) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.PriestRune_RuneHelmEyeOfTheVoid)} - duration := time.Second * 30 - cooldown := time.Minute * 3 - - // For timeline only - priest.EyeOfTheVoidAura = priest.RegisterAura(core.Aura{ - ActionID: actionID, - Label: "Eye of the Void", - Duration: duration, - }) - - priest.EyeOfTheVoid = priest.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskEmpty, - Flags: SpellFlagPriest | core.SpellFlagAPL, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - priest.EyeOfTheVoidPet.EnableWithTimeout(sim, priest.EyeOfTheVoidPet, duration) - priest.EyeOfTheVoidAura.Activate(sim) - }, - }) - - priest.AddMajorCooldown(core.MajorCooldown{ - Spell: priest.EyeOfTheVoid, - Priority: 1, - Type: core.CooldownTypeDPS, - }) -} - -type EyeOfTheVoid struct { - core.Pet - - npcID int32 - Priest *Priest - ShadowBolt *core.Spell -} - -func (priest *Priest) NewEyeOfTheVoid() *EyeOfTheVoid { - baseStats := stats.Stats{} - // Little information about this pet is available so using Warlock Imp stats - switch priest.Level { - case 25: - baseStats = stats.Stats{ - stats.Strength: 47, - stats.Agility: 25, - stats.Stamina: 49, - stats.Intellect: 94, - stats.Spirit: 95, - stats.Mana: 149, - stats.MP5: 0, - stats.MeleeCrit: 3.454 * core.CritRatingPerCritChance, - stats.SpellCrit: 0.9075 * core.CritRatingPerCritChance, - } - case 40: - baseStats = stats.Stats{ - stats.Strength: 70, - stats.Agility: 29, - stats.Stamina: 67, - stats.Intellect: 163, - stats.Spirit: 163, - stats.Mana: 318, - stats.MP5: 0, - stats.MeleeCrit: 3.454 * core.CritRatingPerCritChance, - stats.SpellCrit: 0.9075 * core.CritRatingPerCritChance, - } - case 50: - baseStats = stats.Stats{ - stats.Strength: 101, - stats.Agility: 32, - stats.Stamina: 71, - stats.Intellect: 212, - stats.Spirit: 211, - stats.Mana: 476, - stats.MP5: 0, - stats.MeleeCrit: 3.454 * core.CritRatingPerCritChance, - stats.SpellCrit: 0.9075 * core.CritRatingPerCritChance, - } - case 60: - baseStats = stats.Stats{ - stats.Strength: 101, - stats.Agility: 32, - stats.Stamina: 71, - stats.Intellect: 212, - stats.Spirit: 211, - stats.Mana: 476, - stats.MP5: 0, - stats.MeleeCrit: 3.454 * core.CritRatingPerCritChance, - stats.SpellCrit: 0.9075 * core.CritRatingPerCritChance, - } - } - - eyePet := &EyeOfTheVoid{ - npcID: 202387, - Pet: core.NewPet("Eye of the Void", &priest.Character, baseStats, priest.eyeOfTheVoidStatInheritance(), false, true), - Priest: priest, - } - - eyePet.EnableManaBarWithModifier(0.33) - - // Imp gets 1mp/5 non casting regen per spirit - eyePet.PseudoStats.SpiritRegenMultiplier = 1 - eyePet.PseudoStats.SpiritRegenRateCasting = 0 - eyePet.SpiritManaRegenPerSecond = func() float64 { - // 1mp5 per spirit - return eyePet.GetStat(stats.Spirit) / 5 - } - - // Mage spell crit scaling for imp - eyePet.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[proto.Class_ClassMage][int(eyePet.Level)]*core.SpellCritRatingPerCritChance) - - eyePet.ShadowBolt = eyePet.GetOrRegisterSpell(eyePet.newShadowBoltSpellConfig(priest)) - - priest.AddPet(eyePet) - - return eyePet -} - -// TODO: Verify any eye of the void stat inheritance -func (priest *Priest) eyeOfTheVoidStatInheritance() core.PetStatInheritance { - return func(ownerStats stats.Stats) stats.Stats { - ownerHitChance := ownerStats[stats.SpellHit] / core.SpellHitRatingPerHitChance - highestSchoolPower := ownerStats[stats.SpellPower] + ownerStats[stats.SpellDamage] + max(ownerStats[stats.FirePower], ownerStats[stats.ShadowPower]) - - return stats.Stats{ - stats.Stamina: ownerStats[stats.Stamina] * 0.75, - stats.Intellect: ownerStats[stats.Intellect] * 0.3, - stats.Armor: ownerStats[stats.Armor] * 0.35, - stats.AttackPower: highestSchoolPower * 0.565, - stats.MP5: ownerStats[stats.Intellect] * 0.315, - stats.SpellPower: ownerStats[stats.SpellPower] * 0.15, - stats.SpellDamage: ownerStats[stats.SpellDamage] * 0.15, - stats.FirePower: ownerStats[stats.FirePower] * 0.15, - stats.ShadowPower: ownerStats[stats.ShadowPower] * 0.15, - stats.SpellPenetration: ownerStats[stats.SpellPenetration], - stats.MeleeHit: ownerHitChance * core.MeleeHitRatingPerHitChance, - stats.SpellHit: math.Floor(ownerStats[stats.SpellHit] / 12.0 * 17.0), - } - } -} - -// TODO: -func (eyeOfTheVoid *EyeOfTheVoid) newShadowBoltSpellConfig(priest *Priest) core.SpellConfig { - baseDamage := priest.baseRuneAbilityDamage() + 25 - return core.SpellConfig{ - ActionID: core.ActionID{SpellID: 402790}, - SpellSchool: core.SpellSchoolShadow, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - - ManaCost: core.ManaCostOptions{ - // BaseCost: .05, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - CastTime: time.Second * 3, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - }, - } -} - -func (eyeOfTheVoid *EyeOfTheVoid) Initialize() { -} - -func (eyeOfTheVoid *EyeOfTheVoid) ExecuteCustomRotation(sim *core.Simulation) { - eyeOfTheVoid.ShadowBolt.Cast(sim, nil) -} - -func (eyeOfTheVoid *EyeOfTheVoid) Reset(sim *core.Simulation) { - eyeOfTheVoid.Disable(sim) -} - -func (eyeOfTheVoid *EyeOfTheVoid) OnPetDisable(sim *core.Simulation) { -} - -func (eyeOfTheVoid *EyeOfTheVoid) GetPet() *core.Pet { - return &eyeOfTheVoid.Pet -} diff --git a/sim/priest/healing/healing_priest.go b/sim/priest/healing/healing_priest.go index 68878b47e..2fdb56c24 100644 --- a/sim/priest/healing/healing_priest.go +++ b/sim/priest/healing/healing_priest.go @@ -61,5 +61,4 @@ func (hpriest *HealingPriest) Initialize() { } func (hpriest *HealingPriest) Reset(sim *core.Simulation) { - hpriest.Priest.Reset(sim) } diff --git a/sim/priest/healing/healing_priest_test.go b/sim/priest/healing/healing_priest_test.go index 057ffb50a..c26715049 100644 --- a/sim/priest/healing/healing_priest_test.go +++ b/sim/priest/healing/healing_priest_test.go @@ -83,9 +83,7 @@ var FullConsumes = &proto.Consumes{ var PlayerOptionsDisc = &proto.Player_HealingPriest{ HealingPriest: &proto.HealingPriest{ Options: &proto.HealingPriest_Options{ - UseInnerFire: true, - UseShadowfiend: true, - RapturesPerMinute: 5, + UseInnerFire: true, }, }, } @@ -93,8 +91,7 @@ var PlayerOptionsDisc = &proto.Player_HealingPriest{ var PlayerOptionsHoly = &proto.Player_HealingPriest{ HealingPriest: &proto.HealingPriest{ Options: &proto.HealingPriest_Options{ - UseInnerFire: true, - UseShadowfiend: true, + UseInnerFire: true, }, }, } diff --git a/sim/priest/holy_fire.go b/sim/priest/holy_fire.go index 65691903a..2ba98b4ad 100644 --- a/sim/priest/holy_fire.go +++ b/sim/priest/holy_fire.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const HolyFireRanks = 8 @@ -43,8 +42,6 @@ func (priest *Priest) getHolyFireConfig(rank int) core.SpellConfig { dotCoeff := 0.05 castTime := time.Millisecond * 3500 - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) - return core.SpellConfig{ SpellCode: SpellCode_PriestHolyFire, ActionID: core.ActionID{SpellID: spellId}, @@ -86,11 +83,7 @@ func (priest *Priest) getHolyFireConfig(rank int) core.SpellConfig { }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - } + dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) }, }, diff --git a/sim/priest/homunculi.go b/sim/priest/homunculi.go deleted file mode 100644 index e86a337ed..000000000 --- a/sim/priest/homunculi.go +++ /dev/null @@ -1,224 +0,0 @@ -package priest - -import ( - "math" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (priest *Priest) registerHomunculiSpell() { - if !priest.HasRune(proto.PriestRune_RuneLegsHomunculi) { - return - } - - actionID := core.ActionID{SpellID: int32(proto.PriestRune_RuneLegsHomunculi)} - duration := time.Minute * 2 - cooldown := time.Minute * 2 - - // For timeline only - priest.HomunculiAura = priest.RegisterAura(core.Aura{ - ActionID: actionID, - Label: "Homunculi", - Duration: duration, - }) - - priest.Homunculi = priest.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskEmpty, - Flags: SpellFlagPriest | core.SpellFlagAPL, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - core.Each(priest.HomunculiPets, func(homunculus *Homunculus) { - homunculus.EnableWithTimeout(sim, homunculus, duration) - }) - priest.HomunculiAura.Activate(sim) - }, - }) - - priest.AddMajorCooldown(core.MajorCooldown{ - Spell: priest.Homunculi, - Priority: 1, - Type: core.CooldownTypeDPS, - }) -} - -type Homunculus struct { - core.Pet - - npcID int32 - Priest *Priest - PrimarySpell *core.Spell -} - -func (priest *Priest) NewHomunculus(idx int32, npcID int32) *Homunculus { - // We can't use the legacy pet window for Homunculi so these values are determined from trying to bump damage up to match logs - baseDamageMin := 0.0 - baseDamageMax := 0.0 - baseStats := stats.Stats{ - stats.Strength: 0, - stats.Agility: 0, - stats.Stamina: 0, - stats.Intellect: 0, - stats.Spirit: 0, - stats.AttackPower: 0, - } - - homunculus := &Homunculus{ - npcID: npcID, - Pet: core.NewPet("Homunculi", &priest.Character, baseStats, priest.homunculusStatInheritance(), false, true), - Priest: priest, - } - - homunculus.AddStat(stats.AttackPower, -20) - - homunculus.EnableAutoAttacks(homunculus, core.AutoAttackOptions{ - MainHand: core.Weapon{ - // TODO: Check stats - BaseDamageMin: baseDamageMin, - BaseDamageMax: baseDamageMax, - SwingSpeed: 2, - }, - AutoSwingMelee: true, - }) - - // Homunculus aren't very bright and often sit in front of targets - homunculus.PseudoStats.InFrontOfTarget = true - - // core.ApplyPetConsumeEffects(&homunculus.Character, priest.Consumes) - - priest.AddPet(homunculus) - - return homunculus -} - -// TODO: Verify any homunculus stat inheritance -func (priest *Priest) homunculusStatInheritance() core.PetStatInheritance { - return func(ownerStats stats.Stats) stats.Stats { - // Shadowfiend seems to benefit from the owner's Spell Hit + Shadow Focus hit chance - ownerHitChance := (ownerStats[stats.SpellHit] + 2*float64(priest.Talents.ShadowFocus)) / core.SpellHitRatingPerHitChance - highestSchoolPower := ownerStats[stats.SpellPower] + ownerStats[stats.SpellDamage] + max(ownerStats[stats.HolyPower], ownerStats[stats.ShadowPower]) - - // TODO: Needs more verification - return stats.Stats{ - stats.Stamina: ownerStats[stats.Stamina] * .75, - stats.Intellect: ownerStats[stats.Intellect] * 0.3, - stats.Armor: ownerStats[stats.Armor] * 0.35, - stats.AttackPower: highestSchoolPower * 0.57, - stats.MP5: ownerStats[stats.MP5] * 0.3, - stats.SpellPower: ownerStats[stats.SpellPower] * 0.15, - stats.SpellDamage: ownerStats[stats.SpellDamage] * 0.15, - stats.ShadowPower: ownerStats[stats.ShadowPower] * 0.15, - stats.SpellPenetration: ownerStats[stats.SpellPenetration], - stats.MeleeHit: ownerHitChance * core.MeleeHitRatingPerHitChance, - stats.SpellHit: math.Floor(ownerHitChance / 12.0 * 17.0), - // Shadowfiend seems to most likely use the priest's Spell Crit to scale its melee crit - // In reality the melees are shadow damage and probably use the spell hit table but we can't configure that currently - stats.MeleeCrit: ownerStats[stats.SpellCrit], - stats.SpellCrit: ownerStats[stats.SpellCrit], - } - } -} - -/* func (homunculus *Homunculus) newHomunculusCrippleSpell() core.SpellConfig { - attackSpeedAuras := homunculus.NewEnemyAuraArray(core.HomunculiAttackSpeedAura) - - return core.SpellConfig{ - ActionID: core.ActionID{SpellID: 402808}, - SpellSchool: core.SpellSchoolShadow, - - ProcMask: core.ProcMaskEmpty, - Flags: core.SpellFlagNoLogs, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second * 6, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - attackSpeedAuras.Get(target).Activate(sim) - }, - } -} - -func (homunculus *Homunculus) newHomunculusDegradeSpell() core.SpellConfig { - armorAuras := homunculus.NewEnemyAuraArray(core.HomunculiArmorAura) - - return core.SpellConfig{ - ActionID: core.ActionID{SpellID: 402818}, - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskEmpty, - Flags: core.SpellFlagNoLogs, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second * 15, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - armorAuras.Get(target).Activate(sim) - }, - } -} - -func (homunculus *Homunculus) newHomunculusDemoralizeSpell() core.SpellConfig { - attackPowerAuras := homunculus.NewEnemyAuraArray(core.HomunculiAttackPowerAura) - - return core.SpellConfig{ - ActionID: core.ActionID{SpellID: 402811}, - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskEmpty, - Flags: core.SpellFlagNoLogs, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second * 15, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - attackPowerAuras.Get(target).Activate(sim) - }, - } -} */ - -func (homunculus *Homunculus) Initialize() { - /* switch homunculus.npcID { - case 202390: - homunculus.PrimarySpell = homunculus.GetOrRegisterSpell(homunculus.newHomunculusCrippleSpell()) - case 202392: - homunculus.PrimarySpell = homunculus.GetOrRegisterSpell(homunculus.newHomunculusDegradeSpell()) - case 202391: - homunculus.PrimarySpell = homunculus.GetOrRegisterSpell(homunculus.newHomunculusDemoralizeSpell()) - } */ -} - -func (homunculus *Homunculus) ExecuteCustomRotation(sim *core.Simulation) { - homunculus.PrimarySpell.Cast(sim, nil) -} - -func (homunculus *Homunculus) Reset(sim *core.Simulation) { - homunculus.Disable(sim) -} - -func (homunculus *Homunculus) OnPetDisable(sim *core.Simulation) { -} - -func (homunculus *Homunculus) GetPet() *core.Pet { - return &homunculus.Pet -} diff --git a/sim/priest/mind_blast.go b/sim/priest/mind_blast.go index e570c9ac2..d703f87ba 100644 --- a/sim/priest/mind_blast.go +++ b/sim/priest/mind_blast.go @@ -4,7 +4,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const MindBlastRanks = 9 @@ -37,8 +36,6 @@ func (priest *Priest) getMindBlastBaseConfig(rank int, cdTimer *core.Timer) core manaCost := MindBlastManaCost[rank] level := MindBlastLevel[rank] - hasMindSpike := priest.HasRune(proto.PriestRune_RuneWaistMindSpike) - return core.SpellConfig{ SpellCode: SpellCode_PriestMindBlast, ActionID: core.ActionID{SpellID: spellId}, @@ -70,38 +67,17 @@ func (priest *Priest) getMindBlastBaseConfig(rank int, cdTimer *core.Timer) core BonusCoefficient: spellCoeff, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - var mindSpikeAura *core.Aura - if hasMindSpike { - mindSpikeAura = priest.MindSpikeAuras.Get(target) - } - - oldBonusCrit := spell.BonusCritRating - oldMultiplier := spell.DamageMultiplier - spell.BonusCritRating += float64(mindSpikeAura.GetStacks()) * 30 * core.CritRatingPerCritChance - spell.DamageMultiplier *= priest.MindBlastModifier - result := spell.CalcDamage(sim, target, sim.Roll(baseDamageLow, baseDamageHigh), spell.OutcomeMagicHitAndCrit) - spell.BonusCritRating = oldBonusCrit - spell.DamageMultiplier = oldMultiplier - if result.Landed() { priest.AddShadowWeavingStack(sim, target) - if mindSpikeAura != nil { - mindSpikeAura.Deactivate(sim) - } } - spell.DealDamage(sim, result) }, ExpectedInitialDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { damage := (baseDamageLow + baseDamageHigh) / 2 - - oldMultiplier := spell.DamageMultiplier - spell.DamageMultiplier *= priest.MindBlastModifier result := spell.CalcDamage(sim, target, damage, spell.OutcomeExpectedMagicHitAndCrit) - spell.DamageMultiplier = oldMultiplier return result }, } diff --git a/sim/priest/mind_flay.go b/sim/priest/mind_flay.go index e41d8d610..f80c7545b 100644 --- a/sim/priest/mind_flay.go +++ b/sim/priest/mind_flay.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const MindFlayRanks = 6 @@ -55,8 +54,6 @@ func (priest *Priest) newMindFlaySpellConfig(rank int, tickIdx int32) core.Spell tickLength := time.Second - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) - return core.SpellConfig{ SpellCode: SpellCode_PriestMindFlay, ActionID: core.ActionID{SpellID: spellId}.WithTag(tickIdx), @@ -90,17 +87,10 @@ func (priest *Priest) newMindFlaySpellConfig(rank int, tickIdx int32) core.Spell AffectedByCastSpeed: false, BonusCoefficient: spellCoeff, OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - oldMultiplier := dot.Spell.DamageMultiplier - dot.Spell.DamageMultiplier *= priest.MindFlayModifier dot.Snapshot(target, baseDamage, isRollover) - dot.Spell.DamageMultiplier = oldMultiplier }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - } + dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) }, }, @@ -115,9 +105,7 @@ func (priest *Priest) newMindFlaySpellConfig(rank int, tickIdx int32) core.Spell ExpectedTickDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { baseDamage := baseDamage / MindFlayTicks - spell.DamageMultiplier *= priest.MindFlayModifier result := spell.CalcPeriodicDamage(sim, target, baseDamage, spell.OutcomeExpectedMagicAlwaysHit) - spell.DamageMultiplier /= priest.MindFlayModifier return result }, } diff --git a/sim/priest/mind_sear.go b/sim/priest/mind_sear.go deleted file mode 100644 index e5343d3b6..000000000 --- a/sim/priest/mind_sear.go +++ /dev/null @@ -1,116 +0,0 @@ -package priest - -import ( - "fmt" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -const MindSearTicks = 5 - -func (priest *Priest) registerMindSearSpell() { - if !priest.HasRune(proto.PriestRune_RuneHandsMindSear) { - return - } - - priest.MindSear = make([]*core.Spell, MindSearTicks) - priest.MindSearTicks = make([]*core.Spell, MindSearTicks) - - for tickIdx := int32(0); tickIdx < MindSearTicks; tickIdx++ { - priest.MindSear[tickIdx] = priest.RegisterSpell(priest.newMindSearSpellConfig(tickIdx)) - } -} - -func (priest *Priest) newMindSearSpellConfig(tickIdx int32) core.SpellConfig { - spellId := int32(proto.PriestRune_RuneHandsMindSear) - manaCost := .28 - - numTicks := tickIdx - flags := SpellFlagPriest | core.SpellFlagChanneled | core.SpellFlagNoMetrics - if tickIdx == 0 { - numTicks = 5 - flags |= core.SpellFlagAPL - } - tickLength := time.Second - - priest.MindSearTicks[tickIdx] = priest.newMindSearTickSpell(tickIdx) - - return core.SpellConfig{ - ActionID: core.ActionID{SpellID: spellId}.WithTag(tickIdx), - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskSpellDamage, - Flags: flags, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - }, - - Dot: core.DotConfig{ - IsAOE: true, - Aura: core.Aura{ - Label: fmt.Sprintf("MindSear-%d", tickIdx), - }, - NumberOfTicks: numTicks, - TickLength: tickLength, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - for _, aoeTarget := range sim.Encounter.TargetUnits { - priest.MindSearTicks[tickIdx].Cast(sim, aoeTarget) - priest.MindSearTicks[tickIdx].SpellMetrics[target.UnitIndex].Casts -= 1 - } - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - result := spell.CalcOutcome(sim, target, spell.OutcomeMagicHit) - priest.MindSearTicks[tickIdx].SpellMetrics[target.UnitIndex].Casts += 1 - - if result.Landed() { - spell.AOEDot().Apply(sim) - } - spell.DealOutcome(sim, result) - }, - } -} - -func (priest *Priest) newMindSearTickSpell(numTicks int32) *core.Spell { - baseDamageLow := priest.baseRuneAbilityDamage() * .7 - baseDamageHigh := priest.baseRuneAbilityDamage() * .78 - spellCoeff := 0.15 // classic penalty for mf having a slow effect - - return priest.GetOrRegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 413260}.WithTag(numTicks), - SpellSchool: core.SpellSchoolShadow, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskEmpty, - - BonusHitRating: 1, // Not an independent hit once initial lands - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - damage := sim.Roll(baseDamageLow, baseDamageHigh) - - // Apply the base spell's multipliers to pick up on effects that only affect spells with DoTs - spell.DamageMultiplierAdditive += priest.MindSear[numTicks].PeriodicDamageMultiplierAdditive - 1 - result := spell.CalcAndDealDamage(sim, target, damage, spell.OutcomeMagicHitAndCrit) - spell.DamageMultiplierAdditive -= priest.MindSear[numTicks].PeriodicDamageMultiplierAdditive - 1 - - if result.Landed() { - priest.AddShadowWeavingStack(sim, target) - } - }, - }) -} diff --git a/sim/priest/mind_spike.go b/sim/priest/mind_spike.go deleted file mode 100644 index 36401121c..000000000 --- a/sim/priest/mind_spike.go +++ /dev/null @@ -1,85 +0,0 @@ -package priest - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) registerMindSpikeSpell() { - if !priest.HasRune(proto.PriestRune_RuneWaistMindSpike) { - return - } - - priest.MindSpike = priest.GetOrRegisterSpell(priest.newMindSpikeSpellConfig()) -} - -func (priest *Priest) newMindSpikeSpellConfig() core.SpellConfig { - // 2024-02-22 tuning 10% buff - baseDamageLow := priest.baseRuneAbilityDamage() * 1.11 * 1.1 - baseDamageHigh := priest.baseRuneAbilityDamage() * 1.29 * 1.1 - spellCoeff := .429 - manaCost := .06 - castTime := time.Millisecond * 1500 - - priest.MindSpikeAuras = priest.NewEnemyAuraArray(func(unit *core.Unit, level int32) *core.Aura { - return priest.newMindSpikeAura(unit) - }) - - return core.SpellConfig{ - SpellCode: SpellCode_PriestMindSpike, - ActionID: core.ActionID{SpellID: int32(proto.PriestRune_RuneWaistMindSpike)}, - SpellSchool: core.SpellSchoolShadow | core.SpellSchoolFrost, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagPriest | core.SpellFlagAPL, - // TODO: Verify missile speed - MissileSpeed: 20, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - CastTime: castTime, - GCD: core.GCDDefault, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - BonusCoefficient: spellCoeff, - - ExpectedInitialDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { - damage := (baseDamageLow + baseDamageHigh) / 2 - result := spell.CalcDamage(sim, target, damage, spell.OutcomeExpectedMagicHitAndCrit) - return result - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseDamageLow, baseDamageHigh) - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - - spell.WaitTravelTime(sim, func(sim *core.Simulation) { - spell.DealDamage(sim, result) - - if result.Landed() { - priest.AddShadowWeavingStack(sim, target) - priest.MindSpikeAuras.Get(target).Activate(sim) - priest.MindSpikeAuras.Get(target).AddStack(sim) - } - }) - }, - } -} - -func (priest *Priest) newMindSpikeAura(unit *core.Unit) *core.Aura { - return unit.RegisterAura(core.Aura{ - Label: "Mind Spike", - ActionID: core.ActionID{SpellID: int32(proto.PriestRune_RuneWaistMindSpike)}, - Duration: time.Second * 10, - MaxStacks: 3, - }) -} diff --git a/sim/priest/penance.go b/sim/priest/penance.go deleted file mode 100644 index 0a4f24493..000000000 --- a/sim/priest/penance.go +++ /dev/null @@ -1,105 +0,0 @@ -package priest - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) RegisterPenanceSpell() { - if !priest.HasRune(proto.PriestRune_RuneHandsPenance) { - return - } - priest.Penance = priest.makePenanceSpell(false) - priest.PenanceHeal = priest.makePenanceSpell(true) -} - -// https://www.wowhead.com/classic/spell=402284/penance -// https://www.wowhead.com/classic/news/patch-1-15-build-52124-ptr-datamining-season-of-discovery-runes-336044 -func (priest *Priest) makePenanceSpell(isHeal bool) *core.Spell { - baseDamage := priest.baseRuneAbilityDamage() * 1.28 - baseHealing := priest.baseRuneAbilityHealing() * .85 - spellCoeff := 0.285 - manaCost := .16 - cooldown := time.Second * 12 - - var procMask core.ProcMask - flags := SpellFlagPriest | core.SpellFlagChanneled | core.SpellFlagAPL - if isHeal { - flags |= core.SpellFlagHelpful - procMask = core.ProcMaskSpellHealing - } else { - procMask = core.ProcMaskSpellDamage - } - - return priest.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 402284}, - SpellSchool: core.SpellSchoolHoly, - DefenseType: core.DefenseTypeMagic, - ProcMask: procMask, - Flags: flags, - RequiredLevel: 1, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 0, - - Dot: core.Ternary(!isHeal, core.DotConfig{ - Aura: core.Aura{ - Label: "Penance", - }, - NumberOfTicks: 2, - TickLength: time.Second, - AffectedByCastSpeed: true, - BonusCoefficient: spellCoeff, - - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - dot.Spell.CalcAndDealPeriodicDamage(sim, target, baseDamage, dot.OutcomeTick) - }, - }, core.DotConfig{}), - Hot: core.Ternary(isHeal, core.DotConfig{ - Aura: core.Aura{ - Label: "Penance", - }, - NumberOfTicks: 2, - TickLength: time.Second, - AffectedByCastSpeed: true, - BonusCoefficient: spellCoeff, - - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - dot.Spell.CalcAndDealPeriodicHealing(sim, target, baseHealing, dot.Spell.OutcomeHealingCrit) - }, - }, core.DotConfig{}), - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - if isHeal { - hot := spell.Hot(target) - hot.Apply(sim) - // Do immediate tick - hot.TickOnce(sim) - } else { - result := spell.CalcOutcome(sim, target, spell.OutcomeMagicHit) - if result.Landed() { - dot := spell.Dot(target) - dot.Apply(sim) - // Do immediate tick - dot.TickOnce(sim) - } - spell.DealOutcome(sim, result) - } - }, - }) -} diff --git a/sim/priest/prayer_of_mending.go b/sim/priest/prayer_of_mending.go deleted file mode 100644 index d8e4e5b5a..000000000 --- a/sim/priest/prayer_of_mending.go +++ /dev/null @@ -1,108 +0,0 @@ -package priest - -// func (priest *Priest) registerPrayerOfMendingSpell() { -// actionID := core.ActionID{SpellID: 48113} - -// pomAuras := make([]*core.Aura, len(priest.Env.AllUnits)) -// for _, unit := range priest.Env.AllUnits { -// if !priest.IsOpponent(unit) { -// pomAuras[unit.UnitIndex] = priest.makePrayerOfMendingAura(unit) -// } -// } - -// maxJumps := 5 - -// var curTarget *core.Unit -// var remainingJumps int -// priest.ProcPrayerOfMending = func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { -// baseHealing := 1043 + 0.8057*spell.HealingPower(target) -// priest.PrayerOfMending.CalcAndDealHealing(sim, target, baseHealing, spell.OutcomeHealingCrit) - -// pomAuras[target.UnitIndex].Deactivate(sim) -// curTarget = nil - -// // Bounce to new ally. -// if remainingJumps == 0 { -// return -// } - -// // Find ally with lowest % HP and is not the current mending target. -// var newTarget *core.Unit -// for _, raidUnit := range priest.Env.Raid.AllUnits { -// if raidUnit == target { -// continue -// } - -// if newTarget == nil || (raidUnit.HasHealthBar() && newTarget.HasHealthBar() && raidUnit.CurrentHealthPercent() < newTarget.CurrentHealthPercent()) { -// newTarget = raidUnit -// } -// } - -// if newTarget != nil { -// pomAuras[newTarget.UnitIndex].Activate(sim) -// curTarget = newTarget -// remainingJumps-- -// } -// } - -// priest.PrayerOfMending = priest.RegisterSpell(core.SpellConfig{ -// ActionID: actionID, -// SpellSchool: core.SpellSchoolHoly, -// DefenseType: core.DefenseTypeMagic, -// ProcMask: core.ProcMaskSpellHealing, -// Flags: SpellFlagPriest | core.SpellFlagHelpful | core.SpellFlagAPL, - -// ManaCost: core.ManaCostOptions{ -// BaseCost: 0.15, -// Multiplier: 1, -// }, -// Cast: core.CastConfig{ -// DefaultCast: core.Cast{ -// GCD: core.GCDDefault, -// }, -// CD: core.Cooldown{ -// Timer: priest.NewTimer(), -// Duration: time.Second * 10, -// }, -// }, - -// BonusCritRating: float64(priest.Talents.HolySpecialization) * 1 * core.CritRatingPerCritChance, - -// DamageMultiplier: 1 + .02*float64(priest.Talents.SpiritualHealing), -// ThreatMultiplier: 1, - -// ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { -// if curTarget != nil { -// pomAuras[curTarget.UnitIndex].Deactivate(sim) -// } - -// pomAuras[target.UnitIndex].Activate(sim) -// curTarget = target -// remainingJumps = maxJumps -// }, -// }) -// } - -// func (priest *Priest) makePrayerOfMendingAura(target *core.Unit) *core.Aura { -// autoProc := true - -// return target.RegisterAura(core.Aura{ -// Label: "PrayerOfMending" + strconv.Itoa(int(priest.Index)), -// Duration: time.Second * 30, -// OnGain: func(aura *core.Aura, sim *core.Simulation) { -// if autoProc { -// core.StartDelayedAction(sim, core.DelayedActionOptions{ -// DoAt: sim.CurrentTime + time.Second*5, -// OnAction: func(sim *core.Simulation) { -// priest.ProcPrayerOfMending(sim, aura.Unit, priest.PrayerOfMending) -// }, -// }) -// } -// }, -// OnSpellHitTaken: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { -// if !autoProc && result.Damage > 0 { -// priest.ProcPrayerOfMending(sim, aura.Unit, priest.PrayerOfMending) -// } -// }, -// }) -// } diff --git a/sim/priest/priest.go b/sim/priest/priest.go index 9f7d6dba2..23e58570a 100644 --- a/sim/priest/priest.go +++ b/sim/priest/priest.go @@ -1,7 +1,6 @@ package priest import ( - "github.com/wowsims/classic/sim/common/guardians" "github.com/wowsims/classic/sim/core" "github.com/wowsims/classic/sim/core/proto" "github.com/wowsims/classic/sim/core/stats" @@ -23,7 +22,6 @@ const ( SpellCode_PriestHolyFire SpellCode_PriestMindBlast SpellCode_PriestMindFlay - SpellCode_PriestMindSpike SpellCode_PriestShadowWordPain SpellCode_PriestSmite SpellCode_PriestVampiricTouch @@ -33,63 +31,35 @@ type Priest struct { core.Character Talents *proto.PriestTalents - Latency float64 - MindFlayModifier float64 // For Twisted Faith - MindBlastModifier float64 // For Twisted Faith - MindBlastCritChanceModifier float64 + Latency float64 CircleOfHealing *core.Spell DevouringPlague []*core.Spell - Dispersion *core.Spell EmpoweredRenew *core.Spell - EyeOfTheVoid *core.Spell FlashHeal []*core.Spell GreaterHeal []*core.Spell HolyFire []*core.Spell - Homunculi *core.Spell InnerFocus *core.Spell MindBlast []*core.Spell MindFlay [][]*core.Spell // 1 entry for each tick for each rank - MindSear []*core.Spell // 1 entry for each tick - MindSearTicks []*core.Spell // 1 entry for each tick - MindSpike *core.Spell - Penance *core.Spell - PenanceHeal *core.Spell PowerWordShield []*core.Spell PrayerOfHealing []*core.Spell PrayerOfMending *core.Spell Renew []*core.Spell - Shadowfiend *core.Spell Shadowform *core.Spell ShadowWeavingProc *core.Spell - ShadowWordDeath *core.Spell ShadowWordPain []*core.Spell Smite []*core.Spell VampiricEmbrace *core.Spell - VampiricTouch *core.Spell - VoidPlague *core.Spell - VoidZone *core.Spell - - DispersionAura *core.Aura - EyeOfTheVoidAura *core.Aura - HomunculiAura *core.Aura - InnerFocusAura *core.Aura - ShadowfiendAura *core.Aura - ShadowformAura *core.Aura - SpiritTapAura *core.Aura - SurgeOfLightAura *core.Aura - - MindSpikeAuras core.AuraArray + + InnerFocusAura *core.Aura + ShadowformAura *core.Aura + SpiritTapAura *core.Aura + ShadowWeavingAuras core.AuraArray VampiricEmbraceAuras core.AuraArray WeakenedSouls core.AuraArray - EyeOfTheVoidPet *EyeOfTheVoid - HomunculiPets []*Homunculus - ShadowfiendPet *Shadowfiend - - PainAndSufferingDoTSpells []*core.Spell - ProcPrayerOfMending core.ApplySpellResults } @@ -113,7 +83,9 @@ func (priest *Priest) Initialize() { priest.registerMindBlast() priest.registerMindFlay() priest.registerShadowWordPainSpell() - priest.registerDevouringPlagueSpell() + if priest.GetCharacter().Race == proto.Race_RaceUndead { + priest.registerDevouringPlagueSpell() + } priest.RegisterSmiteSpell() priest.registerHolyFire() @@ -128,11 +100,6 @@ func (priest *Priest) RegisterHealingSpells() { // priest.registerRenewSpell() } -func (priest *Priest) Reset(_ *core.Simulation) { - priest.MindFlayModifier = 1 - priest.MindBlastModifier = 1 -} - func New(character *core.Character, talents string) *Priest { priest := &Priest{ Character: *character, @@ -150,36 +117,9 @@ func New(character *core.Character, talents string) *Priest { return 6.25 + priest.GetStat(stats.Spirit)/8 } - priest.ShadowfiendPet = priest.NewShadowfiend() - - if priest.HasRune(proto.PriestRune_RuneHelmEyeOfTheVoid) { - priest.EyeOfTheVoidPet = priest.NewEyeOfTheVoid() - } - - if priest.HasRune(proto.PriestRune_RuneLegsHomunculi) { - priest.HomunculiPets = make([]*Homunculus, 3) - priest.HomunculiPets[0] = priest.NewHomunculus(1, 202390) - priest.HomunculiPets[1] = priest.NewHomunculus(2, 202392) - priest.HomunculiPets[2] = priest.NewHomunculus(3, 202391) - } - - guardians.ConstructGuardians(&priest.Character) - return priest } -func (priest *Priest) HasRune(rune proto.PriestRune) bool { - return false // priest.HasRuneById(int32(rune)) -} - -func (priest *Priest) baseRuneAbilityDamage() float64 { - return 9.456667 + 0.635108*float64(priest.Level) + 0.039063*float64(priest.Level*priest.Level) -} - -func (priest *Priest) baseRuneAbilityHealing() float64 { - return 38.258376 + 0.904195*float64(priest.Level) + 0.161311*float64(priest.Level*priest.Level) -} - // Agent is a generic way to access underlying priest on any of the agents. type PriestAgent interface { GetPriest() *Priest diff --git a/sim/priest/runes.go b/sim/priest/runes.go deleted file mode 100644 index 309935456..000000000 --- a/sim/priest/runes.go +++ /dev/null @@ -1,159 +0,0 @@ -package priest - -import ( - "slices" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) ApplyRunes() { - // Head - priest.registerEyeOfTheVoidCD() - priest.applyPainAndSuffering() - - // Cloak - priest.registerVampiricTouchSpell() - - // Chest - priest.registerVoidPlagueSpell() - - // Bracers - priest.applySurgeOfLight() - priest.applyDespair() - priest.registerVoidZoneSpell() - - // Hands - priest.registerMindSearSpell() - priest.RegisterPenanceSpell() - priest.registerShadowWordDeathSpell() - - // Belt - priest.registerMindSpikeSpell() - - // Legs - priest.registerHomunculiSpell() - - // Feet - priest.registerDispersionSpell() - - // Skill Books - priest.registerShadowfiendSpell() -} - -func (priest *Priest) applyPainAndSuffering() { - if !priest.HasRune(proto.PriestRune_RuneHelmPainAndSuffering) { - return - } - - priest.PainAndSufferingDoTSpells = []*core.Spell{} - - affectedSpellcodes := []int32{SpellCode_PriestMindBlast, SpellCode_PriestMindFlay, SpellCode_PriestMindSpike} - core.MakePermanent(priest.RegisterAura(core.Aura{ - Label: "Pain and Suffering Trigger", - OnInit: func(aura *core.Aura, sim *core.Simulation) { - priest.PainAndSufferingDoTSpells = append( - priest.PainAndSufferingDoTSpells, - core.FilterSlice( - core.Flatten( - [][]*core.Spell{ - priest.ShadowWordPain, - {priest.VoidPlague, priest.VampiricTouch}, - }, - ), - func(spell *core.Spell) bool { return spell != nil }, - )..., - ) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if slices.Contains(affectedSpellcodes, spell.SpellCode) && result.Landed() { - target := result.Target - - var dotToRollover *core.Dot - dotSpells := core.FilterSlice(priest.PainAndSufferingDoTSpells, func(spell *core.Spell) bool { return spell.Dot(target).IsActive() }) - - if len(dotSpells) > 0 { - dotToRollover = dotSpells[0].Dot(target) - for _, spell := range dotSpells { - dot := spell.Dot(target) - if dot.RemainingDuration(sim) < dotToRollover.RemainingDuration(sim) { - dotToRollover = dot - } - } - - dotToRollover.NumberOfTicks = dotToRollover.OriginalNumberOfTicks - dotToRollover.Rollover(sim) - } - } - }, - })) -} - -func (priest *Priest) applySurgeOfLight() { - if !priest.HasRune(proto.PriestRune_RuneBracersSurgeOfLight) { - return - } - - var affectedSpells []*core.Spell - - priest.SurgeOfLightAura = priest.RegisterAura(core.Aura{ - Label: "Surge of Light Proc", - ActionID: core.ActionID{SpellID: int32(proto.PriestRune_RuneBracersSurgeOfLight)}, - Duration: time.Second * 15, - OnInit: func(aura *core.Aura, sim *core.Simulation) { - affectedSpells = core.FilterSlice( - core.Flatten([][]*core.Spell{priest.Smite, priest.FlashHeal}), - func(spell *core.Spell) bool { return spell != nil }, - ) - }, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - core.Each(affectedSpells, func(spell *core.Spell) { - spell.CastTimeMultiplier -= 1 - }) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - core.Each(affectedSpells, func(spell *core.Spell) { - spell.CastTimeMultiplier += 1 - }) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, _ *core.SpellResult) { - if spell.SpellCode == SpellCode_PriestSmite { - aura.Deactivate(sim) - } - }, - OnHealDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, _ *core.SpellResult) { - if spell.SpellCode == SpellCode_PriestFlashHeal { - aura.Deactivate(sim) - } - }, - }) - - handler := func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.ProcMask.Matches(core.ProcMaskSpellOrSpellProc) && result.Outcome.Matches(core.OutcomeCrit) { - priest.SurgeOfLightAura.Activate(sim) - } - } - - priest.RegisterAura(core.Aura{ - Label: "Surge of Light Trigger", - Duration: core.NeverExpires, - OnReset: func(aura *core.Aura, sim *core.Simulation) { - aura.Activate(sim) - }, - OnSpellHitDealt: handler, - OnHealDealt: handler, - }) -} - -func (priest *Priest) applyDespair() { - if !priest.HasRune(proto.PriestRune_RuneBracersDespair) { - return - } - - priest.OnSpellRegistered(func(spell *core.Spell) { - if spell.Flags.Matches(SpellFlagPriest) && !spell.Flags.Matches(core.SpellFlagHelpful) { - spell.CritDamageBonus += 1 - } - }) -} diff --git a/sim/priest/shadow/TestP1Shadow.results b/sim/priest/shadow/TestP1Shadow.results index b13c4b9e1..0224e34dd 100644 --- a/sim/priest/shadow/TestP1Shadow.results +++ b/sim/priest/shadow/TestP1Shadow.results @@ -1,33 +1,33 @@ character_stats_results: { key: "TestP1Shadow-Phase1-Lvl60-CharacterStats-Default" value: { - final_stats: 175.95 final_stats: 180.55 - final_stats: 476.23225 - final_stats: 372.6 - final_stats: 363.4 - final_stats: 173 - final_stats: 0 - final_stats: 0 - final_stats: 0 + final_stats: 185.15 + final_stats: 462.47825 + final_stats: 319.7 + final_stats: 261.05 + final_stats: 285 final_stats: 0 final_stats: 0 final_stats: 40 - final_stats: 41.25 final_stats: 0 - final_stats: 28.05968 final_stats: 0 + final_stats: 320 + final_stats: 45.25 + final_stats: 1 + final_stats: 29.17096 final_stats: 0 - final_stats: 795.95 + final_stats: 0 + final_stats: 800.55 final_stats: 0 final_stats: 16 final_stats: 0 final_stats: 0 final_stats: 0 - final_stats: 6685 + final_stats: 5891.5 final_stats: 0 final_stats: 0 - final_stats: 1052.1 + final_stats: 879.3 final_stats: 540 final_stats: 0 final_stats: 5 @@ -35,15 +35,15 @@ character_stats_results: { final_stats: 3 final_stats: 5 final_stats: 0 - final_stats: 6279.3225 - final_stats: 35 - final_stats: 68 - final_stats: 68 - final_stats: 68 - final_stats: 78 + final_stats: 6141.7825 + final_stats: 27 + final_stats: 60 + final_stats: 60 + final_stats: 60 + final_stats: 70 final_stats: 384 final_stats: 0 - final_stats: 35 + final_stats: 65 final_stats: 0 } } @@ -53,18 +53,18 @@ stat_weights_results: { weights: 0 weights: 0 weights: 0 + weights: 0.35114 weights: 0 - weights: 0 - weights: 0.08882 + weights: 0.29454 weights: 0 weights: 0 weights: 0 weights: 0 weights: 0 - weights: 0.08882 + weights: 0.29454 weights: 0 - weights: 0.45508 - weights: 0.22314 + weights: 5.04909 + weights: 0.47093 weights: 0 weights: 0 weights: 0 @@ -99,98 +99,98 @@ stat_weights_results: { dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Average-Default" value: { - dps: 49.82754 - tps: 49.52526 + dps: 492.68793 + tps: 485.83352 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Dwarf-p0.bis-Basic-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 49.33146 - tps: 82.7582 + dps: 522.09278 + tps: 762.51802 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Dwarf-p0.bis-Basic-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 49.33146 - tps: 49.1282 + dps: 522.09278 + tps: 514.27452 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Dwarf-p0.bis-Basic-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 48.66608 - tps: 48.15904 + dps: 661.35453 + tps: 655.42395 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Dwarf-p0.bis-Basic-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 31.2971 - tps: 30.04522 + dps: 256.91503 + tps: 420.15538 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Dwarf-p0.bis-Basic-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 31.2971 - tps: 30.04522 + dps: 256.91503 + tps: 255.31427 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Dwarf-p0.bis-Basic-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 31.0536 - tps: 29.81145 + dps: 479.19258 + tps: 474.60129 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Undead-p0.bis-Basic-p1-FullBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 49.15098 - tps: 82.58494 + dps: 494.67047 + tps: 732.7942 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Undead-p0.bis-Basic-p1-FullBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 49.15098 - tps: 48.95494 + dps: 494.67047 + tps: 487.77918 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Undead-p0.bis-Basic-p1-FullBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 48.66608 - tps: 48.15904 + dps: 674.0017 + tps: 667.54164 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Undead-p0.bis-Basic-p1-NoBuffs-P1-Consumes-LongMultiTarget" value: { - dps: 31.2971 - tps: 30.04522 + dps: 254.85011 + tps: 418.17306 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Undead-p0.bis-Basic-p1-NoBuffs-P1-Consumes-LongSingleTarget" value: { - dps: 31.2971 - tps: 30.04522 + dps: 254.85011 + tps: 253.33196 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-Settings-Undead-p0.bis-Basic-p1-NoBuffs-P1-Consumes-ShortSingleTarget" value: { - dps: 31.0536 - tps: 29.81145 + dps: 488.25164 + tps: 483.29798 } } dps_results: { key: "TestP1Shadow-Phase1-Lvl60-SwitchInFrontOfTarget-Default" value: { - dps: 49.15098 - tps: 48.95494 + dps: 494.67047 + tps: 487.77918 } } diff --git a/sim/priest/shadow/shadow_priest.go b/sim/priest/shadow/shadow_priest.go index edaaffb96..51ecb88db 100644 --- a/sim/priest/shadow/shadow_priest.go +++ b/sim/priest/shadow/shadow_priest.go @@ -56,5 +56,4 @@ func (spriest *ShadowPriest) Initialize() { } func (spriest *ShadowPriest) Reset(sim *core.Simulation) { - spriest.Priest.Reset(sim) } diff --git a/sim/priest/shadow_word_death.go b/sim/priest/shadow_word_death.go deleted file mode 100644 index 38e1fc90e..000000000 --- a/sim/priest/shadow_word_death.go +++ /dev/null @@ -1,61 +0,0 @@ -package priest - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) registerShadowWordDeathSpell() { - if !priest.HasRune(proto.PriestRune_RuneHandsShadowWordDeath) { - return - } - - // 2024-02-22 In-game value is ~66% base damage after tuning - baseLowDamage := priest.baseRuneAbilityDamage() * 0.66 * 5.32 - baseHighDamage := priest.baseRuneAbilityDamage() * 0.66 * 6.2 - spellCoeff := 0.429 - manaCost := .12 - cooldown := time.Second * 12 - - priest.ShadowWordDeath = priest.RegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: 401955}, - SpellSchool: core.SpellSchoolShadow, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagPriest | core.SpellFlagBinary | core.SpellFlagAPL, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - BonusCoefficient: spellCoeff, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - baseDamage := sim.Roll(baseLowDamage, baseHighDamage) - result := spell.CalcDamage(sim, target, baseDamage, spell.OutcomeMagicHitAndCrit) - - if result.Landed() { - priest.AddShadowWeavingStack(sim, target) - } - spell.DealDamage(sim, result) - }, - ExpectedInitialDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, _ bool) *core.SpellResult { - baseDamage := (baseLowDamage + baseHighDamage) / 2 - return spell.CalcDamage(sim, target, baseDamage, spell.OutcomeExpectedMagicHitAndCrit) - }, - }) -} diff --git a/sim/priest/shadow_word_pain.go b/sim/priest/shadow_word_pain.go index e5f96116a..da37e0a72 100644 --- a/sim/priest/shadow_word_pain.go +++ b/sim/priest/shadow_word_pain.go @@ -5,7 +5,6 @@ import ( "time" "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" ) const ShadowWordPainRanks = 8 @@ -16,6 +15,8 @@ var ShadowWordPainSpellCoef = [ShadowWordPainRanks + 1]float64{0, 0.067, 0.104, var ShadowWordPainManaCost = [ShadowWordPainRanks + 1]float64{0, 25, 50, 95, 155, 230, 305, 385, 470} var ShadowWordPainLevel = [ShadowWordPainRanks + 1]int{0, 4, 10, 18, 26, 34, 42, 50, 58} +//To Do: Check rollover code from runes + func (priest *Priest) registerShadowWordPainSpell() { priest.ShadowWordPain = make([]*core.Spell, ShadowWordPainRanks+1) @@ -37,10 +38,6 @@ func (priest *Priest) getShadowWordPainConfig(rank int) core.SpellConfig { manaCost := ShadowWordPainManaCost[rank] level := ShadowWordPainLevel[rank] - results := make([]*core.SpellResult, min(core.TernaryInt32(priest.HasRune(proto.PriestRune_RuneLegsSharedPain), 3, 1), priest.Env.GetNumTargets())) - - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) - return core.SpellConfig{ SpellCode: SpellCode_PriestShadowWordPain, ActionID: core.ActionID{SpellID: spellId}, @@ -67,16 +64,6 @@ func (priest *Priest) getShadowWordPainConfig(rank int) core.SpellConfig { Dot: core.DotConfig{ Aura: core.Aura{ Label: fmt.Sprintf("Shadow Word: Pain (Rank %d)", rank), - OnGain: func(aura *core.Aura, sim *core.Simulation) { - if priest.HasRune(proto.PriestRune_RuneChestTwistedFaith) { - priest.MindBlastModifier = 1.5 - priest.MindFlayModifier = 1.5 - } - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - priest.MindBlastModifier = 1 - priest.MindFlayModifier = 1 - }, }, NumberOfTicks: ticks + (priest.Talents.ImprovedShadowWordPain), @@ -87,26 +74,18 @@ func (priest *Priest) getShadowWordPainConfig(rank int) core.SpellConfig { dot.Snapshot(target, baseDotDamage, isRollover) }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - } + dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) }, }, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - for idx := range results { - results[idx] = spell.CalcOutcome(sim, target, spell.OutcomeMagicHitNoHitCounter) - target = sim.Environment.NextTargetUnit(target) - } - for _, result := range results { - if result.Landed() { - priest.AddShadowWeavingStack(sim, result.Target) - spell.Dot(result.Target).Apply(sim) - } - spell.DealOutcome(sim, result) + result := spell.CalcOutcome(sim, target, spell.OutcomeMagicHitNoHitCounter) + + if result.Landed() { + priest.AddShadowWeavingStack(sim, result.Target) + spell.Dot(result.Target).Apply(sim) } + spell.DealOutcome(sim, result) }, } } diff --git a/sim/priest/shadowfiend.go b/sim/priest/shadowfiend.go deleted file mode 100644 index 00adb6d38..000000000 --- a/sim/priest/shadowfiend.go +++ /dev/null @@ -1,248 +0,0 @@ -package priest - -import ( - "math" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" - "github.com/wowsims/classic/sim/core/stats" -) - -func (priest *Priest) registerShadowfiendSpell() { - actionID := core.ActionID{SpellID: 401977} - duration := time.Second * 15 - cooldown := time.Minute * 5 - - // For timeline only - priest.ShadowfiendAura = priest.RegisterAura(core.Aura{ - ActionID: actionID, - Label: "Shadowfiend", - Duration: duration, - }) - - priest.Shadowfiend = priest.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskEmpty, - Flags: SpellFlagPriest | core.SpellFlagAPL, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - priest.ShadowfiendPet.EnableWithTimeout(sim, priest.ShadowfiendPet, duration) - priest.ShadowfiendAura.Activate(sim) - }, - }) - - priest.AddMajorCooldown(core.MajorCooldown{ - Spell: priest.Shadowfiend, - Priority: 1, - Type: core.CooldownTypeMana, - ShouldActivate: func(sim *core.Simulation, character *core.Character) bool { - return character.CurrentManaPercent() <= 0.01 - }, - }) -} - -type Shadowfiend struct { - core.Pet - - Priest *Priest - Shadowcrawl *core.Spell - ShadowcrawlAura *core.Aura -} - -func (priest *Priest) NewShadowfiend() *Shadowfiend { - baseDamageMin := 0.0 - baseDamageMax := 0.0 - baseStats := stats.Stats{} - // Seems to basically be a reskinned Felhunter so using Felhunter stats - switch priest.Level { - case 25: - baseStats = stats.Stats{ - stats.Strength: 50, - stats.Agility: 40, - stats.Stamina: 87, - stats.Intellect: 35, - stats.Spirit: 61, - stats.Mana: 653, - stats.MP5: 0, - stats.MeleeCrit: 3.2685 * core.CritRatingPerCritChance, - stats.SpellCrit: 3.3355 * core.CritRatingPerCritChance, - } - baseDamageMin = 24 - baseDamageMax = 40 - case 40: - // TODO: All of the stats and stat inheritance needs to be verified - baseStats = stats.Stats{ - stats.Strength: 74, - stats.Agility: 58, - stats.Stamina: 148, - stats.Intellect: 49, - stats.Spirit: 97, - stats.Mana: 653, - stats.MP5: 0, - stats.MeleeCrit: 3.2685 * core.CritRatingPerCritChance, - stats.SpellCrit: 3.3355 * core.CritRatingPerCritChance, - } - baseDamageMin = 24 - baseDamageMax = 40 - case 50: - baseStats = stats.Stats{ - stats.Strength: 107, - stats.Agility: 71, - stats.Stamina: 190, - stats.Intellect: 59, - stats.Spirit: 123, - stats.Mana: 912, - stats.MP5: 0, - stats.MeleeCrit: 3.2685 * core.CritRatingPerCritChance, - stats.SpellCrit: 3.3355 * core.CritRatingPerCritChance, - } - baseDamageMin = 24 - baseDamageMax = 40 - case 60: - baseStats = stats.Stats{ - stats.Strength: 129, - stats.Agility: 85, - stats.Stamina: 234, - stats.Intellect: 70, - stats.Spirit: 150, - stats.Mana: 1066, - stats.MP5: 0, - stats.MeleeCrit: 3.2685 * core.CritRatingPerCritChance, - stats.SpellCrit: 3.3355 * core.CritRatingPerCritChance, - } - baseDamageMin = 70 - baseDamageMax = 97 - } - - shadowfiend := &Shadowfiend{ - Pet: core.NewPet("Shadowfiend", &priest.Character, baseStats, priest.shadowfiendStatInheritance(), false, true), - Priest: priest, - } - - manaMetric := priest.NewManaMetrics(core.ActionID{SpellID: 34433}) - core.MakePermanent(shadowfiend.GetOrRegisterAura(core.Aura{ - Label: "Autoattack mana regen", - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - restoreMana := priest.MaxMana() * 0.05 - priest.AddMana(sim, restoreMana, manaMetric) - }, - })) - - shadowfiend.EnableManaBarWithModifier(.77) - - shadowfiend.registerShadowCrawlSpell() - - shadowfiend.PseudoStats.DamageTakenMultiplier *= 0.1 - - shadowfiend.AddStatDependency(stats.Strength, stats.AttackPower, 2) - shadowfiend.AddStat(stats.AttackPower, -20) - - // Warrior crit scaling - shadowfiend.AddStatDependency(stats.Agility, stats.MeleeCrit, core.CritPerAgiAtLevel[proto.Class_ClassWarrior][int(shadowfiend.Level)]*core.CritRatingPerCritChance) - shadowfiend.AddStatDependency(stats.Intellect, stats.SpellCrit, core.CritPerIntAtLevel[proto.Class_ClassWarrior][int(shadowfiend.Level)]*core.SpellCritRatingPerCritChance) - - shadowfiend.EnableAutoAttacks(shadowfiend, core.AutoAttackOptions{ - MainHand: core.Weapon{ - BaseDamageMin: baseDamageMin, - BaseDamageMax: baseDamageMax, - SwingSpeed: 1.5, - AttackPowerPerDPS: 14.0 / 6.0, // Observed 6 times stronger AP scaling then expected - SpellSchool: core.SpellSchoolShadow, - }, - AutoSwingMelee: true, - }) - - priest.AddPet(shadowfiend) - - return shadowfiend -} - -func (priest *Priest) shadowfiendStatInheritance() core.PetStatInheritance { - return func(ownerStats stats.Stats) stats.Stats { - // Shadowfiend seems to benefit from the owner's Spell Hit + Shadow Focus hit chance - ownerHitChance := (ownerStats[stats.SpellHit] + 2*float64(priest.Talents.ShadowFocus)) / core.SpellHitRatingPerHitChance - highestSchoolPower := ownerStats[stats.SpellPower] + ownerStats[stats.SpellDamage] + max(ownerStats[stats.HolyPower], ownerStats[stats.ShadowPower]) - - // TODO: Needs more verification - return stats.Stats{ - stats.Stamina: ownerStats[stats.Stamina] * .75, - stats.Intellect: ownerStats[stats.Intellect] * 0.3, - stats.Armor: ownerStats[stats.Armor] * 0.35, - stats.AttackPower: highestSchoolPower * 0.57, - stats.MP5: ownerStats[stats.MP5] * 0.3, - stats.SpellPower: ownerStats[stats.SpellPower] * 0.15, - stats.SpellDamage: ownerStats[stats.SpellDamage] * 0.15, - stats.ShadowPower: ownerStats[stats.ShadowPower] * 0.15, - stats.SpellPenetration: ownerStats[stats.SpellPenetration], - stats.MeleeHit: ownerHitChance * core.MeleeHitRatingPerHitChance, - stats.SpellHit: math.Floor(ownerHitChance / 12.0 * 17.0), - // Shadowfiend seems to most likely use the priest's Spell Crit to scale its melee crit - // In reality the melees are shadow damage and probably use the spell hit table but we can't configure that currently - stats.MeleeCrit: ownerStats[stats.SpellCrit], - stats.SpellCrit: ownerStats[stats.SpellCrit], - } - } -} - -func (shadowfiend *Shadowfiend) Initialize() { -} - -func (shadowfiend *Shadowfiend) ExecuteCustomRotation(sim *core.Simulation) { - shadowfiend.Shadowcrawl.Cast(sim, shadowfiend.CurrentTarget) -} - -func (shadowfiend *Shadowfiend) Reset(sim *core.Simulation) { - shadowfiend.ShadowcrawlAura.Deactivate(sim) - shadowfiend.Disable(sim) -} - -func (shadowfiend *Shadowfiend) OnPetDisable(sim *core.Simulation) { - shadowfiend.ShadowcrawlAura.Deactivate(sim) -} - -func (shadowfiend *Shadowfiend) GetPet() *core.Pet { - return &shadowfiend.Pet -} - -func (shadowfiend *Shadowfiend) registerShadowCrawlSpell() { - actionID := core.ActionID{SpellID: 401990} - shadowfiend.ShadowcrawlAura = shadowfiend.GetOrRegisterAura(core.Aura{ - Label: "Shadowcrawl", - ActionID: actionID, - Duration: time.Second * 5, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - shadowfiend.PseudoStats.DamageDealtMultiplier *= 1.15 - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - shadowfiend.PseudoStats.DamageDealtMultiplier /= 1.15 - }, - }) - - shadowfiend.Shadowcrawl = shadowfiend.RegisterSpell(core.SpellConfig{ - ActionID: actionID, - SpellSchool: core.SpellSchoolShadow, - ProcMask: core.ProcMaskEmpty, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: time.Second * 6, - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - shadowfiend.ShadowcrawlAura.Activate(sim) - }, - }) -} diff --git a/sim/priest/talents.go b/sim/priest/talents.go index 6c4d56451..2dd3c9ddd 100644 --- a/sim/priest/talents.go +++ b/sim/priest/talents.go @@ -226,8 +226,6 @@ func (priest *Priest) applyDarkness() { [][]*core.Spell{ priest.MindBlast, priest.DevouringPlague, - priest.MindSearTicks, - {priest.ShadowWordDeath}, }, ), func(spell *core.Spell) bool { return spell != nil }, @@ -237,9 +235,6 @@ func (priest *Priest) applyDarkness() { core.Flatten( [][]*core.Spell{ priest.ShadowWordPain, - {priest.VoidPlague}, - {priest.MindSpike}, - {priest.VoidZone}, }, ), func(spell *core.Spell) bool { return spell != nil }, @@ -329,17 +324,17 @@ func (priest *Priest) registerShadowform() { actionID := core.ActionID{SpellID: 15473} + //To Do: Add physical damage resistance + priest.ShadowformAura = priest.RegisterAura(core.Aura{ Label: "Shadowform", ActionID: actionID, Duration: core.NeverExpires, OnGain: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] *= 1.25 - aura.Unit.PseudoStats.SchoolCostMultiplier[stats.SchoolIndexShadow] -= 50 + aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] *= 1.15 }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] /= 1.25 - aura.Unit.PseudoStats.SchoolCostMultiplier[stats.SchoolIndexShadow] += 50 + aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] /= 1.15 }, OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { if spell.SpellSchool.Matches(core.SpellSchoolHoly) { diff --git a/sim/priest/vampiric_touch.go b/sim/priest/vampiric_touch.go deleted file mode 100644 index aa9e49b29..000000000 --- a/sim/priest/vampiric_touch.go +++ /dev/null @@ -1,103 +0,0 @@ -package priest - -import ( - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) registerVampiricTouchSpell() { - if !priest.HasRune(proto.PriestRune_RuneCloakVampiricTouch) { - return - } - - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) - - numTicks := int32(5) - tickLength := time.Second * 3 - baseTickDamage := priest.baseRuneAbilityDamage() * .65 - spellCoef := 0.167 - castTime := time.Millisecond * 1500 - manaCost := 0.16 - - partyPlayers := priest.Env.Raid.GetPlayerParty(&priest.Unit).Players - // https: //www.wowhead.com/classic/spell=402779/vampiric-touch - manaMetrics := priest.NewManaMetrics(core.ActionID{SpellID: 402779}) - manaReturnedMultiplier := 0.05 - - manaGainAura := priest.RegisterAura(core.Aura{ - Label: "Vampiric Touch (Mana)", - Duration: core.NeverExpires, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.SpellSchool.Matches(core.SpellSchoolShadow) { - manaGained := result.Damage * manaReturnedMultiplier - for _, player := range partyPlayers { - player.GetCharacter().AddMana(sim, manaGained, manaMetrics) - } - } - }, - }) - - priest.VampiricTouch = priest.RegisterSpell(core.SpellConfig{ - SpellCode: SpellCode_PriestVampiricTouch, - ActionID: core.ActionID{SpellID: int32(proto.PriestRune_RuneCloakVampiricTouch)}, - SpellSchool: core.SpellSchoolShadow, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagPriest | core.SpellFlagAPL | core.SpellFlagPureDot, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - CastTime: castTime, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "VampiricTouch", - OnGain: func(aura *core.Aura, sim *core.Simulation) { - manaGainAura.Activate(sim) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - manaGainAura.Deactivate(sim) - }, - }, - - NumberOfTicks: numTicks, - TickLength: tickLength, - BonusCoefficient: spellCoef, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseTickDamage, isRollover) - if isRollover && priest.VampiricEmbraceAuras != nil { - priest.VampiricEmbraceAuras.Get(target).Activate(sim) - } - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - } - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - result := spell.CalcOutcome(sim, target, spell.OutcomeMagicHitNoHitCounter) - if result.Landed() { - priest.AddShadowWeavingStack(sim, target) - spell.Dot(target).Apply(sim) - } - spell.DealOutcome(sim, result) - }, - }) -} diff --git a/sim/priest/void_plague.go b/sim/priest/void_plague.go deleted file mode 100644 index fa056bfa0..000000000 --- a/sim/priest/void_plague.go +++ /dev/null @@ -1,82 +0,0 @@ -package priest - -import ( - "strconv" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -// https://www.wowhead.com/classic/spell=425204/void-plague -// https://www.wowhead.com/classic/news/patch-1-15-build-52124-ptr-datamining-season-of-discovery-runes-336044 -func (priest *Priest) registerVoidPlagueSpell() { - if !priest.HasRune(proto.PriestRune_RuneFeetVoidPlague) { - return - } - - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) - - ticks := int32(6) - tickLength := time.Second * 3 - - // 2024-02-22 tuning 10% buff - baseTickDamage := priest.baseRuneAbilityDamage() * 1.17 * 1.1 - spellCoeff := .166 - manaCost := .13 - cooldown := time.Second * 6 - - priest.VoidPlague = priest.GetOrRegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.PriestRune_RuneFeetVoidPlague)}, - SpellSchool: core.SpellSchoolShadow, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagPriest | core.SpellFlagAPL | core.SpellFlagDisease | core.SpellFlagPureDot, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - Aura: core.Aura{ - Label: "VoidPlague-" + strconv.Itoa(1), - }, - - NumberOfTicks: ticks, - TickLength: tickLength, - BonusCoefficient: spellCoeff, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseTickDamage, isRollover) - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) - } - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - result := spell.CalcOutcome(sim, target, spell.OutcomeMagicHitNoHitCounter) - if result.Landed() { - priest.AddShadowWeavingStack(sim, target) - spell.Dot(target).Apply(sim) - } - spell.DealOutcome(sim, result) - }, - }) -} diff --git a/sim/priest/void_zone.go b/sim/priest/void_zone.go deleted file mode 100644 index 8f62563a3..000000000 --- a/sim/priest/void_zone.go +++ /dev/null @@ -1,86 +0,0 @@ -package priest - -import ( - "strconv" - "time" - - "github.com/wowsims/classic/sim/core" - "github.com/wowsims/classic/sim/core/proto" -) - -func (priest *Priest) registerVoidZoneSpell() { - if !priest.HasRune(proto.PriestRune_RuneBracersVoidZone) { - return - } - - ticks := int32(10) - tickLength := time.Second * 1 - - baseTickDamage := priest.baseRuneAbilityDamage() * .51 - spellCoeff := 0.084 - manaCost := .21 - cooldown := time.Second * 30 - - hasDespairRune := priest.HasRune(proto.PriestRune_RuneBracersDespair) - - priest.VoidZone = priest.GetOrRegisterSpell(core.SpellConfig{ - ActionID: core.ActionID{SpellID: int32(proto.PriestRune_RuneBracersVoidZone)}, - SpellSchool: core.SpellSchoolShadow, - DefenseType: core.DefenseTypeMagic, - ProcMask: core.ProcMaskSpellDamage, - Flags: SpellFlagPriest | core.SpellFlagAPL | core.SpellFlagPureDot, - - ManaCost: core.ManaCostOptions{ - BaseCost: manaCost, - }, - Cast: core.CastConfig{ - DefaultCast: core.Cast{ - GCD: core.GCDDefault, - }, - CD: core.Cooldown{ - Timer: priest.NewTimer(), - Duration: cooldown, - }, - }, - - DamageMultiplier: 1, - ThreatMultiplier: 1, - - Dot: core.DotConfig{ - IsAOE: true, - Aura: core.Aura{ - Label: "VoidZone-" + strconv.Itoa(1), - }, - - NumberOfTicks: ticks, - TickLength: tickLength, - BonusCoefficient: spellCoeff, - - OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, baseTickDamage, isRollover) - }, - OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { - for _, aoeTarget := range sim.Encounter.TargetUnits { - if hasDespairRune { - dot.CalcAndDealPeriodicSnapshotDamage(sim, aoeTarget, dot.OutcomeSnapshotCrit) - } else { - dot.CalcAndDealPeriodicSnapshotDamage(sim, aoeTarget, dot.OutcomeTick) - } - } - }, - }, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - spell.AOEDot().Apply(sim) - }, - - ExpectedTickDamage: func(sim *core.Simulation, target *core.Unit, spell *core.Spell, useSnapshot bool) *core.SpellResult { - if useSnapshot { - dot := spell.Dot(target) - return dot.CalcSnapshotDamage(sim, target, dot.Spell.OutcomeExpectedMagicAlwaysHit) - } else { - return spell.CalcPeriodicDamage(sim, target, baseTickDamage, spell.OutcomeExpectedMagicAlwaysHit) - } - }, - }) -} diff --git a/ui/healing_priest/inputs.ts b/ui/healing_priest/inputs.ts index ca955a898..0e6525553 100644 --- a/ui/healing_priest/inputs.ts +++ b/ui/healing_priest/inputs.ts @@ -1,10 +1,9 @@ +import * as InputHelpers from '../core/components/input_helpers.js'; import { Player } from '../core/player.js'; import { Spec, UnitReference, UnitReference_Type as UnitType } from '../core/proto/common.js'; import { ActionId } from '../core/proto_utils/action_id.js'; import { EventID } from '../core/typed_event.js'; -import * as InputHelpers from '../core/components/input_helpers.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. @@ -28,9 +27,4 @@ export const SelfPowerInfusion = InputHelpers.makeSpecOptionsBooleanIconInput({ fieldName: 'useInnerFire', actionId: () => ActionId.fromSpellId(48168), -}); - -export const Shadowfiend = InputHelpers.makeSpecOptionsBooleanIconInput({ - fieldName: 'useShadowfiend', - actionId: () => ActionId.fromSpellId(34433), -}); +}); \ No newline at end of file diff --git a/ui/healing_priest/presets.ts b/ui/healing_priest/presets.ts index 7a91ef93d..42e620676 100644 --- a/ui/healing_priest/presets.ts +++ b/ui/healing_priest/presets.ts @@ -43,8 +43,6 @@ export const HolyTalents = { export const DefaultOptions = Options.create({ useInnerFire: true, - useShadowfiend: true, - rapturesPerMinute: 5, powerInfusionTarget: UnitReference.create(), }); diff --git a/ui/healing_priest/sim.ts b/ui/healing_priest/sim.ts index dad46821e..896a4d320 100644 --- a/ui/healing_priest/sim.ts +++ b/ui/healing_priest/sim.ts @@ -78,7 +78,6 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecHealingPriest, { playerIconInputs: [ HealingPriestInputs.SelfPowerInfusion, HealingPriestInputs.InnerFire, - HealingPriestInputs.Shadowfiend, ], // Buff and Debuff inputs to include/exclude, overriding the EP-based defaults. includeBuffDebuffInputs: [ diff --git a/ui/shadow_priest/apls/p1.apl.json b/ui/shadow_priest/apls/p1.apl.json index 479045c3a..416d6fb4b 100644 --- a/ui/shadow_priest/apls/p1.apl.json +++ b/ui/shadow_priest/apls/p1.apl.json @@ -1,8 +1,13 @@ { "type": "TypeAPL", - "prepullActions": [], - "priorityList": [ - {"action":{"autocastOtherCooldowns":{}}}, - {"action":{"castSpell":{"spellId":{"spellId":8103,"rank":3}}}} - ] + "prepullActions": [ + {"action":{"castSpell":{"spellId":{"spellId":15473}}},"doAtValue":{"const":{"val":"-1s"}}} + ], + "priorityList": [ + {"action":{"autocastOtherCooldowns":{}}}, + {"action":{"condition":{"and":{"vals":[{"not":{"val":{"dotIsActive":{"spellId":{"spellId":10894,"rank":8}}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10"}}}}]}},"castSpell":{"spellId":{"spellId":10894,"rank":8}}}}, + {"action":{"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":14751}}},{"castSpell":{"spellId":{"spellId":19279,"rank":5}}}]}}}, + {"action":{"castSpell":{"spellId":{"spellId":10947,"rank":9}}}}, + {"action":{"castSpell":{"spellId":{"spellId":18807,"rank":6}}}} + ] } \ No newline at end of file diff --git a/ui/shadow_priest/gear_sets/p0.bis.gear.json b/ui/shadow_priest/gear_sets/p0.bis.gear.json index 19141f4df..bb06241c7 100644 --- a/ui/shadow_priest/gear_sets/p0.bis.gear.json +++ b/ui/shadow_priest/gear_sets/p0.bis.gear.json @@ -1,19 +1,19 @@ -{"items": [ - {"id":16693}, - {}, - {"id":16695}, - {}, - {"id":16690}, - {"id":16697}, - {"id":16692}, - {"id":16696}, - {"id":16694}, - {"id":16691}, - {}, - {}, - {}, - {}, - {}, - {}, - {} -]} \ No newline at end of file +{"items": [ + {"id":10504,"randomSuffix":1861,"enchant":1509}, + {"id":18691}, + {"id":14112}, + {"id":13386,"randomSuffix":1851}, + {"id":14136,"enchant":1891}, + {"id":10248,"randomSuffix":1851,"enchant":1883}, + {"id":18407}, + {"id":11662}, + {"id":13170,"enchant":1509}, + {"id":18735,"enchant":851}, + {"id":13001}, + {"id":13001}, + {"id":13968}, + {"id":12930}, + {"id":13349,"enchant":2504}, + {"id":15942,"randomSuffix":1852}, + {"id":13396} + ]} \ No newline at end of file