vanilla-wow-addons – Rev 1
?pathlinks?
-- These functions still need rewriting
-- They were written before I new about for in pairs, captures
-- or even patterns other then %d+... you gotta start somewhere =)
local data = {}
local _, class = UnitClass("player")
local function findpattern(text, pattern, start)
if (text and pattern and (string.find(text, pattern, start))) then
return string.sub(text, string.find(text, pattern, start))
else
return ""
end
end
local function round(arg1, decplaces)
if (decplaces == nil) then decplaces = 0 end
if arg1 == nil then arg1 = 0 end
return string.format ("%."..decplaces.."f", arg1)
end
local function getmanacost(frame)
index = 1
local ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
local manaCost = 0
while (ltext) do
if (strfind(ltext, TheoryCraft_Locale.Mana)) then
manaCost = findpattern(ltext, "%d+")
end
index = index + 1;
ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
end
manaCost = tonumber(manaCost)
if manaCost then
return manaCost
else
return 0
end
end
function TheoryCraft_getMinMax(spelldata, returndata, frame)
if returndata["description"] == nil then return end
local description = returndata["description"]
local baseincrease = returndata["baseincrease"]
local dotbaseincrease = baseincrease
local gearbaseincrease = baseincrease
if spelldata.ismelee == nil then
baseincrease = baseincrease*returndata["talentbaseincreaseupfront"]
if spelldata.talentsbeforegear == nil then
gearbaseincrease = gearbaseincrease*returndata["talentbaseincrease"]*returndata["talentbaseincreaseupfront"]
end
baseincrease = baseincrease*returndata["talentbaseincrease"]
dotbaseincrease = dotbaseincrease*returndata["talentbaseincrease"]
end
local plusdam = (returndata["damfinal"] or 0)*gearbaseincrease
local plusdam2 = returndata["plusdam2"] or 0
local to = TheoryCraft_Locale.to
returndata["backstabmult"] = 1
if spelldata.autoattack then
returndata["mindamage"] = (TheoryCraft_GetStat("MeleeMin")+(TheoryCraft_Data.Stats["attackpower"]/14)*TheoryCraft_GetStat("MainSpeed"))
returndata["maxdamage"] = returndata["mindamage"]-TheoryCraft_GetStat("MeleeMin")+TheoryCraft_GetStat("MeleeMax")
baseincrease = TheoryCraft_GetStat("Meleemodifier")+TheoryCraft_GetStat("Meleetalentmod")
returndata["mindamage"] = returndata["mindamage"]*baseincrease
returndata["maxdamage"] = returndata["maxdamage"]*baseincrease
returndata["critdmgchance"] = TheoryCraft_Data.Stats["meleecritchance"]/100
if TheoryCraft_GetStat("OffhandMin") == 0 then
returndata["description"] = "Attacks the target for "..math.floor(returndata["mindamage"]).." to "..math.floor(returndata["maxdamage"]).."."
else
returndata["offhandmindamage"] = (TheoryCraft_GetStat("OffhandMin")+(TheoryCraft_Data.Stats["attackpower"]/14)*TheoryCraft_GetStat("OffhandSpeed"))
returndata["offhandmaxdamage"] = returndata["offhandmindamage"]-TheoryCraft_GetStat("OffhandMin")+TheoryCraft_GetStat("OffhandMax")
local offhandbaseincrease = baseincrease/2
returndata["offhandmindamage"] = returndata["offhandmindamage"]*offhandbaseincrease
returndata["offhandmaxdamage"] = returndata["offhandmaxdamage"]*offhandbaseincrease
if TheoryCraft_GetStat("MeleeMin") == 0 then
returndata["description"] = "Off-hand attacks for "..math.floor(returndata["offhandmindamage"]).." to "..math.floor(returndata["offhandmaxdamage"]).."."
else
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"]).."."
end
end
return
end
if spelldata.iscombo then
local _, convert
_, _, convert = strfind(returndata["description"], TheoryCraft_MeleeComboEnergyConverter)
returndata["comboconvert"] = tonumber(convert)
for points, tmp, mindamage, maxdamage in string.gfind(returndata["description"], TheoryCraft_MeleeComboReader) do
returndata["combo"..points.."mindamage"] = mindamage
returndata["combo"..points.."maxdamage"] = maxdamage
end
returndata["beforecombo"] = returndata["description"]
elseif spelldata.shoot then
local a = TheoryCraft_Locale.MinMax
if (TheoryCraft_Data.EquipEffects["RangedMin"]) and (TheoryCraft_Data.EquipEffects["RangedMin"] ~= 0) then
returndata["mindamage"] = TheoryCraft_Data.EquipEffects["RangedMin"]
returndata["maxdamage"] = TheoryCraft_Data.EquipEffects["RangedMax"]
returndata["description"] = a.autoshotbefore..returndata["mindamage"]..to..returndata["maxdamage"]..a.autoshotafter
else
returndata["mindamage"] = 0
returndata["maxdamage"] = 0
description = a.shooterror
end
returndata["critchance"] = 5
returndata["critbonus"] = 0.5
if (TheoryCraft_Data.EquipEffects["RangedSpeed"]) and (TheoryCraft_Data.EquipEffects["RangedSpeed"] ~= 0) then
local tmp = (returndata["mindamage"]+returndata["maxdamage"])/2
returndata["dps"] = (tmp+tmp*returndata["critbonus"]*returndata["critchance"]/100)/TheoryCraft_Data.EquipEffects["RangedSpeed"]
else
returndata["dps"] = 0
end
elseif spelldata.autoshot then
-- Autoshot is calculated here
returndata["mindamage"] = TheoryCraft_GetStat("RangedMin")+TheoryCraft_Data.Stats["rangedattackpower"]/14*TheoryCraft_GetStat("RangedSpeed")
returndata["maxdamage"] = returndata["mindamage"]-TheoryCraft_GetStat("RangedMin")+TheoryCraft_GetStat("RangedMax")
baseincrease = TheoryCraft_GetStat("Rangedmodifier")+TheoryCraft_GetStat("Rangedtalentmod")
returndata["maxdamage"] = returndata["maxdamage"]*baseincrease+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
returndata["mindamage"] = returndata["mindamage"]*baseincrease+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
returndata["description"] = TheoryCraft_Locale.MinMax.autoshotbefore..(round(returndata["mindamage"]))..to..(round(returndata["maxdamage"]))..TheoryCraft_Locale.MinMax.autoshotafter
local averageauto, averageaimed, averagemulti, averagearcane = 0, 0, 0, 0
local aimedmana, multimana = 0, 0
averageauto = (returndata["maxdamage"]+returndata["mindamage"])/2
averageauto = averageauto+averageauto*TheoryCraft_Data.Stats["rangedcritchance"]/100*returndata["critbonus"]
for i = 1, 20 do
if TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"]].averagedam then
averageaimed = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"]].averagedam
aimedmana = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..i..")"]].manacost
end
if TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"]].averagedam then
averagemulti = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"]].averagedam
multimana = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..i..")"]].manacost
end
if TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..i..")"] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..i..")"]].dps then
averagearcane = TheoryCraft_TooltipData[TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..i..")"]].dps
end
end
-- averageauto = 651
-- averageaimed = 1293
-- averagemulti = 662
local rotationlength1, rotationlength2, rotationdps1, rotationdps2, autoshotcount1, autoshotcount2
local speed = TheoryCraft_GetStat("RangedSpeed")*TheoryCraft_GetStat("Rangedhastebonus")
-- speed = 2.19
returndata["dps"] = averageauto/speed
returndata["manacost"] = aimedmana+multimana
returndata["basemanacost"] = aimedmana+multimana
returndata["dontshowmana"] = true
-- MS Rotation Calculated Here:
rotationlength1 = 10
rotationlength2 = math.ceil(7/speed)*speed+3
if (speed > 3) or (averageaimed == 0) then
autoshotcount1 = math.floor(rotationlength1/speed)
autoshotcount2 = math.floor(rotationlength2/speed)
else
autoshotcount1 = math.floor((rotationlength1-3)/speed)+1
autoshotcount2 = math.floor((rotationlength2-3)/speed)+1
end
rotationdps1 = (averageaimed+averagemulti+averageauto*autoshotcount1)/rotationlength1
rotationdps2 = (averageaimed+averagemulti+averageauto*autoshotcount2)/rotationlength2
if (rotationdps1 > rotationdps2) then
returndata["msrotationdps"] = rotationdps1
returndata["msrotationlength"] = rotationlength1
if TheoryCraft_Settings["procs"] then
returndata["manacost"] = returndata["manacost"]-autoshotcount1*0.04*TheoryCraft_GetStat("Beastmanarestore")
end
else
returndata["msrotationdps"] = rotationdps2
returndata["msrotationlength"] = rotationlength2
if TheoryCraft_Settings["procs"] then
returndata["manacost"] = returndata["manacost"]-autoshotcount2*0.04*TheoryCraft_GetStat("Beastmanarestore")
end
end
returndata["regencasttime"] = returndata["msrotationlength"]-3
-- AS Rotation Calculated Here:
rotationlength1 = 9
rotationlength2 = math.ceil(6/speed)*speed+3
if rotationlength2 > 10 then
rotationlength2 = 9
end
if (speed > 3) or (averageaimed == 0) then
autoshotcount1 = math.floor(rotationlength1/speed)
autoshotcount2 = math.floor(rotationlength2/speed)
else
autoshotcount1 = math.floor((rotationlength1-3)/speed)+1
autoshotcount2 = math.floor((rotationlength2-3)/speed)+1
end
rotationdps1 = (averageaimed*6+averagemulti*5+averageauto*autoshotcount1*6)/(rotationlength1*6)
rotationdps2 = (averageaimed*6+averagemulti*5+averageauto*autoshotcount2*6)/(rotationlength2*6)
if (rotationdps1 > rotationdps2) then
returndata["asrotationdps"] = rotationdps1
returndata["asrotationlength"] = rotationlength1
else
returndata["asrotationdps"] = rotationdps2
returndata["asrotationlength"] = rotationlength2
end
-- MS/Arc Rotation Calculated Here:
returndata["arcrotationdps"] = (averagearcane*10+averagemulti+averageauto*(10/speed))/10
returndata["arcmagicdps"] = averagearcane
elseif (spelldata.ismelee) or (spelldata.isranged) then
local normalized
if spelldata.noscale then
returndata["backstabmult"] = 0
end
if spelldata.isranged then
normalized = (TheoryCraft_Data.Stats["rangedattackpower"]/14)*returndata["RangedAPMult"]
returndata["mindamage"] = TheoryCraft_Data.EquipEffects["RangedMin"]
returndata["maxdamage"] = TheoryCraft_Data.EquipEffects["RangedMax"]
else
if spelldata.forcemult then
normalized = TheoryCraft_Data.Stats["attackpower"]/14*spelldata.forcemult
elseif spelldata.nextattack then
normalized = TheoryCraft_Data.Stats["attackpower"]/14*TheoryCraft_Data.EquipEffects["MainSpeed"]
else
normalized = TheoryCraft_Data.Stats["attackpower"]/14*(TheoryCraft_Data.EquipEffects["MeleeAPMult"] or 1)
end
returndata["mindamage"] = TheoryCraft_Data.EquipEffects["MeleeMin"]
returndata["maxdamage"] = TheoryCraft_Data.EquipEffects["MeleeMax"]
end
local i = 1
local removetalents = 1
baseincrease = 0
removetalents = removetalents + TheoryCraft_GetStat(spelldata.id.."modifier")
baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.id.."baseincrease")
baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.id.."modifier")+TheoryCraft_GetStat(spelldata.id.."talentmod")
while spelldata.Schools[i] do
if (spelldata.Schools[i] ~= "Ranged") and (spelldata.Schools[i] ~= "Melee") then
removetalents = removetalents + TheoryCraft_GetStat(spelldata.Schools[i].."modifier")
baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.Schools[i].."baseincrease")
end
baseincrease = baseincrease+TheoryCraft_GetStat(spelldata.Schools[i].."modifier")+TheoryCraft_GetStat(spelldata.Schools[i].."talentmod")
i = i + 1
end
local a = TheoryCraft_MeleeMinMaxReader
local _
local found
if spelldata.dontusemelee then
baseincrease = 1
end
TheoryCraft_DeleteTable(data)
returndata["addeddamage"] = 0
local range
for k, pattern in pairs(a) do
if strfind(returndata["description"], pattern.pattern) then
_, _, data[1], data[2], data[3], data[4], data[5], data[6] = strfind(returndata["description"], pattern.pattern)
for k, type in pairs(pattern.type) do
if (type == "mindamage") or (type == "maxdamage") then
returndata[type] = data[k]
range = true
end
end
end
end
if range then
range = nil
elseif strfind(returndata["description"], "%d+"..to.."%d+") then
range = true
returndata["description"] = string.gsub(returndata["description"], "%d+"..to.."%d+", findpattern(findpattern(returndata["description"], "%d+"..to.."%d+"), "%d+"))
end
for k, pattern in pairs(a) do
if strfind(returndata["description"], pattern.pattern) then
_, _, data[1], data[2], data[3], data[4], data[5], data[6] = strfind(returndata["description"], pattern.pattern)
for k, type in pairs(pattern.type) do
if (type == "backstabmult") or (type == "bloodthirstmult") then
returndata[type] = tonumber(data[k])/100
else
returndata[type] = data[k]
end
end
end
end
if returndata["bloodthirstmult"] then
returndata["mindamage"] = returndata["bloodthirstmult"]*TheoryCraft_Data.Stats["attackpower"]
returndata["maxdamage"] = returndata["mindamage"]
returndata["backstabmult"] = 1
normalized = 0
end
if range then
returndata["addeddamage"] = returndata["addeddamage"] + 0.5
end
if class ~= "ROGUE" then
returndata["addeddamage"] = returndata["addeddamage"]/removetalents
end
if returndata["backstabmult"] ~= 1 then
returndata["backstabmult"] = returndata["backstabmult"]/removetalents
end
-- Print("("..round(normalized).."+"..returndata["mindamage"]..")*"..returndata["backstabmult"].."+"..returndata["addeddamage"]..")*"..baseincrease)
local ranged
for k,v in pairs(returndata["schools"]) do
if v == "Ranged" then
ranged = true
end
end
returndata["mindamage"] = ((normalized+returndata["mindamage"])*returndata["backstabmult"] + returndata["addeddamage"])*baseincrease
returndata["maxdamage"] = ((normalized+returndata["maxdamage"])*returndata["backstabmult"] + returndata["addeddamage"])*baseincrease
if ranged then
returndata["mindamage"] = returndata["mindamage"]+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
returndata["maxdamage"] = returndata["maxdamage"]+TheoryCraft_GetStat("AmmoDPS")*TheoryCraft_GetStat("RangedSpeed")
end
a = TheoryCraft_MeleeMinMaxReplacer
local damagetext
if returndata["mindamage"] == returndata["maxdamage"] then
damagetext = round(returndata["mindamage"])
else
damagetext = round(returndata["mindamage"])..to..round(returndata["maxdamage"])
end
local blocktext
if TheoryCraft_Data.EquipEffects["ShieldEquipped"] then
blocktext = floor(TheoryCraft_GetStat("BlockValue"))
end
for k, pattern in pairs(a) do
if strfind(returndata["description"], pattern.search) then
local replace = string.gsub(pattern.replacewith, "%$damage%$", damagetext)
if (not strfind(replace, "%$blockvalue%$")) or (blocktext) then
if blocktext then
replace = string.gsub(replace, "%$blockvalue%$", blocktext)
end
returndata["description"] = string.gsub(returndata["description"], pattern.search, replace)
end
break
end
end
return
elseif (spelldata.isseal) then
local a = TheoryCraft_Locale.MinMax
local alreadybuffedbonus = TheoryCraft_GetStat("AttackPowerCrusader")
local attackbaseincrease = TheoryCraft_GetStat(spelldata.id.."baseincrease")
attackbaseincrease = attackbaseincrease + TheoryCraft_GetStat("Meleemodifier")+TheoryCraft_GetStat("Meleetalentmod")
attackbaseincrease = attackbaseincrease + TheoryCraft_GetStat(spelldata.id.."modifier")+TheoryCraft_GetStat(spelldata.id.."talentmod")
local minDamage, maxDamage, lengthofdamagetext
local baseincrease = 1
while spelldata.Schools[i] do
if (spelldata.Schools[i] ~= "Ranged") and (spelldata.Schools[i] ~= "Melee") then
baseincrease = baseincrease + TheoryCraft_GetStat(spelldata.Schools[i].."baseincrease")
end
baseincrease = baseincrease+TheoryCraft_GetStat(spelldata.Schools[i].."modifier")+TheoryCraft_GetStat(spelldata.Schools[i].."talentmod")
i = i + 1
end
if (spelldata.crusader) then
local lowDmg, hiDmg, offlowDmg, offhiDmg, posBuff, negBuff, percentmod = UnitDamage("player");
local attackspeed = UnitAttackSpeed("player")
lowDmg = lowDmg/attackspeed
hiDmg = hiDmg/attackspeed
local apbonus = findpattern(description, a.crusader)
apbonus = tonumber(findpattern(apbonus, "%d+")) or 0
maxDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMax"])
minDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMin"])
local averagehit = (maxDamage+minDamage)/2*attackbaseincrease
averagehit = (averagehit + averagehit * TheoryCraft_Data.Stats["meleecritchance"]/100)/TheoryCraft_Data.EquipEffects["MainSpeed"]
returndata["sealunbuffed"] = averagehit
maxDamage = ((TheoryCraft_Data.Stats["attackpower"]+apbonus-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMax"])
minDamage = ((TheoryCraft_Data.Stats["attackpower"]+apbonus-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMin"])
local averagehit = (maxDamage+minDamage)/2*attackbaseincrease
averagehit = (averagehit + averagehit * TheoryCraft_Data.Stats["meleecritchance"]/100)/TheoryCraft_Data.EquipEffects["MainSpeed"]
returndata["sealbuffed"] = averagehit
elseif (spelldata.command) then
minDamage = findpattern(description, "%d+"..to.."%d+")
maxDamage = findpattern(minDamage, to.."%d+")
minDamage = string.sub(minDamage, string.find(minDamage, "%d+", 0))
maxDamage = string.sub(maxDamage, string.find(maxDamage, "%d+", 0))
lengthofdamagetext = string.len(minDamage..to..maxDamage);
minDamage = math.floor((minDamage + plusdam)*baseincrease)
maxDamage = math.floor((maxDamage + plusdam)*baseincrease)
local tmp2 = string.sub(description, string.find(description, "%d+"..to.."%d+", 0)+lengthofdamagetext)
local minDamage2 = findpattern(tmp2, "%d+"..to.."%d+")
local maxDamage2 = findpattern(minDamage2, to.."%d+")
minDamage2 = string.sub(minDamage2, string.find(minDamage2, "%d+", 0))
maxDamage2 = string.sub(maxDamage2, string.find(maxDamage2, "%d+", 0))
minDamage2 = math.floor((minDamage2 + plusdam2)*baseincrease)
maxDamage2 = math.floor((maxDamage2 + plusdam2)*baseincrease)
description = string.gsub(description, "%d+"..to.."%d+", "tmpABC", 1)
description = string.gsub(description, "%d+"..to.."%d+", minDamage2..to..maxDamage2)
description = string.gsub(description, "tmpABC", minDamage..to..maxDamage)
maxDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMax"])*attackbaseincrease
minDamage = ((TheoryCraft_Data.Stats["attackpower"]-alreadybuffedbonus)/14*TheoryCraft_Data.EquipEffects["MainSpeed"]+TheoryCraft_Data.EquipEffects["MeleeMin"])*attackbaseincrease
local averagehit = (maxDamage+minDamage)/2
averagehit = averagehit + averagehit * TheoryCraft_Data.Stats["meleecritchance"]/100
returndata["sealunbuffed"] = averagehit/TheoryCraft_Data.EquipEffects["MainSpeed"]
averagehit = averagehit+(7/(60/TheoryCraft_Data.EquipEffects["MainSpeed"])*0.7)*averagehit
returndata["sealbuffed"] = averagehit/TheoryCraft_Data.EquipEffects["MainSpeed"]
elseif (spelldata.righteousness) then
minDamage = findpattern(description, "%d+"..to.."%d+")
maxDamage = findpattern(minDamage, to.."%d+")
minDamage = string.sub(minDamage, string.find(minDamage, "%d+", 0))
maxDamage = string.sub(maxDamage, string.find(maxDamage, "%d+", 0))
lengthofdamagetext = string.len(minDamage..to..maxDamage);
minDamage = math.floor((minDamage + plusdam)*baseincrease)
maxDamage = math.floor((maxDamage + plusdam)*baseincrease)
local tmp2 = string.sub(description, string.find(description, "%d+"..to.."%d+", 0)+lengthofdamagetext)
local minDamage2 = findpattern(tmp2, "%d+"..to.."%d+")
local maxDamage2 = findpattern(minDamage2, to.."%d+")
if minDamage2 and string.find(minDamage2, "%d+") then
minDamage2 = string.sub(minDamage2, string.find(minDamage2, "%d+", 0))
maxDamage2 = string.sub(maxDamage2, string.find(maxDamage2, "%d+", 0))
minDamage2 = math.floor((minDamage2 + plusdam2)*baseincrease)
maxDamage2 = math.floor((maxDamage2 + plusdam2)*baseincrease)
description = string.gsub(description, "%d+"..to.."%d+", "tmpABC", 1)
description = string.gsub(description, "%d+"..to.."%d+", minDamage2..to..maxDamage2)
description = string.gsub(description, "tmpABC", minDamage..to..maxDamage)
else
description = string.gsub(description, "%d+"..to.."%d+", minDamage..to..maxDamage)
end
end
returndata["description"] = description
elseif (spelldata.holynova) then
local minDamage = findpattern(description, "%d+"..to.."%d+")
local maxDamage = findpattern(minDamage, to.."%d+")
minDamage = findpattern(minDamage, "%d+")
maxDamage = findpattern(maxDamage, "%d+")
local lengthofdamagetext = string.len(minDamage..to..maxDamage);
minDamage = minDamage*baseincrease + plusdam
maxDamage = maxDamage*baseincrease + plusdam
local minHeal = string.sub(description, string.find(description, "%d+"..to.."%d+")+lengthofdamagetext)
minHeal = findpattern(minHeal, "%d+"..to.."%d+")
local maxHeal = findpattern(minHeal, to.."%d+")
minHeal = findpattern(minHeal, "%d+")
maxHeal = findpattern(maxHeal, "%d+")
local basehealincrease = TheoryCraft_GetStat("Allbaseincrease")+(TheoryCraft_GetStat("Holybaseincrease") or 0)+(TheoryCraft_GetStat("Healingbaseincrease") or 0)
local plusheal = (TheoryCraft_GetStat("All") + TheoryCraft_GetStat("Holy") + TheoryCraft_GetStat("Healing"))*spelldata.percentheal
local lengthofhealtext = string.len(minHeal..to..maxHeal);
minHeal = (minHeal + plusheal)*basehealincrease
maxHeal = (maxHeal + plusheal)*basehealincrease
description = string.sub(description, 0, string.find(description, "%d+"..to.."%d+", 0)-1)..
round(minDamage)..to..round(maxDamage)..
string.sub(description, string.find(description, "%d+"..to.."%d+", 0)+lengthofdamagetext)
local descriptionbegin = string.sub(description, 0, string.find(description, "%d+"..to.."%d+")+string.len(minDamage..to..maxDamage))
local descriptionrest = string.sub(description, string.find(description, "%d+"..to.."%d+")+string.len(minDamage..to..maxDamage)+1)
descriptionrest=string.sub(descriptionrest, 0, string.find(descriptionrest, "%d+"..to.."%d+", 0)-1)..
round(minHeal)..to..round(maxHeal)..
string.sub(descriptionrest, string.find(descriptionrest, "%d+"..to.."%d+", 0)+lengthofhealtext)
description = descriptionbegin..descriptionrest
returndata["description"] = description
returndata["critdmgchance"] = returndata["critchance"]
returndata["crithealchance"] = returndata["critchance"]
returndata["mindamage"] = minDamage
returndata["maxdamage"] = maxDamage
returndata["minheal"] = minHeal
returndata["maxheal"] = maxHeal
return
else
local a = TheoryCraft_SpellMinMaxReader
local _
TheoryCraft_DeleteTable(data)
local found
for k, pattern in pairs(a) do
if strfind(returndata["description"], pattern.pattern) then
_, _, data[1], data[2], data[3], data[4], data[5], data[6] = strfind(returndata["description"], pattern.pattern)
for k, type in pairs(pattern.type) do
if type == "bothdamage" then
returndata["mindamage"] = tonumber(data[k])
returndata["maxdamage"] = tonumber(data[k])
elseif type == "dotbothdamage" then
returndata["dotmindamage"] = tonumber(data[k])
returndata["dotmaxdamage"] = tonumber(data[k])
else
returndata[type] = data[k]
returndata[type] = data[k]
end
end
found = pattern
break
end
end
if found == nil then return end
local baseincrease = returndata["baseincrease"]
local dotbaseincrease = baseincrease
local gearbaseincrease = baseincrease
baseincrease = baseincrease*returndata["talentbaseincreaseupfront"]
if spelldata.talentsbeforegear == nil then
gearbaseincrease = gearbaseincrease*returndata["talentbaseincrease"]*returndata["talentbaseincreaseupfront"]
end
baseincrease = baseincrease*returndata["talentbaseincrease"]
dotbaseincrease = dotbaseincrease*returndata["talentbaseincrease"]
local plusdam = (returndata["damfinal"] or 0)*gearbaseincrease
local plusdam2 = returndata["plusdam2"] or 0
returndata["backstabmult"] = 1
returndata["basemindamage"] = returndata["mindamage"]
returndata["basemaxdamage"] = returndata["maxdamage"]
if returndata["mindamage"] then
returndata["mindamage"] = returndata["mindamage"]*baseincrease + plusdam
end
if returndata["maxdamage"] then
returndata["maxdamage"] = returndata["maxdamage"]*baseincrease + plusdam
end
if returndata["dotmindamage"] then
returndata["dotmindamage"] = returndata["dotmindamage"]*dotbaseincrease + plusdam2
end
if returndata["dotmaxdamage"] then
returndata["dotmaxdamage"] = returndata["dotmaxdamage"]*dotbaseincrease + plusdam2
end
if returndata["dotmindamage"] and returndata["dotmaxdamage"] then
returndata["dotdamage"] = (returndata["dotmindamage"]+returndata["dotmaxdamage"])/2
end
if returndata["hotheal"] then
returndata["hotheal"] = returndata["hotheal"]*dotbaseincrease + plusdam2
end
if returndata["oversecs"] then
if returndata["dotdamage"] then
returndata["dotdps"] = returndata["dotdamage"]/returndata["oversecs"]
end
if returndata["hotheal"] then
returndata["hothps"] = returndata["hotheal"]/returndata["oversecs"]
end
end
for k, type in pairs(found.type) do
if type == "bothdamage" then
data[k] = round(returndata["mindamage"])
elseif type == "dotbothdamage" then
data[k] = round(returndata["dotmindamage"])
else
if tonumber(returndata[type]) then
data[k] = round(returndata[type])
else
data[k] = returndata[type]
end
end
end
local counter = 0
local function replacer()
counter = counter + 1
return data[counter]
end
returndata["description"] = string.gsub(returndata["description"], found.pattern, string.gsub(found.pattern, "(%(.-%))", replacer), 1)
end
if (spelldata.isheal) then
returndata["minheal"] = returndata["mindamage"]
returndata["maxheal"] = returndata["maxdamage"]
if spelldata.hasdot then
returndata["hothps"] = returndata["dotdps"]
returndata["hotheal"] = returndata["dotdamage"]
end
returndata["mindamage"] = nil
returndata["maxdamage"] = nil
returndata["dotdps"] = nil
returndata["dotdamage"] = nil
end
if (spelldata.drain) then
returndata["minheal"] = returndata["mindamage"]+returndata["mindamage"]*returndata["illum"]*baseincrease
returndata["maxheal"] = returndata["maxdamage"]+returndata["maxdamage"]*returndata["illum"]*baseincrease
end
end