diff --git a/assets/database/db.bin b/assets/database/db.bin index b8cd1865a0..01c70ca8f6 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 3146ce569e..a5e17ae12d 100644 --- a/assets/database/db.json +++ b/assets/database/db.json @@ -6,7 +6,15 @@ {"id":28231,"name":"Tidefury Chestpiece","icon":"inv_chest_chain_03","type":5,"armorType":3,"stats":[0,0,46,31,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,782,0,0,0,0],"gemSockets":[3,4,4],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"phase":1,"quality":3,"setName":"Tidefury Raiment","setId":630,"expansion":2,"sources":[{"drop":{"difficulty":1,"npcId":20912,"zoneId":3848}},{"drop":{"difficulty":2,"npcId":20912,"zoneId":3848}}]}, {"id":28349,"name":"Tidefury Helm","icon":"inv_helmet_19","type":1,"armorType":3,"stats":[0,0,53,27,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,635,0,0,0,0],"gemSockets":[4,1],"socketBonus":[0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"phase":1,"quality":3,"setName":"Tidefury Raiment","setId":630,"expansion":2,"sources":[{"drop":{"difficulty":1,"npcId":17977,"zoneId":3847}},{"drop":{"difficulty":2,"npcId":17977,"zoneId":3847}}]}, {"id":29309,"name":"Band of the Eternal Restorer","icon":"inv_jewelry_ring_55","type":11,"stats":[0,0,49,29,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":152,"phase":1,"quality":4,"unique":true,"sources":[{"quest":{}}]}, +{"id":31026,"name":"Slayer's Handguards","icon":"inv_gauntlets_65","type":7,"armorType":2,"stats":[0,34,65,0,0,18,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,494,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, +{"id":31027,"name":"Slayer's Helm","icon":"inv_helmet_102","type":1,"armorType":2,"stats":[0,46,92,0,0,15,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,642,0,0,0,0],"gemSockets":[1,4],"socketBonus":[0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, +{"id":31028,"name":"Slayer's Chestguard","icon":"inv_chest_leather_16","type":5,"armorType":2,"stats":[0,46,92,0,0,15,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,790,0,0,0,0],"gemSockets":[4,4,3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, +{"id":31029,"name":"Slayer's Legguards","icon":"inv_pants_leather_27","type":9,"armorType":2,"stats":[0,47,92,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, +{"id":31030,"name":"Slayer's Shoulderpads","icon":"inv_shoulder_67","type":3,"armorType":2,"stats":[0,34,66,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,592,0,0,0,0],"gemSockets":[4,3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, {"id":32466,"name":"Bland Blade","icon":"inv_sword_78","type":13,"weaponType":9,"handType":2,"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],"socketBonus":[0,0,0,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":1105,"weaponDamageMax":1105,"weaponSpeed":2.6,"ilvl":350,"phase":1,"quality":4}, +{"id":34448,"name":"Slayer's Bracers","icon":"inv_bracer_09","type":6,"armorType":2,"stats":[0,32,42,0,0,18,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,371,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, +{"id":34558,"name":"Slayer's Belt","icon":"inv_belt_26","type":8,"armorType":2,"stats":[0,43,48,0,0,30,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,477,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, +{"id":34575,"name":"Slayer's Boots","icon":"inv_boots_cloth_02","type":10,"armorType":2,"stats":[0,43,52,0,0,28,16,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,583,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"phase":1,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34677,"name":"Shattered Sun Pendant of Restoration","icon":"inv_jewelry_necklace_12","type":2,"stats":[0,0,19,32,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"phase":1,"quality":4,"sources":[{"soldBy":{"npcId":25032,"npcName":"Eldara Dawnrunner","zoneId":4080}}]}, {"id":45703,"name":"Spark of Hope","icon":"spell_nature_invisibilitytotem","type":12,"stats":[0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":225,"phase":1,"quality":4,"unique":true,"expansion":3,"sources":[{"drop":{"difficulty":8,"npcId":26631,"zoneId":4196}}]}, {"id":46017,"name":"Val'anyr, Hammer of Ancient Kings","icon":"inv_mace_99","type":13,"weaponType":4,"handType":1,"stats":[0,0,105,0,0,0,50,49,0,0,0,0,0,0,777,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,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":272,"weaponDamageMax":507,"weaponSpeed":1.8,"ilvl":258,"phase":1,"quality":5,"sources":[{"quest":{"id":13629,"name":"Val'anyr, Hammer of Ancient Kings"}}]}, diff --git a/assets/database/leftover_db.bin b/assets/database/leftover_db.bin index 4c1ab8e20d..862d205714 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 7619cf1123..58efb16e95 100644 --- a/assets/database/leftover_db.json +++ b/assets/database/leftover_db.json @@ -12783,11 +12783,6 @@ {"id":31023,"name":"Skyshatter Mantle","icon":"inv_shoulder_61","type":3,"armorType":3,"stats":[0,0,57,39,0,11,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,892,0,0,0,0],"gemSockets":[3,4],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[7],"setName":"Skyshatter Regalia","setId":684,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, {"id":31024,"name":"Skyshatter Pauldrons","icon":"inv_shoulder_61","type":3,"armorType":3,"stats":[0,43,48,0,0,11,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,892,0,0,0,0],"gemSockets":[4,4],"socketBonus":[3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[7],"setName":"Skyshatter Harness","setId":682,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, {"id":31025,"name":"Idol of the Avenger","icon":"inv_misc_rune_10","type":14,"rangedWeaponType":4,"stats":[0,0,15,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"gemSockets":[8],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":106,"quality":3,"unique":true,"classAllowlist":[4,1,7],"sources":[{"quest":{}}]}, -{"id":31026,"name":"Slayer's Handguards","icon":"inv_gauntlets_65","type":7,"armorType":2,"stats":[0,34,65,0,0,18,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,494,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, -{"id":31027,"name":"Slayer's Helm","icon":"inv_helmet_102","type":1,"armorType":2,"stats":[0,46,92,0,0,15,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,642,0,0,0,0],"gemSockets":[1,4],"socketBonus":[0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, -{"id":31028,"name":"Slayer's Chestguard","icon":"inv_chest_leather_16","type":5,"armorType":2,"stats":[0,46,92,0,0,15,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,790,0,0,0,0],"gemSockets":[4,4,3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, -{"id":31029,"name":"Slayer's Legguards","icon":"inv_pants_leather_27","type":9,"armorType":2,"stats":[0,47,92,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, -{"id":31030,"name":"Slayer's Shoulderpads","icon":"inv_shoulder_67","type":3,"armorType":2,"stats":[0,34,66,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,592,0,0,0,0],"gemSockets":[4,3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, {"id":31031,"name":"Stormfury Totem","icon":"spell_nature_manaregentotem","type":14,"rangedWeaponType":4,"stats":[0,10,15,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"gemSockets":[8],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":106,"quality":3,"unique":true,"classAllowlist":[1,7],"sources":[{"quest":{}}]}, {"id":31032,"name":"Thunderheart Gloves","icon":"inv_gauntlets_58","type":7,"armorType":2,"stats":[0,0,57,39,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,494,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":146,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Raiment","setId":678,"sources":[{"soldBy":{"npcId":23381,"npcName":"Tydormu"}}]}, {"id":31033,"name":"Libram of Righteous Power","icon":"inv_misc_book_13","type":14,"rangedWeaponType":4,"stats":[10,0,15,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"gemSockets":[8],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":106,"quality":3,"unique":true,"classAllowlist":[4,10],"sources":[{"quest":{}}]}, @@ -14500,7 +14495,6 @@ {"id":34445,"name":"Thunderheart Bracers","icon":"inv_bracer_08","type":6,"armorType":2,"stats":[0,0,37,33,28,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,371,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Raiment","setId":678,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34446,"name":"Thunderheart Bands","icon":"inv_bracer_08","type":6,"armorType":2,"stats":[0,0,37,33,0,0,24,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,371,0,0,0,0],"gemSockets":[4],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Regalia","setId":677,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34447,"name":"Bracers of the Tempest","icon":"inv_bracer_12","type":6,"armorType":1,"stats":[0,0,33,33,0,0,19,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,267,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[3],"setName":"Tempest Regalia","setId":671,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, -{"id":34448,"name":"Slayer's Bracers","icon":"inv_bracer_09","type":6,"armorType":2,"stats":[0,32,42,0,0,18,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,371,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34470,"name":"Timbal's Focusing Crystal","icon":"inv_misc_gem_lionseye_01","type":12,"stats":[0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"quality":4,"unique":true,"expansion":2,"sources":[{"drop":{"difficulty":2,"npcId":24560,"zoneId":4131}}]}, {"id":34471,"name":"Vial of the Sunwell","icon":"inv_potion_106","type":12,"stats":[0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"quality":4,"unique":true,"expansion":2,"sources":[{"drop":{"difficulty":2,"npcId":24560,"zoneId":4131}}]}, {"id":34472,"name":"Shard of Contempt","icon":"inv_misc_rune_04","type":12,"stats":[0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"quality":4,"unique":true,"expansion":2,"sources":[{"drop":{"difficulty":2,"npcId":24560,"zoneId":4131}}]}, @@ -14526,7 +14520,6 @@ {"id":34555,"name":"Thunderheart Cord","icon":"inv_belt_24","type":8,"armorType":2,"stats":[0,0,50,43,0,0,29,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,477,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Regalia","setId":677,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34556,"name":"Thunderheart Waistguard","icon":"inv_belt_24","type":8,"armorType":2,"stats":[0,40,69,20,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,477,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Harness","setId":676,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34557,"name":"Belt of the Tempest","icon":"inv_belt_07","type":8,"armorType":1,"stats":[0,0,48,43,0,0,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,344,0,0,0,0],"gemSockets":[4],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[3],"setName":"Tempest Regalia","setId":671,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, -{"id":34558,"name":"Slayer's Belt","icon":"inv_belt_26","type":8,"armorType":2,"stats":[0,43,48,0,0,30,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,477,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34559,"name":"Lightbringer Treads","icon":"inv_boots_chain_08","type":10,"armorType":4,"stats":[0,0,50,43,22,0,30,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1308,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[4],"setName":"Lightbringer Raiment","setId":681,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34560,"name":"Lightbringer Stompers","icon":"inv_boots_chain_08","type":10,"armorType":4,"stats":[30,0,58,0,0,0,0,0,0,32,21,0,0,0,0,0,0,0,0,0,0,0,1308,0,0,0,0],"gemSockets":[3],"socketBonus":[0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[4],"setName":"Lightbringer Armor","setId":679,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34561,"name":"Lightbringer Boots","icon":"inv_boots_chain_08","type":10,"armorType":4,"stats":[42,0,22,0,0,0,40,27,19,0,0,0,0,0,0,0,0,0,0,0,0,0,1308,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[4],"setName":"Lightbringer Battlegear","setId":680,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, @@ -14543,7 +14536,6 @@ {"id":34572,"name":"Thunderheart Footwraps","icon":"inv_boots_08","type":10,"armorType":2,"stats":[0,0,50,43,0,0,28,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,583,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Regalia","setId":677,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34573,"name":"Thunderheart Treads","icon":"inv_boots_wolf","type":10,"armorType":2,"stats":[0,35,80,18,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,583,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[1],"setName":"Thunderheart Harness","setId":676,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34574,"name":"Boots of the Tempest","icon":"inv_boots_cloth_16","type":10,"armorType":1,"stats":[0,0,48,43,0,0,29,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,420,0,0,0,0],"gemSockets":[4],"socketBonus":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[3],"setName":"Tempest Regalia","setId":671,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, -{"id":34575,"name":"Slayer's Boots","icon":"inv_boots_cloth_02","type":10,"armorType":2,"stats":[0,43,52,0,0,28,16,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,583,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":154,"quality":4,"classAllowlist":[6],"setName":"Slayer's Armor","setId":668,"sources":[{"soldBy":{"npcId":25976,"npcName":"Theremis","zoneId":4080}}]}, {"id":34601,"name":"Shoulderplates of Everlasting Pain","icon":"inv_shoulder_27","type":3,"armorType":4,"stats":[30,0,33,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1054,0,0,0,0],"gemSockets":[4,3],"socketBonus":[3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"quality":4,"expansion":2,"sources":[{"drop":{"difficulty":2,"npcId":24723,"zoneId":4131}}]}, {"id":34602,"name":"Eversong Cuffs","icon":"inv_bracer_02","type":6,"armorType":2,"stats":[0,0,32,23,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,281,0,0,0,0],"gemSockets":[2],"socketBonus":[0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"ilvl":115,"quality":4,"expansion":2,"sources":[{"drop":{"difficulty":2,"npcId":24723,"zoneId":4131}}]}, {"id":34603,"name":"Distracting Blades","icon":"inv_throwingknife_01","type":14,"rangedWeaponType":5,"stats":[0,14,20,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"socketBonus":[0,0,0,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":182,"weaponDamageMax":274,"weaponSpeed":2,"ilvl":115,"quality":4,"expansion":2,"sources":[{"drop":{"difficulty":2,"npcId":24723,"zoneId":4131}}]}, diff --git a/proto/rogue.proto b/proto/rogue.proto index 7ed4f4b59e..36119b3f86 100644 --- a/proto/rogue.proto +++ b/proto/rogue.proto @@ -131,6 +131,7 @@ message RogueOptions { bool apply_poisons_manually = 6; bool assume_bleed_active = 7; float vanish_break_time = 8; + int32 starting_combo_points = 9; } message AssassinationRogue { diff --git a/sim/core/energy.go b/sim/core/energy.go index f2b4608cec..58e39521c3 100644 --- a/sim/core/energy.go +++ b/sim/core/energy.go @@ -11,10 +11,11 @@ import ( type energyBar struct { unit *Unit - maxEnergy float64 - currentEnergy float64 - comboPoints int32 - nextEnergyTick time.Duration + maxEnergy float64 + currentEnergy float64 + startingComboPoints int32 + comboPoints int32 + nextEnergyTick time.Duration // Time between Energy ticks. EnergyTickDuration time.Duration @@ -27,19 +28,24 @@ type energyBar struct { regenMetrics *ResourceMetrics EnergyRefundMetrics *ResourceMetrics } +type EnergyBarOptions struct { + StartingComboPoints int32 + MaxEnergy float64 +} -func (unit *Unit) EnableEnergyBar(maxEnergy float64) { +func (unit *Unit) EnableEnergyBar(options EnergyBarOptions) { unit.SetCurrentPowerBar(EnergyBar) unit.energyBar = energyBar{ unit: unit, - maxEnergy: max(100, maxEnergy), + maxEnergy: max(100, options.MaxEnergy), EnergyTickDuration: unit.ReactionTime, EnergyPerTick: 10.0 * unit.ReactionTime.Seconds(), energyRegenMultiplier: 1, hasteRatingMultiplier: 1, regenMetrics: unit.NewEnergyMetrics(ActionID{OtherID: proto.OtherAction_OtherActionEnergyRegen}), EnergyRefundMetrics: unit.NewEnergyMetrics(ActionID{OtherID: proto.OtherAction_OtherActionRefund}), + startingComboPoints: max(0, min(int32(options.StartingComboPoints), 5)), } } @@ -111,7 +117,7 @@ func (eb *energyBar) ComboPoints() int32 { } func (eb *energyBar) IsReset(sim *Simulation) bool { - return (eb.nextEnergyTick != 0) && (eb.nextEnergyTick - sim.CurrentTime <= eb.EnergyTickDuration) + return (eb.nextEnergyTick != 0) && (eb.nextEnergyTick-sim.CurrentTime <= eb.EnergyTickDuration) } func (eb *energyBar) IsTicking(sim *Simulation) bool { @@ -198,7 +204,8 @@ func (eb *energyBar) reset(sim *Simulation) { } eb.currentEnergy = eb.maxEnergy - eb.comboPoints = 0 + eb.comboPoints = eb.startingComboPoints + eb.hasteRatingMultiplier = 1.0 + eb.unit.GetStat(stats.HasteRating)/(100*HasteRatingPerHastePercent) eb.energyRegenMultiplier = 1.0 diff --git a/sim/druid/feral/feral.go b/sim/druid/feral/feral.go index 502a030d6f..c1a0ea15ac 100644 --- a/sim/druid/feral/feral.go +++ b/sim/druid/feral/feral.go @@ -42,7 +42,9 @@ func NewFeralDruid(character *core.Character, options *proto.Player) *FeralDruid cat.AssumeBleedActive = feralOptions.Options.AssumeBleedActive cat.maxRipTicks = cat.MaxRipTicks() - cat.EnableEnergyBar(100.0) + cat.EnableEnergyBar(core.EnergyBarOptions{ + MaxEnergy: 100.0, + }) cat.EnableRageBar(core.RageBarOptions{RageMultiplier: 1, MHSwingSpeed: 2.5}) cat.EnableAutoAttacks(cat, core.AutoAttackOptions{ diff --git a/sim/rogue/assassination/TestAssassination.results b/sim/rogue/assassination/TestAssassination.results index b1647132dd..c43a9f41c9 100644 --- a/sim/rogue/assassination/TestAssassination.results +++ b/sim/rogue/assassination/TestAssassination.results @@ -1517,6 +1517,13 @@ dps_results: { tps: 20608.75495 } } +dps_results: { + key: "TestAssassination-AllItems-Slayer'sArmor" + value: { + dps: 31867.52102 + tps: 22625.93993 + } +} dps_results: { key: "TestAssassination-AllItems-Sorrowsong-55879" value: { diff --git a/sim/rogue/assassination/assassination.go b/sim/rogue/assassination/assassination.go index b020e446a7..f4830c9bb7 100644 --- a/sim/rogue/assassination/assassination.go +++ b/sim/rogue/assassination/assassination.go @@ -7,9 +7,6 @@ import ( "github.com/wowsims/cata/sim/rogue" ) -const masteryDamagePerPoint = 0.035 -const masteryBaseEffect = 0.28 - func RegisterAssassinationRogue() { core.RegisterAgentFactory( proto.Player_AssassinationRogue{}, @@ -30,6 +27,9 @@ func RegisterAssassinationRogue() { func (sinRogue *AssassinationRogue) Initialize() { sinRogue.Rogue.Initialize() + sinRogue.MasteryBaseValue = 0.28 + sinRogue.MasteryMultiplier = 0.035 + sinRogue.registerMutilateSpell() sinRogue.registerOverkill() sinRogue.registerColdBloodCD() @@ -39,7 +39,8 @@ func (sinRogue *AssassinationRogue) Initialize() { // Apply Mastery // As far as I am able to find, Asn's Mastery is an additive bonus. To be tested. - masteryEffect := getMasteryBonus(sinRogue.GetStat(stats.MasteryRating)) + masteryEffect := sinRogue.GetMasteryBonusFromRating(sinRogue.GetStat(stats.MasteryRating)) + for _, spell := range sinRogue.InstantPoison { spell.DamageMultiplierAdditive += masteryEffect } @@ -53,8 +54,9 @@ func (sinRogue *AssassinationRogue) Initialize() { } sinRogue.AddOnMasteryStatChanged(func(sim *core.Simulation, oldMastery, newMastery float64) { - masteryEffectOld := getMasteryBonus(oldMastery) - masteryEffectNew := getMasteryBonus(newMastery) + masteryEffectOld := sinRogue.GetMasteryBonusFromRating(oldMastery) + masteryEffectNew := sinRogue.GetMasteryBonusFromRating(newMastery) + for _, spell := range sinRogue.InstantPoison { spell.DamageMultiplierAdditive -= masteryEffectOld spell.DamageMultiplierAdditive += masteryEffectNew @@ -80,10 +82,6 @@ func (sinRogue *AssassinationRogue) Initialize() { } } -func getMasteryBonus(masteryRating float64) float64 { - return masteryBaseEffect + core.MasteryRatingToMasteryPoints(masteryRating)*masteryDamagePerPoint -} - func NewAssassinationRogue(character *core.Character, options *proto.Player) *AssassinationRogue { sinOptions := options.GetAssassinationRogue().Options diff --git a/sim/rogue/combat/TestCombat.results b/sim/rogue/combat/TestCombat.results index b707378191..854bbd9331 100644 --- a/sim/rogue/combat/TestCombat.results +++ b/sim/rogue/combat/TestCombat.results @@ -1522,6 +1522,13 @@ dps_results: { tps: 21129.0141 } } +dps_results: { + key: "TestCombat-AllItems-Slayer'sArmor" + value: { + dps: 26773.36141 + tps: 19009.0866 + } +} dps_results: { key: "TestCombat-AllItems-Sorrowsong-55879" value: { diff --git a/sim/rogue/combat/combat.go b/sim/rogue/combat/combat.go index baf7eaa139..ff076b46ba 100644 --- a/sim/rogue/combat/combat.go +++ b/sim/rogue/combat/combat.go @@ -38,6 +38,9 @@ func NewCombatRogue(character *core.Character, options *proto.Player) *CombatRog func (combatRogue *CombatRogue) Initialize() { combatRogue.Rogue.Initialize() + combatRogue.MasteryBaseValue = 0.16 + combatRogue.MasteryMultiplier = 0.02 + // Ambidexterity Passive combatRogue.AutoAttacks.OHConfig().DamageMultiplier *= 1.75 // Vitality Passive diff --git a/sim/rogue/combat/mastery.go b/sim/rogue/combat/mastery.go index 681fb286da..fade48402f 100644 --- a/sim/rogue/combat/mastery.go +++ b/sim/rogue/combat/mastery.go @@ -5,9 +5,6 @@ import ( "github.com/wowsims/cata/sim/rogue" ) -const masteryChancePerPoint = .02 -const masteryBaseEffect = 0.16 - func (comRogue *CombatRogue) applyMastery() { comRogue.mainGauche = comRogue.RegisterSpell(core.SpellConfig{ @@ -38,8 +35,7 @@ func (comRogue *CombatRogue) applyMastery() { OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { if spell.ProcMask.Matches(core.ProcMaskMeleeMH) && spell != comRogue.mainGauche && spell != comRogue.Rupture { - masteryPoints := comRogue.GetMasteryPoints() - mgProcChance := masteryChancePerPoint*masteryPoints + masteryBaseEffect + mgProcChance := comRogue.GetMasteryBonus() if sim.Proc(mgProcChance, "Main Gauche") { comRogue.mainGauche.Cast(sim, result.Target) diff --git a/sim/rogue/items.go b/sim/rogue/items.go index e2d18d0376..ef14b988ed 100644 --- a/sim/rogue/items.go +++ b/sim/rogue/items.go @@ -10,6 +10,35 @@ import ( "github.com/wowsims/cata/sim/core/stats" ) +var Tier6 = core.NewItemSet(core.ItemSet{ + Name: "Slayer's Armor", + Bonuses: map[int32]core.ApplySetBonus{ + 2: func(agent core.Agent, setBonusAura *core.Aura) { + // Increases the haste from your Slice and Dice ability by 5% + // Handeled in slide_and_dice.go:35 + rogue := agent.(RogueAgent).GetRogue() + setBonusAura.AttachSpellMod(core.SpellModConfig{ + Kind: core.SpellMod_Custom, + ClassMask: RogueSpellSliceAndDice, + ApplyCustom: func(mod *core.SpellMod, spell *core.Spell) { + rogue.SliceAndDiceBonusFlat += 0.05 + }, + RemoveCustom: func(mod *core.SpellMod, spell *core.Spell) { + rogue.SliceAndDiceBonusFlat -= 0.05 + }, + }) + }, + 4: func(agent core.Agent, setBonusAura *core.Aura) { + // Increases the damage dealt by your Backstab, Sinister Strike, Mutilate, and Hemorrhage abilities by 6%. + setBonusAura.AttachSpellMod(core.SpellModConfig{ + Kind: core.SpellMod_DamageDone_Flat, + ClassMask: RogueSpellBackstab | RogueSpellSinisterStrike | RogueSpellMutilate | RogueSpellHemorrhage, + FloatValue: 6.0, + }) + }, + }, +}) + var Tier11 = core.NewItemSet(core.ItemSet{ Name: "Wind Dancer's Regalia", Bonuses: map[int32]core.ApplySetBonus{ diff --git a/sim/rogue/rogue.go b/sim/rogue/rogue.go index 00fb951865..0c8d7d1d2e 100644 --- a/sim/rogue/rogue.go +++ b/sim/rogue/rogue.go @@ -29,7 +29,10 @@ type Rogue struct { CombatOptions *proto.CombatRogue_Options SubtletyOptions *proto.SubtletyRogue_Options - SliceAndDiceBonus float64 + MasteryBaseValue float64 + MasteryMultiplier float64 + + SliceAndDiceBonusFlat float64 // The flat bonus Attack Speed bonus before Mastery is applied AdditiveEnergyRegenBonus float64 sliceAndDiceDurations [6]time.Duration @@ -199,8 +202,6 @@ func (rogue *Rogue) Initialize() { rogue.registerThistleTeaCD() rogue.registerGougeSpell() - rogue.SliceAndDiceBonus = 0.4 - rogue.T12ToTLastBuff = 3 // re-configure poisons when performing an item swap @@ -274,7 +275,11 @@ func NewRogue(character *core.Character, options *proto.RogueOptions, talents st rogue.GetMHWeapon().WeaponType == proto.WeaponType_WeaponTypeDagger { maxEnergy += 20 } - rogue.EnableEnergyBar(maxEnergy) + + rogue.EnableEnergyBar(core.EnergyBarOptions{ + MaxEnergy: maxEnergy, + StartingComboPoints: options.StartingComboPoints, + }) rogue.EnableAutoAttacks(rogue, core.AutoAttackOptions{ MainHand: rogue.WeaponFromMainHand(0), // Set crit multiplier later when we have targets. @@ -336,6 +341,13 @@ func (rogue *Rogue) IsStealthed() bool { return false } +func (rogue *Rogue) GetMasteryBonus() float64 { + return rogue.GetMasteryBonusFromRating(rogue.GetStat(stats.MasteryRating)) +} +func (rogue *Rogue) GetMasteryBonusFromRating(masteryRating float64) float64 { + return rogue.MasteryBaseValue + core.MasteryRatingToMasteryPoints(masteryRating)*rogue.MasteryMultiplier +} + // Agent is a generic way to access underlying rogue on any of the agents. type RogueAgent interface { GetRogue() *Rogue diff --git a/sim/rogue/slice_and_dice.go b/sim/rogue/slice_and_dice.go index 2051ffa31f..d8b0555ff2 100644 --- a/sim/rogue/slice_and_dice.go +++ b/sim/rogue/slice_and_dice.go @@ -10,6 +10,7 @@ import ( func (rogue *Rogue) registerSliceAndDice() { actionID := core.ActionID{SpellID: 5171} + rogue.SliceAndDiceBonusFlat = 0.4 durationMultiplier := 1.0 + 0.25*float64(rogue.Talents.ImprovedSliceAndDice) durationBonus := time.Duration(0) if rogue.HasPrimeGlyph(proto.RoguePrimeGlyph_GlyphOfSliceAndDice) { @@ -24,16 +25,22 @@ func (rogue *Rogue) registerSliceAndDice() { time.Duration(float64(time.Second*21+durationBonus) * durationMultiplier), } + var slideAndDiceMod float64 rogue.SliceAndDiceAura = rogue.RegisterAura(core.Aura{ Label: "Slice and Dice", ActionID: actionID, // This will be overridden on cast, but set a non-zero default so it doesn't crash when used in APL prepull Duration: rogue.sliceAndDiceDurations[5], OnGain: func(aura *core.Aura, sim *core.Simulation) { - rogue.MultiplyMeleeSpeed(sim, 1+rogue.SliceAndDiceBonus) + masteryBonus := core.TernaryFloat64(rogue.Spec == proto.Spec_SpecSubtletyRogue, rogue.GetMasteryBonus(), 0) + slideAndDiceMod = 1 + rogue.SliceAndDiceBonusFlat*(1+masteryBonus) + rogue.MultiplyMeleeSpeed(sim, slideAndDiceMod) + if sim.Log != nil { + rogue.Log(sim, "[DEBUG]: Slice and Dice attack speed mod: %v", slideAndDiceMod) + } }, OnExpire: func(aura *core.Aura, sim *core.Simulation) { - rogue.MultiplyMeleeSpeed(sim, 1/(1+rogue.SliceAndDiceBonus)) + rogue.MultiplyMeleeSpeed(sim, 1/slideAndDiceMod) }, }) diff --git a/sim/rogue/subtlety/TestSubtlety.results b/sim/rogue/subtlety/TestSubtlety.results index 7edae030ef..2e5d53654f 100644 --- a/sim/rogue/subtlety/TestSubtlety.results +++ b/sim/rogue/subtlety/TestSubtlety.results @@ -718,8 +718,8 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-Harrison'sInsigniaofPanache-65803" value: { - dps: 24389.55852 - tps: 17316.58655 + dps: 24627.67475 + tps: 17485.64907 } } dps_results: { @@ -1033,15 +1033,15 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-MarkofKhardros-56132" value: { - dps: 24563.97465 - tps: 17440.422 + dps: 24886.22599 + tps: 17669.22045 } } dps_results: { key: "TestSubtlety-AllItems-MarkofKhardros-56458" value: { - dps: 24713.60747 - tps: 17546.66131 + dps: 24909.66656 + tps: 17685.86326 } } dps_results: { @@ -1103,8 +1103,8 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-MoonwellChalice-70142" value: { - dps: 24535.68448 - tps: 17420.33598 + dps: 24651.1618 + tps: 17502.32488 } } dps_results: { @@ -1159,15 +1159,15 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-PorcelainCrab-55237" value: { - dps: 24189.59544 - tps: 17174.61277 + dps: 24230.71153 + tps: 17203.80519 } } dps_results: { key: "TestSubtlety-AllItems-PorcelainCrab-56280" value: { - dps: 24438.85318 - tps: 17351.58576 + dps: 24391.04782 + tps: 17317.64395 } } dps_results: { @@ -1406,8 +1406,8 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-Schnottz'sMedallionofCommand-65805" value: { - dps: 24998.7498 - tps: 17749.11236 + dps: 25180.53962 + tps: 17878.18313 } } dps_results: { @@ -1469,15 +1469,22 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-Skardyn'sGrace-56115" value: { - dps: 25214.18715 - tps: 17902.07287 + dps: 25287.61621 + tps: 17954.20751 } } dps_results: { key: "TestSubtlety-AllItems-Skardyn'sGrace-56440" value: { - dps: 25496.72183 - tps: 18102.6725 + dps: 25446.52679 + tps: 18067.03402 + } +} +dps_results: { + key: "TestSubtlety-AllItems-Slayer'sArmor" + value: { + dps: 37317.02807 + tps: 26495.08993 } } dps_results: { @@ -1511,22 +1518,22 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-SoulshifterVortex-77206" value: { - dps: 24756.36764 - tps: 17577.02102 + dps: 24780.28301 + tps: 17594.00094 } } dps_results: { key: "TestSubtlety-AllItems-SoulshifterVortex-77970" value: { - dps: 24688.51352 - tps: 17528.8446 + dps: 24849.50863 + tps: 17643.15113 } } dps_results: { key: "TestSubtlety-AllItems-SoulshifterVortex-77990" value: { - dps: 24631.33803 - tps: 17488.25 + dps: 24656.4134 + tps: 17506.05351 } } dps_results: { @@ -1777,8 +1784,8 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-Varo'then'sBrooch-72899" value: { - dps: 24652.42869 - tps: 17503.22437 + dps: 24761.92422 + tps: 17580.9662 } } dps_results: { @@ -1805,8 +1812,8 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-VestmentsoftheDarkPhoenix" value: { - dps: 25939.56089 - tps: 18417.08823 + dps: 25648.47314 + tps: 18210.41593 } } dps_results: { @@ -2064,15 +2071,15 @@ dps_results: { dps_results: { key: "TestSubtlety-AllItems-Za'brox'sLuckyTooth-63742" value: { - dps: 24360.98882 - tps: 17296.30206 + dps: 24413.28923 + tps: 17333.43535 } } dps_results: { key: "TestSubtlety-AllItems-Za'brox'sLuckyTooth-63745" value: { - dps: 24360.98882 - tps: 17296.30206 + dps: 24413.28923 + tps: 17333.43535 } } dps_results: { @@ -2253,169 +2260,169 @@ dps_results: { dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Deadly-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 31031.15113 - tps: 22032.1173 + dps: 31044.63352 + tps: 22041.6898 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Deadly-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 31031.15113 - tps: 22032.1173 + dps: 31044.63352 + tps: 22041.6898 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Deadly-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 41526.26674 - tps: 29483.64938 + dps: 41508.11859 + tps: 29470.7642 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Deadly-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 17722.41743 - tps: 12582.91637 + dps: 17742.67152 + tps: 12597.29678 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Deadly-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 17722.41743 - tps: 12582.91637 + dps: 17742.67152 + tps: 12597.29678 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Deadly-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 20172.28317 - tps: 14322.32105 + dps: 20180.40114 + tps: 14328.08481 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Instant-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 33383.57277 - tps: 23702.33667 + dps: 33389.70875 + tps: 23706.69322 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Instant-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 33383.57277 - tps: 23702.33667 + dps: 33389.70875 + tps: 23706.69322 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Instant-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 44468.38584 - tps: 31572.55394 + dps: 44481.9353 + tps: 31582.17406 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Instant-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 18992.21351 - tps: 13484.47159 + dps: 19053.56322 + tps: 13528.02989 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Instant-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 18992.21351 - tps: 13484.47159 + dps: 19053.56322 + tps: 13528.02989 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Deadly OH Instant-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 21445.63372 - tps: 15226.39994 + dps: 21434.70357 + tps: 15218.63954 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Instant OH Instant-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 31093.55424 - tps: 22076.42351 + dps: 31097.23311 + tps: 22079.03551 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Instant OH Instant-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 31093.55424 - tps: 22076.42351 + dps: 31097.23311 + tps: 22079.03551 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Instant OH Instant-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 41888.51227 - tps: 29740.84371 + dps: 41975.96917 + tps: 29802.93811 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Instant OH Instant-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 17476.3799 - tps: 12408.22973 + dps: 17451.76046 + tps: 12390.74993 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Instant OH Instant-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 17476.3799 - tps: 12408.22973 + dps: 17451.76046 + tps: 12390.74993 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-MH Instant OH Instant-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 20247.48996 - tps: 14375.71787 + dps: 20314.12171 + tps: 14423.02641 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-Subtlety-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 33646.34945 - tps: 23888.90811 + dps: 33654.51626 + tps: 23894.70654 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-Subtlety-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 33646.34945 - tps: 23888.90811 + dps: 33654.51626 + tps: 23894.70654 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-Subtlety-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 44275.74212 - tps: 31435.7769 + dps: 44112.31021 + tps: 31319.74025 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-Subtlety-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 18987.31419 - tps: 13480.99307 + dps: 19003.88755 + tps: 13492.76016 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-Subtlety-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 18987.31419 - tps: 13480.99307 + dps: 19003.88755 + tps: 13492.76016 } } dps_results: { key: "TestSubtlety-Settings-Human-p3_subtlety-Subtlety-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 21751.8393 - tps: 15443.8059 + dps: 21656.00835 + tps: 15375.76593 } } dps_results: { @@ -2757,169 +2764,169 @@ dps_results: { dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Deadly-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 31296.96687 - tps: 22220.84648 + dps: 31268.46891 + tps: 22200.61293 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Deadly-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 31296.96687 - tps: 22220.84648 + dps: 31268.46891 + tps: 22200.61293 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Deadly-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 42042.83419 - tps: 29850.41228 + dps: 42024.68821 + tps: 29837.52863 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Deadly-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 17886.07545 - tps: 12699.11357 + dps: 17907.22612 + tps: 12714.13055 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Deadly-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 17886.07545 - tps: 12699.11357 + dps: 17907.22612 + tps: 12714.13055 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Deadly-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 20486.43228 - tps: 14545.36692 + dps: 20494.23047 + tps: 14550.90364 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Instant-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 33669.10689 - tps: 23905.06589 + dps: 33677.94715 + tps: 23911.34248 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Instant-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 33669.10689 - tps: 23905.06589 + dps: 33677.94715 + tps: 23911.34248 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Instant-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 45015.64996 - tps: 31961.11147 + dps: 45029.1982 + tps: 31970.73072 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Instant-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 19158.55222 - tps: 13602.57207 + dps: 19220.90484 + tps: 13646.84243 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Instant-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 19158.55222 - tps: 13602.57207 + dps: 19220.90484 + tps: 13646.84243 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Deadly OH Instant-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 21772.31822 - tps: 15458.34593 + dps: 21761.39037 + tps: 15450.58716 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Instant OH Instant-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 31365.43852 - tps: 22269.46135 + dps: 31379.01384 + tps: 22279.09983 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Instant OH Instant-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 31365.43852 - tps: 22269.46135 + dps: 31379.01384 + tps: 22279.09983 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Instant OH Instant-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 42423.3798 - tps: 30120.59966 + dps: 42510.82175 + tps: 30182.68344 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Instant OH Instant-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 17630.75585 - tps: 12517.83665 + dps: 17606.43877 + tps: 12500.57153 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Instant OH Instant-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 17630.75585 - tps: 12517.83665 + dps: 17606.43877 + tps: 12500.57153 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-MH Instant OH Instant-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 20570.21885 - tps: 14604.85539 + dps: 20636.83828 + tps: 14652.15518 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-Subtlety-subtlety-FullBuffs-0.0yards-LongMultiTarget" value: { - dps: 33939.39083 - tps: 24096.96749 + dps: 33950.84464 + tps: 24105.09969 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-Subtlety-subtlety-FullBuffs-0.0yards-LongSingleTarget" value: { - dps: 33939.39083 - tps: 24096.96749 + dps: 33950.84464 + tps: 24105.09969 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-Subtlety-subtlety-FullBuffs-0.0yards-ShortSingleTarget" value: { - dps: 44820.54356 - tps: 31822.58592 + dps: 44657.14026 + tps: 31706.56958 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-Subtlety-subtlety-NoBuffs-0.0yards-LongMultiTarget" value: { - dps: 19155.64465 - tps: 13600.5077 + dps: 19169.0373 + tps: 13610.01649 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-Subtlety-subtlety-NoBuffs-0.0yards-LongSingleTarget" value: { - dps: 19155.64465 - tps: 13600.5077 + dps: 19169.0373 + tps: 13610.01649 } } dps_results: { key: "TestSubtlety-Settings-Orc-p3_subtlety-Subtlety-subtlety-NoBuffs-0.0yards-ShortSingleTarget" value: { - dps: 22082.54385 - tps: 15678.60614 + dps: 21986.24774 + tps: 15610.2359 } } dps_results: { diff --git a/sim/rogue/subtlety/subtlety.go b/sim/rogue/subtlety/subtlety.go index eff3e95229..fa747f6f04 100644 --- a/sim/rogue/subtlety/subtlety.go +++ b/sim/rogue/subtlety/subtlety.go @@ -7,10 +7,6 @@ import ( "github.com/wowsims/cata/sim/rogue" ) -const masteryDamagePerPoint = .025 -const masteryBaseEffect = 0.2 -const masteryFloored = false // Firelands patch appears to have fixed this issue - func RegisterSubtletyRogue() { core.RegisterAgentFactory( proto.Player_SubtletyRogue{}, @@ -31,6 +27,9 @@ func RegisterSubtletyRogue() { func (subRogue *SubtletyRogue) Initialize() { subRogue.Rogue.Initialize() + subRogue.MasteryBaseValue = 0.2 + subRogue.MasteryMultiplier = .025 + subRogue.registerHemorrhageSpell() subRogue.registerSanguinaryVein() subRogue.registerPremeditation() @@ -46,18 +45,15 @@ func (subRogue *SubtletyRogue) Initialize() { // Apply Mastery // From all I can find, Sub's Mastery is Additive. Will need to test. - masteryEffect := getMasteryBonus(subRogue.GetStat(stats.MasteryRating)) + masteryEffect := subRogue.GetMasteryBonusFromRating(subRogue.GetStat(stats.MasteryRating)) - subRogue.SliceAndDiceBonus *= (1 + masteryEffect) subRogue.Eviscerate.DamageMultiplierAdditive += masteryEffect subRogue.Rupture.DamageMultiplierAdditive += masteryEffect subRogue.AddOnMasteryStatChanged(func(sim *core.Simulation, oldMastery, newMastery float64) { - masteryEffectOld := getMasteryBonus(oldMastery) - masteryEffectNew := getMasteryBonus(newMastery) + masteryEffectOld := subRogue.GetMasteryBonusFromRating(oldMastery) + masteryEffectNew := subRogue.GetMasteryBonusFromRating(newMastery) - subRogue.SliceAndDiceBonus /= (1 + masteryEffectOld) - subRogue.SliceAndDiceBonus *= (1 + masteryEffectNew) subRogue.Eviscerate.DamageMultiplierAdditive -= masteryEffectOld subRogue.Eviscerate.DamageMultiplierAdditive += masteryEffectNew subRogue.Rupture.DamageMultiplierAdditive -= masteryEffectOld @@ -65,10 +61,6 @@ func (subRogue *SubtletyRogue) Initialize() { }) } -func getMasteryBonus(masteryRating float64) float64 { - return masteryBaseEffect + core.MasteryRatingToMasteryPoints(masteryRating)*masteryDamagePerPoint -} - func NewSubtletyRogue(character *core.Character, options *proto.Player) *SubtletyRogue { subOptions := options.GetSubtletyRogue().Options diff --git a/tools/database/overrides.go b/tools/database/overrides.go index 2ce0ca6721..7c4a0d54cf 100644 --- a/tools/database/overrides.go +++ b/tools/database/overrides.go @@ -232,6 +232,15 @@ var ItemAllowList = map[int32]struct{}{ 29309: {}, // Band of the Eternal Restorer + 31026: {}, // Slayer's Handguards + 31027: {}, // Slayer's Helm + 31028: {}, // Slayer's Chestguard + 31029: {}, // Slayer's Legguards + 31030: {}, // Slayer's Shoulderpads + 34448: {}, // Slayer's Bracers + 34558: {}, // Slayer's Belt + 34575: {}, // Slayer's Boots + 34677: {}, // Shattered Sun Pendant of Restoration 45703: {}, // Spark of Hope diff --git a/ui/rogue/inputs.ts b/ui/rogue/inputs.ts index e82dd2d8f9..1cb3dd2e95 100644 --- a/ui/rogue/inputs.ts +++ b/ui/rogue/inputs.ts @@ -75,3 +75,11 @@ export const ApplyPoisonsManually = () => label: 'Configure poisons manually', labelTooltip: 'Prevent automatic poison configuration that is based on equipped weapons.', }); + +export const StartingComboPoints = () => + InputHelpers.makeClassOptionsNumberInput({ + fieldName: 'startingComboPoints', + label: 'Starting Combo Points', + labelTooltip: 'Initial Combo Points at the start of each iteration.', + max: 5, + }); diff --git a/ui/rogue/subtlety/sim.ts b/ui/rogue/subtlety/sim.ts index f1923c76a8..e660520ce1 100644 --- a/ui/rogue/subtlety/sim.ts +++ b/ui/rogue/subtlety/sim.ts @@ -134,6 +134,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecSubtletyRogue, { // OtherInputs.TankAssignment, OtherInputs.InFrontOfTarget, OtherInputs.InputDelay, + RogueInputs.StartingComboPoints(), ], }, itemSwapSlots: [ @@ -218,7 +219,7 @@ export class SubtletyRogueSimUI extends IndividualSimUI } else { return Presets.P1_EP_PRESET.epWeights; } - } + }, }); });