vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 -- These functions still need rewriting
2 -- They were written before I new about for in pairs, captures
3 -- or even patterns other then %d+... you gotta start somewhere =)
4  
5 local data = {}
6 local _, class = UnitClass("player")
7  
8 local function findpattern(text, pattern, start)
9 if (text and pattern and (string.find(text, pattern, start))) then
10 return string.sub(text, string.find(text, pattern, start))
11 else
12 return ""
13 end
14 end
15  
16 local function round(arg1, decplaces)
17 if (decplaces == nil) then decplaces = 0 end
18 if arg1 == nil then arg1 = 0 end
19 return string.format ("%."..decplaces.."f", arg1)
20 end
21  
22 local function getmanacost(frame)
23 index = 1
24 local ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
25 local manaCost = 0
26 while (ltext) do
27 if (strfind(ltext, TheoryCraft_Locale.Mana)) then
28 manaCost = findpattern(ltext, "%d+")
29 end
30 index = index + 1;
31 ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
32 end
33 manaCost = tonumber(manaCost)
34 if manaCost then
35 return manaCost
36 else
37 return 0
38 end
39 end
40  
41 function TheoryCraft_getMinMax(spelldata, returndata, frame)
42 if returndata["description"] == nil then return end
43  
44 local description = returndata["description"]
45 local baseincrease = returndata["baseincrease"]
46 local dotbaseincrease = baseincrease
47 local gearbaseincrease = baseincrease
48 if spelldata.ismelee == nil then
49 baseincrease = baseincrease*returndata["talentbaseincreaseupfront"]
50 if spelldata.talentsbeforegear == nil then
51 gearbaseincrease = gearbaseincrease*returndata["talentbaseincrease"]*returndata["talentbaseincreaseupfront"]
52 end
53 baseincrease = baseincrease*returndata["talentbaseincrease"]
54 dotbaseincrease = dotbaseincrease*returndata["talentbaseincrease"]
55 end
56 local plusdam = (returndata["damfinal"] or 0)*gearbaseincrease
57 local plusdam2 = returndata["plusdam2"] or 0
58 local to = TheoryCraft_Locale.to
59 returndata["backstabmult"] = 1
60  
61 if spelldata.autoattack then
62 returndata["mindamage"] = (TheoryCraft_GetStat("MeleeMin")+(TheoryCraft_Data.Stats["attackpower"]/14)*TheoryCraft_GetStat("MainSpeed"))
63 returndata["maxdamage"] = returndata["mindamage"]-TheoryCraft_GetStat("MeleeMin")+TheoryCraft_GetStat("MeleeMax")
64 baseincrease = TheoryCraft_GetStat("Meleemodifier")+TheoryCraft_GetStat("Meleetalentmod")
65 returndata["mindamage"] = returndata["mindamage"]*baseincrease
66 returndata["maxdamage"] = returndata["maxdamage"]*baseincrease
67 returndata["critdmgchance"] = TheoryCraft_Data.Stats["meleecritchance"]/100
68 if TheoryCraft_GetStat("OffhandMin") == 0 then
69 returndata["description"] = "Attacks the target for "..math.floor(returndata["mindamage"]).." to "..math.floor(returndata["maxdamage"]).."."
70 else
71 returndata["offhandmindamage"] = (TheoryCraft_GetStat("OffhandMin")+(TheoryCraft_Data.Stats["attackpower"]/14)*TheoryCraft_GetStat("OffhandSpeed"))
72 returndata["offhandmaxdamage"] = returndata["offhandmindamage"]-TheoryCraft_GetStat("OffhandMin")+TheoryCraft_GetStat("OffhandMax")
73 local offhandbaseincrease = baseincrease/2
74 returndata["offhandmindamage"] = returndata["offhandmindamage"]*offhandbaseincrease
75 returndata["offhandmaxdamage"] = returndata["offhandmaxdamage"]*offhandbaseincrease
76 if TheoryCraft_GetStat("MeleeMin") == 0 then
77 returndata["description"] = "Off-hand attacks for "..math.floor(returndata["offhandmindamage"]).." to "..math.floor(returndata["offhandmaxdamage"]).."."
78 else
79 returndata["description"] = "Main hand attacks the target for "..math.floor(returndata["mindamage"]).." to "..math.floor(returndata["maxdamage"])..", off-hand for "..math.floor(returndata["offhandmindamage"]).." to "..math.floor(returndata["offhandmaxdamage"]).."."
80 end
81 end
82 return
83 end
84 if spelldata.iscombo then
85 local _, convert
86 _, _, convert = strfind(returndata["description"], TheoryCraft_MeleeComboEnergyConverter)
87 returndata["comboconvert"] = tonumber(convert)
88 for points, tmp, mindamage, maxdamage in string.gfind(returndata["description"], TheoryCraft_MeleeComboReader) do
89 returndata["combo"..points.."mindamage"] = mindamage
90 returndata["combo"..points.."maxdamage"] = maxdamage
91 end
92 returndata["beforecombo"] = returndata["description"]
93 elseif spelldata.shoot then
94 local a = TheoryCraft_Locale.MinMax
95 if (TheoryCraft_Data.EquipEffects["RangedMin"]) and (TheoryCraft_Data.EquipEffects["RangedMin"] ~= 0) then
96 returndata["mindamage"] = TheoryCraft_Data.EquipEffects["RangedMin"]
97 returndata["maxdamage"] = TheoryCraft_Data.EquipEffects["RangedMax"]
98 returndata["description"] = a.autoshotbefore..returndata["mindamage"]..to..returndata["maxdamage"]..a.autoshotafter
99 else
100 returndata["mindamage"] = 0
101 returndata["maxdamage"] = 0
102 description = a.shooterror
103 end
104 returndata["critchance"] = 5
105 returndata["critbonus"] = 0.5
106 if (TheoryCraft_Data.EquipEffects["RangedSpeed"]) and (TheoryCraft_Data.EquipEffects["RangedSpeed"] ~= 0) then
107 local tmp = (returndata["mindamage"]+returndata["maxdamage"])/2
108 returndata["dps"] = (tmp+tmp*returndata["critbonus"]*returndata["critchance"]/100)/TheoryCraft_Data.EquipEffects["RangedSpeed"]
109 else
110 returndata["dps"] = 0
111 end
112 elseif spelldata.autoshot then
113 -- Autoshot is calculated here
114 returndata["mindamage"] = TheoryCraft_GetStat("RangedMin")+TheoryCraft_Data.Stats["rangedattackpower"]/14*TheoryCraft_GetStat("RangedSpeed")
115 returndata["maxdamage"] = returndata["mindamage"]-TheoryCraft_GetStat("RangedMin")+TheoryCraft_GetStat("RangedMax")
116 baseincrease = TheoryCraft_GetStat("Rangedmodifier")+TheoryCraft_GetStat("Rangedtalentmod")
117 returndata["maxdamage"] = returndata["maxdamage"]*baseincrease+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
118 returndata["mindamage"] = returndata["mindamage"]*baseincrease+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
119 returndata["description"] = TheoryCraft_Locale.MinMax.autoshotbefore..(round(returndata["mindamage"]))..to..(round(returndata["maxdamage"]))..TheoryCraft_Locale.MinMax.autoshotafter
120  
121 local averageauto, averageaimed, averagemulti, averagearcane = 0, 0, 0, 0
122 local aimedmana, multimana = 0, 0
123 averageauto = (returndata["maxdamage"]+returndata["mindamage"])/2
124 averageauto = averageauto+averageauto*TheoryCraft_Data.Stats["rangedcritchance"]/100*returndata["critbonus"]
125 for i = 1, 20 do
126 if TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"]].averagedam then
127 averageaimed = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"]].averagedam
128 aimedmana = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"]].manacost
129 end
130 if TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"]].averagedam then
131 averagemulti = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"]].averagedam
132 multimana = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"]].manacost
133 end
134 if TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..i..")"] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..i..")"]].dps then
135 averagearcane = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..i..")"]].dps
136 end
137 end
138 -- averageauto = 651
139 -- averageaimed = 1293
140 -- averagemulti = 662
141  
142 local rotationlength1, rotationlength2, rotationdps1, rotationdps2, autoshotcount1, autoshotcount2
143 local speed = TheoryCraft_GetStat("RangedSpeed")*TheoryCraft_GetStat("Rangedhastebonus")
144 -- speed = 2.19
145 returndata["dps"] = averageauto/speed
146  
147 returndata["manacost"] = aimedmana+multimana
148 returndata["basemanacost"] = aimedmana+multimana
149 returndata["dontshowmana"] = true
150  
151 -- MS Rotation Calculated Here:
152  
153 rotationlength1 = 10
154 rotationlength2 = math.ceil(7/speed)*speed+3
155 if (speed > 3) or (averageaimed == 0) then
156 autoshotcount1 = math.floor(rotationlength1/speed)
157 autoshotcount2 = math.floor(rotationlength2/speed)
158 else
159 autoshotcount1 = math.floor((rotationlength1-3)/speed)+1
160 autoshotcount2 = math.floor((rotationlength2-3)/speed)+1
161 end
162  
163 rotationdps1 = (averageaimed+averagemulti+averageauto*autoshotcount1)/rotationlength1
164 rotationdps2 = (averageaimed+averagemulti+averageauto*autoshotcount2)/rotationlength2
165 if (rotationdps1 > rotationdps2) then
166 returndata["msrotationdps"] = rotationdps1
167 returndata["msrotationlength"] = rotationlength1
168 if TheoryCraft_Settings["procs"] then
169 returndata["manacost"] = returndata["manacost"]-autoshotcount1*0.04*TheoryCraft_GetStat("Beastmanarestore")
170 end
171 else
172 returndata["msrotationdps"] = rotationdps2
173 returndata["msrotationlength"] = rotationlength2
174 if TheoryCraft_Settings["procs"] then
175 returndata["manacost"] = returndata["manacost"]-autoshotcount2*0.04*TheoryCraft_GetStat("Beastmanarestore")
176 end
177 end
178 returndata["regencasttime"] = returndata["msrotationlength"]-3
179  
180 -- AS Rotation Calculated Here:
181  
182 rotationlength1 = 9
183 rotationlength2 = math.ceil(6/speed)*speed+3
184 if rotationlength2 > 10 then
185 rotationlength2 = 9
186 end
187 if (speed > 3) or (averageaimed == 0) then
188 autoshotcount1 = math.floor(rotationlength1/speed)
189 autoshotcount2 = math.floor(rotationlength2/speed)
190 else
191 autoshotcount1 = math.floor((rotationlength1-3)/speed)+1
192 autoshotcount2 = math.floor((rotationlength2-3)/speed)+1
193 end
194  
195 rotationdps1 = (averageaimed*6+averagemulti*5+averageauto*autoshotcount1*6)/(rotationlength1*6)
196 rotationdps2 = (averageaimed*6+averagemulti*5+averageauto*autoshotcount2*6)/(rotationlength2*6)
197 if (rotationdps1 > rotationdps2) then
198 returndata["asrotationdps"] = rotationdps1
199 returndata["asrotationlength"] = rotationlength1
200 else
201 returndata["asrotationdps"] = rotationdps2
202 returndata["asrotationlength"] = rotationlength2
203 end
204  
205 -- MS/Arc Rotation Calculated Here:
206  
207 returndata["arcrotationdps"] = (averagearcane*10+averagemulti+averageauto*(10/speed))/10
208 returndata["arcmagicdps"] = averagearcane
209 elseif (spelldata.ismelee) or (spelldata.isranged) then
210 local normalized
211 if spelldata.noscale then
212 returndata["backstabmult"] = 0
213 end
214 if spelldata.isranged then
215 normalized = (TheoryCraft_Data.Stats["rangedattackpower"]/14)*returndata["RangedAPMult"]
216 returndata["mindamage"] = TheoryCraft_Data.EquipEffects["RangedMin"]
217 returndata["maxdamage"] = TheoryCraft_Data.EquipEffects["RangedMax"]
218 else
219 if spelldata.forcemult then
220 normalized = TheoryCraft_Data.Stats["attackpower"]/14*spelldata.forcemult
221 elseif spelldata.nextattack then
222 normalized = TheoryCraft_Data.Stats["attackpower"]/14*TheoryCraft_Data.EquipEffects["MainSpeed"]
223 else
224 normalized = TheoryCraft_Data.Stats["attackpower"]/14*(TheoryCraft_Data.EquipEffects["MeleeAPMult"] or 1)
225 end
226 returndata["mindamage"] = TheoryCraft_Data.EquipEffects["MeleeMin"]
227 returndata["maxdamage"] = TheoryCraft_Data.EquipEffects["MeleeMax"]
228 end
229  
230 local i = 1
231 local removetalents = 1
232 baseincrease = 0
233 removetalents = removetalents + TheoryCraft_GetStat(spelldata.id.."modifier")
234 baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.id.."baseincrease")
235 baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.id.."modifier")+TheoryCraft_GetStat(spelldata.id.."talentmod")
236 while spelldata.Schools[i] do
237 if (spelldata.Schools[i] ~= "Ranged") and (spelldata.Schools[i] ~= "Melee") then
238 removetalents = removetalents + TheoryCraft_GetStat(spelldata.Schools[i].."modifier")
239 baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.Schools[i].."baseincrease")
240 end
241 baseincrease = baseincrease+TheoryCraft_GetStat(spelldata.Schools[i].."modifier")+TheoryCraft_GetStat(spelldata.Schools[i].."talentmod")
242 i = i + 1
243 end
244 local a = TheoryCraft_MeleeMinMaxReader
245 local _
246 local found
247 if spelldata.dontusemelee then
248 baseincrease = 1
249 end
250 TheoryCraft_DeleteTable(data)
251 returndata["addeddamage"] = 0
252 local range
253 for k, pattern in pairs(a) do
254 if strfind(returndata["description"], pattern.pattern) then
255 _, _, data[1], data[2], data[3], data[4], data[5], data[6] = strfind(returndata["description"], pattern.pattern)
256 for k, type in pairs(pattern.type) do
257 if (type == "mindamage") or (type == "maxdamage") then
258 returndata[type] = data[k]
259 range = true
260 end
261 end
262 end
263 end
264 if range then
265 range = nil
266 elseif strfind(returndata["description"], "%d+"..to.."%d+") then
267 range = true
268 returndata["description"] = string.gsub(returndata["description"], "%d+"..to.."%d+", findpattern(findpattern(returndata["description"], "%d+"..to.."%d+"), "%d+"))
269 end
270 for k, pattern in pairs(a) do
271 if strfind(returndata["description"], pattern.pattern) then
272 _, _, data[1], data[2], data[3], data[4], data[5], data[6] = strfind(returndata["description"], pattern.pattern)
273 for k, type in pairs(pattern.type) do
274 if (type == "backstabmult") or (type == "bloodthirstmult") then
275 returndata[type] = tonumber(data[k])/100
276 else
277 returndata[type] = data[k]
278 end
279 end
280 end
281 end
282 if returndata["bloodthirstmult"] then
283 returndata["mindamage"] = returndata["bloodthirstmult"]*TheoryCraft_Data.Stats["attackpower"]
284 returndata["maxdamage"] = returndata["mindamage"]
285 returndata["backstabmult"] = 1
286 normalized = 0
287 end
288 if range then
289 returndata["addeddamage"] = returndata["addeddamage"] + 0.5
290 end
291 if class ~= "ROGUE" then
292 returndata["addeddamage"] = returndata["addeddamage"]/removetalents
293 end
294 if returndata["backstabmult"] ~= 1 then
295 returndata["backstabmult"] = returndata["backstabmult"]/removetalents
296 end
297 -- Print("("..round(normalized).."+"..returndata["mindamage"]..")*"..returndata["backstabmult"].."+"..returndata["addeddamage"]..")*"..baseincrease)
298 local ranged
299 for k,v in pairs(returndata["schools"]) do
300 if v == "Ranged" then
301 ranged = true
302 end
303 end
304 returndata["mindamage"] = ((normalized+returndata["mindamage"])*returndata["backstabmult"] + returndata["addeddamage"])*baseincrease
305 returndata["maxdamage"] = ((normalized+returndata["maxdamage"])*returndata["backstabmult"] + returndata["addeddamage"])*baseincrease
306 if ranged then
307 returndata["mindamage"] = returndata["mindamage"]+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
308 returndata["maxdamage"] = returndata["maxdamage"]+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
309 end
310  
311 a = TheoryCraft_MeleeMinMaxReplacer
312 local damagetext
313 if returndata["mindamage"] == returndata["maxdamage"] then
314 damagetext = round(returndata["mindamage"])
315 else
316 damagetext = round(returndata["mindamage"])..to..round(returndata["maxdamage"])
317 end
318 local blocktext
319 if TheoryCraft_Data.EquipEffects["ShieldEquipped"] then
320 blocktext = floor(TheoryCraft_GetStat("BlockValue"))
321 end
322 for k, pattern in pairs(a) do
323 if strfind(returndata["description"], pattern.search) then
324 local replace = string.gsub(pattern.replacewith, "%$damage%$", damagetext)
325 if (not strfind(replace, "%$blockvalue%$")) or (blocktext) then
326 if blocktext then
327 replace = string.gsub(replace, "%$blockvalue%$", blocktext)
328 end
329 returndata["description"] = string.gsub(returndata["description"], pattern.search, replace)
330 end
331 break
332 end
333 end
334 return
335 elseif (spelldata.isseal) then
336 local a = TheoryCraft_Locale.MinMax
337 local alreadybuffedbonus = TheoryCraft_GetStat("AttackPowerCrusader")
338 local attackbaseincrease = TheoryCraft_GetStat(spelldata.id.."baseincrease")
339 attackbaseincrease = attackbaseincrease + TheoryCraft_GetStat("Meleemodifier")+TheoryCraft_GetStat("Meleetalentmod")
340 attackbaseincrease = attackbaseincrease + TheoryCraft_GetStat(spelldata.id.."modifier")+TheoryCraft_GetStat(spelldata.id.."talentmod")
341 local minDamage, maxDamage, lengthofdamagetext
342 local baseincrease = 1
343 while spelldata.Schools[i] do
344 if (spelldata.Schools[i] ~= "Ranged") and (spelldata.Schools[i] ~= "Melee") then
345 baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.Schools[i].."baseincrease")
346 end
347 baseincrease = baseincrease+TheoryCraft_GetStat(spelldata.Schools[i].."modifier")+TheoryCraft_GetStat(spelldata.Schools[i].."talentmod")
348 i = i + 1
349 end
350 if (spelldata.crusader) then
351 local lowDmg, hiDmg, offlowDmg, offhiDmg, posBuff, negBuff, percentmod = UnitDamage("player");
352 local attackspeed = UnitAttackSpeed("player")
353 lowDmg = lowDmg/attackspeed
354 hiDmg = hiDmg/attackspeed
355 local apbonus = findpattern(description, a.crusader)
356 apbonus = tonumber(findpattern(apbonus, "%d+")) or 0
357  
358 maxDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMax"])
359 minDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMin"])
360 local averagehit = (maxDamage+minDamage)/2*attackbaseincrease
361 averagehit = (averagehit + averagehit * TheoryCraft_Data.Stats["meleecritchance"]/100)/TheoryCraft_Data.EquipEffects["MainSpeed"]
362  
363 returndata["sealunbuffed"] = averagehit
364 maxDamage = ((TheoryCraft_Data.Stats["attackpower"]+apbonus-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMax"])
365 minDamage = ((TheoryCraft_Data.Stats["attackpower"]+apbonus-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMin"])
366 local averagehit = (maxDamage+minDamage)/2*attackbaseincrease
367 averagehit = (averagehit + averagehit * TheoryCraft_Data.Stats["meleecritchance"]/100)/TheoryCraft_Data.EquipEffects["MainSpeed"]
368 returndata["sealbuffed"] = averagehit
369 elseif (spelldata.command) then
370 minDamage = findpattern(description, "%d+"..to.."%d+")
371 maxDamage = findpattern(minDamage, to.."%d+")
372 minDamage = string.sub(minDamage, string.find(minDamage, "%d+", 0))
373 maxDamage = string.sub(maxDamage, string.find(maxDamage, "%d+", 0))
374 lengthofdamagetext = string.len(minDamage..to..maxDamage);
375 minDamage = math.floor((minDamage + plusdam)*baseincrease)
376 maxDamage = math.floor((maxDamage + plusdam)*baseincrease)
377 local tmp2 = string.sub(description, string.find(description, "%d+"..to.."%d+", 0)+lengthofdamagetext)
378 local minDamage2 = findpattern(tmp2, "%d+"..to.."%d+")
379 local maxDamage2 = findpattern(minDamage2, to.."%d+")
380 minDamage2 = string.sub(minDamage2, string.find(minDamage2, "%d+", 0))
381 maxDamage2 = string.sub(maxDamage2, string.find(maxDamage2, "%d+", 0))
382 minDamage2 = math.floor((minDamage2 + plusdam2)*baseincrease)
383 maxDamage2 = math.floor((maxDamage2 + plusdam2)*baseincrease)
384  
385 description = string.gsub(description, "%d+"..to.."%d+", "tmpABC", 1)
386 description = string.gsub(description, "%d+"..to.."%d+", minDamage2..to..maxDamage2)
387 description = string.gsub(description, "tmpABC", minDamage..to..maxDamage)
388  
389 maxDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMax"])*attackbaseincrease
390 minDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMin"])*attackbaseincrease
391 local averagehit = (maxDamage+minDamage)/2
392 averagehit = averagehit + averagehit * TheoryCraft_Data.Stats["meleecritchance"]/100
393  
394 returndata["sealunbuffed"] = averagehit/TheoryCraft_Data.EquipEffects["MainSpeed"]
395 averagehit = averagehit+(7/(60/TheoryCraft_Data.EquipEffects["MainSpeed"])*0.7)*averagehit
396 returndata["sealbuffed"] = averagehit/TheoryCraft_Data.EquipEffects["MainSpeed"]
397 elseif (spelldata.righteousness) then
398 minDamage = findpattern(description, "%d+"..to.."%d+")
399 maxDamage = findpattern(minDamage, to.."%d+")
400 minDamage = string.sub(minDamage, string.find(minDamage, "%d+", 0))
401 maxDamage = string.sub(maxDamage, string.find(maxDamage, "%d+", 0))
402 lengthofdamagetext = string.len(minDamage..to..maxDamage);
403 minDamage = math.floor((minDamage + plusdam)*baseincrease)
404 maxDamage = math.floor((maxDamage + plusdam)*baseincrease)
405 local tmp2 = string.sub(description, string.find(description, "%d+"..to.."%d+", 0)+lengthofdamagetext)
406 local minDamage2 = findpattern(tmp2, "%d+"..to.."%d+")
407 local maxDamage2 = findpattern(minDamage2, to.."%d+")
408 if minDamage2 and string.find(minDamage2, "%d+") then
409 minDamage2 = string.sub(minDamage2, string.find(minDamage2, "%d+", 0))
410 maxDamage2 = string.sub(maxDamage2, string.find(maxDamage2, "%d+", 0))
411 minDamage2 = math.floor((minDamage2 + plusdam2)*baseincrease)
412 maxDamage2 = math.floor((maxDamage2 + plusdam2)*baseincrease)
413 description = string.gsub(description, "%d+"..to.."%d+", "tmpABC", 1)
414 description = string.gsub(description, "%d+"..to.."%d+", minDamage2..to..maxDamage2)
415 description = string.gsub(description, "tmpABC", minDamage..to..maxDamage)
416 else
417 description = string.gsub(description, "%d+"..to.."%d+", minDamage..to..maxDamage)
418 end
419 end
420 returndata["description"] = description
421 elseif (spelldata.holynova) then
422 local minDamage = findpattern(description, "%d+"..to.."%d+")
423 local maxDamage = findpattern(minDamage, to.."%d+")
424 minDamage = findpattern(minDamage, "%d+")
425 maxDamage = findpattern(maxDamage, "%d+")
426 local lengthofdamagetext = string.len(minDamage..to..maxDamage);
427 minDamage = minDamage*baseincrease + plusdam
428 maxDamage = maxDamage*baseincrease + plusdam
429  
430 local minHeal = string.sub(description, string.find(description, "%d+"..to.."%d+")+lengthofdamagetext)
431 minHeal = findpattern(minHeal, "%d+"..to.."%d+")
432 local maxHeal = findpattern(minHeal, to.."%d+")
433 minHeal = findpattern(minHeal, "%d+")
434 maxHeal = findpattern(maxHeal, "%d+")
435 local basehealincrease = TheoryCraft_GetStat("Allbaseincrease")+(TheoryCraft_GetStat("Holybaseincrease") or 0)+(TheoryCraft_GetStat("Healingbaseincrease") or 0)
436 local plusheal = (TheoryCraft_GetStat("All") + TheoryCraft_GetStat("Holy") + TheoryCraft_GetStat("Healing"))*spelldata.percentheal
437  
438 local lengthofhealtext = string.len(minHeal..to..maxHeal);
439 minHeal = (minHeal + plusheal)*basehealincrease
440 maxHeal = (maxHeal + plusheal)*basehealincrease
441  
442 description = string.sub(description, 0, string.find(description, "%d+"..to.."%d+", 0)-1)..
443 round(minDamage)..to..round(maxDamage)..
444 string.sub(description, string.find(description, "%d+"..to.."%d+", 0)+lengthofdamagetext)
445 local descriptionbegin = string.sub(description, 0, string.find(description, "%d+"..to.."%d+")+string.len(minDamage..to..maxDamage))
446 local descriptionrest = string.sub(description, string.find(description, "%d+"..to.."%d+")+string.len(minDamage..to..maxDamage)+1)
447 descriptionrest=string.sub(descriptionrest, 0, string.find(descriptionrest, "%d+"..to.."%d+", 0)-1)..
448 round(minHeal)..to..round(maxHeal)..
449 string.sub(descriptionrest, string.find(descriptionrest, "%d+"..to.."%d+", 0)+lengthofhealtext)
450 description = descriptionbegin..descriptionrest
451 returndata["description"] = description
452 returndata["critdmgchance"] = returndata["critchance"]
453 returndata["crithealchance"] = returndata["critchance"]
454 returndata["mindamage"] = minDamage
455 returndata["maxdamage"] = maxDamage
456 returndata["minheal"] = minHeal
457 returndata["maxheal"] = maxHeal
458 return
459 else
460 local a = TheoryCraft_SpellMinMaxReader
461 local _
462 TheoryCraft_DeleteTable(data)
463 local found
464 for k, pattern in pairs(a) do
465 if strfind(returndata["description"], pattern.pattern) then
466 _, _, data[1], data[2], data[3], data[4], data[5], data[6] = strfind(returndata["description"], pattern.pattern)
467 for k, type in pairs(pattern.type) do
468 if type == "bothdamage" then
469 returndata["mindamage"] = tonumber(data[k])
470 returndata["maxdamage"] = tonumber(data[k])
471 elseif type == "dotbothdamage" then
472 returndata["dotmindamage"] = tonumber(data[k])
473 returndata["dotmaxdamage"] = tonumber(data[k])
474 else
475 returndata[type] = data[k]
476 returndata[type] = data[k]
477 end
478 end
479 found = pattern
480 break
481 end
482 end
483 if found == nil then return end
484  
485 local baseincrease = returndata["baseincrease"]
486 local dotbaseincrease = baseincrease
487 local gearbaseincrease = baseincrease
488 baseincrease = baseincrease*returndata["talentbaseincreaseupfront"]
489 if spelldata.talentsbeforegear == nil then
490 gearbaseincrease = gearbaseincrease*returndata["talentbaseincrease"]*returndata["talentbaseincreaseupfront"]
491 end
492 baseincrease = baseincrease*returndata["talentbaseincrease"]
493 dotbaseincrease = dotbaseincrease*returndata["talentbaseincrease"]
494 local plusdam = (returndata["damfinal"] or 0)*gearbaseincrease
495 local plusdam2 = returndata["plusdam2"] or 0
496 returndata["backstabmult"] = 1
497  
498 returndata["basemindamage"] = returndata["mindamage"]
499 returndata["basemaxdamage"] = returndata["maxdamage"]
500 if returndata["mindamage"] then
501 returndata["mindamage"] = returndata["mindamage"]*baseincrease + plusdam
502 end
503 if returndata["maxdamage"] then
504 returndata["maxdamage"] = returndata["maxdamage"]*baseincrease + plusdam
505 end
506 if returndata["dotmindamage"] then
507 returndata["dotmindamage"] = returndata["dotmindamage"]*dotbaseincrease + plusdam2
508 end
509 if returndata["dotmaxdamage"] then
510 returndata["dotmaxdamage"] = returndata["dotmaxdamage"]*dotbaseincrease + plusdam2
511 end
512 if returndata["dotmindamage"] and returndata["dotmaxdamage"] then
513 returndata["dotdamage"] = (returndata["dotmindamage"]+returndata["dotmaxdamage"])/2
514 end
515 if returndata["hotheal"] then
516 returndata["hotheal"] = returndata["hotheal"]*dotbaseincrease + plusdam2
517 end
518 if returndata["oversecs"] then
519 if returndata["dotdamage"] then
520 returndata["dotdps"] = returndata["dotdamage"]/returndata["oversecs"]
521 end
522 if returndata["hotheal"] then
523 returndata["hothps"] = returndata["hotheal"]/returndata["oversecs"]
524 end
525 end
526  
527 for k, type in pairs(found.type) do
528 if type == "bothdamage" then
529 data[k] = round(returndata["mindamage"])
530 elseif type == "dotbothdamage" then
531 data[k] = round(returndata["dotmindamage"])
532 else
533 if tonumber(returndata[type]) then
534 data[k] = round(returndata[type])
535 else
536 data[k] = returndata[type]
537 end
538 end
539 end
540  
541 local counter = 0
542 local function replacer()
543 counter = counter + 1
544 return data[counter]
545 end
546 returndata["description"] = string.gsub(returndata["description"], found.pattern, string.gsub(found.pattern, "(%(.-%))", replacer), 1)
547 end
548 if (spelldata.isheal) then
549 returndata["minheal"] = returndata["mindamage"]
550 returndata["maxheal"] = returndata["maxdamage"]
551 if spelldata.hasdot then
552 returndata["hothps"] = returndata["dotdps"]
553 returndata["hotheal"] = returndata["dotdamage"]
554 end
555 returndata["mindamage"] = nil
556 returndata["maxdamage"] = nil
557 returndata["dotdps"] = nil
558 returndata["dotdamage"] = nil
559 end
560 if (spelldata.drain) then
561 returndata["minheal"] = returndata["mindamage"]+returndata["mindamage"]*returndata["illum"]*baseincrease
562 returndata["maxheal"] = returndata["maxdamage"]+returndata["maxdamage"]*returndata["illum"]*baseincrease
563 end
564 end