Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- statweights
- local weights = {
- int = 4.51,
- spi = 5.19,
- hit = 5.19,
- haste = 2.41,
- mastery = 2.37,
- crit = 1.95
- }
- -- reforgable stats
- local refstats = {"spi","hit","haste","mastery","crit"}
- -- slots
- local slots = {"head","neck","shoulders","back","chest","wrists","hands","waist","legs","feet","finger","finger","trinkets","trinkets","off_hand","main_hand"}
- local slotnames = {"head","neck","shoulders","back","chest","wrists","hands","waist","legs","feet","finger1","finger2","trinket1","trinket2","off_hand","main_hand"}
- -- gemstrings
- local gemstrings = {}
- gemstrings["m"] = "burning_primal"
- gemstrings["r"] = "160int"
- gemstrings["b"] = "80int_160spi"
- if weights["haste"] == math.max(weights["haste"],weights["mastery"],weights["crit"]) then
- gemstrings["y"] = "80int_160haste"
- elseif weights["mastery"] == math.max(weights["haste"],weights["mastery"],weights["crit"]) then
- gemstrings["y"] = "80int_160mastery"
- elseif weights["crit"] == math.max(weights["haste"],weights["mastery"],weights["crit"]) then
- gemstrings["y"] = "80int_160crit"
- end
- -- enchantstrings
- local enchantstrings = {
- shoulders = ",enchant=200int_100crit",
- back = ",enchant=180int",
- chest = ",enchant=80all",
- wrists = ",enchant=180int",
- hands = ",enchant=170haste",
- legs = ",enchant=285int_165spi",
- feet = ",enchant=140mastery",
- main_hand = ",enchant=jade_spirit",
- off_hand = ",enchant=165int",
- }
- -- available items
- local items = {
- head = {
- {
- id = 96696,
- name = "Headpiece of the Witch Doctor",
- int = 1519,
- spi = 1088,
- hit = 0,
- haste = 995,
- mastery = 0,
- crit = 0,
- s1 = "m",
- s2 = "y",
- s3 = "",
- sbval = 180,
- sbstat = "crit"
- },
- {
- id = 96509,
- name = "Clear-Mind Helm",
- int = 1519,
- spi = 0,
- hit = 0,
- haste = 1070,
- mastery = 1023,
- crit = 0,
- s1 = "m",
- s2 = "b",
- s3 = "",
- sbval = 180,
- sbstat = "int"
- }
- },
- neck = {
- {
- id = 96402,
- name = "Horridon's Tusk Fragment",
- int = 980,
- spi = 558,
- hit = 0,
- haste = 0,
- mastery = 710,
- crit = 0,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96537,
- name = "Passionfire Choker",
- int = 900,
- spi = 581,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 633,
- s1 = "y",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "crit"
- },
- {
- id = 96560,
- name = "Soul Prism of Lei-Shen",
- int = 820,
- spi = 665,
- hit = 0,
- haste = 417,
- mastery = 0,
- crit = 0,
- s1 = "b",
- s2 = "b",
- s3 = "",
- sbval = 120,
- sbstat = "spi"
- },
- {
- id = 96708,
- name = "Necklace of the Terra-Cotta Invoker",
- int = 900,
- spi = 0,
- hit = 642,
- haste = 565,
- mastery = 0,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "hit"
- },
- {
- id = 96713,
- name = "Necklace of the Terra-Cotta Mender",
- int = 900,
- spi = 652,
- hit = 0,
- haste = 0,
- mastery = 549,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "spi"
- },
- {
- id = 96453,
- name = "Megaera's Shining Eye",
- int = 980,
- spi = 0,
- hit = 654,
- haste = 0,
- mastery = 0,
- crit = 654,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- }
- },
- shoulders = {
- {
- id = 96698,
- name = "Shoulderwraps of the Witch Doctor",
- int = 1147,
- spi = 0,
- hit = 0,
- haste = 817,
- mastery = 0,
- crit = 748,
- s1 = "r",
- s2 = "y",
- s3 = "",
- sbval = 120,
- sbstat = "haste"
- },
- {
- id = 96439,
- name = "Spaulders of Quaking Fear",
- int = 1227,
- spi = 942,
- hit = 0,
- haste = 642,
- mastery = 0,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "spi"
- },
- {
- id = 96615,
- name = "Abandoned Spaulders of Renewal",
- int = 1227,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 844,
- crit = 809,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- }
- },
- back = {
- {
- id = 95013,
- name = "Black Night Thundercloak",
- int = 957,
- spi = 651,
- hit = 0,
- haste = 0,
- mastery = 651,
- crit = 0,
- s1 = "y",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "haste"
- },
- {
- id = 95014,
- name = "Red Sky Cloudcloak",
- int = 957,
- spi = 0,
- hit = 701,
- haste = 566,
- mastery = 0,
- crit = 0,
- s1 = "y",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "haste"
- },
- {
- id = 96383,
- name = "Drape of Booming Nights",
- int = 980,
- spi = 719,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 542,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96435,
- name = "Shimmershell Cape",
- int = 980,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 682,
- crit = 605,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96485,
- name = "Deadly Glare Cape",
- int = 900,
- spi = 0,
- hit = 0,
- haste = 633,
- mastery = 0,
- crit = 581,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96517,
- name = "Constantly Accelerating Cape",
- int = 900,
- spi = 549,
- hit = 0,
- haste = 652,
- mastery = 0,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- }
- },
- chest = {
- {
- id = 96694,
- name = "Hauberk of the Witch Doctor",
- int = 1519,
- spi = 966,
- hit = 0,
- haste = 0,
- mastery = 1105,
- crit = 0,
- s1 = "r",
- s2 = "y",
- s3 = "b",
- sbval = 180,
- sbstat = "int"
- },
- {
- id = 96532,
- name = "Ro'shak's Molten Chain",
- int = 1599,
- spi = 1093,
- hit = 0,
- haste = 1093,
- mastery = 0,
- crit = 0,
- s1 = "r",
- s2 = "r",
- s3 = "",
- sbval = 120,
- sbstat = "int"
- },
- {
- id = 96459,
- name = "Chain of Consuming Magic",
- int = 1599,
- spi = 1226,
- hit = 0,
- haste = 0,
- mastery = 866,
- crit = 0,
- s1 = "y",
- s2 = "y",
- s3 = "",
- sbval = 120,
- sbstat = "int"
- },
- {
- id = 95035,
- name = "Chains of Counted Souls",
- int = 1620,
- spi = 0,
- hit = 0,
- haste = 1228,
- mastery = 938,
- crit = 0,
- s1 = "r",
- s2 = "r",
- s3 = "r",
- sbval = 180,
- sbstat = "int"
- }
- },
- wrists = {
- {
- id = 96489,
- name = "Vein-Cover Bracers",
- int = 980,
- spi = 736,
- hit = 0,
- haste = 512,
- mastery = 0,
- crit = 0,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- }
- },
- hands = {
- {
- id = 96695,
- name = "Gloves of the Witch Doctor",
- int = 1227,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 849,
- crit = 769,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96466,
- name = "Grasp of the Ruthless Mother",
- int = 1307,
- spi = 786,
- hit = 0,
- haste = 0,
- mastery = 922,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96545,
- name = "Fingers of the Night",
- int = 1227,
- spi = 930,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 633,
- s1 = "y",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- }
- },
- waist = {
- {
- id = 94999,
- name = "Longdraw Chain Belt",
- int = 1222,
- spi = 0,
- hit = 0,
- haste = 924,
- mastery = 712,
- crit = 0,
- s1 = "r",
- s2 = "b",
- s3 = "b",
- sbval = 120,
- sbstat = "int"
- },
- {
- id = 96458,
- name = "Links of the Bifurcated Tongue",
- int = 1147,
- spi = 804,
- hit = 0,
- haste = 0,
- mastery = 769,
- crit = 0,
- s1 = "r",
- s2 = "r",
- s3 = "y",
- sbval = 120,
- sbstat = "spi"
- },
- {
- id = 96717,
- name = "Abandoned Zandalari Waterchain",
- int = 1227,
- spi = 0,
- hit = 0,
- haste = 746,
- mastery = 0,
- crit = 882,
- s1 = "r",
- s2 = "b",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- }
- },
- legs = {
- {
- id = 96697,
- name = "Kilt of the Witch Doctor",
- int = 1599,
- spi = 0,
- hit = 0,
- haste = 937,
- mastery = 0,
- crit = 1201,
- s1 = "y",
- s2 = "b",
- s3 = "",
- sbval = 120,
- sbstat = "int"
- },
- {
- id = 96564,
- name = "Leggings of the Violent Gale",
- int = 1519,
- spi = 1178,
- hit = 0,
- haste = 0,
- mastery = 834,
- crit = 0,
- s1 = "r",
- s2 = "r",
- s3 = "r",
- sbval = 180,
- sbstat = "int"
- },
- {
- id = 96407,
- name = "Legguards of Scintillating Scales",
- int = 1599,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 1093,
- crit = 1093,
- s1 = "r",
- s2 = "b",
- s3 = "",
- sbval = 120,
- sbstat = "int"
- },
- {
- id = 95027,
- name = "Legguards of Awaked Repair",
- int = 1620,
- spi = 1228,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 938,
- s1 = "r",
- s2 = "y",
- s3 = "y",
- sbval = 180,
- sbstat = "mastery"
- }
- },
- feet = {
- {
- id = 95008,
- name = "World-Mote Sabatons",
- int = 1222,
- spi = 850,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 805,
- s1 = "y",
- s2 = "b",
- s3 = "",
- sbval = 120,
- sbstat = "int"
- },
- {
- id = 96387,
- name = "Ghostbinder Greatboots",
- int = 1227,
- spi = 911,
- hit = 0,
- haste = 691,
- mastery = 0,
- crit = 0,
- s1 = "y",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "spi"
- },
- {
- id = 96711,
- name = "Spiritbound Boots",
- int = 1307,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 871,
- crit = 871,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- }
- },
- finger = {
- {
- id = 95018,
- name = "Ra-den's Evolving Signet",
- int = 957,
- spi = 658,
- hit = 0,
- haste = 624,
- mastery = 0,
- crit = 0,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 95019,
- name = "Ra-den's Summoning Band",
- int = 957,
- spi = 0,
- hit = 509,
- haste = 744,
- mastery = 0,
- crit = 0,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96382,
- name = "Jin'rokh's Dreamshard",
- int = 980,
- spi = 0,
- hit = 605,
- haste = 0,
- mastery = 0,
- crit = 682,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96403,
- name = "Petrified Eye of the Basilisk",
- int = 980,
- spi = 745,
- hit = 0,
- haste = 0,
- mastery = 497,
- crit = 0,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96486,
- name = "Durumu's Captive Eyeballs",
- int = 900,
- spi = 672,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 496,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "spi"
- },
- {
- id = 96529,
- name = "Ro'shak's Remembrance",
- int = 900,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 478,
- crit = 703,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "haste"
- }
- },
- trinkets = {
- {
- id = 96516,
- name = "Cha'Ye's Essence of Brilliance",
- int = 0,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 1657,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96558,
- name = "Unerring Vision of Lei-Shen",
- int = 1657,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 0,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96413,
- name = "Wushoolay's Final Choice",
- int = 0,
- spi = 0,
- hit = 1657,
- haste = 0,
- mastery = 0,
- crit = 0,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- },
- {
- id = 96455,
- name = "Breath of the Hydra",
- int = 0,
- spi = 0,
- hit = 0,
- haste = 1657,
- mastery = 0,
- crit = 0,
- s1 = "",
- s2 = "",
- s3 = "",
- sbval = 0,
- sbstat = ""
- }
- },
- off_hand = {
- {
- id = 96436,
- name = "Torto's Discarded Shell",
- int = 900,
- spi = 676,
- hit = 0,
- haste = 525,
- mastery = 0,
- crit = 0,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96538,
- name = "Shield of Twinned Despair",
- int = 900,
- spi = 712,
- hit = 0,
- haste = 0,
- mastery = 463,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96454,
- name = "Fetish of the Hydra",
- int = 900,
- spi = 0,
- hit = 642,
- haste = 0,
- mastery = 0,
- crit = 565,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96530,
- name = "Orb of Arcing Lightning",
- int = 900,
- spi = 696,
- hit = 0,
- haste = 472,
- mastery = 0,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96562,
- name = "Lei-Shen's Orb of Command",
- int = 900,
- spi = 0,
- hit = 0,
- haste = 518,
- mastery = 0,
- crit = 670,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- }
- },
- main_hand = {
- {
- id = 96559,
- name = "Torall, Rod of the Shattered Throne",
- int = 754,
- spi = 533,
- hit = 0,
- haste = 342,
- mastery = 0,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96414,
- name = "Amun-Thoth, Sul's Spiritrending Talons",
- int = 674,
- spi = 506,
- hit = 0,
- haste = 0,
- mastery = 389,
- crit = 0,
- s1 = "b",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96518,
- name = "Athame of the Sanguine Ritual",
- int = 674,
- spi = 0,
- hit = 0,
- haste = 463,
- mastery = 463,
- crit = 0,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- },
- {
- id = 96487,
- name = "Ritual Dagger of the Mind's Eye",
- int = 674,
- spi = 499,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 401,
- s1 = "r",
- s2 = "",
- s3 = "",
- sbval = 60,
- sbstat = "int"
- }
- }
- }
- --function gem(s1, s2, s3, sbval, sbstat)
- function gem(item)
- local s1 = item.s1
- local s2 = item.s2
- local s3 = item.s3
- local sbval = item.sbval
- local sbstat = item.sbstat
- local pure = 0
- local match = 0
- local bonus = true
- local gemstring = ",gems="
- -- pure red
- if s1 ~= "" then
- pure = pure + 160 * weights["int"]
- if s1 ~= "r" then
- bonus = false
- end
- end
- if s2 ~= "" then
- pure = pure + 160 * weights["int"]
- if s2 ~= "r" then
- bonus = false
- end
- end
- if s3 ~= "" then
- pure = pure + 160 * weights["int"]
- if s3 ~= "r" then
- bonus = false
- end
- end
- if bonus and sbval > 0 then
- pure = pure + sbval * weights[sbstat]
- end
- if s1 == "r" then
- match = match + 160 * weights["int"]
- elseif s1 == "y" then
- match = match + 80 * weights["int"] + 160 * math.max(weights["haste"],weights["mastery"],weights["crit"])
- elseif s1 == "b" then
- match = match + 80 * weights["int"] + 160 * weights["spi"]
- end
- if s2 == "r" then
- match = match + 160 * weights["int"]
- elseif s2 == "y" then
- match = match + 80 * weights["int"] + 160 * math.max(weights["haste"],weights["mastery"],weights["crit"])
- elseif s2 == "b" then
- match = match + 80 * weights["int"] + 160 * weights["spi"]
- end
- if s3 == "r" then
- match = match + 160 * weights["int"]
- elseif s3 == "y" then
- match = match + 80 * weights["int"] + 160 * math.max(weights["haste"],weights["mastery"],weights["crit"])
- elseif s3 == "b" then
- match = match + 80 * weights["int"] + 160 * weights["spi"]
- end
- if sbval > 0 then
- match = match + sbval * weights[sbstat]
- end
- if s1 ~= "" then
- if match > pure then
- --print("match sockets for "..match.."dps. pure would net "..pure.."dps.")
- gemstring = gemstring .. gemstrings[s1]
- if s2 ~= "" then
- gemstring = gemstring.."_"..gemstrings[s2]
- end
- if s3 ~= "" then
- gemstring = gemstring.."_"..gemstrings[s3]
- end
- gemstring = gemstring.."_"..sbval..sbstat
- return gemstring
- else
- --print("socket pure red for "..pure.."dps. matching would net "..match.."dps.")
- if s1 == "m" then
- gemstring = gemstring .. gemstrings["m"]
- else
- gemstring = gemstring .. gemstrings["r"]
- end
- if s2 ~= "" then
- gemstring = gemstring.."_"..gemstrings["r"]
- end
- if s3 ~= "" then
- gemstring = gemstring.."_"..gemstrings["r"]
- end
- if bonus then
- gemstring = gemstring.."_"..sbval..sbstat
- end
- return gemstring
- end
- else
- return ""
- end
- end
- function sanitycheck(head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand)
- local scitems = {items["head"][head], items["neck"][neck], items["shoulders"][shoulders], items["back"][back], items["chest"][chest], items["wrists"][wrists], items["hands"][hands], items["waist"][waist], items["legs"][legs], items["feet"][feet], items["finger"][finger1], items["finger"][finger2], items["trinkets"][trinket1], items["trinkets"][trinket2], items["off_hand"][off_hand], items["main_hand"][main_hand]}
- local unreforged_spi = 245 -- spi from leg and chest enchants
- local spi = 0
- for i = 1,#scitems do
- local gstring = gem(scitems[i])
- local spistart,_ = string.find(gstring,"spi")
- if spistart then
- spivaluestart = string.find(gstring,"_",spistart-4) + 1
- unreforged_spi = unreforged_spi + string.sub(gstring,spivaluestart,spistart-1)
- end
- spi = spi + scitems[i].spi + scitems[i].hit
- end
- --if spi > (5100-unreforged_spi)/0.6 then
- if spi > 8225 then
- --print("too much spi: "..spi.."\n")
- return false
- end
- return true
- end
- function parse_gemstring(str)
- local bonus = {
- int = 0,
- spi = 0,
- hit = 0,
- haste = 0,
- mastery = 0,
- crit = 0
- }
- if string.find(str,"burning") then
- bonus["int"] = bonus["int"] + 216
- end
- for gem in string.gmatch(str,"%d+%a+") do
- local value = string.sub(gem,1,string.find(gem,"%a+")-1)
- local stat = string.sub(gem,string.find(gem,"%a+"))
- if stat == "all" then stat = "int" end
- --print(gem.." => "..value.." "..stat)
- bonus[stat] = bonus[stat] + tonumber(value)
- end
- return bonus
- -- for k,v in pairs(bonus) do
- -- print(k.." "..v)
- -- end
- end
- function reforge(item)
- local refs = {""}
- --get highest non-hit target not on item
- local maxtarget = 0
- local maxval = 0
- for target = 3,5 do
- if (item[refstats[target]] == 0) and (weights[refstats[target]] > maxval) then
- maxtarget = target
- maxval = weights[refstats[target]]
- end
- end
- --print("max: "..maxtarget)
- --get lowest non-hit source on item
- local minsource = 0
- local minval = 100
- for source = 3,5 do
- if (item[refstats[source]] > 0) and (weights[refstats[source]] < minval) then
- minsource = source
- minval = weights[refstats[source]]
- end
- end
- --print("min: "..minsource)
- --spi/hit to highest target
- for source = 1,2 do
- if item[refstats[source]] > 0 then
- table.insert(refs,",reforge="..refstats[source].."_"..refstats[maxtarget])
- end
- end
- --lowest to highest
- if (maxtarget > 0) and (minsource > 0) and (weights[refstats[maxtarget]] > weights[refstats[minsource]]) then
- table.insert(refs,",reforge="..refstats[minsource].."_"..refstats[maxtarget])
- end
- --all nonhit/spi to spi if no hit/spi on item
- if (item["hit"] == 0) and (item["spi"] == 0) then
- for source = 3,5 do
- if item[refstats[source]] > 0 then
- table.insert(refs,",reforge="..refstats[source].."_spi")
- end
- end
- end
- if #refs > 1 then
- table.remove(refs,1)
- end
- return refs
- end
- -- local bla = reforge(items["head"][2])
- -- for r = 1,#bla do print(bla[r]) end
- --exit
- function reforgeset(head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand)
- -- reforge a to b -> a=ceil(0.6*a), b=b+a-ceil(0.6*a)
- local refitems = {items["head"][head], items["neck"][neck], items["shoulders"][shoulders], items["back"][back], items["chest"][chest], items["wrists"][wrists], items["hands"][hands], items["waist"][waist], items["legs"][legs], items["feet"][feet], items["finger"][finger1], items["finger"][finger2], items["trinkets"][trinket1], items["trinkets"][trinket2], items["off_hand"][off_hand], items["main_hand"][main_hand]}
- local refcombo = {}
- for i = 1,#refitems do
- table.insert(refcombo,reforge(refitems[i]))
- end
- return refcombo
- end
- --local bla = reforgeset(1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1)
- -- for a = 1,#bla do
- -- for b = 1,#bla[a] do
- -- print(bla[a][b])
- -- end
- -- end
- -- returns the source and target stat from a reforge string
- function parsereforge(str)
- local retval = {}
- --for word in string.gmatch(str,"%a+") do print(word) end
- --print(str)
- for w in string.gmatch(str,"%a+") do
- table.insert(retval,w)
- end
- return retval
- end
- -- local bla = parsereforge(",reforge=spi_mastery")
- -- for i = 1,#bla do
- -- print(bla[i])
- -- end
- local maxrefset = {}
- function calcvalue(head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand,curmax)
- local cvitems = {items["head"][head], items["neck"][neck], items["shoulders"][shoulders], items["back"][back], items["chest"][chest], items["wrists"][wrists], items["hands"][hands], items["waist"][waist], items["legs"][legs], items["feet"][feet], items["finger"][finger1], items["finger"][finger2], items["trinkets"][trinket1], items["trinkets"][trinket2], items["off_hand"][off_hand], items["main_hand"][main_hand]}
- local int = 0
- local spi = 0 -- including hit
- local haste = 0
- local mastery = 0
- local crit = 0
- local gembonus = {}
- local enchbonus = {int = 0, spi = 0, haste = 0, mastery = 0, crit = 0}
- local value = 0
- for i = 1,#cvitems do
- gembonus = parse_gemstring(gem(cvitems[i]))
- local estr = enchantstrings[slots[i]]
- if estr ~= nil then enchbonus = parse_gemstring(enchantstrings[slots[i]]) end
- int = int + cvitems[i].int + gembonus["int"] + enchbonus["int"]
- spi = spi + cvitems[i].spi + gembonus["spi"] + enchbonus["spi"] + cvitems[i].hit + gembonus["hit"]
- haste = haste + cvitems[i].haste + gembonus["haste"] + enchbonus["haste"]
- mastery = mastery + cvitems[i].mastery + gembonus["mastery"] + enchbonus["mastery"]
- crit = crit + cvitems[i].crit + gembonus["crit"] + enchbonus["crit"]
- end
- -- establish upper bounds of current item value. assumption: all hit above will be reforged to the lowest valued stat, missing hit will be reforged from the highest valued stat. very conservative upperbound to reduce # of permutations
- local ubhaste, ubmastery, ubcrit = haste, mastery, crit
- if spi > 5100 then
- if weights["haste"] == math.min(weights["haste"],weights["mastery"],weights["crit"]) then
- ubhaste = haste + spi - 5100
- elseif weights["mastery"] == math.min(weights["haste"],weights["mastery"],weights["crit"]) then
- ubmastery = mastery + spi - 5100
- elseif weights["crit"] == math.min(weights["haste"],weights["mastery"],weights["crit"]) then
- ubcrit = crit + spi - 5100
- end
- elseif spi < 5100 then
- if weights["haste"] == math.max(weights["haste"],weights["mastery"],weights["crit"]) then
- ubhaste = haste - (spi - 5100)
- elseif weights["mastery"] == math.max(weights["haste"],weights["mastery"],weights["crit"]) then
- ubmastery = mastery - (spi - 5100)
- elseif weights["crit"] == math.max(weights["haste"],weights["mastery"],weights["crit"]) then
- ubcrit = crit - (spi - 5100)
- end
- end
- local upperbound = int * weights["int"] + 5100 * weights["spi"] + ubhaste * weights["haste"] + ubmastery * weights["mastery"] + ubcrit * weights["crit"]
- -- if upperbound > curmax then
- --print("possible set found ("..upperbound.." > "..curmax.."), reforging...")
- -- else
- if upperbound < curmax then
- --print("imferior set found ("..upperbound.." < "..curmax.."), skipping")
- return 0, curmax
- end
- --reforge here
- local maxvalue = curmax
- local r = 0
- local rmax = 1
- --local maxrefset = {}
- local refset = reforgeset(head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand)
- for i = 1,#refset do
- rmax = rmax * #refset[i]
- end
- -- for a = 1,#refset do
- -- print("---")
- -- for b = 1,#refset[a] do
- -- print(refset[a][b])
- -- end
- -- end
- for shead = 1,#refset[1] do
- for sneck = 1,#refset[2] do
- for sshoulders = 1,#refset[3] do
- for sback = 1,#refset[4] do
- for schest = 1,#refset[5] do
- for swrists = 1,#refset[6] do
- for shands = 1,#refset[7] do
- for swaist = 1,#refset[8] do
- for slegs = 1,#refset[9] do
- for sfeet = 1,#refset[10] do
- for sfinger1 = 1,#refset[11] do
- for sfinger2 = 1,#refset[12] do
- for strinket1 = 1,#refset[13] do
- for strinket2 = 1,#refset[14] do
- for smain_hand = 1,#refset[15] do
- for soff_hand = 1,#refset[16] do
- r = r + 1
- local refbonus = {spi = 0, haste = 0, mastery = 0, crit = 0, hit = 0}
- local curref = {shead,sneck,sshoulders,sback,schest,swrists,shands,swaist,slegs,sfeet,sfinger1,sfinger2,strinket1,strinket2,soff_hand,smain_hand}
- for s = 1,#cvitems do
- if (refset[s][curref[s]] ~= "") and (refset[s][curref[s]] ~= nil) then
- --print(refset[s][curref[s]])
- local temp = parsereforge(refset[s][curref[s]])
- local source = temp[2]
- local target = temp[3]
- local amnt = math.floor(0.4 * cvitems[s][source])
- --print("reforging "..amnt.." "..source.." to "..target.." on "..cvitems[s]["name"])
- refbonus[source] = refbonus[source] - amnt
- refbonus[target] = refbonus[target] + amnt
- end
- end
- -- spi = spi + refbonus["spi"]
- -- haste = haste + refbonus["haste"]
- -- mastery = mastery + refbonus["mastery"]
- -- crit = crit + refbonus["crit"]
- value = 0
- local totspi = spi + refbonus["spi"] + refbonus["hit"]
- if (totspi >= 5100) and (totspi <= 5610) then
- value = int * weights["int"] + 5100 * weights["spi"] + (haste + refbonus["haste"]) * weights["haste"] + (mastery + refbonus["mastery"]) * weights["mastery"] + (crit + refbonus["crit"]) * weights["crit"]
- if value > maxvalue then
- maxvalue = value
- maxrefset = curref
- print("reforge "..r.." / "..rmax..": new max reforge value: "..maxvalue.." ("..totspi.." spirit/hit)")
- for s = 1,#cvitems do
- local estr, rstr = "", ""
- if enchantstrings[slotnames[s]] ~= nil then
- estr = enchantstrings[slotnames[s]]
- end
- if refset[s][curref[s]] ~= nil then
- rstr = refset[s][curref[s]]
- end
- print(slotnames[s].."="..string.gsub(string.gsub(string.gsub(cvitems[s].name," ","_"),"'",""),",","")..",id="..cvitems[s].id..gem(cvitems[s])..estr..rstr)
- end
- print("\n\n")
- end
- else
- --print("reforge "..r.." / "..rmax..": can't get close enough to hitcap: "..totspi)
- value = 0
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- return value, maxvalue
- end
- --calcvalue(1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1)
- function gettwofromx(slot) -- returns a table of non-repeating item combinations
- local out = {}
- for a = 1,#items[slot]-1 do
- for b = a+1,#items[slot] do
- table.insert(out,{a,b})
- end
- end
- return out
- end
- function get4tierset() -- returns a table of sets that cover the set-slots and provde the 4t15 bonus
- local out = {}
- table.insert(out,{1,1,1,1,1}) --5t15
- for head = 2,#items["head"] do
- table.insert(out,{head,1,1,1,1})
- end
- for shoulders = 2,#items["shoulders"] do
- table.insert(out,{1,shoulders,1,1,1})
- end
- for chest = 2,#items["chest"] do
- table.insert(out,{1,1,chest,1,1})
- end
- for hands = 2,#items["hands"] do
- table.insert(out,{1,1,1,hands,1})
- end
- for legs = 2,#items["legs"] do
- table.insert(out,{1,1,1,1,legs})
- end
- return out
- end
- --local combo_ringtrinket = {{1,2},{1,3},{1,4},{2,3},{2,4},{3,4}}
- local combo_rings = gettwofromx("finger")
- local combo_trinkets = gettwofromx("trinkets")
- --local combo_tier = {{2,3,2,3,2},{1,3,2,3,2},{2,1,2,3,2},{2,2,2,3,2},{2,3,1,3,2},{2,3,3,3,2},{2,3,2,1,2},{2,3,2,2,2},{2,3,2,3,1},{2,3,2,3,3}}
- local combo_tier = get4tierset()
- --print(#combo_tier)
- --local sets = 0
- local total = 0
- local maxvalue = 0
- local maxset = {}
- local val = 0
- local set = 0
- local setper = 0
- local numsets = #combo_tier * #combo_rings * #combo_trinkets * #items["neck"] * #items["back"] * #items["wrists"] * #items["waist"] * #items["feet"] * #items["off_hand"] * #items["main_hand"]
- -- iterate over all sets possible
- for tier = 1,#combo_tier do
- head = combo_tier[tier][1]
- shoulders = combo_tier[tier][2]
- chest = combo_tier[tier][3]
- hands = combo_tier[tier][4]
- legs = combo_tier[tier][5]
- for neck = 1,#items["neck"] do
- for back = 1,#items["back"] do
- for wrists = 1,#items["wrists"] do
- for waist = 1,#items["waist"] do
- for feet = 1,#items["feet"] do
- for fingers = 1,#combo_rings do
- finger1 = combo_rings[fingers][1]
- finger2 = combo_rings[fingers][2]
- for trinkets = 1,#combo_trinkets do
- trinket1 = combo_trinkets[trinkets][1]
- trinket2 = combo_trinkets[trinkets][2]
- for off_hand = 1,#items["off_hand"] do
- for main_hand = 1,#items["main_hand"] do
- set = set + 1
- if set % 69984 == 0 then
- setper = setper + 1
- print(setper.."% of sets tried")
- end
- total = total + 1
- if sanitycheck(head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand) then
- --sets = sets + 1
- val, maxvalue = calcvalue(head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand,maxvalue)
- --print(val.." "..maxvalue)
- if val > maxvalue then
- maxvalue = val
- maxset = {head,neck,shoulders,back,chest,wrists,hands,waist,legs,feet,finger1,finger2,trinket1,trinket2,off_hand,main_hand}
- print("new best set: "..val)
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- print(sets.."/"..total)
- for s = 1,#slots do
- local estr = ""
- if enchantstrings[slotnames[s]] ~= nil then
- estr = enchantstrings[slotnames[s]]
- end
- print(slotnames[s].."="..string.gsub(string.gsub(string.gsub(items[slots[s]][maxset[s]].name," ","_"),"'",""),",","")..",id="..items[slots[s]][maxset[s]].id..gem(items[slots[s]][maxset[s]])..estr)
- end
Advertisement
Add Comment
Please, Sign In to add comment