diff --git a/assets/database/db.json b/assets/database/db.json index aeeacfe098..8f37883482 100644 --- a/assets/database/db.json +++ b/assets/database/db.json @@ -10131,6 +10131,7 @@ {"id":439510,"name":"Engrave Cloak - Improved Swipe","icon":"inv_misc_monsterclaw_03","type":4,"requiresLevel":1,"classAllowlist":[1]}, {"id":439733,"name":"Engrave Cloak - Tree of Life","icon":"ability_druid_treeoflife","type":4,"requiresLevel":1,"classAllowlist":[1]}, {"id":439748,"name":"Engrave Cloak - Starfall","icon":"ability_druid_starfall","type":4,"requiresLevel":1,"classAllowlist":[1]}, +{"id":440529,"name":"Engrave Cloak - Resourcefulness","icon":"ability_hunter_resourcefulness","type":4,"requiresLevel":1,"classAllowlist":[2]}, {"id":440569,"name":"Engrave Cloak - Storm, Earth, and Fire","icon":"spell_shaman_stormearthfire","type":4,"requiresLevel":1,"classAllowlist":[7]}, {"id":440580,"name":"Engrave Cloak - Feral Spirit","icon":"spell_shaman_feralspirit","type":4,"requiresLevel":1,"classAllowlist":[7]}, {"id":440802,"name":"Engrave Cloak - Frozen Orb","icon":"spell_frost_frozencore","type":4,"requiresLevel":1,"classAllowlist":[3]}, diff --git a/sim/hunter/explosive_trap.go b/sim/hunter/explosive_trap.go index 84adec8c51..73e9273af5 100644 --- a/sim/hunter/explosive_trap.go +++ b/sim/hunter/explosive_trap.go @@ -30,12 +30,12 @@ func (hunter *Hunter) getExplosiveTrapConfig(rank int, timer *core.Timer) core.S MissileSpeed: 24, ManaCost: core.ManaCostOptions{ - FlatCost: manaCost, + FlatCost: manaCost * hunter.resourcefulnessManacostModifier(), }, Cast: core.CastConfig{ CD: core.Cooldown{ Timer: timer, - Duration: time.Second * 15, + Duration: time.Second * time.Duration(15 * hunter.resourcefulnessCooldownModifier()), }, DefaultCast: core.Cast{ GCD: core.GCDDefault, @@ -70,6 +70,7 @@ func (hunter *Hunter) getExplosiveTrapConfig(rank int, timer *core.Timer) core.S curTarget := target for hitIndex := int32(0); hitIndex < numHits; hitIndex++ { baseDamage := sim.Roll(minDamage, maxDamage) + baseDamage += hunter.tntDamageFlatBonus() baseDamage *= sim.Encounter.AOECapMultiplier() spell.CalcAndDealDamage(sim, curTarget, baseDamage, spell.OutcomeMagicHitAndCrit) curTarget = sim.Environment.NextTargetUnit(curTarget) diff --git a/sim/hunter/frost_trap.go b/sim/hunter/frost_trap.go index d9f93162fb..a7c9de87e5 100644 --- a/sim/hunter/frost_trap.go +++ b/sim/hunter/frost_trap.go @@ -26,7 +26,7 @@ func (hunter *Hunter) getFrostTrapConfig(timer *core.Timer) core.SpellConfig { Cast: core.CastConfig{ CD: core.Cooldown{ Timer: timer, - Duration: time.Second * 15, + Duration: time.Second * time.Duration(15 * hunter.resourcefulnessCooldownModifier()), }, DefaultCast: core.Cast{ GCD: core.GCDDefault, diff --git a/sim/hunter/immolation_trap.go b/sim/hunter/immolation_trap.go index 132090ac68..cb3235766b 100644 --- a/sim/hunter/immolation_trap.go +++ b/sim/hunter/immolation_trap.go @@ -32,7 +32,7 @@ func (hunter *Hunter) getImmolationTrapConfig(rank int, timer *core.Timer) core. Cast: core.CastConfig{ CD: core.Cooldown{ Timer: timer, - Duration: time.Second * 15, + Duration: time.Second * time.Duration(15 * hunter.resourcefulnessCooldownModifier()), }, DefaultCast: core.Cast{ GCD: core.GCDDefault, @@ -52,7 +52,8 @@ func (hunter *Hunter) getImmolationTrapConfig(rank int, timer *core.Timer) core. TickLength: time.Second * 3, OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { - dot.Snapshot(target, dotDamage/5, isRollover) + tickDamage := (dotDamage + hunter.tntDamageFlatBonus()) / float64(dot.NumberOfTicks) + dot.Snapshot(target, tickDamage, isRollover) }, OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTickCounted) diff --git a/sim/hunter/runes.go b/sim/hunter/runes.go index 6f2fd47bfc..0983bdd143 100644 --- a/sim/hunter/runes.go +++ b/sim/hunter/runes.go @@ -271,3 +271,24 @@ func (hunter *Hunter) tntDamageMultiplier() float64 { } return 1.0 } + +func (hunter *Hunter) tntDamageFlatBonus() float64 { + if hunter.HasRune(proto.HunterRune_RuneBracersTNT) { + return hunter.GetStat(stats.AttackPower) * 0.5 + } + return 0.0 +} + +func (hunter *Hunter) resourcefulnessManacostModifier() float64 { + if hunter.HasRune(proto.HunterRune_RuneCloakResourcefulness) { + return 0.0 + } + return 1.0 +} + +func (hunter *Hunter) resourcefulnessCooldownModifier() float64 { + if hunter.HasRune(proto.HunterRune_RuneCloakResourcefulness) { + return 0.6 + } + return 1.0 +} \ No newline at end of file diff --git a/tools/database/rune_overrides.go b/tools/database/rune_overrides.go index 37e7a70b8c..163aa95d9a 100644 --- a/tools/database/rune_overrides.go +++ b/tools/database/rune_overrides.go @@ -49,7 +49,6 @@ var UnimplementedRuneOverrides = []int32{ // Hunter 440520, // Cloak - Improved Volley - 440529, // Cloak - Resourcefulness 440533, // Cloak - Hit and Run // Mage