diff --git a/assets/database/db.bin b/assets/database/db.bin index 6313d3114f..8d5154b04a 100644 Binary files a/assets/database/db.bin and b/assets/database/db.bin differ diff --git a/assets/database/db.json b/assets/database/db.json index f10afa7928..60ad5e61cd 100644 --- a/assets/database/db.json +++ b/assets/database/db.json @@ -10400,7 +10400,7 @@ {"path":"Blackwing Descent/Nefarian 25 H Adds","targets":[{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 1","target":{"id":4191801,"name":"Animated Bone Warrior 25 H - 1","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2,"targetInputs":[{"inputType":1,"label":"Electrocute Count","tooltip":"Number of Electrocute casts to model. Total count will be spread evenly over the encounter duration with a randomized offset.","numberValue":6}]}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 2","target":{"id":4191802,"name":"Animated Bone Warrior 25 H - 2","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 3","target":{"id":4191803,"name":"Animated Bone Warrior 25 H - 3","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 4","target":{"id":4191804,"name":"Animated Bone Warrior 25 H - 4","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 5","target":{"id":4191805,"name":"Animated Bone Warrior 25 H - 5","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 6","target":{"id":4191806,"name":"Animated Bone Warrior 25 H - 6","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 7","target":{"id":4191807,"name":"Animated Bone Warrior 25 H - 7","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 8","target":{"id":4191808,"name":"Animated Bone Warrior 25 H - 8","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 9","target":{"id":4191809,"name":"Animated Bone Warrior 25 H - 9","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 10","target":{"id":4191810,"name":"Animated Bone Warrior 25 H - 10","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 11","target":{"id":4191811,"name":"Animated Bone Warrior 25 H - 11","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}},{"path":"Blackwing Descent/Animated Bone Warrior 25 H - 12","target":{"id":4191812,"name":"Animated Bone Warrior 25 H - 12","level":85,"mobType":8,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,38745000,0,0],"minBaseDamage":2394,"damageSpread":0.34,"swingSpeed":2}}]}, {"path":"Firelands/Beth'tilac 25 H","targets":[{"path":"Firelands/Beth'tilac 25 H","target":{"id":52498,"name":"Beth'tilac 25 H","level":88,"mobType":1,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,98518124,0,0],"minBaseDamage":170101,"damageSpread":0.4832,"swingSpeed":2,"targetInputs":[{"label":"Include Frenzy","tooltip":"Model the burn phase of the encounter with the stacking boss damage amp. Note that The Widow's Kiss will not be modeled even if this option is selected, since it is assumed that an off-tank will be pre-taunting to soak the debuff."}]}}]}, {"path":"Firelands/Baleroc 25 H","targets":[{"path":"Firelands/Baleroc 25 H","target":{"id":53494,"name":"Baleroc 25 H","level":88,"mobType":4,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,195576084,0,0],"minBaseDamage":323321,"damageSpread":0.4738,"swingSpeed":2,"dualWield":true,"tankIndex":1,"targetInputs":[{"label":"Tank swap for Decimation Blade","tooltip":"If checked, the boss will be tanked by Tank 2 rather than the Main Tank during Decimation Blade windows.","boolValue":true},{"inputType":1,"label":"Initial OT Blaze of Glory stacks","tooltip":"If non-zero, Tank 2 will initiate the pull until the specified stack count is accumulated. Larger values allow the OT to gear more aggressively while still meeting the 250k HP threshold for the first Decimation Blade window, but make life more difficult for the MT during Inferno Blade windows. This input is ignored if tank swaps are disabled.","numberValue":2},{"inputType":1,"label":"Initial Vital Spark ramp rate","tooltip":"For the first minute of the pull, the simulated healing agent will accumulate this many Vital Spark stacks on average between Vital Flame refreshes on the tank.","numberValue":7.5},{"inputType":1,"label":"Steady state Vital Spark accumulation rate","tooltip":"Slower rate for the remainder of the pull.","numberValue":4}]}}]}, -{"path":"Dragon Soul/Warmaster Blackhorn 25 H P2","targets":[{"path":"Dragon Soul/Warmaster Blackhorn 25 H","target":{"id":56427,"name":"Warmaster Blackhorn 25 H","level":88,"mobType":6,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,89671248,0,0],"minBaseDamage":295695,"damageSpread":0.1,"swingSpeed":1.5,"targetInputs":[{"inputType":1,"label":"Tank swap interval","tooltip":"Elapsed time (in seconds) between simulated tank swaps","numberValue":30},{"inputType":1,"label":"Add de-activation time","tooltip":"Simulation time (in seconds) at which to disable Goriona's attacks","numberValue":96},{"inputType":1,"label":"Burn phase HP %","tooltip":"% of boss HP remaining when Goriona is de-activated","numberValue":73}]}},{"path":"Dragon Soul/Goriona 25 H","target":{"id":56781,"name":"Goriona 25 H","level":88,"mobType":3,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,80759953,0,0],"minBaseDamage":249124,"damageSpread":0.2,"swingSpeed":1.5,"tankIndex":1}}]} +{"path":"Dragon Soul/Warmaster Blackhorn 25 H P2","targets":[{"path":"Dragon Soul/Warmaster Blackhorn 25 H","target":{"id":56427,"name":"Warmaster Blackhorn 25 H","level":88,"mobType":6,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,89671248,0,0],"minBaseDamage":295695,"damageSpread":0.1,"swingSpeed":1.5,"targetInputs":[{"inputType":1,"label":"Tank swap interval","tooltip":"Elapsed time (in seconds) between simulated tank swaps","numberValue":30},{"inputType":1,"label":"Add de-activation time","tooltip":"Simulation time (in seconds) at which to disable Goriona's attacks","numberValue":96},{"inputType":1,"label":"Burn phase HP %","tooltip":"% of boss HP remaining when Goriona is de-activated","numberValue":73},{"inputType":2,"label":"Nerf state","tooltip":"Strength of the stacking Power of the Aspects debuff","enumOptions":["0%","5%","10%","15%","20%","25%","30%","35%"]}]}},{"path":"Dragon Soul/Goriona 25 H","target":{"id":56781,"name":"Goriona 25 H","level":88,"mobType":3,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11977,0,80759953,0,0],"minBaseDamage":249124,"damageSpread":0.2,"swingSpeed":1.5,"tankIndex":1}}]} ], "glyphIds":[ {"itemId":40919,"spellId":54830}, diff --git a/sim/encounters/dragonsoul/blackhorn_ai.go b/sim/encounters/dragonsoul/blackhorn_ai.go index 3a29ed8268..c64e2db568 100644 --- a/sim/encounters/dragonsoul/blackhorn_ai.go +++ b/sim/encounters/dragonsoul/blackhorn_ai.go @@ -99,6 +99,13 @@ func blackhornTargetInputs() []*proto.TargetInput { InputType: proto.InputType_Number, NumberValue: 73, }, + { + Label: "Nerf state", + Tooltip: "Strength of the stacking Power of the Aspects debuff", + InputType: proto.InputType_Enum, + EnumOptions: []string{"0%", "5%", "10%", "15%", "20%", "25%", "30%", "35%"}, + EnumValue: 0, + }, } } @@ -129,6 +136,7 @@ type BlackhornAI struct { disableAddAt time.Duration cleavePhaseVengeanceInterval time.Duration cleavePhaseVengeanceGain int32 + nerfLevel int32 // Spell + aura references Devastate *core.Spell @@ -162,6 +170,7 @@ func (ai *BlackhornAI) Initialize(target *core.Target, config *proto.Target) { ai.disableAddAt = core.DurationFromSeconds(config.TargetInputs[1].NumberValue) ai.cleavePhaseVengeanceGain = 100 - int32(config.TargetInputs[2].NumberValue) ai.cleavePhaseVengeanceInterval = ai.disableAddAt / time.Duration(ai.cleavePhaseVengeanceGain) + ai.nerfLevel = config.TargetInputs[3].EnumValue } // Register relevant spells and auras @@ -169,6 +178,7 @@ func (ai *BlackhornAI) Initialize(target *core.Target, config *proto.Target) { ai.registerDisruptingRoar() ai.registerVengeance() ai.registerTwilightBreath() + ai.registerPowerOfTheAspects() } func (ai *BlackhornAI) registerDevastate() { @@ -393,6 +403,36 @@ func (ai *BlackhornAI) registerTwilightBreath() { } } +func (ai *BlackhornAI) registerPowerOfTheAspects() { + if !ai.isBoss || (ai.nerfLevel == 0) { + return + } + + damageMultiplier := 1.0 - 0.05*float64(ai.nerfLevel) + auraID := 109250 + ai.nerfLevel + + debuffConfig := core.Aura{ + Label: "Power of the Aspects", + ActionID: core.ActionID{SpellID: auraID}, + Duration: core.NeverExpires, + + OnReset: func(aura *core.Aura, sim *core.Simulation) { + aura.Activate(sim) + }, + + OnGain: func(aura *core.Aura, sim *core.Simulation) { + aura.Unit.PseudoStats.DamageDealtMultiplier *= damageMultiplier + }, + + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + aura.Unit.PseudoStats.DamageDealtMultiplier /= damageMultiplier + }, + } + + ai.BossUnit.GetOrRegisterAura(debuffConfig) + ai.AddUnit.GetOrRegisterAura(debuffConfig) +} + func (ai *BlackhornAI) Reset(sim *core.Simulation) { // Randomize GCD and swing timings to prevent fake APL-Haste couplings. ai.Target.ExtendGCDUntil(sim, core.DurationFromSeconds(sim.RandomFloat("Specials Timing")*core.BossGCD.Seconds())) diff --git a/ui/druid/guardian/presets.ts b/ui/druid/guardian/presets.ts index 4fff993169..04edde375a 100644 --- a/ui/druid/guardian/presets.ts +++ b/ui/druid/guardian/presets.ts @@ -211,6 +211,6 @@ export const PRESET_BUILD_BLACKHORN_OT = PresetUtils.makePresetBuild("Blackhorn rotation: ROTATION_BLACKHORN_OT, encounter: PresetUtils.makePresetEncounter( "Blackhorn OT", - 'http://localhost:5173/cata/druid/guardian/?i=cmxe#eJzdUkFrE0EUzputS2KCTUPRpgd9LdTagBIiihZxJ4vSHFMVWm9OstPu0M3usrNtMKdcvHhRKh7ak148eCj1IFR68WYLFnrSXvUkVI9C8SBOdhOt4h/Q7zTvzfe+93jvO3oiCUWgYEMb4CFAm8A6gV0CZioLl6ACewCTiUmShVxi2F/V9KrD7vIgmc7CaDqpFfNVcueIqjNTrwG2gKzr5LmWHk4NJCKco1uk7xP5BgcEnmpx7ja9r51OdV5PMh/pwNrUh9bg2ntj4tS9/emNk1+N/OZ4f/rlsy8G6qPf9YoWURNtQbuagzS/utLBtnE5zuwaI3MR3hnlnbcdfDZKL/r8/Q2tNTTDggaTIQ/QdFh9wfYCF0sXsIKzQ3phDxL/INrWG3oopHn2uPwnJ1rNlUyuvALxtl4ZXc6BsQwzScjlbjF3AWWT+ShctZ8l5hQuXneYL7mFoWhwPCNclLzuuZacwBoPm5yrhGgsOizscHr1ciRWvkqXYV4pHy9bFlr8LKuHYomFwnMjvYJ5M67tJX5vwEJs2qJuY+ihJSSrORynvECR2bhUv6G6Xq/TrOo0rTr1m4vqnL7NJMdKFccK58fQm8OaJ2UnDniDCVe480pZjd5VQyEPTcetWJPeoKUHxN/Z1FqZHrHrE+3/8Mm1UvnR332C4thPn2z/8kkRfgD/5btE' + 'http://localhost:5173/cata/druid/guardian/?i=cmxe#eJzdUs9rE0EUzpu1MWmCTUPRpgedFmJtQImJEQ3iboLSnCS1QuvNSXaSHZPshp1Jgznl4sWLUvHQHkQvHjyUXoRKL95swUJO2quehOhRKJ6cyQ+t4j+g32F4881733u8+UZP+CAOBljQBngE0EawiaCDIOsPwSXIwT5A2pNGIQh7pvi65s1XyT3q+gIhmAn4tHgkj+6MyLqs/w3ADqBNL3qpBab8454ezhk76EgHaZ/RdzhA8Fzr07eNB9ppv4qeBT8Z4xvzH1sTGx/0uVP3uwtbJ7/pke3ZscCrF1917J3pHs1pvVRPmxkD2Qkjsr6msKtf7jMdfbrUw3s9s/dO4YueeDpS725prckl4tYIF9TF2SopVizHtXEihXN4edIb2wfPP4i2+dY4dDUi5Enmz5zeaq4Ew5k16G/rtT7IOdBXYckH4fAtYlcwb5I6Zrbczwqpxi5er5I6pyYWrEbxGWZjTouObfI5XKCiSakkWK1RJULlDOv5dF/5qrEKZal8PGOa2KRnSVGwFSKYY/f0YtnFfu2Q+L0BEbhpsaKFhYNNxkmhSvG848pkMsvlq5C/N+y0LDstyE5j2Yb8zrpFOMW5PI7GklHslHDB4VzdXVojzGZ2WSrL0QdqmPFD01Gzr2nclJp3fSg8eoO6JcyFfIpdWBQutcvCUqrCooouVpRg3mlKSw3YDK/TolCqhUaplEbxaBqlomntfFwdKkqoKKGipIqSqWjiIarvbWut4HCqgSm1/8OU1xKZx383JWbHfppy95cp4/ADEKDaLg==', ), });