solidity

elemental shaman upgrade evaluator

Apr 30th, 2013
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 28.89 KB | None | 0 0
  1. # upgrade evaluater
  2. # usage: -b baseitems -u upgrade-items
  3.  
  4. require 'net/http'
  5. require 'rexml/document'
  6. $maxhit = 5200
  7. $t_start = Time.now
  8. $baseIDs = []
  9. $upgradeIDs = []
  10. $mhID = 0
  11. $ohID = 0
  12. #statweights
  13. $w = Hash["int" => 4.42, "splpwr" => 3.47, "spi" => 5.05, "hit" => 5.05, "haste" => 2.47, "mastery" => 2.31, "crit" => 1.98]    # oxi 20130430
  14.  
  15. #--------------------------------------------------------------------------------
  16. #
  17. # setup character professions (NYI)
  18. #
  19. #--------------------------------------------------------------------------------
  20. $profs = {
  21.     "alc" => 0, # alchemy (not relevant for simcraft?)
  22.     "bla" => 1, # blacksmithing (prismatic sockets on wrists and hands)
  23.     "enc" => 1, # enchanting (160 int enchant on rings
  24.     "eng" => 0, # engineering (synapse springs on hands)
  25.     "her" => 0, # herbalism (not relevant for simcraft?)
  26.     "ins" => 0, # inscription (520 int, 100 crit on shoulders)
  27.     "jew" => 0, # jewelcrafting NYI
  28.     "lea" => 0, # leatherworking (500 int on wrists)
  29.     "min" => 0, # mining
  30.     "ski" => 0, # skinning
  31.     "tai" => 0  # tailoring (lightweave emroidery on back)
  32. }
  33. $wrathion_weapon_socket = true
  34. $wrathion_meta = false
  35.  
  36. def timedMsg(msg)
  37.     time = Time.now-$t_start
  38.     time = "%010.4f" % time
  39.     puts time + " " + msg
  40. end
  41.  
  42. #--------------------------------------------------------------------------------
  43. #
  44. # parse options
  45. #
  46. #--------------------------------------------------------------------------------
  47. while ARGV.length >= 2 do
  48.     switch = ARGV.shift
  49.     case switch
  50.     when "-b"
  51.         while (ARGV.length > 0) and (ARGV[0][0] != "-") do
  52.             $baseIDs.push(ARGV.shift.to_i)
  53.         end
  54.     when "-u"
  55.         while (ARGV.length > 0) and (ARGV[0][0] != "-") do
  56.             $upgradeIDs.push(ARGV.shift.to_i)
  57.         end
  58.     when "-mh"  # mainhand to use when evaluating upgrading from a two-hand weapon
  59.         $mhID = ARGV.shift.to_i
  60.     when "-oh"  # offhand to use when evaluating upgrading from a two-hand weapon
  61.         $ohID = ARGV.shift.to_i
  62.     else
  63.         puts "unkown option\"#{switch}\""
  64.         puts "usage: <-b itemIDs> <-u itemIDs> [-mh itemID] [-oh itemID]"
  65.         puts "-b <itemIDs> your current gear as itemIDs, separated by spaces"
  66.         puts "-u <itemIDs> available upgrades, separated by spaces"
  67.         puts "-mh <itemID> main-hand to use when wearing a two-hander and evaluating an off_hand"
  68.         puts "-oh <itemID> off-hand to use when wearing a two-hander and evaluating a main_hand"
  69.     end
  70. end
  71.  
  72. #--------------------------------------------------------------------------------
  73. #
  74. # statweights
  75. #
  76. #--------------------------------------------------------------------------------
  77. #puts "#{Time.now-$t_start} setting up gems & statweights"
  78. # $w = Hash["int" => 4.64, "splpwr" => 3.66, "spi" => 5.23, "hit" => 5.23, "haste" => 2.51, "mastery" => 2.36, "crit" => 2.29]  #t15hc bis
  79. $w = Hash["int" => 4.42, "splpwr" => 3.47, "spi" => 5.05, "hit" => 5.05, "haste" => 2.47, "mastery" => 2.31, "crit" => 1.98]    # oxi 20130430
  80. $wnh = $w.dup   # statweights without hit/spi
  81. $wnh["spi"] = 0
  82. $wnh["hit"] = 0
  83.  
  84. #--------------------------------------------------------------------------------
  85. #
  86. # setup stat prios for reforging
  87. #
  88. #--------------------------------------------------------------------------------
  89. timedMsg("setting up gems")
  90. $nonhitrefstats = Hash["mastery" => $w["mastery"], "haste" => $w["haste"], "crit" => $w["crit"]]
  91. $nonhitrefstats = $nonhitrefstats.sort_by {|_key, value| value}
  92. $high, $medium, $low = $nonhitrefstats[2][0], $nonhitrefstats[1][0], $nonhitrefstats[0][0]
  93.  
  94.  
  95. #--------------------------------------------------------------------------------
  96. #
  97. # setup stat prios for reforging
  98. #
  99. #--------------------------------------------------------------------------------
  100. $gemsByColor = {
  101.     "r" => [
  102.         [
  103.             "160int",
  104.             160*$w["int"],
  105.             160*$wnh["int"],
  106.             Hash["int" => 160],
  107.             0
  108.         ],
  109.         [
  110.             "80int_160#{$high}",
  111.             80*$w["int"]+160*$w[$high],
  112.             80*$wnh["int"]+160*$wnh[$high],
  113.             Hash["int" => 80, $high => 160],
  114.             0
  115.         ]
  116.     ],
  117.     "y" => [
  118.         [
  119.             "80int_160#{$high}",
  120.             80*$w["int"]+160*$w[$high],
  121.             80*$wnh["int"]+160*$wnh[$high],
  122.             Hash["int" => 80, $high => 160],
  123.             1
  124.         ],
  125.         [
  126.             "320#{$high}",
  127.             320*$w[$high],
  128.             320*$wnh[$high],
  129.             Hash[$high => 320],
  130.             1
  131.         ]
  132.     ],
  133.     "b" => [
  134.         [
  135.             "80int_160spi",
  136.             80*$w["int"]+160*$w["spi"],
  137.             80*$wnh["int"]+160*$wnh["spi"],
  138.             Hash["int" => 80, "spi" => 160],
  139.             2
  140.         ],
  141.         [
  142.             "160#{$high}_160spi",
  143.             160*$w[$high]+160*$w["spi"],
  144.             160*$wnh[$high]+160*$wnh["spi"],
  145.             Hash[$high => 160, "spi" => 160],
  146.             2
  147.         ]
  148.     ]
  149. }
  150. if $wration_meta then
  151.     $gemsByColor["m"] = [[
  152.         "sinister_primal",
  153.         324*$w["crit"],
  154.         324*$w["crit"],
  155.         Hash["crit" => 324],
  156.         3
  157.     ]]
  158. else
  159.     $gemsByColor["m"] = [[
  160.         "burning_primal",
  161.         216*$w["int"],
  162.         216*$w["int"],
  163.         Hash["int" => 216],
  164.         3
  165.     ]]
  166. end
  167. $gemsByColor.each do |sc|
  168.     sc[1].each do |gem|
  169.         sc[1].sort!{ |a,b| b[1] <=> a[1] }
  170.     end
  171. end
  172. $allgems = $gemsByColor["r"] + $gemsByColor["y"] + $gemsByColor["b"]
  173. $allgems.sort!{ |a,b| b[2] <=> a[2]}
  174. $gemcols = ["red","yellow","blue","meta","prismatic"]
  175. $maxgemcol = $allgems[0][4]
  176. $gems = [$gemsByColor["r"][0][0],$gemsByColor["y"][0][0],$gemsByColor["b"][0][0],$gemsByColor["m"][0][0],$allgems[0][0]]
  177. $gemval = [$gemsByColor["r"][0][1],$gemsByColor["y"][0][1],$gemsByColor["b"][0][1],$gemsByColor["m"][0][1],$allgems[0][1]]
  178. $gemstats = [$gemsByColor["r"][0][3],$gemsByColor["y"][0][3],$gemsByColor["b"][0][3],$gemsByColor["m"][0][3],$allgems[0][3]]
  179. #$gems = ["160int","80int_160#{$high}","80int_160spi","sinister_primal","160int"]
  180. #$gemval = [160 * $w["int"], 80 * $w["int"] + 160 * $w[$high], 80 * $w["int"] + 160 * $w["spi"], 324 * $w["crit"],160 * $w["int"]]
  181. if $debug then
  182.     (0..4).each do |i|
  183.         puts "best #{$gemcols[i]} gem: #{$gems[i]} at #{$gemval[i]}"
  184.     end
  185. end
  186.  
  187.  
  188. #--------------------------------------------------------------------------------
  189. #
  190. # setup classes for items and sets
  191. #
  192. #--------------------------------------------------------------------------------
  193. timedMsg("setting up classes")
  194. class Item
  195.     def initialize(id, name, slot, int = 0, splpwr = 0, spi = 0, hit = 0, haste = 0, mastery = 0, crit = 0, sockets = nil)
  196.         @id = id
  197.         @name = name
  198.         @slot = slot    #head,shoulder,back,chest,wrist,hands,waist,legs,feet,finger,trinket,main_hand,off_hand
  199.         @basestats = Hash["int" => int, "splpwr" => splpwr, "spi" => spi, "hit" => hit, "haste" => haste, "mastery" => mastery, "crit" => crit]
  200.         # setup gems
  201.         @sockets = sockets  # array of skt colors, bonus value, bonus stat: 0 = red, 1 = yellow, 2 = blue, 3 = meta, 4 = prismatic
  202.                             # [1, 2, 3, 180, "int"]
  203.         @gembonus = Hash["int" => 0, "splpwr" => 0, "spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  204.         @gemstring = ""
  205.         if @sockets then
  206.             self.gem()
  207.         end
  208.         # setup enchants
  209.         @enchantbonus = Hash["int" => 0, "splpwr" => 0, "spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  210.         @enchantstring = ""
  211.         self.enchant()
  212.         # setup reforging
  213.         @reforges = []
  214.         self.getRefs()
  215.         @refindex = nil
  216.         @refstring = ""
  217.     end
  218.    
  219.     def getName
  220.         out = @name
  221.     end
  222.    
  223.     def getSimcName
  224.         name = @name.gsub(" ", "_") # space to underscore
  225.         name.gsub!("'", "")         # remove apostrophes
  226.         name.gsub!(",", "")         # remove commata
  227.         name.gsub!("-", "")         # remove dashes
  228.         name.downcase!
  229.     end
  230.    
  231.     def getID
  232.         out = @id
  233.     end
  234.    
  235.     def getSlot
  236.         out = @slot
  237.     end
  238.    
  239.     def getSpiHit()
  240.         spihit = @basestats["spi"] + @basestats["hit"] + @gembonus["spi"] + @gembonus["hit"] + @enchantbonus["spi"] + @enchantbonus["hit"]# + @reforgebonus["spi"] + @reforgebonus["hit"]
  241.     end
  242.    
  243.     def getReforgableSpiHit()
  244.         out = @basestats["spi"] + @basestats["hit"]
  245.     end
  246.    
  247.     def reforge()
  248.         maxval = 0
  249.         maxref = nil
  250.         (0..@reforges.length-1).each do |r|
  251.             self.setReforge(r)
  252.             tempval = self.getValue
  253.             if tempval > maxval then
  254.                 maxval = tempval
  255.                 maxref = r
  256.             end
  257.         end
  258.         self.setReforge(maxref)
  259.     end
  260.    
  261.     def getValue()
  262.         value = 0
  263.         stats = $w.keys
  264.         stats.each do |s|
  265.             # if (s != "spi") and (s != "hit") then
  266.             value += @basestats[s] * $w[s]
  267.             value += @gembonus[s] * $w[s]
  268.             value += @enchantbonus[s] * $w[s]
  269.             #value += @reforgebonus[s] * $w[s]
  270.             # end
  271.         end
  272.         out = value
  273.     end
  274.    
  275.     def getStats()
  276.         itemstats = Hash["int" => 0, "splpwr" => 0, "spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  277.         stats = $w.keys
  278.         stats.each do |s|
  279.             itemstats[s] += @basestats[s]
  280.             itemstats[s] += @gembonus[s]
  281.             itemstats[s] += @enchantbonus[s]
  282.             #itemstats[s] += @reforgebonus[s]
  283.         end
  284.         out = itemstats
  285.     end
  286.    
  287.     def enchant()
  288.         @enchantbonus.each do |k,v|
  289.             @enchantbonus[k] = 0
  290.         end
  291.         case @slot
  292.         when "shoulders"
  293.             if $profs["ins"] == 1 then
  294.                 @enchantbonus["int"] += 520
  295.                 @enchantbonus["crit"] += 100
  296.                 enchantstring = ",enchant=520int_100crit"
  297.             else
  298.                 @enchantbonus["int"] += 200
  299.                 @enchantbonus["crit"] += 100
  300.                 enchantstring = ",enchant=200int_100crit"
  301.             end
  302.         when "back"
  303.             if $profs["tai"] == 1 then
  304.                 enchantstring = ",enchant=lightweave_embroidery_3"
  305.             else
  306.                 @enchantbonus["int"] += 180
  307.                 enchantstring = ",enchant=180int"
  308.             end
  309.         when "chest"
  310.             @enchantbonus["int"] += 80
  311.             @enchantbonus["spi"] += 80
  312.             enchantstring = ",enchant=80all"
  313.         when "wrists"
  314.             if $profs["lea"] == 1 then
  315.                 @enchantbonus["int"] += 500
  316.                 enchantstring = ",enchant=500int"
  317.             else
  318.                 @enchantbonus["int"] += 180
  319.                 enchantstring = ",enchant=180int"
  320.             end
  321.         when "hands"
  322.             @enchantbonus["haste"] += 170
  323.             enchantstring = ",enchant=170haste"
  324.             if $profs["eng"] == 1 then
  325.                 enchantstring = "#{enchantstring},addon=synapse_springs_mark_ii"
  326.             end
  327.         when "legs"
  328.             @enchantbonus["int"] += 285
  329.             @enchantbonus["spi"] += 165
  330.             enchantstring = ",enchant=285int_165spi"
  331.         when "feet"
  332.             @enchantbonus["mastery"] += 140
  333.             enchantstring = ",enchant=140mastery"
  334.         when "finger"
  335.             if $profs["enc"] == 1 then
  336.                 @enchantbonus["int"] += 160
  337.                 enchantstring = ",enchant=160int"
  338.             end
  339.         when "main_hand"
  340.             enchantstring = ",enchant=jade_spirit"
  341.         when "off_hand"
  342.             @enchantbonus["int"] += 165
  343.             enchantstring = ",enchant=165int"
  344.         else
  345.             enchantstring = ""
  346.         end
  347.         @enchantstring = enchantstring
  348.     end
  349.    
  350.     def gem()
  351.         if @sockets then
  352.             @gembonus.each do |k,v|
  353.                 @gembonus[k] = 0
  354.             end
  355.             # calc matching value
  356.             v_match = 0
  357.             @sockets[0..-3].each do |s|
  358.                 v_match += $gemval[s]
  359.             end
  360.             v_match += @sockets[-2] * $w[@sockets[-1]]
  361.             #puts "matching value: #{v_match}"
  362.             # calc pure value
  363.             v_pure = 0
  364.             bonus = true
  365.             @sockets[0..-3].each do |s|
  366.                 s != 3 ? v_pure += $gemval[4] : v_pure += $gemval[s]
  367.                 s != $maxgemcol ? bonus = false : nil
  368.             end
  369.             bonus ? v_pure += @sockets[-2] * $w[@sockets[-1]] : nil
  370.             #puts "pure value: #{v_pure}"
  371.            
  372.             #construct gemstring
  373.             gemstring = ",gems="
  374.             bonus = true    # assume matching sockets
  375.             if v_match >= v_pure then
  376.                 @sockets[0..-3].each do |s|
  377.                     gemstring += "#{$gems[s]}_"
  378.                     $gemstats[s].each do |k,v|
  379.                         @gembonus[k] += v
  380.                     end
  381.                 end
  382.                 @gembonus[@sockets[-1]] += @sockets[-2]
  383.                 gemstring += "#{@sockets[-2]}#{@sockets[-1]}_"
  384.             else
  385.                 @sockets[0..-3].each do |s|
  386.                     if s != 3 then
  387.                         gemstring += "#{$gems[4]}_"
  388.                         s != $maxgemcol ? bonus = false : nil
  389.                         $gemstats[4].each do |k,v|
  390.                             @gembonus[k] += v
  391.                         end
  392.                     else
  393.                         gemstring += "#{$gems[s]}_"
  394.                         $gemstats[s].each do |k,v|
  395.                             @gembonus[k] += v
  396.                         end
  397.                     end
  398.                 end
  399.                 if bonus then
  400.                     gemstring += "#{@sockets[-2]}#{@sockets[-1]}_"
  401.                 end
  402.             end
  403.             gemstring.chop!
  404.             @gemstring = gemstring
  405.         end
  406.     end
  407.    
  408.     # def refSanity(s, t)
  409.         # sensible = true
  410.         # if ((t == "spi") or (t == "hit")) and ((@basestats["spi"] > 0) or (@basestats["hit"] > 0)) then sensible = false end
  411.        
  412.     # end
  413.    
  414.     def getRefs()
  415.         hitstats = ["spi", "hit"]
  416.         secstats = ["haste", "mastery", "crit"]
  417.         secstats.sort!{|a,b| $w[b] <=> $w[a]}
  418.         secmin = secstats.sort{|a,b| $w[a] <=> $w[b]}
  419.         refs = Array.new
  420.         sources, targets = Array.new, Array.new
  421.         secstats.each do |s|
  422.             @basestats[s] > 0 ? sources.push(s) : targets.push(s)
  423.         end
  424.         #get all refs that take hit/spi and turn it into sth else
  425.         hitstats.each do |s|
  426.             if @basestats[s] > 0 then
  427.                 amnt = (0.4*@basestats[s]).floor
  428.                 secstats.each do |t|
  429.                     if @basestats[t] == 0 then
  430.                         refs.push([s,t,amnt])
  431.                         break
  432.                     end
  433.                 end
  434.             end
  435.         end
  436.         #get all refs from any stat to hit/spi if not on the item yet
  437.         if (@basestats["spi"] == 0) and (@basestats["hit"] == 0) then
  438.             secmin.each do |s|
  439.                 if @basestats[s] > 0 then
  440.                     amnt = (0.4*@basestats[s]).floor
  441.                     refs.push([s,"spi",amnt])
  442.                     break
  443.                 end
  444.             end
  445.         end
  446.         #get minsource to maxtarget
  447.         secmin.each do |s|
  448.             if @basestats[s] > 0 then
  449.                 amnt = (0.4*@basestats[s]).floor
  450.                 secstats.each do |t|
  451.                     if (@basestats[t] == 0) and ($w[t] > $w[s]) then
  452.                         refs.push([s,t,amnt])
  453.                         break
  454.                     end
  455.                 end
  456.                 break
  457.             end
  458.         end
  459.         # add no-reforge option if applicable
  460.         # only one stat, either spi, hit or highest sec
  461.         numstats = 0
  462.         (secstats+hitstats).each do |s|
  463.             if @basestats[s] > 0 then
  464.                 numstats += 1
  465.             end
  466.         end
  467.         if (numstats == 1) and ((@basestats["hit"] > 0) or (@basestats["spi"] > 0) or (@basestats[secstats[0]] > 0)) then
  468.             refs.push(nil)
  469.         elsif (numstats == 2) and (((@basestats["hit"] > 0) and (@basestats[secstats[0]] > 0)) or ((@basestats["spi"] > 0) and (@basestats[secstats[0]] > 0)) or ((@basestats[secstats[1]] > 0) and (@basestats[secstats[0]] > 0)))
  470.             refs.push(nil)
  471.         end
  472.         if refs.length == 0 then
  473.             refs.push(nil)
  474.         end
  475.         @reforges = refs
  476.         out = refs
  477.     end
  478.    
  479.     def setReforge(index)
  480.         @refindex = index
  481.         if @reforges[@refindex] != nil then
  482.             @refstring =",reforge=#{@reforges[@refindex][0]}_#{@reforges[@refindex][1]}"
  483.         else
  484.             @refstring = ""
  485.         end
  486.     end
  487.    
  488.     def getRefIndex
  489.         out = @refindex
  490.     end
  491.    
  492.     def getReforge()
  493.         out = @reforges[@refindex]
  494.     end
  495.    
  496.     def getReforges()   #deprecated
  497.         refstats = ["spi","hit","haste","mastery","crit"]
  498.         refs = Array.new
  499.         sources, targets = Array.new, Array.new
  500.         refstats.each do |s|
  501.             @basestats[s] > 0 ? sources.push(s) : targets.push(s)
  502.         end
  503.         if (sources.include?("spi") and sources.include?($high)) then
  504.             refs.push(nil)
  505.             refs.push(["spi",$medium])
  506.         elsif (sources.include?("hit") and sources.include?($high)) then
  507.             refs.push(nil)
  508.             refs.push(["hit",$medium])
  509.         elsif (sources.include?("spi") and sources.include?($medium)) then
  510.             refs.push(["spi",$high])
  511.             refs.push([$medium,$high])
  512.         elsif (sources.include?("hit") and sources.include?($medium)) then
  513.             refs.push(["hit",$high])
  514.             refs.push([$medium,$high])
  515.         elsif (sources.include?("spi") and sources.include?($low)) then
  516.             refs.push(["spi",$high])
  517.             refs.push([$low,$high])
  518.         elsif (sources.include?("hit") and sources.include?($low)) then
  519.             refs.push(["hit",$high])
  520.             refs.push([$low,$high])
  521.         elsif (sources.include?($high) and sources.include?($medium)) then
  522.             refs.push(nil)
  523.             refs.push([$medium,"spi"])
  524.         elsif (sources.include?($high) and sources.include?($low)) then
  525.             refs.push([$low,"spi"])
  526.             refs.push([$low,$medium])
  527.         elsif (sources.include?($medium) and sources.include?($low)) then
  528.             refs.push([$low,"spi"])
  529.             refs.push([$low,$high])
  530.         elsif (sources.length == 1) then
  531.             if sources.include?("spi") then
  532.                 refs.push(nil)
  533.                 refs.push(["spi",$high])
  534.             elsif sources.include?("hit") then
  535.                 refs.push(nil)
  536.                 refs.push(["hit",$high])
  537.             elsif sources.include?($high) then
  538.                 refs.push(nil)
  539.                 refs.push([$high,"spi"])
  540.             elsif sources.include?($medium) then
  541.                 refs.push([$medium,"spi"])
  542.                 refs.push([$medium,$high])
  543.             elsif sources.include?($low) then
  544.                 refs.push([$low,"spi"])
  545.                 refs.push([$low,$high])
  546.             end
  547.         else
  548.             refs.push(nil)
  549.         end
  550.         # puts "sources: #{sources.to_s}"
  551.         # puts "targets: #{targets.to_s}"
  552.         # puts "refs: #{refs.to_s}"
  553.     end
  554.    
  555.     def getNumReforges()
  556.         out = @reforges.length
  557.     end
  558.    
  559.     def to_s    # only for debugging
  560.         out = "itemID\t\t#@id\nName\t\t#@name\nSlot\t\t#@slot\nBase Stats\nInt\t\t#{@basestats["int"]}\nSpellpower\t#{@basestats["splpwr"]}\nSpirit\t\t#{@basestats["spi"]}\nHit Rating\t#{@basestats["hit"]}\nHaste Rating\t#{@basestats["haste"]}\nMastery Rating\t#{@basestats["mastery"]}\nCrit Rating\t#{@basestats["crit"]}\nEnchant\t\t#@enchantstring\n\t\t#{@enchantbonus.to_s}\nGems\t\t#@gemstring\n\t\t#{@gembonus.to_s}\nReforge\t\t#{@reforgestring}\n\t\t#{@reforgebonus.to_s}"
  561.     end
  562.    
  563.     def getSimc(slotnmbr = "")
  564.         #clean up the item name
  565.         name = @name.gsub(" ", "_") # space to underscore
  566.         name.gsub!("'", "")         # remove apostrophes
  567.         name.gsub!(",", "")         # remove commata
  568.         name.gsub!("-", "")         # remove dashes
  569.         name.downcase!
  570.    
  571.         out = "#@slot#{slotnmbr}=#{name},id=#@id#{@gemstring}#{@enchantstring}#{@refstring}"
  572.     end
  573. end
  574.  
  575. class ItemSet
  576.     # $items = [$setslots, $neck, $back, $wrists, $waist, $feet, $fingers, $trinkets, $main_hand, $off_hand]
  577.     # def initialize(head, neck, shoulders, back, chest, wrists, hands, waist, legs, feet, finger1, finger2, trinket1, trinket2, main_hand, off_hand)
  578.         # @slots = [head, neck, shoulders, back, chest, wrists, hands, waist, legs, feet, finger1, finger2, trinket1, trinket2, main_hand, off_hand]
  579.     # end
  580.     def initialize(setItems)
  581.         @slots = setItems.flatten
  582.         @reforgebonus = Hash["int" => 0, "splpwr" => 0, "spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  583.     end
  584.    
  585.     def getSpiHit()
  586.         spihit = 0
  587.         @slots.each do |s|
  588.             spihit += s.getSpiHit
  589.         end
  590.         spihit += @reforgebonus["spi"] + @reforgebonus["hit"]
  591.         result = spihit
  592.     end
  593.    
  594.     def getReforgableSpiHit()
  595.         spihit = 0
  596.         @slots.each do |s|
  597.             spihit += s.getReforgableSpiHit
  598.         end
  599.         out = spihit
  600.     end
  601.    
  602.     def to_s
  603.         @slots.each do |s|
  604.             out = s.to_s
  605.         end
  606.     end
  607.    
  608.     def getSimc
  609.         temp = ""
  610.         slotnmbr = 0
  611.         f = 1
  612.         t = 1
  613.         @slots.each do |s|
  614.             if s.getSlot == "finger" then
  615.                 nmbrstr = f.to_s
  616.                 f += 1
  617.             elsif s.getSlot == "trinket" then
  618.                 nmbrstr = t.to_s
  619.                 t += 1
  620.             else
  621.                 nmbrstr = ""
  622.             end
  623.             # case s.getSlot
  624.             # when 2, 4
  625.                 # nmbrstr = "1"
  626.             # when 3, 5
  627.                 # nmbrstr = "2"
  628.             # else
  629.                 # nmbrstr = ""
  630.             # end
  631.             temp += "#{s.getSimc(nmbrstr)}\n"
  632.             slotnmbr += 1
  633.         end
  634.         out = temp
  635.     end
  636.    
  637.     def calcrefs(a, b)
  638.         if a.length == 1 then
  639.             a[0].each do |i|
  640.                 set = b.dup
  641.                 set.push(i)
  642.                 # do ref related stuff here
  643.                 # set reforges for all items
  644.                 (0..set.length-1).each do |index|
  645.                     if @slots[index].getRefIndex != set[index] then
  646.                         @slots[index].setReforge(set[index])
  647.                     end
  648.                 end
  649.                 # reset reforgebonus to 0
  650.                 @reforgebonus = Hash["spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  651.                 # recalculate reforgebonus
  652.                 @slots.each do |s|
  653.                     ref = s.getReforge
  654.                     if ref != nil then
  655.                         @reforgebonus[ref[0]] -= ref[2]
  656.                         @reforgebonus[ref[1]] += ref[2]
  657.                     end
  658.                 end
  659.                 # check for hitcap
  660.                 if self.getSpiHit < $maxhit then
  661.                     tempval = self.getValue
  662.                     if tempval > @refmaxval then
  663.                         @refmaxval = tempval
  664.                         @refmaxref = set
  665.                         @refmaxrefbonus = @reforgebonus
  666.                     end
  667.                 end
  668.             end
  669.         else
  670.             ta = a.dup
  671.             fa = ta.shift
  672.             fa.each do |i|
  673.                 tb = b.dup
  674.                 tb.push(i)
  675.                 calcrefs(ta, tb)
  676.             end
  677.         end
  678.     end
  679.    
  680.     def reforge
  681.         if $debug then mstart = Time.now end
  682.         @refmaxval = 0
  683.         @refmaxref = nil
  684.         @refmaxrefbonus = nil
  685.         refarr = []
  686.         @slots.each do |s|
  687.             refarr.push(Array(0..s.getNumReforges-1))
  688.         end
  689.         calcrefs(refarr, [])
  690.         if @refmaxref == nil then
  691.             #puts "#{Time.now-$t_start} can't reforge set to below #$maxhit hit"
  692.         else
  693.             (0..@slots.length-1).each do |s|
  694.                 @slots[s].setReforge(@refmaxref[s])
  695.             end
  696.             @reforgebonus = @refmaxrefbonus
  697.         end
  698.         if $debug then
  699.             mend = Time.now
  700.             dur = mend - mstart
  701.             puts "ItemSet::reforge took #{dur} seconds"
  702.         end
  703.     end
  704.    
  705.     def getStats()
  706.         totalStats = Hash["int" => 0, "splpwr" => 0, "spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  707.         @slots.each do |s|
  708.             # puts s
  709.             itemStats = s.getStats
  710.             totalStats.keys.each do |k|
  711.                 totalStats[k] += itemStats[k]
  712.             end
  713.         end
  714.         @reforgebonus.keys.each do |k|
  715.             totalStats[k] += @reforgebonus[k]
  716.         end
  717.         out = totalStats
  718.     end
  719.    
  720.     def getValue()
  721.         # if $debug then mstart = Time.now end
  722.         totalStats = Hash["int" => 0, "splpwr" => 0, "spi" => 0, "hit" => 0, "haste" => 0, "mastery" => 0, "crit" => 0]
  723.         @slots.each do |s|
  724.             # puts s
  725.             itemStats = s.getStats
  726.             totalStats.keys.each do |k|
  727.                 totalStats[k] += itemStats[k]
  728.             end
  729.         end
  730.         @reforgebonus.keys.each do |k|
  731.             totalStats[k] += @reforgebonus[k]
  732.         end
  733.         value = 0
  734.         if (totalStats["spi"] + totalStats["hit"]).between?(5100,$maxhit) then
  735.             totalStats.keys.each do |s|
  736.                 if (s != "spi") and (s != "hit") then
  737.                     value += totalStats[s] * $w[s]
  738.                 end
  739.             end
  740.         end
  741.        
  742.         # if totalStats["spi"] + totalStats["hit"] > 5100 then
  743.             # value -= (totalStats["spi"] + totalStats["hit"] - 5100) * $w["spi"]
  744.         # end
  745.         # if $debug then
  746.             # mend = Time.now
  747.             # dur = mend - mstart
  748.             # puts "ItemSet::getValue took #{dur} seconds"
  749.         # end
  750.         out = value
  751.     end
  752. end
  753.  
  754. #--------------------------------------------------------------------------------
  755. #
  756. # load itembase from wowhead
  757. #
  758. #--------------------------------------------------------------------------------
  759. def getWowheadData(itemarr)
  760.     itemBase = Hash.new
  761.     timedMsg("adding #{itemarr.length} items from wowhead")
  762.     bonusTrans = {
  763.         "Intellect" => "int",
  764.         "Hit" => "hit",
  765.         "Spirit" => "spi",
  766.         "Haste" => "haste",
  767.         "Mastery" => "mastery",
  768.         "Critical Strike" => "crit"
  769.     }
  770.     socketTrans = {1 => 3, 2 => 0, 4 => 1, 8 => 2}
  771.     slotTrans = {
  772.         1 => "head",
  773.         2 => "neck",
  774.         3 => "shoulders",
  775.         16 => "back",
  776.         5 => "chest",
  777.         9 => "wrists",
  778.         10 => "hands",
  779.         6 => "waist",
  780.         7 => "legs",
  781.         8 => "feet",
  782.         11 => "finger",
  783.         12 => "trinket",
  784.         14 => "off_hand",
  785.         23 => "off_hand",
  786.         13 => "main_hand",
  787.         17 => "two_hand"
  788.     }
  789.     itemarr.each do |itemID|
  790.         #check if item already exists
  791.         itemExists = false
  792.         itemBase.keys.each do |key|
  793.             itemBase[key].each do |i|
  794.                 if i.getID == itemID then
  795.                     itemExists = true
  796.                     timedMsg("Item #{itemID} already exists")
  797.                 end
  798.             end
  799.         end
  800.        
  801.         if itemExists == false then
  802.             timedMsg("adding #{itemID}")
  803.             # uri = URI("http://www.wowhead.com/item=#{itemID}&xml=1")
  804.             # file = File.new("out.txt")
  805.                    
  806.             doc = REXML::Document.new(Net::HTTP.get(URI("http://www.wowhead.com/item=#{itemID}&xml=1")))
  807.             root = doc.root
  808.  
  809.             str = root.elements[1].elements["jsonEquip"].to_s
  810.             str = str[20..-16]
  811.             str.gsub!("\"","")
  812.             arr = str.split(/[,:]/)
  813.             #puts str + "\n"
  814.             #puts arr.to_s
  815.             hsh = Hash[*arr]
  816.             #puts hsh.to_s
  817.             #hit = hsh["hitrtng"].to_i
  818.  
  819.             tooltip = root.elements[1].elements["htmlTooltip"].to_s
  820.             strSocketBonus = tooltip.match(/Socket Bonus: \+[0-9]+ [A-za-z ]+/).to_s
  821.             bonusValue = strSocketBonus.match(/[0-9]+/).to_s
  822.             bonusStat = strSocketBonus.match(/[0-9] [A-za-z ]+/).to_s[2..-1]
  823.             #puts bonusValue
  824.             #puts bonusStat
  825.             #puts bonusTrans[bonusStat]
  826.  
  827.             id = itemID
  828.             puts name = root.elements[1].elements["name"].to_s[15..-11]
  829.             slot = root.elements[1].elements["inventorySlot"].attributes["id"].to_i
  830.             slotName = slotTrans[slot]
  831.             int = hsh["int"].to_i
  832.             splpwr = hsh["splpwr"].to_i
  833.             spi = hsh["spi"].to_i
  834.             hit = hsh["hitrtng"].to_i
  835.             haste = hsh["hastertng"].to_i
  836.             mastery = hsh["mastrtng"].to_i
  837.             crit = hsh["critstrkrtng"].to_i
  838.             sockets = []
  839.             if hsh["socket1"] != nil then sockets.push(socketTrans[hsh["socket1"].to_i].to_i) end
  840.             if hsh["socket2"] != nil then sockets.push(socketTrans[hsh["socket2"].to_i].to_i) end
  841.             if hsh["socket3"] != nil then sockets.push(socketTrans[hsh["socket3"].to_i].to_i) end
  842.             if slotName == "waist" then
  843.                 sockets.push(4)
  844.             elsif slotName == "hands" then
  845.                 if $profs["bla"] == 1 then
  846.                     sockets.push(4)
  847.                 end
  848.             elsif slotName == "wrists" then
  849.                 if $profs["bla"] == 1 then
  850.                     sockets.push(4)
  851.                 end
  852.             elsif (slotName == "main_hand") or (slotName == "two_hand") then
  853.                 if $wrathion_weapon_socket then
  854.                     sockets.push(4)
  855.                 end
  856.             end
  857.             if bonusValue != "" then
  858.                 sockets.push(bonusValue.to_i)
  859.                 sockets.push(bonusTrans[bonusStat])
  860.             end
  861.             if sockets.length == 1 then
  862.                 sockets.push(0)
  863.                 sockets.push("int")
  864.             end
  865.             if sockets.length == 0 then sockets = nil end
  866.             # if we just added a socket to an item that had none, add a dummy socket bonus to avoid errors
  867.             #puts "sockets: #{sockets}"
  868.            
  869.             if not (itemBase.key?(slotName)) then itemBase[slotName] = Array.new end
  870.             if slotName == "two_hand" then
  871.                 simcSlotName = "main_hand"
  872.             else
  873.                 simcSlotName = slotName
  874.             end
  875.             itemBase[slotName].push(Item.new(id,name,simcSlotName,int,splpwr,spi,hit,haste,mastery,crit,sockets))
  876.         end
  877.     end
  878.     out = itemBase
  879. end
  880.  
  881. $baseItems = getWowheadData($baseIDs)
  882. $upgradeItems = getWowheadData($upgradeIDs)
  883.  
  884. if $ohID > 0 then
  885.     $oh = getWowheadData([$ohID])["off_hand"][0]
  886. end
  887. if $mhID > 0 then
  888.     $mh = getWowheadData([$mhID])["main_hand"][0]
  889. end
  890.  
  891. puts "\nbase set:"
  892. $arrBase = []
  893. $baseItems.keys.each do |key|
  894.     $baseItems[key].each do |i|
  895.         puts "#{i.getID} #{i.getName}"
  896.         $arrBase.push(i)
  897.     end
  898. end
  899.  
  900. $sets = Hash.new
  901. $sets["base"] = ItemSet.new($arrBase)
  902.  
  903. $upgradeItems.keys.each do |ukey|
  904.     $upgradeItems[ukey].each do |ui|
  905.         if (ukey == "main_hand") and $baseItems.key?("two_hand") then
  906.             if $ohID > 0 then
  907.                 puts "\ninserting #{ui.getName} into set."
  908.                 arrSet = []
  909.                 $baseItems.keys.each do |bkey|  # add all items except the two-hand
  910.                     if bkey != "two_hand" then
  911.                         $baseItems[bkey].each do |bi|
  912.                             arrSet.push(bi)
  913.                         end
  914.                     end
  915.                 end
  916.                 arrSet.push(ui)                 # add the upgrade main-hand
  917.                 arrSet.push($oh)                # add replacement off-hand
  918.                 key = "#{ui.getID}_#{ui.getSimcName}"
  919.                 $sets[key] = ItemSet.new(arrSet)
  920.                 arrSet.each do |i|
  921.                     puts "#{i.getID} #{i.getName}"
  922.                 end
  923.             else
  924.                 puts "\n can't insert #{ui.getName} into set, no matching off-hand defined."
  925.             end
  926.         elsif (ukey == "off_hand") and $baseItems.key?("two_hand") then
  927.             if $mhID > 0 then
  928.                 puts "\ninserting #{ui.getName} into set."
  929.                 arrSet = []
  930.                 $baseItems.keys.each do |bkey|  # add all items except the two-hand
  931.                     if bkey != "two_hand" then
  932.                         $baseItems[bkey].each do |bi|
  933.                             arrSet.push(bi)
  934.                         end
  935.                     end
  936.                 end
  937.                 arrSet.push(ui)                 # add the upgrade off-hand
  938.                 arrSet.push($mh)                # add replacement main-hand
  939.                 key = "#{ui.getID}_#{ui.getSimcName}"
  940.                 $sets[key] = ItemSet.new(arrSet)
  941.                 arrSet.each do |i|
  942.                     puts "#{i.getID} #{i.getName}"
  943.                 end
  944.             else
  945.                 puts "\n can't insert #{ui.getName} into set, no matching main-hand defined."
  946.             end
  947.         elsif (ukey == "two_hand") and $baseItems.key?("main_hand") and $baseItems.key?("off_hand") then
  948.             puts "\ninserting #{ui.getName} into set."
  949.             arrSet = []
  950.             $baseItems.keys.each do |bkey|      # add all items except main/off hand
  951.                 if (bkey != "main_hand") and (bkey != "off_hand") then
  952.                     $baseItems[bkey].each do |bi|
  953.                         arrSet.push(bi)
  954.                     end
  955.                 end
  956.             end
  957.             arrSet.push(ui)                     # add the upgrade two-hand
  958.             key = "#{ui.getID}_#{ui.getSimcName}"
  959.             $sets[key] = ItemSet.new(arrSet)
  960.             arrSet.each do |i|
  961.                 puts "#{i.getID} #{i.getName}"
  962.             end
  963.         elsif $baseItems[ukey].length == 1 then
  964.             puts "\ninserting #{ui.getName} into set."
  965.             arrSet = []
  966.             $baseItems.keys.each do |bkey|
  967.                 if bkey != ukey then
  968.                     $baseItems[bkey].each do |bi|
  969.                         arrSet.push(bi)
  970.                     end
  971.                 else
  972.                     arrSet.push(ui)
  973.                 end
  974.             end
  975.             key = "#{ui.getID}_#{ui.getSimcName}"
  976.             $sets[key] = ItemSet.new(arrSet)
  977.             arrSet.each do |i|
  978.                 puts "#{i.getID} #{i.getName}"
  979.             end
  980.         elsif $baseItems[ukey].length == 2 then     #replacing a trinket, gotta check both slots
  981.             puts "\ninserting #{ui.getName} into set. NYI"
  982.             arrSet = []
  983.             (0..1).each do |ri|
  984.                 arrSet.push([])
  985.                 $baseItems.keys.each do |bkey|
  986.                     if bkey != ukey then
  987.                         $baseItems[bkey].each do |bi|
  988.                             arrSet[ri].push(bi)
  989.                         end
  990.                     else
  991.                         arrSet[ri].push($baseItems[bkey][ri])
  992.                         arrSet[ri].push(ui)
  993.                     end
  994.                 end
  995.                 arrSet[ri].each do |i|
  996.                     puts "#{i.getID} #{i.getName}"
  997.                 end
  998.                 key = "#{ui.getID}_#{ri}_#{ui.getSimcName}"
  999.                 $sets[key] = ItemSet.new(arrSet[ri])
  1000.                 puts "\n"
  1001.             end
  1002.         end
  1003.     end
  1004. end
  1005.  
  1006. # write simc files for each set
  1007. $sets.each do |k,v|
  1008.     v.reforge
  1009.     val = v.getValue
  1010.     timedMsg("writing #{k} with est. dps of #{val} to file")
  1011.     outFile = File.open("#{k}.simc","w")
  1012.     outFile.syswrite("shaman=\"#{k}\"\nspec=elemental\ntalents=333323\nglyphs=fire_elemental_totem/unleashed_lightning/chain_lightning/lakestrider/astral_recall\nprofessions=enchanting=600/blacksmithing=600\n\n")
  1013.     outFile.syswrite(v.getSimc)
  1014.     outFile.close
  1015. end
  1016. # write mastery simc file
  1017. outFile = File.open("upgrades.simc","w")
  1018. outFile.syswrite("threads=1\noptimal_raid=1\ncalculate_scale_factors=0\niterations=25000\nhtml=upgrades.html\nfight_style=patchwerk\n\n")
  1019. $sets.each do |k,v|
  1020.     outFile.syswrite("#{k}.simc name=#{k}\n")
  1021. end
  1022. outFile.close
Add Comment
Please, Sign In to add comment