Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified assets/database/db.bin
Binary file not shown.
2 changes: 1 addition & 1 deletion assets/database/db.json
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down
40 changes: 40 additions & 0 deletions sim/encounters/dragonsoul/blackhorn_ai.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
}
}

Expand Down Expand Up @@ -129,6 +136,7 @@ type BlackhornAI struct {
disableAddAt time.Duration
cleavePhaseVengeanceInterval time.Duration
cleavePhaseVengeanceGain int32
nerfLevel int32

// Spell + aura references
Devastate *core.Spell
Expand Down Expand Up @@ -162,13 +170,15 @@ 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
ai.registerDevastate()
ai.registerDisruptingRoar()
ai.registerVengeance()
ai.registerTwilightBreath()
ai.registerPowerOfTheAspects()
}

func (ai *BlackhornAI) registerDevastate() {
Expand Down Expand Up @@ -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()))
Expand Down
2 changes: 1 addition & 1 deletion ui/druid/guardian/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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==',
),
});
Loading