diff --git a/assets/database/db.bin b/assets/database/db.bin index 3a670d8a9e..689bfe760c 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 82d80769c7..2575cbe997 100644 --- a/assets/database/db.json +++ b/assets/database/db.json @@ -5230,11 +5230,8 @@ {"id":19163,"name":"Molten Belt","icon":"inv_belt_13","type":8,"armorType":2,"requiresLevel":60,"stats":[0,28,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0],"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":70,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":8,"spellId":23710}}]}, {"id":19164,"name":"Dark Iron Gauntlets","icon":"inv_gauntlets_22","type":7,"armorType":4,"requiresLevel":60,"stats":[0,12,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,495,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0],"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":70,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":2,"spellId":23637}}]}, {"id":19165,"name":"Flarecore Leggings","icon":"inv_pants_06","type":9,"armorType":1,"requiresLevel":60,"stats":[0,0,21,0,0,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0],"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":70,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":11,"spellId":23667}}]}, -{"id":19166,"name":"Black Amnesty","icon":"inv_weapon_shortblade_12","type":13,"weaponType":2,"handType":2,"requiresLevel":60,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"weaponDamageMin":53,"weaponDamageMax":100,"weaponSpeed":1.6,"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":66,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":2,"spellId":23638}}]}, {"id":19167,"name":"Blackfury","icon":"inv_spear_08","type":13,"weaponType":6,"handType":4,"requiresLevel":60,"stats":[35,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0],"weaponDamageMin":105,"weaponDamageMax":158,"weaponSpeed":2.1,"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":66,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":2,"spellId":23639}}]}, {"id":19168,"name":"Blackguard","icon":"inv_sword_39","type":13,"weaponType":9,"handType":2,"requiresLevel":60,"stats":[0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"weaponDamageMin":65,"weaponDamageMax":121,"weaponSpeed":1.8,"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":70,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":2,"spellId":23652}}]}, -{"id":19169,"name":"Nightfall","icon":"inv_axe_12","type":13,"weaponType":1,"handType":4,"requiresLevel":60,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"weaponDamageMin":187,"weaponDamageMax":282,"weaponSpeed":3.5,"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":70,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":2,"spellId":23653}}]}, -{"id":19170,"name":"Ebon Hand","icon":"inv_hammer_19","type":13,"weaponType":4,"handType":2,"requiresLevel":60,"stats":[0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0],"weaponDamageMin":90,"weaponDamageMax":168,"weaponSpeed":2.5,"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":70,"phase":1,"quality":4,"expansion":1,"sources":[{"crafted":{"profession":2,"spellId":23650}}]}, {"id":19287,"name":"Darkmoon Card: Heroism","icon":"inv_misc_ticket_tarot_heroism_01","type":12,"requiresLevel":60,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":66,"phase":1,"quality":4,"unique":true,"sources":[{"quest":{"id":7928,"name":"Darkmoon Warlords Deck"}}]}, {"id":19288,"name":"Darkmoon Card: Blue Dragon","icon":"inv_misc_ticket_tarot_bluedragon_01","type":12,"requiresLevel":60,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":66,"phase":1,"quality":4,"unique":true,"sources":[{"quest":{"id":7907,"name":"Darkmoon Beast Deck"}}]}, {"id":19289,"name":"Darkmoon Card: Maelstrom","icon":"inv_misc_ticket_tarot_maelstrom_01","type":12,"requiresLevel":60,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"weaponSkills":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":66,"phase":1,"quality":4,"unique":true,"sources":[{"quest":{"id":7929,"name":"Darkmoon Elementals Deck"}}]}, @@ -9761,6 +9758,7 @@ {"id":408531,"name":"Engrave Pants - Way of Earth","icon":"spell_nature_earthquake","type":9,"requiresLevel":1,"classAllowlist":[7]}, {"id":408696,"name":"Engrave Boots - Spirit of the Alpha","icon":"ability_hunter_pet_wolf","type":10,"requiresLevel":1,"classAllowlist":[7]}, {"id":408700,"name":"Engrave Boots - Waylay","icon":"ability_rogue_waylay","type":10,"requiresLevel":1,"classAllowlist":[6]}, +{"id":409240,"name":"Engrave Cloak - Fan of Knives","icon":"ability_rogue_fanofknives","type":4,"requiresLevel":1,"classAllowlist":[6]}, {"id":409324,"name":"Engrave Pants - Ancestral Guidance","icon":"ability_druid_lunarguidance","type":9,"requiresLevel":1,"classAllowlist":[7]}, {"id":409368,"name":"Engrave Gloves - Beast Mastery","icon":"ability_physical_taunt","type":7,"requiresLevel":1,"classAllowlist":[2]}, {"id":409428,"name":"Engrave Chest - Master Marksman","icon":"ability_hunter_mastermarksman","type":5,"requiresLevel":1,"classAllowlist":[2]}, @@ -9774,6 +9772,7 @@ {"id":410176,"name":"Engrave Gloves - Skull Bash","icon":"inv_misc_bone_taurenskull_01","type":7,"requiresLevel":1,"classAllowlist":[1]}, {"id":411115,"name":"Engrave Chest - Survival of the Fittest","icon":"ability_druid_enrage","type":5,"requiresLevel":1,"classAllowlist":[1]}, {"id":412019,"name":"Engrave Boots - Sacred Shield","icon":"ability_paladin_blessedmending","type":10,"requiresLevel":1,"classAllowlist":[4]}, +{"id":412096,"name":"Engrave Cloak - Crimson Tempest","icon":"inv_sword_17","type":4,"requiresLevel":1,"classAllowlist":[6]}, {"id":412115,"name":"Engrave Helm - Advanced Warding","icon":"spell_arcane_arcaneresilience","type":1,"requiresLevel":1,"classAllowlist":[3]}, {"id":412286,"name":"Engrave Chest - Burnout","icon":"ability_mage_burnout","type":5,"requiresLevel":1,"classAllowlist":[3]}, {"id":412322,"name":"Engrave Boots - Spell Power","icon":"spell_holy_mindvision","type":10,"requiresLevel":1,"classAllowlist":[3]}, @@ -9899,6 +9898,7 @@ {"id":432276,"name":"Engrave Bracers - Carnage","icon":"ability_rogue_bloodsplatter","type":6,"requiresLevel":1,"classAllowlist":[6]}, {"id":436364,"name":"Engrave Chest - Two-Handed Mastery","icon":"spell_fire_enchantweapon","type":5,"requiresLevel":1,"classAllowlist":[7]}, {"id":436516,"name":"Engrave Boots - Chronostatic Preservation","icon":"spell_arcane_arcane02","type":10,"requiresLevel":1,"classAllowlist":[3]}, +{"id":436564,"name":"Engrave Cloak - Blunderbuss","icon":"inv_musket_04","type":4,"requiresLevel":1,"classAllowlist":[6]}, {"id":437123,"name":"Engrave Belt - Steady Shot","icon":"ability_hunter_steadyshot","type":8,"requiresLevel":1,"classAllowlist":[2]}, {"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]}, @@ -13613,11 +13613,8 @@ {"id":23633,"name":"Gloves of the Dawn","icon":"inv_gauntlets_29","requiresLevel":59}, {"id":23636,"name":"Dark Iron Helm","icon":"inv_helmet_22","requiresLevel":60}, {"id":23637,"name":"Dark Iron Gauntlets","icon":"inv_gauntlets_22","requiresLevel":60}, -{"id":23638,"name":"Black Amnesty","icon":"inv_weapon_shortblade_12","requiresLevel":60}, {"id":23639,"name":"Blackfury","icon":"inv_spear_08","requiresLevel":60}, -{"id":23650,"name":"Ebon Hand","icon":"inv_hammer_19","requiresLevel":60}, {"id":23652,"name":"Blackguard","icon":"inv_sword_39","requiresLevel":60}, -{"id":23653,"name":"Nightfall","icon":"inv_axe_12","requiresLevel":60}, {"id":23663,"name":"Mantle of the Timbermaw","icon":"inv_shoulder_19","requiresLevel":59}, {"id":23664,"name":"Argent Boots","icon":"inv_boots_cloth_03","requiresLevel":53}, {"id":23665,"name":"Argent Shoulders","icon":"inv_shoulder_13","requiresLevel":59}, diff --git a/assets/database/leftover_db.bin b/assets/database/leftover_db.bin index f6de646c7e..49f2453c69 100644 Binary files a/assets/database/leftover_db.bin and b/assets/database/leftover_db.bin differ diff --git a/assets/database/leftover_db.json b/assets/database/leftover_db.json index 623c14cd66..01e323b2dd 100644 --- a/assets/database/leftover_db.json +++ b/assets/database/leftover_db.json @@ -1479,8 +1479,8 @@ {"effectId":63,"spellId":13538,"name":"Enchant Chest - Lesser Absorption","type":5,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":66,"spellId":7457,"name":"Enchant Bracer - Minor Stamina","type":6,"stats":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":66,"spellId":7863,"name":"Enchant Boots - Minor Stamina","type":10,"stats":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, -{"effectId":241,"spellId":7745,"name":"Enchant 2H Weapon - Minor Impact","type":13,"enchantType":1,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":241,"spellId":13503,"name":"Enchant Weapon - Lesser Striking","type":13,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, +{"effectId":241,"spellId":7745,"name":"Enchant 2H Weapon - Minor Impact","type":13,"enchantType":1,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":242,"spellId":7748,"name":"Enchant Chest - Lesser Health","type":5,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":243,"spellId":7766,"name":"Enchant Bracer - Minor Spirit","type":6,"stats":[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":2}, {"effectId":246,"spellId":7776,"name":"Enchant Chest - Lesser Mana","type":5,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":2}, @@ -1554,8 +1554,8 @@ {"effectId":929,"itemId":16217,"spellId":20069,"name":"Enchant Shield - Greater Stamina","type":13,"enchantType":2,"stats":[0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":930,"spellId":13947,"name":"Enchant Gloves - Riding Skill","type":7,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":2}, {"effectId":931,"spellId":13948,"name":"Enchant Gloves - Minor Haste","type":7,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, -{"effectId":943,"spellId":13693,"name":"Enchant Weapon - Striking","type":13,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":943,"spellId":13529,"name":"Enchant 2H Weapon - Lesser Impact","type":13,"enchantType":1,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, +{"effectId":943,"spellId":13693,"name":"Enchant Weapon - Striking","type":13,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":963,"spellId":13937,"name":"Enchant 2H Weapon - Greater Impact","type":13,"enchantType":1,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":1}, {"effectId":1483,"itemId":11622,"spellId":15340,"name":"Lesser Arcanum of Rumination","type":1,"extraTypes":[9],"enchantType":3,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"quality":2}, {"effectId":1503,"itemId":11642,"spellId":15389,"name":"Lesser Arcanum of Constitution","type":1,"extraTypes":[9],"enchantType":3,"stats":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0],"quality":2}, @@ -1693,6 +1693,7 @@ {"id":408531,"name":"Engrave Pants - Way of Earth","icon":"spell_nature_earthquake","type":9,"requiresLevel":1,"classAllowlist":[7]}, {"id":408696,"name":"Engrave Boots - Spirit of the Alpha","icon":"ability_hunter_pet_wolf","type":10,"requiresLevel":1,"classAllowlist":[7]}, {"id":408700,"name":"Engrave Boots - Waylay","icon":"ability_rogue_waylay","type":10,"requiresLevel":1,"classAllowlist":[6]}, +{"id":409240,"name":"Engrave Cloak - Fan of Knives","icon":"ability_rogue_fanofknives","type":4,"requiresLevel":1,"classAllowlist":[6]}, {"id":409324,"name":"Engrave Pants - Ancestral Guidance","icon":"ability_druid_lunarguidance","type":9,"requiresLevel":1,"classAllowlist":[7]}, {"id":409368,"name":"Engrave Gloves - Beast Mastery","icon":"ability_physical_taunt","type":7,"requiresLevel":1,"classAllowlist":[2]}, {"id":409428,"name":"Engrave Chest - Master Marksman","icon":"ability_hunter_mastermarksman","type":5,"requiresLevel":1,"classAllowlist":[2]}, @@ -1706,6 +1707,7 @@ {"id":410176,"name":"Engrave Gloves - Skull Bash","icon":"inv_misc_bone_taurenskull_01","type":7,"requiresLevel":1,"classAllowlist":[1]}, {"id":411115,"name":"Engrave Chest - Survival of the Fittest","icon":"ability_druid_enrage","type":5,"requiresLevel":1,"classAllowlist":[1]}, {"id":412019,"name":"Engrave Boots - Sacred Shield","icon":"ability_paladin_blessedmending","type":10,"requiresLevel":1,"classAllowlist":[4]}, +{"id":412096,"name":"Engrave Cloak - Crimson Tempest","icon":"inv_sword_17","type":4,"requiresLevel":1,"classAllowlist":[6]}, {"id":412115,"name":"Engrave Helm - Advanced Warding","icon":"spell_arcane_arcaneresilience","type":1,"requiresLevel":1,"classAllowlist":[3]}, {"id":412286,"name":"Engrave Chest - Burnout","icon":"ability_mage_burnout","type":5,"requiresLevel":1,"classAllowlist":[3]}, {"id":412322,"name":"Engrave Boots - Spell Power","icon":"spell_holy_mindvision","type":10,"requiresLevel":1,"classAllowlist":[3]}, @@ -1831,6 +1833,7 @@ {"id":432276,"name":"Engrave Bracers - Carnage","icon":"ability_rogue_bloodsplatter","type":6,"requiresLevel":1,"classAllowlist":[6]}, {"id":436364,"name":"Engrave Chest - Two-Handed Mastery","icon":"spell_fire_enchantweapon","type":5,"requiresLevel":1,"classAllowlist":[7]}, {"id":436516,"name":"Engrave Boots - Chronostatic Preservation","icon":"spell_arcane_arcane02","type":10,"requiresLevel":1,"classAllowlist":[3]}, +{"id":436564,"name":"Engrave Cloak - Blunderbuss","icon":"inv_musket_04","type":4,"requiresLevel":1,"classAllowlist":[6]}, {"id":437123,"name":"Engrave Belt - Steady Shot","icon":"ability_hunter_steadyshot","type":8,"requiresLevel":1,"classAllowlist":[2]}, {"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]}, diff --git a/sim/rogue/blunderbuss.go b/sim/rogue/blunderbuss.go new file mode 100644 index 0000000000..58e29c7765 --- /dev/null +++ b/sim/rogue/blunderbuss.go @@ -0,0 +1,62 @@ +package rogue + +import ( + "time" + + "github.com/wowsims/sod/sim/core" + "github.com/wowsims/sod/sim/core/proto" +) + +// TODO: 10 yd range +func (rogue *Rogue) registerBlunderbussSpell() { + if !rogue.HasRune(proto.RogueRune_RuneBlunderbuss) { + return + } + + results := make([]*core.SpellResult, min(4, rogue.Env.GetNumTargets())) + + rogue.Blunderbuss = rogue.RegisterSpell(core.SpellConfig{ + ActionID: core.ActionID{SpellID: 436564}, + SpellSchool: core.SpellSchoolPhysical, + DefenseType: core.DefenseTypeRanged, + ProcMask: core.ProcMaskRangedSpecial, + Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, + + EnergyCost: core.EnergyCostOptions{ + Cost: 20, + Refund: 0, + }, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: time.Second, + }, + CD: core.Cooldown{ + Timer: rogue.NewTimer(), + Duration: time.Second * 15, + }, + IgnoreHaste: true, + }, + + DamageMultiplier: 1, + ThreatMultiplier: 1, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + rogue.BreakStealth(sim) + baseApDamage := spell.MeleeAttackPower() * 0.48 + + for idx := range results { + results[idx] = spell.CalcDamage(sim, target, rogue.rollBlunderbussDamage(sim)+baseApDamage, spell.OutcomeRangedHitAndCrit) + target = sim.Environment.NextTargetUnit(target) + } + + for _, result := range results { + spell.DealDamage(sim, result) + } + }, + }) +} + +func (rogue *Rogue) rollBlunderbussDamage(sim *core.Simulation) float64 { + baseDamage := rogue.baseRuneAbilityDamage() + return sim.Roll(baseDamage*1.92, baseDamage*2.88) +} diff --git a/sim/rogue/crimson_tempest.go b/sim/rogue/crimson_tempest.go new file mode 100644 index 0000000000..3262295345 --- /dev/null +++ b/sim/rogue/crimson_tempest.go @@ -0,0 +1,96 @@ +package rogue + +import ( + "time" + + "github.com/wowsims/sod/sim/core" + "github.com/wowsims/sod/sim/core/proto" + "github.com/wowsims/sod/sim/core/stats" +) + +func (rogue *Rogue) makeCrimsonTempestHitSpell() *core.Spell { + actionID := core.ActionID{SpellID: 412096} + procMask := core.ProcMaskMeleeMHSpecial + + return rogue.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolPhysical, + DefenseType: core.DefenseTypeMelee, + ProcMask: procMask, + Flags: core.SpellFlagMeleeMetrics, + + DamageMultiplier: []float64{1, 1.1, 1.2, 1.3}[rogue.Talents.SerratedBlades], + ThreatMultiplier: 1, + + Dot: core.DotConfig{ + Aura: core.Aura{ + Label: "Crimson Tempest", + Tag: RogueBleedTag, + }, + NumberOfTicks: 0, + TickLength: time.Second * 2, + + OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { + dot.Snapshot(target, rogue.CrimsonTempestDamage(rogue.ComboPoints()), isRollover) + }, + OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { + dot.CalcAndDealPeriodicSnapshotDamage(sim, target, dot.OutcomeTick) + }, + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + result := spell.CalcOutcome(sim, target, spell.OutcomeMeleeSpecialHit) + if result.Landed() { + dot := spell.Dot(target) + dot.Spell = spell + dot.NumberOfTicks = rogue.ComboPoints() + 1 + dot.Apply(sim) + } + spell.DealOutcome(sim, result) + }, + }) +} + +// TODO: Currently bugged and creates "infite loop detected" warning +func (rogue *Rogue) registerCrimsonTempestSpell() { + if !rogue.HasRune(proto.RogueRune_RuneCrimsonTempest) { + return + } + + // Must be updated to match combo points spent + rogue.CrimsonTempestBleed = rogue.makeCrimsonTempestHitSpell() + + rogue.CrimsonTempest = rogue.RegisterSpell(core.SpellConfig{ + ActionID: core.ActionID{SpellID: 412096}, + SpellSchool: core.SpellSchoolPhysical, + DefenseType: core.DefenseTypeMelee, + ProcMask: core.ProcMaskMeleeMHSpecial, + Flags: SpellFlagCarnage, // TODO: Placeholder to prevent use in APL while broken. Replace with rogue.finisherFlags() + MetricSplits: 6, + + EnergyCost: core.EnergyCostOptions{ + Cost: 35, + Refund: 0, + }, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: time.Second, + }, + IgnoreHaste: true, + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + rogue.BreakStealth(sim) + + for _, aoeTarget := range sim.Encounter.TargetUnits { + rogue.CrimsonTempestBleed.Cast(sim, aoeTarget) + } + + rogue.SpendComboPoints(sim, spell) + }, + }) +} + +func (rogue *Rogue) CrimsonTempestDamage(comboPoints int32) float64 { + return []float64{0.15, 0.3, 0.45, 0.6, 0.75, 0.9}[comboPoints] * rogue.GetStat(stats.AttackPower) +} diff --git a/sim/rogue/fan_of_knives.go b/sim/rogue/fan_of_knives.go new file mode 100644 index 0000000000..8ed851c0ce --- /dev/null +++ b/sim/rogue/fan_of_knives.go @@ -0,0 +1,86 @@ +package rogue + +import ( + "time" + + "github.com/wowsims/sod/sim/core" + "github.com/wowsims/sod/sim/core/proto" +) + +const FanOfKnivesSpellID int32 = 409240 + +func (rogue *Rogue) makeFanOfKnivesWeaponHitSpell(isMH bool) *core.Spell { + var procMask core.ProcMask + var weaponMultiplier float64 + var actionID core.ActionID + if isMH { + actionID = core.ActionID{SpellID: FanOfKnivesSpellID}.WithTag(1) + weaponMultiplier = core.TernaryFloat64(rogue.HasDagger(core.MainHand), 0.75, 0.5) + procMask = core.ProcMaskMeleeMHSpecial + } else { + actionID = core.ActionID{SpellID: FanOfKnivesSpellID}.WithTag(2) + weaponMultiplier = core.TernaryFloat64(rogue.HasDagger(core.OffHand), 0.75, 0.5) + weaponMultiplier *= rogue.dwsMultiplier() + procMask = core.ProcMaskMeleeOHSpecial + } + + return rogue.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolPhysical, + DefenseType: core.DefenseTypeMelee, + ProcMask: procMask, + Flags: core.SpellFlagMeleeMetrics | SpellFlagColdBlooded, + + DamageMultiplier: weaponMultiplier, + ThreatMultiplier: 1, + }) +} + +// TODO: 8 yd range +func (rogue *Rogue) registerFanOfKnives() { + if !rogue.HasRune(proto.RogueRune_RuneFanOfKnives) { + return + } + + mhSpell := rogue.makeFanOfKnivesWeaponHitSpell(true) + ohSpell := rogue.makeFanOfKnivesWeaponHitSpell(false) + results := make([]*core.SpellResult, len(rogue.Env.Encounter.TargetUnits)) + + rogue.FanOfKnives = rogue.RegisterSpell(core.SpellConfig{ + ActionID: core.ActionID{SpellID: FanOfKnivesSpellID}, + SpellSchool: core.SpellSchoolPhysical, + Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, + + EnergyCost: core.EnergyCostOptions{ + Cost: 50, + }, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: time.Second, + }, + IgnoreHaste: true, + }, + + ApplyEffects: func(sim *core.Simulation, unit *core.Unit, spell *core.Spell) { + rogue.BreakStealth(sim) + // Calc and apply all OH hits first, because MH hits can benefit from an OH felstriker proc. + for i, aoeTarget := range sim.Encounter.TargetUnits { + baseDamage := ohSpell.Unit.OHWeaponDamage(sim, ohSpell.MeleeAttackPower()) + baseDamage *= sim.Encounter.AOECapMultiplier() + results[i] = ohSpell.CalcDamage(sim, aoeTarget, baseDamage, ohSpell.OutcomeMeleeWeaponSpecialHitAndCrit) + } + for i := range sim.Encounter.TargetUnits { + ohSpell.DealDamage(sim, results[i]) + } + + for i, aoeTarget := range sim.Encounter.TargetUnits { + baseDamage := mhSpell.Unit.MHWeaponDamage(sim, mhSpell.MeleeAttackPower()) + baseDamage *= sim.Encounter.AOECapMultiplier() + results[i] = mhSpell.CalcDamage(sim, aoeTarget, baseDamage, mhSpell.OutcomeMeleeWeaponSpecialHitAndCrit) + } + for i := range sim.Encounter.TargetUnits { + mhSpell.DealDamage(sim, results[i]) + } + }, + }) +} diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index 3966b0c9c9..700a60f9db 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -30,32 +30,36 @@ type Rogue struct { sliceAndDiceDurations [6]time.Duration bladeDanceDurations [6]time.Duration - Backstab *core.Spell - BladeFlurry *core.Spell - Feint *core.Spell - Garrote *core.Spell - Ambush *core.Spell - Hemorrhage *core.Spell - GhostlyStrike *core.Spell - HungerForBlood *core.Spell - Mutilate *core.Spell - MutilateMH *core.Spell - MutilateOH *core.Spell - Shiv *core.Spell - SinisterStrike *core.Spell - SaberSlash *core.Spell - saberSlashTick *core.Spell - MainGauche *core.Spell - Shadowstep *core.Spell - Preparation *core.Spell - Premeditation *core.Spell - ColdBlood *core.Spell - Vanish *core.Spell - Shadowstrike *core.Spell - QuickDraw *core.Spell - ShurikenToss *core.Spell - BetweenTheEyes *core.Spell - PoisonedKnife *core.Spell + Backstab *core.Spell + BladeFlurry *core.Spell + Feint *core.Spell + Garrote *core.Spell + Ambush *core.Spell + Hemorrhage *core.Spell + GhostlyStrike *core.Spell + HungerForBlood *core.Spell + Mutilate *core.Spell + MutilateMH *core.Spell + MutilateOH *core.Spell + Shiv *core.Spell + SinisterStrike *core.Spell + SaberSlash *core.Spell + saberSlashTick *core.Spell + MainGauche *core.Spell + Shadowstep *core.Spell + Preparation *core.Spell + Premeditation *core.Spell + ColdBlood *core.Spell + Vanish *core.Spell + Shadowstrike *core.Spell + QuickDraw *core.Spell + ShurikenToss *core.Spell + BetweenTheEyes *core.Spell + PoisonedKnife *core.Spell + Blunderbuss *core.Spell + FanOfKnives *core.Spell + CrimsonTempest *core.Spell + CrimsonTempestBleed *core.Spell Envenom *core.Spell Eviscerate *core.Spell diff --git a/sim/rogue/runes.go b/sim/rogue/runes.go index 3c9a7ce015..fa94330176 100644 --- a/sim/rogue/runes.go +++ b/sim/rogue/runes.go @@ -37,6 +37,9 @@ func (rogue *Rogue) ApplyRunes() { rogue.applyJustAFleshWound() rogue.applyRollingWithThePunches() rogue.registerCutthroat() + rogue.registerBlunderbussSpell() + rogue.registerFanOfKnives() + rogue.registerCrimsonTempestSpell() } func (rogue *Rogue) applyCombatPotency() { diff --git a/tools/database/rune_overrides.go b/tools/database/rune_overrides.go index 94e828880e..dd2ca3821d 100644 --- a/tools/database/rune_overrides.go +++ b/tools/database/rune_overrides.go @@ -70,11 +70,6 @@ var UnimplementedRuneOverrides = []int32{ // Priest - // Rogue - 409240, // Cloak - Fan of Knives - 412096, // Cloak - Crimson Tempest - 436564, // Cloak - Blunderbuss - // Shaman // Warlock