Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 116.92 KB | None | 0 0
  1. local _, class = UnitClass("player")
  2. local returndata = {}
  3. local summeddata = {}
  4.  
  5. local function findpattern(text, pattern, start)
  6. if (text and pattern and (string.find(text, pattern, start))) then
  7. return string.sub(text, string.find(text, pattern, start))
  8. else
  9. return ""
  10. end
  11. end
  12.  
  13. local function round(arg1, decplaces)
  14. if (decplaces == nil) then decplaces = 0 end
  15. if arg1 == nil then arg1 = 0 end
  16. return string.format ("%."..decplaces.."f", arg1)
  17. end
  18.  
  19. local function TheoryCraft_AddData(arg1, data, summeddata)
  20. if data == nil then return end
  21. summeddata["tmpincrease"] = summeddata["tmpincrease"] + (data[arg1.."modifier"] or 0)
  22. summeddata["tmpincreaseupfront"] = summeddata["tmpincreaseupfront"] + (data[arg1.."UpFrontmodifier"] or 0)
  23. if summeddata["baseincrease"] ~= 0 then
  24. summeddata["baseincrease"] = summeddata["baseincrease"] * ((data[arg1.."baseincrease"] or 0)+1)
  25. else
  26. summeddata["baseincrease"] = summeddata["baseincrease"] + (data[arg1.."baseincrease"] or 0)
  27. end
  28. if summeddata["baseincreaseupfront"] ~= 0 then
  29. summeddata["baseincreaseupfront"] = summeddata["baseincreaseupfront"] * ((data[arg1.."UpFrontbaseincrease"] or 0)+1)
  30. else
  31. summeddata["baseincreaseupfront"] = summeddata["baseincreaseupfront"] + (data[arg1.."UpFrontbaseincrease"] or 0)
  32. end
  33. summeddata["talentmod"] = summeddata["talentmod"] + (data[arg1.."talentmod"] or 0)
  34. summeddata["talentmodupfront"] = summeddata["talentmodupfront"] + (data[arg1.."UpFronttalentmod"] or 0)
  35. if (summeddata["doshatter"] ~= 0) then
  36. summeddata["critchance"] = summeddata["critchance"] + (data[arg1.."shatter"] or 0)
  37. end
  38. summeddata["illum"] = summeddata["illum"] + (data[arg1.."illum"] or 0)
  39. summeddata["plusdam"] = summeddata["plusdam"] + (data[arg1] or 0)
  40. summeddata["manacostmod"] = summeddata["manacostmod"] + (data[arg1.."manacost"] or 0)
  41. summeddata["critchance"] = summeddata["critchance"] + (data[arg1.."critchance"] or 0)
  42. summeddata["critbonus"] = summeddata["critbonus"] + (data[arg1.."critbonus"] or 0)
  43. summeddata["ignitemodifier"] = summeddata["ignitemodifier"] + (data[arg1.."ignitemodifier"] or 0)
  44. summeddata["sepignite"] = summeddata["sepignite"] + (data[arg1.."sepignite"] or 0)
  45. summeddata["hitbonus"] = summeddata["hitbonus"] - (data[arg1.."hitchance"] or 0)
  46. summeddata["casttime"] = summeddata["casttime"] + (data[arg1.."casttime"] or 0)
  47. summeddata["regencasttime"] = summeddata["regencasttime"] + (data[arg1.."casttime"] or 0)
  48. summeddata["penetration"] = summeddata["penetration"] + (data[arg1.."penetration"] or 0)
  49. summeddata["grace"] = summeddata["grace"] + (data[arg1.."grace"] or 0)
  50. summeddata["threat"] = summeddata["threat"] + (data[arg1.."threat"] or 0)
  51. if data[arg1.."Netherwind"] == 1 then
  52. summeddata["netherwind"] = 1
  53. end
  54. end
  55.  
  56. local function TheoryCraft_DoSchool(arg1, summeddata)
  57. if TheoryCraft_Data.Testing then
  58. TheoryCraft_AddData(arg1, TheoryCraft_Data.TalentsTest, summeddata)
  59. else
  60. TheoryCraft_AddData(arg1, TheoryCraft_Data.Talents, summeddata)
  61. end
  62. TheoryCraft_AddData(arg1, TheoryCraft_Data.BaseData, summeddata)
  63. TheoryCraft_AddData(arg1, TheoryCraft_Data.Stats, summeddata)
  64. TheoryCraft_AddData(arg1, TheoryCraft_Data.PlayerBuffs, summeddata)
  65. TheoryCraft_AddData(arg1, TheoryCraft_Data.TargetBuffs, summeddata)
  66. TheoryCraft_AddData(arg1, TheoryCraft_Data.EquipEffects, summeddata)
  67. TheoryCraft_AddData(arg1, TheoryCraft_Data.Target, summeddata)
  68. end
  69.  
  70. local function SummateData(name, schools)
  71. TheoryCraft_DeleteTable(summeddata)
  72. summeddata["doshatter"] = (TheoryCraft_Data.TargetBuffs["doshatter"] or 0)
  73. summeddata["tmpincrease"] = 0
  74. summeddata["tmpincreaseupfront"] = 0
  75. summeddata["baseincrease"] = 0
  76. summeddata["baseincreaseupfront"] = 0
  77. summeddata["talentmod"] = 0
  78. summeddata["talentmodupfront"] = 0
  79. summeddata["critchance"] = (TheoryCraft_Data.Stats["critchance"] or 0)
  80. summeddata["illum"] = 0
  81. summeddata["plusdam"] = 0
  82. summeddata["manacostmod"] = 1
  83. summeddata["critbonus"] = 0
  84. summeddata["ignitemodifier"] = 0
  85. summeddata["sepignite"] = 0
  86. summeddata["hitbonus"] = 0
  87. summeddata["casttime"] = 0
  88. summeddata["regencasttime"] = 0
  89. summeddata["penetration"] = 0
  90. summeddata["grace"] = 0
  91. summeddata["netherwind"] = 0
  92. summeddata["threat"] = 0
  93. for k, v in pairs (schools) do
  94. TheoryCraft_DoSchool(v, summeddata)
  95. end
  96. TheoryCraft_DoSchool(name, summeddata)
  97. end
  98.  
  99. local function getcooldown(frame)
  100. index = 1
  101. local rtext = getglobal(frame:GetName().."TextRight"..index):GetText()
  102. local cooldown = 1.5
  103. while (rtext) do
  104. if (getglobal(frame:GetName().."TextRight"..index):IsVisible()) then
  105. if (strfind(rtext, "%d+.%d+"..TheoryCraft_Locale.Cooldown)) then
  106. cooldown = findpattern(rtext, "%d+.%d+");
  107. elseif (strfind(rtext, "%d+"..TheoryCraft_Locale.Cooldown)) then
  108. cooldown = findpattern(rtext, "%d+");
  109. end
  110. end
  111. index = index + 1;
  112. rtext = getglobal(frame:GetName().."TextRight"..index):GetText()
  113. end
  114. return cooldown
  115. end
  116.  
  117. local function getlifetap(returndata)
  118. local i2 = 1
  119. local spellname = 1
  120. local spellrank = 1
  121. local quit = 0
  122. local found = 0
  123. while (spellname) do
  124. spellname, spellrank = GetSpellBookItemName(i2,BOOKTYPE_SPELL)
  125. spellrank = tonumber(findpattern(spellrank, "%d+"))
  126. if (spellname == TheoryCraft_Locale.lifetap) then
  127. found = 1
  128. elseif (found == 1) then
  129. TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
  130. TCTooltip:SetSpellBookItem(i2-1,BOOKTYPE_SPELL)
  131. if (TCTooltip:NumLines() > 0) then
  132. local description = getglobal("TCTooltipTextLeft"..TCTooltip:NumLines()):GetText()
  133. returndata["lifetapHealth"] = findpattern(description, "%d+ health")
  134. returndata["lifetapMana"] = findpattern(description, "%d+ mana")
  135. if returndata["lifetapHealth"] then
  136. returndata["lifetapHealth"] = tonumber(findpattern(returndata["lifetapHealth"], "%d+"))
  137. end
  138. if returndata["lifetapMana"] then
  139. returndata["lifetapMana"] = tonumber(findpattern(returndata["lifetapMana"], "%d+"))
  140. end
  141. end
  142. return
  143. end
  144. i2 = i2 + 1
  145. end
  146. end
  147.  
  148. function TheoryCraft_GetStat(statname)
  149. if TheoryCraft_Data.testing then
  150. return (TheoryCraft_Data.BaseData[statname] or 0)+
  151. (TheoryCraft_Data.TalentsTest[statname] or 0)+
  152. (TheoryCraft_Data.Stats[statname] or 0)+
  153. (TheoryCraft_Data.PlayerBuffs[statname] or 0)+
  154. (TheoryCraft_Data.TargetBuffs[statname] or 0)+
  155. (TheoryCraft_Data.EquipEffects[statname] or 0)+
  156. (TheoryCraft_Data.Target[statname] or 0)
  157. else
  158. return (TheoryCraft_Data.BaseData[statname] or 0)+
  159. (TheoryCraft_Data.Talents[statname] or 0)+
  160. (TheoryCraft_Data.Stats[statname] or 0)+
  161. (TheoryCraft_Data.PlayerBuffs[statname] or 0)+
  162. (TheoryCraft_Data.TargetBuffs[statname] or 0)+
  163. (TheoryCraft_Data.EquipEffects[statname] or 0)+
  164. (TheoryCraft_Data.Target[statname] or 0)
  165. end
  166. end
  167.  
  168. local function agipercrit()
  169. if TheoryCraft_agipercrit then
  170. return TheoryCraft_agipercrit
  171. else
  172. return TheoryCraft_CritChance[class][1]
  173. end
  174. end
  175.  
  176. function TheoryCraft_intpercrit()
  177. local critdivider
  178. local agipercrit = agipercrit()
  179. if agipercrit == TheoryCraft_CritChance[class][1] then
  180. critdivider = UnitLevel("player")/60*TheoryCraft_CritChance[class][2]
  181. if (critdivider < 5) then
  182. critdivider = 5
  183. end
  184. else
  185. critdivider = agipercrit/TheoryCraft_CritChance[class][1]*TheoryCraft_CritChance[class][2]
  186. end
  187. return critdivider
  188. end
  189.  
  190. --- Returns the cast time from the spell tooltip ---
  191.  
  192. local function getcasttime(frame)
  193. index = 1;
  194. local ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
  195. local castTime = 0
  196. while (ltext) do
  197. ltext = string.gsub(ltext, ",", ".")
  198. if (strfind(ltext, "%d+.%d+"..TheoryCraft_Locale.SecCast)) then
  199. castTime = findpattern(findpattern(ltext, "%d+.%d+"..TheoryCraft_Locale.SecCast), "%d+.%d+")
  200. elseif (strfind(ltext, "%d+"..TheoryCraft_Locale.SecCast)) then
  201. castTime = findpattern(findpattern(ltext, "%d+"..TheoryCraft_Locale.SecCast), "%d+")
  202. end
  203. index = index + 1
  204. ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
  205. end
  206. castTime = tonumber(castTime)
  207. return castTime
  208. end
  209.  
  210. --- Returns the dot duration from the spell tooltip ---
  211.  
  212. local function TheoryCraft_getDotDuration(description)
  213. local i = 1
  214. local _, found
  215. while TheoryCraft_DotDurations[i] do
  216. if (strfind(description, TheoryCraft_DotDurations[i].text)) then
  217. if TheoryCraft_DotDurations[i].amount == "n" then
  218. _, _, found = strfind(description, TheoryCraft_DotDurations[i].text)
  219. return found
  220. else
  221. return TheoryCraft_DotDurations[i].amount
  222. end
  223. end
  224. i = i + 1
  225. end
  226. return 1
  227. end
  228.  
  229. local function getmanacost(frame)
  230. index = 1
  231. local ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
  232. local manaCost = 0
  233. while (ltext) do
  234. if (strfind(ltext, TheoryCraft_Locale.Mana)) then
  235. manaCost = findpattern(ltext, "%d+")
  236. end
  237. index = index + 1;
  238. ltext = getglobal(frame:GetName().."TextLeft"..index):GetText()
  239. end
  240. manaCost = tonumber(manaCost)
  241. if manaCost then
  242. return manaCost
  243. else
  244. return 0
  245. end
  246. end
  247.  
  248. local function TheoryCraft_GetRangedSpeed()
  249. TheoryCraftTooltip:SetOwner(UIParent,"ANCHOR_NONE")
  250. TheoryCraftTooltip:SetInventoryItem ("player", GetInventorySlotInfo("RangedSlot"))
  251. local index = 1
  252. ltext = getglobal(TheoryCraftTooltip:GetName().."TextLeft"..index)
  253. rtext = getglobal(TheoryCraftTooltip:GetName().."TextRight"..index)
  254. if ltext then
  255. ltext = ltext:GetText()
  256. end
  257. if rtext then
  258. if not (getglobal(TheoryCraftTooltip:GetName().."TextRight"..index):IsVisible()) then
  259. rtext = nil
  260. else
  261. rtext = rtext:GetText()
  262. end
  263. end
  264. while (ltext ~= nil) do
  265. if (rtext) then
  266. for k, v in pairs(TheoryCraft_EquipEveryRight) do
  267. if (v.slot == nil) or (v.slot == "Ranged") then
  268. _, start, found = strfind(rtext, v.text)
  269. if found then
  270. if v.amount then
  271. TheoryCraftTooltip:ClearLines()
  272. return v.amount
  273. else
  274. TheoryCraftTooltip:ClearLines()
  275. return found
  276. end
  277. end
  278. end
  279. end
  280. end
  281. index = index + 1;
  282. ltext = getglobal(TheoryCraftTooltip:GetName().."TextLeft"..index)
  283. rtext = getglobal(TheoryCraftTooltip:GetName().."TextRight"..index)
  284. if ltext then
  285. ltext = ltext:GetText()
  286. end
  287. if rtext then
  288. if not (getglobal(TheoryCraftTooltip:GetName().."TextRight"..index):IsVisible()) then
  289. rtext = nil
  290. else
  291. rtext = rtext:GetText()
  292. end
  293. end
  294. end
  295. TheoryCraftTooltip:ClearLines()
  296. return 2.8
  297. end
  298.  
  299. local function GetCritChance(critreport)
  300. local critChance, iCritInfo, critNum
  301. local remove = 0
  302. local id = 1
  303. local attackSpell = GetSpellBookItemName(id,BOOKTYPE_SPELL)
  304. if (attackSpell ~= TheoryCraft_Locale.Attack) then
  305. name, texture, offset, numSpells = GetSpellTabInfo(1)
  306. for i=1, numSpells do
  307. if (GetSpellBookItemName(i,BOOKTYPE_SPELL) == TheoryCraft_Locale.Attack) then
  308. id = i
  309. end
  310. end
  311. end
  312. if GetSpellBookItemName(id,BOOKTYPE_SPELL) ~= TheoryCraft_Locale.Attack then
  313. return 0
  314. end
  315. TheoryCraftTooltip:SetOwner(UIParent,"ANCHOR_NONE")
  316. TheoryCraftTooltip:SetSpellBookItem(id, BOOKTYPE_SPELL)
  317. local spellName = TheoryCraftTooltipTextLeft2:GetText()
  318. if not spellName then return 0 end
  319. iCritInfo = string.find(spellName, "%s")
  320. critNum = string.sub(spellName,0,(iCritInfo -2))
  321. critChance = string.gsub(critNum, ",", ".")
  322. critChance = tonumber(critChance)
  323. if critreport == nil then critreport = 0 end
  324. if (critChance) and (critChance ~= critreport) then
  325. local doweaponskill = true
  326. if class == "DRUID" then
  327. local _, _, active = GetShapeshiftFormInfo(1)
  328. if active then doweaponskill = nil end
  329. local _, _, active = GetShapeshiftFormInfo(3)
  330. if active then doweaponskill = nil end
  331. end
  332. if doweaponskill then
  333. TheoryCraftTooltip:SetOwner(UIParent,"ANCHOR_NONE")
  334. TheoryCraftTooltip:SetInventoryItem ("player", GetInventorySlotInfo("MainHandSlot"))
  335. local i, i2 = 1
  336. local ltext = getglobal(TheoryCraftTooltip:GetName().."TextLeft"..i):GetText()
  337. local rtext = getglobal(TheoryCraftTooltip:GetName().."TextRight"..i):GetText()
  338. local skill = TheoryCraft_WeaponSkillOther
  339. local english = "Unarmed"
  340. while ltext do
  341. ltext = getglobal(TheoryCraftTooltip:GetName().."TextLeft"..i):GetText()
  342. rtext = getglobal(TheoryCraftTooltip:GetName().."TextRight"..i):GetText()
  343. if (rtext) and (getglobal(TheoryCraftTooltip:GetName().."TextRight"..i):IsVisible()) then
  344. i2 = 1
  345. while TheoryCraft_WeaponSkills[i2] do
  346. if (((TheoryCraft_WeaponSkills[i2].ltext) and (TheoryCraft_WeaponSkills[i2].ltext == ltext)) or (TheoryCraft_WeaponSkills[i2].ltext == nil)) and (TheoryCraft_WeaponSkills[i2].text == rtext) then
  347. skill = TheoryCraft_WeaponSkills[i2].skill
  348. english = TheoryCraft_WeaponSkills[i2].english
  349. break
  350. end
  351. i2 = i2 + 1
  352. end
  353. end
  354. if skill ~= TheoryCraft_WeaponSkillOther then
  355. break
  356. end
  357. i = i + 1
  358. end
  359. local i = 1
  360. local skillTitle, header, isExpanded, skillRank
  361. while GetSkillLineInfo(i) do
  362. skillTitle, header, isExpanded, skillRank = GetSkillLineInfo(i)
  363. if (skillTitle == skill) then
  364. critChance = critChance + (UnitLevel("player")*5 - skillRank)*0.04
  365. break
  366. end
  367. i = i + 1
  368. end
  369. -- remove weapon specs
  370. critChance = critChance - TheoryCraft_GetStat(english.."specreal")
  371. end
  372. critChance = critChance - (TheoryCraft_GetStat("CritChangeTalents") or 0)
  373. if doweaponskill == nil then
  374. critChance = critChance - (TheoryCraft_Data.Talents["Formcritchancereal"] or 0)
  375. remove = -1*(TheoryCraft_Data.Talents["Formcritchancereal"] or 0)
  376. end
  377. local critchance2 = critChance-TheoryCraft_GetStat("CritReport")
  378. if doweaponskill == nil then
  379. critChance = critChance + (TheoryCraft_Data.Talents["Formcritchance"] or 0)
  380. end
  381. if class == "WARRIOR" then
  382. local _, _, active = GetShapeshiftFormInfo(3)
  383. if active then
  384. critchance2 = critchance2 - 3
  385. remove = -3
  386. end
  387. end
  388. if UnitLevel("player") == 60 then
  389. if (class == "DRUID") then
  390. if doweaponskill == nil then
  391. remove = -1*(TheoryCraft_Data.Talents["Formcritchance"] or 0)
  392. end
  393. end
  394. TheoryCraft_agipercrit = TheoryCraft_CritChance[class][1]
  395. else
  396. if (TheoryCraft_Data["outfit"] == nil) or (TheoryCraft_Data["outfit"] == 1) then
  397. local _, agi = UnitStat("player", 2)
  398. TheoryCraft_agipercrit = agi/(critchance2-TheoryCraft_CritChance[class][3])
  399. end
  400. end
  401. return (critChance or 0), remove
  402. else
  403. return 0, remove
  404. end
  405. end
  406.  
  407. function TheoryCraft_LoadStats(talents)
  408. if talents == nil then talents = TheoryCraft_Data.Talents end
  409. TheoryCraft_DeleteTable(TheoryCraft_Data.Stats)
  410. local remove
  411. TheoryCraft_Data.Stats["meleecritchance"], remove = GetCritChance()
  412. TheoryCraft_Data.Stats["Rangedhastebonus"] = UnitRangedDamage("player")/TheoryCraft_GetRangedSpeed()
  413. local outfit = (TheoryCraft_Data["outfit"] or 1)
  414. if outfit == -1 then
  415. outfit = 1
  416. end
  417.  
  418. local _, tmp = UnitStat("player", 1)
  419. TheoryCraft_Data.Stats["strength"] = tmp
  420. _, tmp = UnitStat("player", 2)
  421. TheoryCraft_Data.Stats["agility"] = tmp
  422. _, tmp = UnitStat("player", 3)
  423. TheoryCraft_Data.Stats["stamina"] = tmp
  424. _, tmp = UnitStat("player", 4)
  425. TheoryCraft_Data.Stats["intellect"] = tmp
  426. _, tmp = UnitStat("player", 5)
  427. TheoryCraft_Data.Stats["spirit"] = tmp
  428. TheoryCraft_Data.Stats["agipercrit"] = agipercrit()
  429.  
  430. local _, catform, bearform
  431. if class == "DRUID" then
  432. _, _, bearform = GetShapeshiftFormInfo(1)
  433. _, _, catform = GetShapeshiftFormInfo(3)
  434. TheoryCraft_Data.Stats["agilityapranged"] = 2
  435. TheoryCraft_Data.Stats["strengthapmelee"] = 2
  436. if catform then
  437. TheoryCraft_Data.Stats["agilityapmelee"] = 1
  438. else
  439. TheoryCraft_Data.Stats["agilityapmelee"] = 0
  440. end
  441. elseif (class == "WARRIOR") or (class == "PALADIN") or (class == "SHAMAN") then
  442. TheoryCraft_Data.Stats["agilityapranged"] = 2
  443. TheoryCraft_Data.Stats["strengthapmelee"] = 2
  444. TheoryCraft_Data.Stats["agilityapmelee"] = 0
  445. elseif (class == "ROGUE") or (class == "HUNTER") then
  446. TheoryCraft_Data.Stats["agilityapranged"] = 2
  447. TheoryCraft_Data.Stats["strengthapmelee"] = 1
  448. TheoryCraft_Data.Stats["agilityapmelee"] = 1
  449. else
  450. TheoryCraft_Data.Stats["agilityapranged"] = 0
  451. TheoryCraft_Data.Stats["strengthapmelee"] = 1
  452. TheoryCraft_Data.Stats["agilityapmelee"] = 0
  453. end
  454.  
  455. local base, pos, neg = UnitAttackPower("player")
  456. TheoryCraft_Data.Stats["attackpower"] = base+pos+neg-TheoryCraft_Data.Stats["strengthapmelee"]*TheoryCraft_Data.Stats["strength"]-TheoryCraft_Data.Stats["agilityapmelee"]*TheoryCraft_Data.Stats["agility"]+(talents["AttackPowerTalents"] or 0)
  457. base, pos, neg = UnitRangedAttackPower("player")
  458. TheoryCraft_Data.Stats["rangedattackpower"] = (TheoryCraft_Data.TargetBuffs["huntersmark"] or 0)+base+pos+neg-TheoryCraft_Data.Stats["agilityapranged"]*TheoryCraft_Data.Stats["agility"]
  459.  
  460. TheoryCraft_Data.Stats["totalmana"] = UnitPowerMax("player")/talents["manamultiplierreal"]
  461. TheoryCraft_Data.Stats["totalhealth"] = UnitHealthMax("player")/talents["healthmultiplierreal"]
  462.  
  463. TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]-TheoryCraft_Data.Stats["agility"]/TheoryCraft_Data.Stats["agipercrit"]
  464. TheoryCraft_Data.Stats["totalhealth"] = TheoryCraft_Data.Stats["totalhealth"] - TheoryCraft_Data.Stats["stamina"]*10
  465. TheoryCraft_Data.Stats["totalmana"] = TheoryCraft_Data.Stats["totalmana"] - TheoryCraft_Data.Stats["intellect"]*15
  466.  
  467. TheoryCraft_Data.Stats["strength"] = TheoryCraft_Data.Stats["strength"]/talents["strmultiplierreal"]
  468. TheoryCraft_Data.Stats["agility"] = TheoryCraft_Data.Stats["agility"]/talents["agimultiplierreal"]
  469. TheoryCraft_Data.Stats["stamina"] = TheoryCraft_Data.Stats["stamina"]/talents["stammultiplierreal"]
  470. TheoryCraft_Data.Stats["intellect"] = TheoryCraft_Data.Stats["intellect"]/talents["intmultiplierreal"]
  471. TheoryCraft_Data.Stats["spirit"] = TheoryCraft_Data.Stats["spirit"]/talents["spiritmultiplierreal"]
  472. TheoryCraft_Data.Stats["formattackpower"] = 0
  473.  
  474. if (TheoryCraft_Outfits[outfit].meleecritchance) then TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_Outfits[outfit].meleecritchance end
  475. if (TheoryCraft_Outfits[outfit].rangedattackpower) then TheoryCraft_Data.Stats["rangedattackpower"] = TheoryCraft_Data.Stats["rangedattackpower"]+TheoryCraft_Outfits[outfit].rangedattackpower end
  476. if (TheoryCraft_Outfits[outfit].attackpower) then TheoryCraft_Data.Stats["attackpower"] = TheoryCraft_Data.Stats["attackpower"]+TheoryCraft_Outfits[outfit].attackpower end
  477. if (TheoryCraft_Outfits[outfit].formattackpower) then TheoryCraft_Data.Stats["formattackpower"] = TheoryCraft_Data.Stats["formattackpower"]+TheoryCraft_Outfits[outfit].formattackpower end
  478. if (TheoryCraft_Outfits[outfit].strength) then TheoryCraft_Data.Stats["strength"] = TheoryCraft_Data.Stats["strength"]+TheoryCraft_Outfits[outfit].strength end
  479. if (TheoryCraft_Outfits[outfit].agility) then TheoryCraft_Data.Stats["agility"] = TheoryCraft_Data.Stats["agility"]+TheoryCraft_Outfits[outfit].agility end
  480. if (TheoryCraft_Outfits[outfit].stamina) then TheoryCraft_Data.Stats["stamina"] = TheoryCraft_Data.Stats["stamina"]+TheoryCraft_Outfits[outfit].stamina end
  481. if (TheoryCraft_Outfits[outfit].intellect) then TheoryCraft_Data.Stats["intellect"] = TheoryCraft_Data.Stats["intellect"]+TheoryCraft_Outfits[outfit].intellect end
  482. if (TheoryCraft_Outfits[outfit].spirit) then TheoryCraft_Data.Stats["spirit"] = TheoryCraft_Data.Stats["spirit"]+TheoryCraft_Outfits[outfit].spirit end
  483. if (TheoryCraft_Outfits[outfit].totalmana) then TheoryCraft_Data.Stats["totalmana"] = TheoryCraft_Data.Stats["totalmana"]+TheoryCraft_Outfits[outfit].totalmana end
  484. if (TheoryCraft_Outfits[outfit].totalhealth) then TheoryCraft_Data.Stats["totalhealth"] = TheoryCraft_Data.Stats["totalhealth"]+TheoryCraft_Outfits[outfit].totalhealth end
  485.  
  486. local i = 1
  487. TheoryCraft_Data.DequippedSets = {}
  488. while (TheoryCraft_Outfits[outfit].destat[i]) do
  489. TheoryCraft_Data.Stats = TheoryCraft_DequipEffect(TheoryCraft_Outfits[outfit].destat[i], TheoryCraft_Data.Stats, TheoryCraft_Data.DequippedSets)
  490. i = i + 1
  491. end
  492.  
  493. local returndata
  494. for k,count in pairs(TheoryCraft_Data.DequippedSets) do
  495. if TheoryCraft_SetBonuses[k] then
  496. for k,v in pairs(TheoryCraft_SetBonuses[k]) do
  497. if (v["pieces"] <= count) then
  498. returndata = {}
  499. returndata = TheoryCraft_DequipLine(v["text"], returndata)
  500. for k,v in pairs(returndata) do
  501. TheoryCraft_Data.Stats[k] = (TheoryCraft_Data.Stats[k] or 0) + v
  502. end
  503. returndata = {}
  504. returndata = TheoryCraft_DequipSpecial(v["text"], returndata)
  505. for k,v in pairs(returndata) do
  506. TheoryCraft_Data.Stats[k] = (TheoryCraft_Data.Stats[k] or 0) + v
  507. end
  508. end
  509. end
  510. end
  511. end
  512.  
  513. if catform or bearform then TheoryCraft_Data.Stats["attackpower"] = TheoryCraft_Data.Stats["attackpower"] + TheoryCraft_Data.Stats["formattackpower"] end
  514. TheoryCraft_Data.Stats["strength"] = math.floor(TheoryCraft_Data.Stats["strength"] * talents["strmultiplier"])
  515. TheoryCraft_Data.Stats["agility"] = math.floor(TheoryCraft_Data.Stats["agility"] * talents["agimultiplier"])
  516. TheoryCraft_Data.Stats["rangedattackpower"] = math.floor(TheoryCraft_Data.Stats["rangedattackpower"]+TheoryCraft_Data.Stats["agilityapranged"]*TheoryCraft_Data.Stats["agility"])
  517. TheoryCraft_Data.Stats["attackpower"] = math.floor(TheoryCraft_Data.Stats["attackpower"]+TheoryCraft_Data.Stats["strengthapmelee"]*TheoryCraft_Data.Stats["strength"]+TheoryCraft_Data.Stats["agilityapmelee"]*TheoryCraft_Data.Stats["agility"])
  518. TheoryCraft_Data.Stats["intellect"] = math.floor(TheoryCraft_Data.Stats["intellect"] * talents["intmultiplier"])
  519. TheoryCraft_Data.Stats["stamina"] = math.floor(TheoryCraft_Data.Stats["stamina"] * talents["stammultiplier"])
  520. TheoryCraft_Data.Stats["spirit"] = math.floor(TheoryCraft_Data.Stats["spirit"] * talents["spiritmultiplier"])
  521. TheoryCraft_Data.Stats["totalhealth"] = (TheoryCraft_Data.Stats["totalhealth"] + TheoryCraft_Data.Stats["stamina"]*10)*talents["healthmultiplier"]
  522. TheoryCraft_Data.Stats["totalmana"] = (TheoryCraft_Data.Stats["totalmana"] + TheoryCraft_Data.Stats["intellect"]*15)*talents["manamultiplier"]
  523. TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_Data.Stats["agility"]/TheoryCraft_Data.Stats["agipercrit"]
  524. TheoryCraft_Data.Stats["rangedcritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+(talents["Huntercritchance"] or 0)
  525. TheoryCraft_Data.Stats["critchance"] = TheoryCraft_Data.Stats["intellect"]/TheoryCraft_intpercrit()+TheoryCraft_CritChance[class][4]
  526. if class == "MAGE" then
  527. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/8+6.25
  528. elseif class == "PRIEST" then
  529. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/8+6.25
  530. elseif class == "WARLOCK" then
  531. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/10+7.5
  532. elseif class == "DRUID" then
  533. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/10+7.5
  534. elseif class == "SHAMAN" then
  535. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/10+8.5
  536. elseif class == "HUNTER" then
  537. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/10+7.5
  538. elseif class == "PALADIN" then
  539. TheoryCraft_Data.Stats["regenfromspirit"] = TheoryCraft_Data.Stats["spirit"]/10+7.5
  540. elseif class == "ROGUE" then
  541. TheoryCraft_Data.Stats["regenfromspirit"] = 0
  542. elseif class == "WARRIOR" then
  543. TheoryCraft_Data.Stats["regenfromspirit"] = 0
  544. end
  545.  
  546. TheoryCraft_Data.Stats["meleecritchancereal"] = TheoryCraft_Data.Stats["meleecritchance"]+(remove or 0)
  547. if (TheoryCraft_Data.EquipEffects["FistEquipped"] or 0) >= 1 then
  548. TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_GetStat("Fistspec")
  549. end
  550. if (TheoryCraft_Data.EquipEffects["DaggerEquipped"] or 0) >= 1 then
  551. TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_GetStat("Daggerspec")
  552. end
  553. if (TheoryCraft_Data.EquipEffects["AxeEquipped"] or 0) >= 1 then
  554. TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_GetStat("Axespec")
  555. end
  556. if (TheoryCraft_Data.EquipEffects["PolearmEquipped"] or 0) >= 1 then
  557. TheoryCraft_Data.Stats["meleecritchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_GetStat("Polearmspec")
  558. end
  559. local meleeapmult = TheoryCraft_GetStat("MeleeAPMult")
  560. if meleeapmult > 3 then
  561. TheoryCraft_Data.Stats["Meleemodifier"] = (talents["Twohandmodifier"] or 0)+(talents["Twohandtalentmod"] or 0)
  562. elseif meleeapmult > 1 then
  563. TheoryCraft_Data.Stats["Meleemodifier"] = (talents["Onehandmodifier"] or 0)+(talents["Onehandtalentmod"] or 0)
  564. end
  565. local manaregen = TheoryCraft_GetStat("manaperfive")/5
  566. manaregen = manaregen+TheoryCraft_Data.Stats["totalmana"]*TheoryCraft_GetStat("FelEnergy")/4
  567. TheoryCraft_Data.Stats["regen"] = manaregen+TheoryCraft_Data.Stats["regenfromspirit"]
  568. TheoryCraft_Data.Stats["icregen"] = manaregen+(TheoryCraft_Data.Stats["regenfromspirit"])*TheoryCraft_GetStat("ICPercent")
  569. if (class == "MAGE") then
  570. TheoryCraft_Data.Stats["maxtotalmana"] = TheoryCraft_Data.Stats["totalmana"]+TheoryCraft_Data.Stats["regenfromspirit"]*15*8+1100+manaregen*8
  571. end
  572. if (class == "WARLOCK") then
  573. getlifetap(TheoryCraft_Data.Stats)
  574. end
  575.  
  576. TheoryCraft_Data.Stats["All"] = math.floor(TheoryCraft_Data.Stats["spirit"]*(talents["Allspiritual"] or 0))
  577. TheoryCraft_Data.Stats["BlockValue"] = TheoryCraft_GetStat("BlockValueReport")+(TheoryCraft_Data.Stats["strength"]/20) - 1
  578. end
  579.  
  580. local function AddProcs(casttime, returndata, spelldata)
  581. TheoryCraft_Data.Procs = {}
  582. if TheoryCraft_Settings["procs"] == nil then return end
  583. if (spelldata == nil) or (spelldata.Schools == nil) then return end
  584. if TheoryCraft_Data.EquipEffects["procs"] then
  585. local i = 1
  586. local amount, procduration
  587. while TheoryCraft_Data.EquipEffects["procs"][i] do
  588. amount = TheoryCraft_Data.EquipEffects["procs"][i].amount
  589. if TheoryCraft_Data.EquipEffects["procs"][i].exact then
  590. procduration = 1 - (1 - TheoryCraft_Data.EquipEffects["procs"][i].proc)^math.floor(TheoryCraft_Data.EquipEffects["procs"][i].duration/casttime)
  591. else
  592. procduration = 1 - (1 - TheoryCraft_Data.EquipEffects["procs"][i].proc)^(TheoryCraft_Data.EquipEffects["procs"][i].duration/casttime)
  593. end
  594. TheoryCraft_Data.Procs[TheoryCraft_Data.EquipEffects["procs"][i].type] = (TheoryCraft_Data.Procs[TheoryCraft_Data.EquipEffects["procs"][i].type] or 0)+amount*procduration
  595. i = i + 1
  596. end
  597. i = 1
  598. while (spelldata.Schools[i]) do
  599. TheoryCraft_AddData(spelldata.Schools[i], TheoryCraft_Data.Procs, returndata)
  600. i = i+1
  601. end
  602. if TheoryCraft_Data.Procs["ICPercent"] then
  603. TheoryCraft_Data.Stats["icregen"] = TheoryCraft_GetStat("manaperfive")/5+(TheoryCraft_Data.Stats["regenfromspirit"])*(TheoryCraft_GetStat("ICPercent")+TheoryCraft_Data.Procs["ICPercent"])
  604. end
  605. end
  606. end
  607.  
  608. local function CleanUp(spelldata, returndata)
  609. if spelldata.percent == 0 then
  610. returndata["plusdam"] = nil
  611. returndata["damfinal"] = nil
  612. returndata["damcoef"] = nil
  613. end
  614. if spelldata.ismelee then
  615. returndata["manacost"] = nil
  616. returndata["plusdam"] = nil
  617. end
  618. if spelldata.isheal then
  619. returndata["penetration"] = nil
  620. end
  621. if spelldata.armor then
  622. returndata["plusdam"] = nil
  623. returndata["penetration"] = nil
  624. end
  625. if spelldata.dodps == nil then
  626. returndata["hps"] = nil
  627. returndata["withhothps"] = nil
  628. returndata["hpsdam"] = nil
  629. returndata["hpsdampercent"] = nil
  630. returndata["dps"] = nil
  631. returndata["withdotdps"] = nil
  632. returndata["dpsdam"] = nil
  633. returndata["dpsdampercent"] = nil
  634. end
  635. if (spelldata.usemelee) or (spelldata.petspell) then
  636. returndata["nextpendam"] = nil
  637. returndata["nextpen"] = nil
  638. returndata["penetration"] = nil
  639. end
  640. if spelldata.petspell then
  641. returndata["damcoef"] = nil
  642. returndata["dpsdam"] = nil
  643. returndata["dpsdampercent"] = nil
  644. returndata["plusdam"] = nil
  645. returndata["dameff"] = nil
  646. returndata["damfinal"] = nil
  647. returndata["lifetapdps"] = nil
  648. returndata["lifetapdpm"] = nil
  649. returndata["nextagidps"] = nil
  650. returndata["nexthitdps"] = nil
  651. returndata["nextcritdps"] = nil
  652. returndata["nextstrdpsequive"] = nil
  653. returndata["nextagidpsequive"] = nil
  654. returndata["nexthitdpsequive"] = nil
  655. returndata["nextcritdpsequive"] = nil
  656. returndata["nextagidam"] = nil
  657. returndata["nextpendam"] = nil
  658. returndata["nexthitdam"] = nil
  659. returndata["nextcritdam"] = nil
  660. returndata["nextstrdamequive"] = nil
  661. returndata["nextagidamequive"] = nil
  662. returndata["nextpendamequive"] = nil
  663. returndata["nexthitdamequive"] = nil
  664. returndata["nextcritdamequive"] = nil
  665. returndata["regendam"] = nil
  666. returndata["icregendam"] = nil
  667. returndata["nextcritheal"] = nil
  668. returndata["nextcrithealequive"] = nil
  669. returndata["hpsdam"] = nil
  670. returndata["hpsdampercent"] = nil
  671. returndata["regenheal"] = nil
  672. returndata["icregenheal"] = nil
  673. end
  674.  
  675. if (spelldata.dontdpsafterresists) then
  676. returndata["nexthitdam"] = nil
  677. end
  678.  
  679. if (spelldata.cancrit == nil) then
  680. returndata["nextcritdam"] = nil
  681. returndata["nextcritdamequive"] = nil
  682. returndata["nextcritdps"] = nil
  683. returndata["nextcritdpsequive"] = nil
  684. returndata["critchance"] = nil
  685. returndata["critdmgchance"] = nil
  686. returndata["crithealchance"] = nil
  687. returndata["critdmgmin"] = nil
  688. returndata["critdmgmax"] = nil
  689. returndata["critdmgminminusignite"] = nil
  690. returndata["critdmgmaxminusignite"] = nil
  691. returndata["crithealmin"] = nil
  692. returndata["crithealmax"] = nil
  693. end
  694. end
  695.  
  696. local function GenerateTooltip(frame, returndata, spelldata, spellrank)
  697. returndata["RangedAPMult"] = 2.8
  698. if (frame == nil) or (frame:NumLines() == 0) then
  699. CleanUp(spelldata, returndata)
  700. return
  701. end
  702. if spelldata.evocation then
  703. CleanUp(spelldata, returndata)
  704. returndata["evocation"] = TheoryCraft_GetStat("maxtotalmana")-TheoryCraft_GetStat("totalmana")-1100
  705. return
  706. end
  707. if (spelldata.isranged) then
  708. if TheoryCraft_Data.EquipEffects["RangedSpeed"] == nil then
  709. CleanUp(spelldata, returndata)
  710. return
  711. end
  712. end
  713. if (spelldata.isseal) then
  714. if TheoryCraft_Data.EquipEffects["MainSpeed"] == nil then
  715. CleanUp(spelldata, returndata)
  716. return
  717. end
  718. end
  719.  
  720. if (spelldata.id == "Backstab") then
  721. if TheoryCraft_GetStat("DaggerEquipped") == 0 then
  722. CleanUp(spelldata, returndata)
  723. return
  724. end
  725. end
  726. if (spelldata.ismelee) then
  727. if TheoryCraft_Data.EquipEffects["MainSpeed"] == nil then
  728. CleanUp(spelldata, returndata)
  729. return
  730. end
  731. local i = 1
  732. returndata["critchance"] = TheoryCraft_Data.Stats["meleecritchance"]+TheoryCraft_GetStat(spelldata.id.."critchance")
  733. while spelldata.Schools[i] do
  734. returndata["critchance"] = returndata["critchance"]+TheoryCraft_GetStat(spelldata.Schools[i].."critchance")
  735. i = i + 1
  736. end
  737. end
  738. if (spelldata.bearform) then
  739. local _, _, active = GetShapeshiftFormInfo(1)
  740. if active == nil then
  741. CleanUp(spelldata, returndata)
  742. return
  743. end
  744. end
  745. if (spelldata.catform) then
  746. local _, _, active = GetShapeshiftFormInfo(3)
  747. if active == nil then
  748. CleanUp(spelldata, returndata)
  749. return
  750. end
  751. end
  752. if (spelldata.usemelee) then
  753. returndata["critchance"] = (TheoryCraft_Data.Stats["meleecritchance"] or 0)+TheoryCraft_GetStat("Holycritchance")
  754. returndata["critbonus"] = 1
  755. end
  756. if (spelldata.isranged) or ((class == "HUNTER") and (spelldata.ismelee == nil)) then
  757. returndata["critchance"] = TheoryCraft_Data.Stats["rangedcritchance"]
  758. end
  759. returndata["description"] = getglobal(frame:GetName().."TextLeft"..frame:NumLines()):GetText()
  760. returndata["casttime"] = getcasttime(frame)+(returndata["casttime"] or 0)
  761. returndata["manacost"] = getmanacost(frame)
  762. if not (spelldata.shoot or spelldata.ismelee or spelldata.isranged) then
  763. returndata["basemanacost"] = returndata["manacost"]
  764. end
  765. if returndata["casttime"] < 1.5 then
  766. returndata["casttime"] = 1.5
  767. end
  768. returndata["regencasttime"] = returndata["casttime"]
  769. if (spelldata.casttime) then
  770. returndata["casttime"] = spelldata.casttime
  771. end
  772. AddProcs(returndata["casttime"], returndata, spelldata)
  773. if (spelldata.regencasttime) then
  774. returndata["regencasttime"] = spelldata.regencasttime
  775. end
  776. if (returndata["netherwind"] == 1) and (TheoryCraft_Settings["procs"]) then
  777. if (returndata["casttime"] > 1.5) then returndata["casttime"] = (returndata["casttime"]-1.5)*0.9+1.5 end
  778. if (returndata["regencasttime"] > 1.5) then returndata["regencasttime"] = (returndata["regencasttime"]-1.5)*0.9+1.5 end
  779. end
  780. local spelllevel = 60
  781. local levelpercent = 1
  782. returndata["manamultiplier"] = spelldata.manamultiplier
  783. if (spelldata["level"..spellrank]) then spelllevel = spelldata["level"..spellrank] end
  784. if (spelldata["level"..spellrank.."per"]) then levelpercent = spelldata["level"..spellrank.."per"] end
  785. if (spelldata["level"..spellrank.."manamult"]) then returndata["manamultiplier"] = spelldata["level"..spellrank.."manamult"] end
  786. if (spelldata["level"..spellrank.."ct"]) then
  787. returndata["casttime"] = spelldata["level"..spellrank.."ct"]
  788. returndata["regencasttime"] = spelldata["level"..spellrank.."ct"]
  789. end
  790. if (spelllevel < 20) then
  791. levelpercent = levelpercent*(0.0375*spelllevel+0.25)
  792. end
  793.  
  794. returndata["dotduration"] = TheoryCraft_getDotDuration(returndata["description"])
  795. returndata["basedotduration"] = spelldata.basedotduration
  796. if (spelldata.ismelee == nil) and (spelldata.isranged == nil) then
  797. if (spelldata.isheal == nil) and (spelldata.talentsbeforegear == nil) then
  798. returndata["damcoef"] = spelldata.percent*returndata["tmpincrease"]*returndata["tmpincreaseupfront"]*levelpercent
  799. else
  800. returndata["damcoef"] = spelldata.percent*levelpercent
  801. end
  802. if (spelldata.righteousness) then
  803. if (TheoryCraft_Data.EquipEffects["MeleeAPMult"] >= 3) then
  804. returndata["damcoef"] = spelldata.percent2*returndata["tmpincrease"]*levelpercent
  805. end
  806. end
  807. if (spelldata.hasdot == 1) then
  808. returndata["damcoef2"] = spelldata.percentdot
  809. returndata["plusdam2"] = math.floor(returndata["plusdam"] * returndata["damcoef2"] * levelpercent)
  810. end
  811. if (newcasttime) and (spelldata.isdot) then
  812. returndata["damcoef"] = returndata["damcoef"]*newcasttime/returndata["basedotduration"]
  813. returndata["casttime"] = newcasttime
  814. end
  815.  
  816. if(spelldata.id =="Flash Heal") then
  817. returndata["damfinal"] = 0
  818. elseif(spelldata.id =="Greater Heal") then
  819. returndata["damfinal"] = 0
  820. else
  821. returndata["damfinal"] = 0 --spelldata.id -- GetSpellBonusDamage(6) -- ICI
  822. end
  823. end
  824.  
  825. if returndata["critchance"] > 100 then
  826. returndata["critchance"] = 100
  827. end
  828. returndata["critbonus"] = returndata["critbonus"]+returndata["sepignite"]*(returndata["baseincrease"]+returndata["ignitemodifier"]-1)
  829. returndata["sepignite"] = returndata["sepignite"]*returndata["baseincrease"]
  830.  
  831. returndata["talentbaseincrease"] = (1/returndata["tmpincrease"])*(returndata["talentmod"]+returndata["tmpincrease"])
  832. returndata["talentbaseincreaseupfront"] = (1/returndata["tmpincreaseupfront"])*(returndata["talentmodupfront"]+returndata["tmpincreaseupfront"])
  833. if (spelldata.talentsbeforegear == nil) and (returndata["damcoef"]) then
  834. returndata["damcoef"] = returndata["damcoef"]*returndata["talentbaseincrease"]*returndata["talentbaseincreaseupfront"]
  835. end
  836. if class == "DRUID" then
  837. local _, bearform, catform
  838. _, _, bearform = GetShapeshiftFormInfo(1)
  839. _, _, catform = GetShapeshiftFormInfo(3)
  840. if catform then
  841. TheoryCraft_Data.EquipEffects["MeleeAPMult"] = 1
  842. TheoryCraft_Data.EquipEffects["MainSpeed"] = 1
  843. elseif bearform then
  844. TheoryCraft_Data.EquipEffects["MeleeAPMult"] = 2.5
  845. TheoryCraft_Data.EquipEffects["MainSpeed"] = 2.5
  846. end
  847. if (bearform) or (catform) then
  848. local lowDmg, hiDmg, offlowDmg, offhiDmg, posBuff, negBuff, percentmod = UnitDamage("player")
  849. local base, pos, neg = UnitAttackPower("player")
  850. base = (base+pos+neg)/14*TheoryCraft_Data.EquipEffects["MeleeAPMult"]
  851. TheoryCraft_Data.EquipEffects["MeleeMin"] = lowDmg-base
  852. TheoryCraft_Data.EquipEffects["MeleeMax"] = hiDmg-lowDmg+TheoryCraft_Data.EquipEffects["MeleeMin"]
  853. end
  854. end
  855. TheoryCraft_getMinMax(spelldata, returndata, frame)
  856. if spelldata.cancrit then
  857. if spelldata.drain then
  858. returndata["critdmgchance"] = returndata["critchance"]
  859. returndata["crithealchance"] = returndata["critchance"]
  860. elseif spelldata.isheal then
  861. returndata["crithealchance"] = returndata["critchance"]
  862. else
  863. returndata["critdmgchance"] = returndata["critchance"]
  864. end
  865. end
  866.  
  867. if spelldata.isheal == nil then
  868. returndata["manacost"] = returndata["manacost"]-returndata["manacost"]*(TheoryCraft_Data.Talents["clearcast"] or 0)
  869. end
  870. if (returndata["manamultiplier"]) then
  871. returndata["manacost"] = returndata["manacost"]*returndata["manamultiplier"]
  872. end
  873. returndata["manacost"] = returndata["manacost"]-TheoryCraft_Data.Stats["icregen"]*returndata["regencasttime"]
  874. returndata["manacost"] = returndata["manacost"]*returndata["manacostmod"]
  875.  
  876. if (returndata["crithealchance"]) and (returndata["crithealchance"] > 100) then
  877. returndata["crithealchance"] = 100
  878. end
  879. if (returndata["critdmgchance"]) and (returndata["critdmgchance"] > 100) then
  880. returndata["critdmgchance"] = 100
  881. end
  882.  
  883. if spelldata.dontusemelee then
  884. returndata["critbonus"] = 0.5
  885. end
  886. if (spelldata.isseal) or (spelldata.ismelee) or (spelldata.isranged) then
  887. if (returndata["mindamage"] and returndata["maxdamage"] and (spelldata.isseal == nil)) and (spelldata.block == nil) then
  888. returndata["critdmgmin"] = returndata["mindamage"]*(returndata["critbonus"]+1)
  889. returndata["critdmgmax"] = returndata["maxdamage"]*(returndata["critbonus"]+1)
  890. returndata["averagedamnocrit"] = (returndata["maxdamage"]+returndata["mindamage"])/2
  891. returndata["averagecritdam"] = returndata["averagedamnocrit"]*returndata["critbonus"]
  892. returndata["averagedam"] = returndata["averagedamnocrit"]+returndata["averagecritdam"]*returndata["critdmgchance"]/100
  893. returndata["nextagidam"] = 10*TheoryCraft_Data.Talents["agimultiplier"]
  894. if spelldata.ismelee then
  895. if spelldata.nextattack then
  896. local attackpower = 10*TheoryCraft_Data.Talents["agimultiplier"]*TheoryCraft_Data.Stats["agilityapmelee"]
  897. local addeddamage = attackpower*(TheoryCraft_Data.EquipEffects["MainSpeed"])*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Meleemodifier")/14
  898. local addedcritpercent = 10*TheoryCraft_Data.Talents["agimultiplier"]/TheoryCraft_Data.Stats["agipercrit"]/100
  899. returndata["nextagidam"] = addedcritpercent*returndata["averagecritdam"]+addeddamage*(addedcritpercent+returndata["critdmgchance"]/100)*returndata["critbonus"]+addeddamage
  900. returndata["damworth"] = (1+(returndata["critchance"]/100)*returndata["critbonus"])*(TheoryCraft_Data.EquipEffects["MainSpeed"])/14*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Meleemodifier")
  901. elseif returndata["bloodthirstmult"] then
  902. local attackpower = 10*TheoryCraft_Data.Talents["agimultiplier"]*TheoryCraft_Data.Stats["agilityapmelee"]
  903. local addeddamage = attackpower*returndata["bloodthirstmult"]*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Meleemodifier")/14
  904. local addedcritpercent = 10*TheoryCraft_Data.Talents["agimultiplier"]/TheoryCraft_Data.Stats["agipercrit"]/100
  905. returndata["nextagidam"] = addedcritpercent*returndata["averagecritdam"]+addeddamage*(addedcritpercent+returndata["critdmgchance"]/100)*returndata["critbonus"]+addeddamage
  906. returndata["damworth"] = (1+(returndata["critchance"]/100)*returndata["critbonus"])*returndata["bloodthirstmult"]*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Meleemodifier")
  907. else
  908. local attackpower = 10*TheoryCraft_Data.Talents["agimultiplier"]*TheoryCraft_Data.Stats["agilityapmelee"]
  909. local addeddamage = attackpower*TheoryCraft_Data.EquipEffects["MeleeAPMult"]*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Meleemodifier")/14
  910. local addedcritpercent = 10*TheoryCraft_Data.Talents["agimultiplier"]/TheoryCraft_Data.Stats["agipercrit"]/100
  911. returndata["nextagidam"] = addedcritpercent*returndata["averagecritdam"]+addeddamage*(addedcritpercent+returndata["critdmgchance"]/100)*returndata["critbonus"]+addeddamage
  912. returndata["damworth"] = (1+(returndata["critchance"]/100)*returndata["critbonus"])*TheoryCraft_Data.EquipEffects["MeleeAPMult"]/14*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Meleemodifier")
  913. end
  914. returndata["nextstrdam"] = 10*TheoryCraft_Data.Talents["strmultiplier"]*TheoryCraft_Data.Stats["strengthapmelee"]*returndata["damworth"]
  915. else
  916. local attackpower = 10*TheoryCraft_Data.Talents["agimultiplier"]*TheoryCraft_Data.Stats["agilityapranged"]
  917. local addeddamage = attackpower*returndata["RangedAPMult"]*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Rangedmodifier")/14
  918. local addedcritpercent = 10*TheoryCraft_Data.Talents["agimultiplier"]/TheoryCraft_Data.Stats["agipercrit"]/100
  919. returndata["nextagidam"] = addedcritpercent*returndata["averagecritdam"]+addeddamage*(addedcritpercent+returndata["critdmgchance"]/100)*returndata["critbonus"]+addeddamage
  920. returndata["damworth"] = (1+(returndata["critchance"]/100)*returndata["critbonus"])*returndata["RangedAPMult"]/14*returndata["backstabmult"]*returndata["baseincrease"]*TheoryCraft_GetStat("Rangedmodifier")
  921. end
  922.  
  923. returndata["nextcritdam"] = returndata["averagecritdam"]/100
  924. returndata["nexthitdam"] = returndata["averagedamnocrit"]/100
  925. if (returndata["damworth"] ~= 0) then
  926. if returndata["nextstrdam"] then
  927. returndata["nextstrdamequive"] = returndata["nextstrdam"]/returndata["damworth"]
  928. end
  929. returndata["nexthitdamequive"] = returndata["nexthitdam"]/returndata["damworth"]
  930. returndata["nextcritdamequive"] = returndata["nextcritdam"]/returndata["damworth"]
  931. returndata["nextagidamequive"] = returndata["nextagidam"]/returndata["damworth"]
  932. end
  933. if (spelldata.isranged) and (spelldata.shoot == nil) then
  934. if (spelldata.autoshot) then
  935. returndata["dpm"] = returndata["msrotationlength"]*returndata["msrotationdps"]/returndata["manacost"]
  936. returndata["maxoomdam"] = (TheoryCraft_Data.Stats["totalmana"]+TheoryCraft_GetStat("manarestore"))*returndata["dpm"]
  937. returndata["maxoomdamtime"] = returndata["maxoomdam"]/returndata["dps"]
  938. returndata["regendam"] = TheoryCraft_Data.Stats["regen"]*10*returndata["dpm"]
  939. returndata["icregendam"] = TheoryCraft_Data.Stats["icregen"]*10*returndata["dpm"]
  940. else
  941. if TheoryCraft_Settings["dontcritdpm"] then
  942. returndata["dpm"] = returndata["averagedamnocrit"]/returndata["manacost"]
  943. else
  944. returndata["dpm"] = returndata["averagedam"]/returndata["manacost"]
  945. end
  946. returndata["regendam"] = TheoryCraft_Data.Stats["regen"]*10*returndata["dpm"]
  947. returndata["icregendam"] = TheoryCraft_Data.Stats["icregen"]*10*returndata["dpm"]
  948. end
  949. end
  950. end
  951. else
  952. if class == "DRUID" then
  953. if (spelldata.cancrit) and (returndata["grace"] ~= 0) and (not TheoryCraft_Settings["dontcrit"]) then
  954. returndata["casttime"] = returndata["casttime"]-(returndata["critchance"]/100)*returndata["grace"]
  955. if returndata["casttime"] < 1.5 then
  956. returndata["casttime"] = 1.5
  957. end
  958. end
  959. end
  960. if (class == "MAGE") then
  961. if (returndata["critdmgchance"]) and (not TheoryCraft_Settings["dontcrit"]) then
  962. returndata["manacost"] = returndata["manacost"]-returndata["manacost"]*((returndata["critdmgchance"]/100)*returndata["illum"])
  963. end
  964. end
  965.  
  966. if returndata["mindamage"] then
  967. if returndata["maxdamage"] == nil then
  968. returndata["maxdamage"] = returndata["mindamage"]
  969. end
  970. returndata["critdmgmin"] = returndata["mindamage"]*(returndata["critbonus"]+1)
  971. returndata["critdmgmax"] = returndata["maxdamage"]*(returndata["critbonus"]+1)
  972. returndata["averagedamnocrit"] = (returndata["maxdamage"]+returndata["mindamage"])/2
  973. returndata["averagedpsdamnocrit"] = returndata["damfinal"]
  974. if spelldata.cancrit then
  975. returndata["critdmgmin"] = returndata["mindamage"]*(returndata["critbonus"]+1)
  976. returndata["critdmgmax"] = returndata["maxdamage"]*(returndata["critbonus"]+1)
  977. if (returndata["sepignite"] ~= 0) then
  978. returndata["critdmgminminusignite"] = ((returndata["critdmgmin"]/(returndata["critbonus"]+1))*(1+returndata["critbonus"]-returndata["sepignite"]))
  979. returndata["critdmgmaxminusignite"] = ((returndata["critdmgmax"]/(returndata["critbonus"]+1))*(1+returndata["critbonus"]-returndata["sepignite"]))
  980. end
  981.  
  982. if (TheoryCraft_Settings["rollignites"]) and (not spelldata.dontdomax) and (returndata["sepignite"] ~= 0) and (returndata["critdmgchance"] < 99) then
  983. local ignitecritmin = returndata["critdmgmin"]-(returndata["critdmgmin"]/(returndata["critbonus"]+1))*(1+returndata["critbonus"]-returndata["sepignite"])
  984. local ignitecritmax = returndata["critdmgmax"]-(returndata["critdmgmax"]/(returndata["critbonus"]+1))*(1+returndata["critbonus"]-returndata["sepignite"])
  985. local igniteaverage = (ignitecritmax-ignitecritmin)/2+ignitecritmin
  986. local noignitecritmin = returndata["critdmgmin"]-ignitecritmin-returndata["mindamage"]
  987. local noignitecritmax = returndata["critdmgmax"]-ignitecritmax-returndata["maxdamage"]
  988. local noigniteaverage = (noignitecritmin+noignitecritmax)/2
  989. local rollchance = (returndata["critdmgchance"]/100)
  990. local ignitelength = 4+rollchance*4+(rollchance^2)*4+(rollchance^3)*4+(rollchance^4)*4+(rollchance^5)*4+(rollchance^6)*4
  991. returndata["averagecritdam"] = noigniteaverage+ignitelength*igniteaverage/4
  992. rollchance = ((returndata["critdmgchance"]+1)/100)
  993. local newignitelength = 4+rollchance*4+(rollchance^2)*4+(rollchance^3)*4+(rollchance^4)*4+(rollchance^5)*4+(rollchance^6)*4
  994. -- Average Crit Damage
  995. returndata["nextcritdam"] = noigniteaverage+newignitelength*igniteaverage/4
  996. -- Damage from extra ignite length
  997. returndata["nextcritdam"] = (returndata["nextcritdam"]+(newignitelength-ignitelength)*igniteaverage/4*returndata["critdmgchance"])/100
  998. else
  999. returndata["averagecritdam"] = returndata["averagedamnocrit"]*returndata["critbonus"]
  1000. returndata["nextcritdam"] = returndata["averagecritdam"]/100
  1001. end
  1002. returndata["damhitworth"] = returndata["damcoef"]
  1003. returndata["damcritworth"] = returndata["damcoef"]*(returndata["critbonus"]+1)
  1004. returndata["damworth"] = returndata["damcoef"]*(1+returndata["critdmgchance"]*returndata["critbonus"]/100)
  1005. returndata["averagedam"] = returndata["averagedamnocrit"]+returndata["averagecritdam"]*returndata["critdmgchance"]/100
  1006. returndata["nextcritdam"] = returndata["nextcritdam"] + returndata["averagedam"]*returndata["grace"]
  1007. returndata["nextcritdamequive"] = returndata["nextcritdam"]/returndata["damworth"]
  1008. else
  1009. returndata["averagecritdam"] = 0
  1010. returndata["averagedam"] = returndata["averagedamnocrit"]
  1011. returndata["damhitworth"] = returndata["damcoef"]
  1012. returndata["damcritworth"] = 0
  1013. returndata["damworth"] = returndata["damcoef"]
  1014. end
  1015. returndata["averagedamthreat"] = returndata["averagedam"]*returndata["threat"]
  1016. returndata["averagedamthreatpercent"] = returndata["averagedamthreat"]/returndata["averagedam"]*100
  1017. if (not TheoryCraft_Settings["dontcrit"]) then
  1018. returndata["averagedpsdam"] = returndata["averagedpsdamnocrit"]*(returndata["averagedam"]/returndata["averagedamnocrit"])
  1019. else
  1020. returndata["averagedpsdam"] = returndata["averagedpsdamnocrit"]
  1021. end
  1022. if spelldata.tickinterval then
  1023. if (spelldata.hasdot) and (returndata["dotdamage"]) then
  1024. returndata["averagedamtick"] = returndata["dotdamage"]/returndata["dotduration"]*spelldata.tickinterval
  1025. returndata["averagedamticknocrit"] = returndata["dotdamage"]/returndata["dotduration"]*spelldata.tickinterval
  1026. else
  1027. if returndata["manamultiplier"] then
  1028. if (TheoryCraft_Settings["dontcrit"]) then
  1029. returndata["averagedamtick"] = returndata["averagedamnocrit"]/returndata["manamultiplier"]/returndata["dotduration"]*spelldata.tickinterval
  1030. else
  1031. returndata["averagedamtick"] = returndata["averagedam"]/returndata["manamultiplier"]/returndata["dotduration"]*spelldata.tickinterval
  1032. end
  1033. else
  1034. if (TheoryCraft_Settings["dontcrit"]) then
  1035. returndata["averagedamtick"] = returndata["averagedamnocrit"]/returndata["dotduration"]*spelldata.tickinterval
  1036. else
  1037. returndata["averagedamtick"] = returndata["averagedam"]/returndata["dotduration"]*spelldata.tickinterval
  1038. end
  1039. end
  1040. end
  1041. end
  1042. if spelldata.coa then
  1043. local tick1 = round((returndata["averagedam"]-returndata["damfinal"]*returndata["baseincrease"])/24+returndata["damfinal"]*returndata["baseincrease"]/12)
  1044. local tick2 = round((returndata["averagedam"]-returndata["damfinal"]*returndata["baseincrease"])/12+returndata["damfinal"]*returndata["baseincrease"]/12)
  1045. local tick3 = round((returndata["averagedam"]-returndata["damfinal"]*returndata["baseincrease"])/8+returndata["damfinal"]*returndata["baseincrease"]/12)
  1046. returndata["averagedamtick"] = tick1..", "..tick2..", "..tick3
  1047. end
  1048. if spelldata.starshards then
  1049. local tick1 = round((returndata["averagedam"]-returndata["damfinal"]*returndata["baseincrease"])/10+returndata["damfinal"]*returndata["baseincrease"]/6)
  1050. local tick2 = round((returndata["averagedam"]-returndata["damfinal"]*returndata["baseincrease"])/6+returndata["damfinal"]*returndata["baseincrease"]/6)
  1051. local tick3 = round((returndata["averagedam"]-returndata["damfinal"]*returndata["baseincrease"])/4.5+returndata["damfinal"]*returndata["baseincrease"]/6)
  1052. returndata["averagedamtick"] = tick1..", "..tick2..", "..tick3
  1053. end
  1054. if (TheoryCraft_Settings["dontcrit"]) then
  1055. returndata["dpm"] = returndata["averagedamnocrit"]/returndata["manacost"]
  1056. else
  1057. returndata["dpm"] = returndata["averagedam"]/returndata["manacost"]
  1058. end
  1059. if (TheoryCraft_Data.Stats["lifetapMana"]) and (TheoryCraft_Data.Stats["lifetapHealth"]) then
  1060. returndata["lifetapdpm"] = returndata["dpm"]*returndata["manacost"]/(returndata["manacost"]/TheoryCraft_Data.Stats["lifetapMana"]*TheoryCraft_Data.Stats["lifetapHealth"])
  1061. end
  1062. if (spelldata.overcooldown) then
  1063. if (TheoryCraft_Settings["dontcrit"]) then
  1064. returndata["dps"] = returndata["averagedamnocrit"]/getcooldown(frame)
  1065. else
  1066. returndata["dps"] = returndata["averagedam"]/getcooldown(frame)
  1067. end
  1068. returndata["dpsdam"] = returndata["averagedpsdam"]/getcooldown(frame)
  1069. else
  1070. if (TheoryCraft_Settings["dotoverct"]) and (spelldata.isdot) then
  1071. if (TheoryCraft_Settings["dontcrit"]) then
  1072. returndata["dps"] = returndata["averagedamnocrit"]/returndata["casttime"]
  1073. else
  1074. returndata["dps"] = returndata["averagedam"]/returndata["casttime"]
  1075. end
  1076. returndata["dpsdam"] = returndata["averagedpsdam"]/returndata["casttime"]
  1077. else
  1078. if spelldata.isdot then
  1079. if (TheoryCraft_Settings["dontcrit"]) then
  1080. returndata["dps"] = returndata["averagedamnocrit"]/returndata["dotduration"]
  1081. else
  1082. returndata["dps"] = returndata["averagedam"]/returndata["dotduration"]
  1083. end
  1084. returndata["dpsdam"] = returndata["averagedpsdam"]/returndata["dotduration"]
  1085. else
  1086. if (TheoryCraft_Settings["dontcrit"]) then
  1087. returndata["dps"] = returndata["averagedamnocrit"]/returndata["casttime"]
  1088. else
  1089. returndata["dps"] = returndata["averagedam"]/returndata["casttime"]
  1090. end
  1091. returndata["dpsdam"] = returndata["averagedpsdam"]/returndata["casttime"]
  1092. if TheoryCraft_Data.Stats["lifetapMana"] then
  1093. if (TheoryCraft_Settings["dontcrit"]) then
  1094. returndata["lifetapdps"] = returndata["averagedamnocrit"]/(returndata["casttime"]+(returndata["manacost"]/TheoryCraft_Data.Stats["lifetapMana"])*1.5)
  1095. else
  1096. returndata["lifetapdps"] = returndata["averagedam"]/(returndata["casttime"]+(returndata["manacost"]/TheoryCraft_Data.Stats["lifetapMana"])*1.5)
  1097. end
  1098. end
  1099. end
  1100. end
  1101. end
  1102.  
  1103. if returndata["dotdamage"] then
  1104. returndata["withdotdpm"] = (returndata["dpm"]*returndata["manacost"]+returndata["dotdamage"])/returndata["manacost"]
  1105. if (TheoryCraft_Settings["combinedot"]) then
  1106. if (TheoryCraft_Settings["dontcrit"]) then
  1107. returndata["withdotdps"] = (returndata["averagedamnocrit"]+returndata["dotdamage"])/returndata["casttime"]
  1108. else
  1109. returndata["withdotdps"] = (returndata["averagedam"]+returndata["dotdamage"])/returndata["casttime"]
  1110. end
  1111. else
  1112. returndata["withdotdps"] = returndata["dotdamage"]/returndata["dotduration"]
  1113. end
  1114. end
  1115.  
  1116. if spelldata.isdot then
  1117. returndata["dameff"] = returndata["damcoef"]*returndata["baseincrease"]/returndata["dotduration"]*3.5
  1118. else
  1119. if returndata["damcoef2"] then
  1120. returndata["dameff"] = ((returndata["damcoef"]+returndata["damcoef2"])*returndata["baseincrease"])/returndata["casttime"]*3.5
  1121. else
  1122. returndata["dameff"] = returndata["damcoef"]*returndata["baseincrease"]/returndata["casttime"]*3.5
  1123. end
  1124. end
  1125. if spelldata.dontdomax == nil then
  1126. returndata["maxoomdam"] = (TheoryCraft_Data.Stats["totalmana"]+TheoryCraft_GetStat("manarestore"))*returndata["dpm"]
  1127. returndata["maxoomdamtime"] = returndata["maxoomdam"]/returndata["dps"]
  1128. if TheoryCraft_Data.Stats["maxtotalmana"] then
  1129. returndata["maxevocoomdam"] = (TheoryCraft_Data.Stats["maxtotalmana"]+TheoryCraft_GetStat("manarestore"))*returndata["dpm"]
  1130. returndata["maxevocoomdamtime"] = returndata["maxevocoomdam"]/returndata["dps"]+8
  1131. end
  1132. end
  1133. if (spelldata.isdot == nil) then
  1134. returndata["nexthitdam"] = returndata["averagedamnocrit"]/100
  1135. returndata["nexthitdamequive"] = returndata["nexthitdam"]/returndata["damworth"]
  1136. end
  1137. returndata["nextpendam"] = returndata["averagedam"]*UnitLevel("player")/2400
  1138. returndata["nextpendamequive"] = returndata["nextpendam"]/returndata["damworth"]
  1139. returndata["regendam"] = TheoryCraft_Data.Stats["regen"]*10*returndata["dpm"]
  1140. returndata["icregendam"] = TheoryCraft_Data.Stats["icregen"]*10*returndata["dpm"]
  1141. returndata["penetration"] = returndata["penetration"]/((20/3)*UnitLevel("player"))*returndata["dps"]
  1142. if (returndata["manamultiplier"]) and (spelldata.lightningshield == nil) then
  1143. returndata["averagedam"] = returndata["averagedam"]/returndata["manamultiplier"]
  1144. returndata["averagedamnocrit"] = returndata["averagedamnocrit"]/returndata["manamultiplier"]
  1145. returndata["averagedamthreat"] = returndata["averagedamthreat"]/returndata["manamultiplier"]
  1146. end
  1147. end
  1148.  
  1149. if (returndata["minheal"]) then
  1150. if (class == "PALADIN") or (class == "MAGE") then
  1151. if (returndata["crithealchance"]) then
  1152. if (returndata["illum"] ~= 0) and (returndata["mindamage"]) then
  1153. returndata["manacost2"] = returndata["manacost"]
  1154. end
  1155. returndata["manacost"] = returndata["manacost"]-returndata["manacost"]*((returndata["crithealchance"]/100)*returndata["illum"])
  1156. end
  1157. end
  1158. if returndata["maxheal"] == nil then
  1159. returndata["maxheal"] = returndata["minheal"]
  1160. end
  1161. returndata["averagehealnocrit"] = (returndata["maxheal"]-returndata["minheal"])/2+returndata["minheal"]
  1162. returndata["averagehpsdamnocrit"] = returndata["damfinal"]
  1163. if spelldata.cancrit then
  1164. if returndata["crithealchance"] == nil then returndata["crithealchance"] = 0 end
  1165. returndata["crithealmin"] = returndata["minheal"]*(returndata["critbonus"]+1)
  1166. returndata["crithealmax"] = returndata["maxheal"]*(returndata["critbonus"]+1)
  1167. returndata["averagecritheal"] = returndata["averagehealnocrit"]*returndata["critbonus"]
  1168. returndata["nextcrit"] = returndata["averagecritheal"]/100
  1169. returndata["healworth"] = returndata["damcoef"]*(1+returndata["crithealchance"]*returndata["critbonus"]/100)
  1170. returndata["averageheal"] = returndata["averagehealnocrit"]+returndata["averagecritheal"]*returndata["crithealchance"]/100
  1171. returndata["nextcritheal"] = returndata["averagecritheal"]/100
  1172. returndata["nextcrithealequive"] = returndata["nextcritheal"]/returndata["healworth"]
  1173. else
  1174. returndata["averagecritheal"] = 0
  1175. returndata["averageheal"] = returndata["averagehealnocrit"]
  1176. returndata["healworth"] = returndata["damcoef"]
  1177. end
  1178. returndata["averagehealthreat"] = returndata["averageheal"]*returndata["threat"]
  1179. returndata["averagehealthreatpercent"] = returndata["averagehealthreat"]/returndata["averageheal"]*100
  1180. returndata["averagehpsdam"] = returndata["averagehpsdamnocrit"]*(returndata["averageheal"]/returndata["averagehealnocrit"])
  1181. if spelldata.tickinterval then
  1182. if (spelldata.hasdot) and (returndata["hotheal"]) then
  1183. returndata["averagehealtick"] = returndata["hotheal"]/returndata["dotduration"]*spelldata.tickinterval
  1184. else
  1185. if returndata["manamultiplier"] then
  1186. returndata["averagehealtick"] = returndata["averageheal"]/returndata["manamultiplier"]/returndata["dotduration"]*spelldata.tickinterval
  1187. else
  1188. returndata["averagehealtick"] = returndata["averageheal"]/returndata["dotduration"]*spelldata.tickinterval
  1189. end
  1190. end
  1191. end
  1192. if TheoryCraft_Settings["dontcrithpm"] then
  1193. returndata["hpm"] = returndata["averagehealnocrit"]/returndata["manacost"]
  1194. else
  1195. returndata["hpm"] = returndata["averageheal"]/returndata["manacost"]
  1196. end
  1197. if (TheoryCraft_Data.Stats["lifetapMana"]) and (TheoryCraft_Data.Stats["lifetapHealth"]) then
  1198. returndata["lifetaphpm"] = returndata["hpm"]*returndata["manacost"]/(returndata["manacost"]/TheoryCraft_Data.Stats["lifetapMana"]*TheoryCraft_Data.Stats["lifetapHealth"])
  1199. end
  1200. if (TheoryCraft_Settings["dotoverct"]) and (spelldata.isdot) then
  1201. returndata["hps"] = returndata["averageheal"]/returndata["casttime"]
  1202. returndata["hpsdam"] = returndata["averagehpsdam"]/returndata["casttime"]
  1203. else
  1204. if spelldata.isdot then
  1205. returndata["hps"] = returndata["averageheal"]/returndata["dotduration"]
  1206. returndata["hpsdam"] = returndata["averagehpsdam"]/returndata["dotduration"]
  1207. else
  1208. returndata["hps"] = returndata["averageheal"]/returndata["casttime"]
  1209. returndata["hpsdam"] = returndata["averagehpsdam"]/returndata["casttime"]
  1210. end
  1211. end
  1212. if TheoryCraft_Data.Stats["lifetapMana"] then
  1213. returndata["lifetaphps"] = returndata["averageheal"]/(returndata["casttime"]+(returndata["manacost"]/TheoryCraft_Data.Stats["lifetapMana"])*1.5)
  1214. end
  1215. if returndata["hotheal"] then
  1216. returndata["withhothpm"] = (returndata["hpm"]*returndata["manacost"]+returndata["hotheal"])/returndata["manacost"]
  1217. if (TheoryCraft_Settings["combinedot"]) then
  1218. returndata["withhothps"] = (returndata["averageheal"]+returndata["hotheal"])/returndata["casttime"]
  1219. else
  1220. returndata["withhothps"] = returndata["hotheal"]/returndata["dotduration"]
  1221. end
  1222. end
  1223.  
  1224. if spelldata.isdot then
  1225. returndata["dameff"] = returndata["damcoef"]*returndata["baseincrease"]/returndata["dotduration"]*3.5
  1226. else
  1227. if returndata["damcoef2"] then
  1228. returndata["dameff"] = ((returndata["damcoef"]+returndata["damcoef2"])*returndata["baseincrease"])/returndata["casttime"]*3.5
  1229. else
  1230. returndata["dameff"] = returndata["damcoef"]*returndata["baseincrease"]/returndata["casttime"]*3.5
  1231. end
  1232. end
  1233. if spelldata.dontdomax == nil then
  1234. returndata["maxoomheal"] = (TheoryCraft_Data.Stats["totalmana"]+TheoryCraft_GetStat("manarestore"))*returndata["hpm"]
  1235. returndata["maxoomhealtime"] = returndata["maxoomheal"]/returndata["hps"]
  1236. if returndata["maxtotalmana"] then
  1237. returndata["maxevocoomheal"] = TheoryCraft_Data.Stats["maxtotalmana"]*returndata["hpm"]
  1238. returndata["maxevocoomhealtime"] = returndata["maxevocoomheal"]/returndata["hps"]+8
  1239. end
  1240. end
  1241. returndata["regenheal"] = TheoryCraft_Data.Stats["regen"]*10*returndata["hpm"]
  1242. returndata["icregenheal"] = TheoryCraft_Data.Stats["icregen"]*10*returndata["hpm"]
  1243. if returndata["manamultiplier"] then
  1244. returndata["averageheal"] = returndata["averageheal"]/returndata["manamultiplier"]
  1245. returndata["averagehealnocrit"] = returndata["averagehealnocrit"]/returndata["manamultiplier"]
  1246. returndata["averagehealthreat"] = returndata["averagehealthreat"]/returndata["manamultiplier"]
  1247. end
  1248. end
  1249. end
  1250. if (returndata["dps"]) then
  1251. if (returndata["dpsdam"]) then
  1252. returndata["dpsdampercent"] = returndata["dpsdam"]/returndata["dps"]*100
  1253. end
  1254. end
  1255. if (returndata["hps"]) then
  1256. if (returndata["hpsdam"]) then
  1257. returndata["hpsdampercent"] = returndata["hpsdam"]/returndata["hps"]*100
  1258. end
  1259. end
  1260. if (returndata["manamultiplier"]) then
  1261. returndata["manacost"] = returndata["manacost"]/returndata["manamultiplier"]
  1262. end
  1263. if (spelldata.manamultiplier) and (returndata["damcoef"]) and (spelldata.lightningshield == nil) then
  1264. returndata["damcoef"] = returndata["damcoef"]/spelldata.manamultiplier
  1265. end
  1266.  
  1267. if (returndata["nextcritdam"]) and (returndata["critdmgchance"]) and (returndata["critdmgchance"] > 99) then
  1268. if returndata["critdmgchance"] < 100 then
  1269. returndata["nextcritdam"] = returndata["nextcritdam"]*(1 - (returndata["critdmgchance"] - 99))
  1270. returndata["nextcritdamequive"] = returndata["nextcritdamequive"]*(1 - (returndata["critdmgchance"] - 99))
  1271. else
  1272. returndata["nextcritdam"] = 0
  1273. returndata["nextcritdamequive"] = 0
  1274. end
  1275. end
  1276. if (returndata["nextcritheal"]) and (returndata["crithealchance"]) and (returndata["crithealchance"] > 99) then
  1277. if returndata["crithealchance"] < 100 then
  1278. returndata["nextcritheal"] = returndata["nextcritheal"]*(1 - (returndata["crithealchance"] - 99))
  1279. returndata["nextcrithealequive"] = returndata["nextcrithealequive"]*(1 - (returndata["crithealchance"] - 99))
  1280. else
  1281. returndata["nextcritheal"] = 0
  1282. returndata["nextcrithealequive"] = 0
  1283. end
  1284. end
  1285.  
  1286. CleanUp(spelldata, returndata)
  1287.  
  1288. if returndata["basemindamage"] then
  1289. if returndata["basemaxdamage"] == nil then
  1290. returndata["basemaxdamage"] = returndata["basemindamage"]
  1291. end
  1292. returndata["damtodouble"] = (returndata["basemindamage"]+returndata["basemaxdamage"])/2/returndata["damcoef"]
  1293. end
  1294.  
  1295. if returndata["damcoef"] then returndata["damcoef"] = returndata["damcoef"]*100 end
  1296. if returndata["dameff"] then returndata["dameff"] = returndata["dameff"]*100 end
  1297.  
  1298. if returndata["dps"] and returndata["manacost"] then
  1299. returndata["dpsmana"] = returndata["dps"]/returndata["manacost"]
  1300. end
  1301. if returndata["manacost"] then
  1302. returndata["maxspellcasts"] = 1+math.floor((TheoryCraft_GetStat("totalmana")-(returndata["basemanacost"] or returndata["manacost"]))/returndata["manacost"])
  1303. if returndata["maxoomdam"] then
  1304. returndata["maxoomdamfloored"] = returndata["dpm"]*returndata["manacost"]*returndata["maxspellcasts"]
  1305. end
  1306. if returndata["maxoomheal"] then
  1307. returndata["maxoomhealfloored"] = returndata["hpm"]*returndata["manacost"]*returndata["maxspellcasts"]
  1308. end
  1309. end
  1310.  
  1311. return
  1312. end
  1313.  
  1314. function TheoryCraft_GenerateTooltip(frame, spellname, spellrank, i2, showonbutton, macro, force)
  1315. local timer = GetTime()
  1316. local oldspellname = spellname
  1317. local olddesc
  1318. if i2 == nil then
  1319. if (frame) and (frame ~= TCTooltip2) then
  1320. if frame:NumLines() == 0 then return end
  1321. i2 = 1
  1322. if getglobal(frame:GetName().."TextRight1") and getglobal(frame:GetName().."TextRight1"):IsVisible() then
  1323. spellrank = getglobal(frame:GetName().."TextRight1"):GetText()
  1324. spellrank = tonumber(findpattern(spellrank, "%d+"))
  1325. if spellrank == nil then spellrank = 0 end
  1326. else
  1327. spellrank = nil
  1328. end
  1329. if getglobal(frame:GetName().."TextLeft1") and getglobal(frame:GetName().."TextLeft1"):GetText() then
  1330. spellname = getglobal(frame:GetName().."TextLeft1"):GetText()
  1331. else
  1332. spellname = ""
  1333. end
  1334. local spellname2, spellrank2
  1335. while (true) do
  1336. spellname2, spellrank2 = GetSpellBookItemName(i2,BOOKTYPE_SPELL)
  1337. if spellname2 == nil then return end
  1338. spellrank2 = tonumber(findpattern(spellrank2, "%d+"))
  1339. if spellrank2 == nil then spellrank2 = 0 end
  1340. if (spellname == spellname2) and ((spellrank == nil) or (spellrank == spellrank2)) then break end
  1341. i2 = i2 + 1
  1342. end
  1343. if spellname ~= spellname2 then return end
  1344. if (spellrank) and (spellrank ~= spellrank2) then return end
  1345. if (spellname == "Attack") then spellrank = 0 end
  1346. if (spellrank == nil) then
  1347. olddesc = getglobal(frame:GetName().."TextLeft"..frame:NumLines()):GetText()
  1348. while (spellname == spellname2) do
  1349. spellname2, spellrank = GetSpellBookItemName(i2,BOOKTYPE_SPELL)
  1350. if spellname == nil then return end
  1351. spellrank = tonumber(findpattern(spellrank, "%d+"))
  1352. if spellrank == nil then spellrank = 0 end
  1353. TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
  1354. TCTooltip:SetSpellBookItem(i2,BOOKTYPE_SPELL)
  1355. if (getglobal("TCTooltipTextLeft"..TCTooltip:NumLines())) and (getglobal("TCTooltipTextLeft"..TCTooltip:NumLines()):GetText() == olddesc) then
  1356. break
  1357. end
  1358. i2 = i2 + 1
  1359. end
  1360. if (TCTooltip) and (getglobal("TCTooltipTextLeft"..TCTooltip:NumLines())) and (getglobal("TCTooltipTextLeft"..TCTooltip:NumLines()):GetText() ~= olddesc) then
  1361. return
  1362. end
  1363. end
  1364. else
  1365. i2 = 1
  1366. local spellname2, spellrank2
  1367. if (string.len(spellrank) == 1) and (string.len(spellname) ~= 13) then
  1368. macro = nil
  1369. end
  1370. if (string.len(spellrank) == 2) and (string.len(spellname) ~= 12) then
  1371. macro = nil
  1372. end
  1373. while (true) do
  1374. spellname2, spellrank2 = GetSpellBookItemName(i2,BOOKTYPE_SPELL)
  1375. if spellname2 == nil then return end
  1376. spellrank2 = tonumber(findpattern(spellrank2, "%d+"))
  1377. if spellrank2 == nil then spellrank2 = 0 end
  1378. if (spellname == spellname2) or ((macro) and (spellname == string.sub(spellname2, 1, string.len(spellname)))) then
  1379. spellname = spellname2
  1380. if spellrank == spellrank2 then
  1381. break
  1382. end
  1383. end
  1384. i2 = i2 + 1
  1385. end
  1386. if spellname ~= spellname2 then return end
  1387. if spellrank ~= spellrank2 then return end
  1388. if frame == nil then
  1389. frame = TCTooltip
  1390. end
  1391. frame:SetOwner(UIParent,"ANCHOR_NONE")
  1392. frame:SetSpellBookItem(i2,BOOKTYPE_SPELL)
  1393. if frame:NumLines() == 0 then return end
  1394. end
  1395. end
  1396. if spellname == TheoryCraft_Locale.MinMax.autoshotname then
  1397. local highestaimed, highestmulti, highestarcane
  1398. local i2 = 1
  1399. local spellname, spellrank = GetSpellBookItemName(i2,BOOKTYPE_SPELL)
  1400. while (spellname) do
  1401. spellrank = tonumber(findpattern((spellrank or "0"), "%d+"))
  1402. if (spellname == TheoryCraft_Locale.MinMax.aimedshotname) and ((highestaimed == nil) or (highestaimed < spellrank)) then
  1403. highestaimed = spellrank
  1404. end
  1405. if (spellname == TheoryCraft_Locale.MinMax.multishotname) and ((highestmulti == nil) or (highestmulti < spellrank)) then
  1406. highestmulti = spellrank
  1407. end
  1408. if (spellname == TheoryCraft_Locale.MinMax.arcaneshotname) and ((highestarcane == nil) or (highestarcane < spellrank)) then
  1409. highestarcane = spellrank
  1410. end
  1411. i2 = i2 + 1
  1412. spellname, spellrank = GetSpellBookItemName(i2,BOOKTYPE_SPELL)
  1413. end
  1414. if (highestaimed) and (TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.aimedshotname.."("..highestaimed..")"] == nil) then
  1415. TheoryCraft_GenerateTooltip(TCTooltip2, TheoryCraft_Locale.MinMax.aimedshotname, highestaimed, nil, nil, nil, true)
  1416. end
  1417. if (highestmulti) and (TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.multishotname.."("..highestmulti..")"] == nil) then
  1418. TheoryCraft_GenerateTooltip(TCTooltip2, TheoryCraft_Locale.MinMax.multishotname, highestmulti, nil, nil, nil, true)
  1419. end
  1420. if (highestarcane) and (TheoryCraft_TooltipData[TheoryCraft_Locale.MinMax.arcaneshotname.."("..highestarcane..")"] == nil) then
  1421. TheoryCraft_GenerateTooltip(TCTooltip2, TheoryCraft_Locale.MinMax.arcaneshotname, highestarcane, nil, nil, nil, true)
  1422. end
  1423. end
  1424. if (not force) and (TheoryCraft_Settings["GenerateList"] ~= "") and (not string.find(TheoryCraft_Settings["GenerateList"], string.gsub(spellname, "-", "%%-").."%("..spellrank.."%)")) then
  1425. return
  1426. end
  1427. local i
  1428. for k, v in pairs(TheoryCraft_Spells[class]) do
  1429. if v.name == spellname then
  1430. i = v
  1431. break
  1432. end
  1433. end
  1434. if not i then return end
  1435. -- TheoryCraft_Data.Testing = nil
  1436. SummateData(i.id, i.Schools)
  1437. olddesc = getglobal(frame:GetName().."TextLeft"..frame:NumLines()):GetText()
  1438.  
  1439.  
  1440. -- Prêtre --
  1441.  
  1442. currentStatStrength, Strb, Strc, Strd = UnitStat("player",1)
  1443. currentStatAgility, Agib, Agic, Agid = UnitStat("player",2)
  1444. currentStatStamina, Stab, Stac, Stad = UnitStat("player",3)
  1445. currentStatIntellect, Intb, Intc, Intd = UnitStat("player",4)
  1446. currentStatSpirit, Spib, Spic, Spid = UnitStat("player",5)
  1447.  
  1448. --for AllBuff = 1,40 do
  1449. --local _, _, _, _, _, _, _, _, _, BuffId = UnitBuff("player",i)
  1450. --if (BuffId == 15473) then
  1451. --currentRankTalentShado3 = 1
  1452. --else
  1453. --currentRankTalentShado3 = 0
  1454. --end
  1455. --end
  1456.  
  1457. a, b, c, d, currentRankTalentDisci1 = GetTalentInfo(1,5)
  1458. a, b, c, d, currentRankTalentDisci2 = GetTalentInfo(1,10)
  1459. a, b, c, d, currentRankTalentDisci3 = GetTalentInfo(1,14)
  1460.  
  1461. a, b, c, d, currentRankTalentHoly1 = GetTalentInfo(2,2)
  1462. a, b, c, d, currentRankTalentHoly2 = GetTalentInfo(2,5)
  1463. a, b, c, d, currentRankTalentHoly3 = GetTalentInfo(2,10)
  1464. a, b, c, d, currentRankTalentHoly4 = GetTalentInfo(2,11)
  1465. a, b, c, d, currentRankTalentHoly5 = GetTalentInfo(2,12)
  1466. a, b, c, d, currentRankTalentHoly6 = GetTalentInfo(2,15)
  1467. a, b, c, d, currentRankTalentHoly7 = GetTalentInfo(2,14)
  1468.  
  1469. a, b, c, d, currentRankTalentShado1 = GetTalentInfo(3,4)
  1470. a, b, c, d, currentRankTalentShado2 = GetTalentInfo(3,15)
  1471. a, b, c, d, currentRankTalentShado3 = GetTalentInfo(3,16)
  1472.  
  1473. TalentDisc1 = 1 + (currentRankTalentDisci1 * 0.05)
  1474. TalentDisc2 = 1 - (currentRankTalentDisci2 * 0.02)
  1475. TalentDisc3 = 1 + (currentRankTalentDisci3 / 100)
  1476.  
  1477. TalentHoly1 = 1 + (currentRankTalentHoly1 * 0.05)
  1478. TalentHoly2 = currentRankTalentHoly2 / 10
  1479. TalentHoly3 = 1 - (currentRankTalentHoly3 * 0.05)
  1480. TalentHoly4 = 1 + (currentRankTalentHoly4 * 0.05)
  1481. TalentHoly5 = 1 - (currentRankTalentHoly5 * 0.10)
  1482. TalentHoly6 = 1 + (currentRankTalentHoly6 * 0.02)
  1483. -- TalentHoly7 = currentRankTalentHoly7 * currentStatSpirit * 0.05 --
  1484.  
  1485. TalentShado1 = (currentRankTalentShado1 + 6) / 6
  1486. TalentShado2 = 1 + (currentRankTalentShado2 * 0.02)
  1487. TalentShado3 = 1 + (currentRankTalentShado3 * 0.15)
  1488.  
  1489. -- Soins rapides --
  1490.  
  1491. if(spellname =="Soins rapides" and spellrank == 7) then
  1492. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1493. bMinDmg = 828
  1494. bMaxDmg = 975
  1495. mana = 380
  1496. a = bMinDmg+bonusSpellDmg
  1497. b = bMaxDmg+bonusSpellDmg
  1498. c = (a+b)/2
  1499. z = TalentHoly6
  1500. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1501. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1502. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1503.  
  1504. elseif(spellname =="Soins rapides" and spellrank == 6) then
  1505. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1506. bMinDmg = 662
  1507. bMaxDmg = 783
  1508. mana = 315
  1509. a = bMinDmg+bonusSpellDmg
  1510. b = bMaxDmg+bonusSpellDmg
  1511. c = (a+b)/2
  1512. z = TalentHoly6
  1513. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1514. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1515. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1516.  
  1517. elseif(spellname =="Soins rapides" and spellrank == 5) then
  1518. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1519. bMinDmg = 534
  1520. bMaxDmg = 633
  1521. mana = 265
  1522. a = bMinDmg+bonusSpellDmg
  1523. b = bMaxDmg+bonusSpellDmg
  1524. c = (a+b)/2
  1525. z = TalentHoly6
  1526. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1527. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1528. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1529.  
  1530. elseif(spellname =="Soins rapides" and spellrank == 4) then
  1531. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1532. bMinDmg = 414
  1533. bMaxDmg = 492
  1534. mana = 215
  1535. a = bMinDmg+bonusSpellDmg
  1536. b = bMaxDmg+bonusSpellDmg
  1537. c = (a+b)/2
  1538. z = TalentHoly6
  1539. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1540. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1541. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1542.  
  1543. elseif(spellname =="Soins rapides" and spellrank == 3) then
  1544. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1545. bMinDmg = 339
  1546. bMaxDmg = 406
  1547. mana = 185
  1548. a = bMinDmg+bonusSpellDmg
  1549. b = bMaxDmg+bonusSpellDmg
  1550. c = (a+b)/2
  1551. z = TalentHoly6
  1552. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1553. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1554. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1555.  
  1556. elseif(spellname =="Soins rapides" and spellrank == 2) then
  1557. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1558. bMinDmg = 269
  1559. bMaxDmg = 325
  1560. mana = 155
  1561. a = bMinDmg+bonusSpellDmg
  1562. b = bMaxDmg+bonusSpellDmg
  1563. c = (a+b)/2
  1564. z = TalentHoly6
  1565. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1566. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1567. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1568.  
  1569. elseif(spellname =="Soins rapides" and spellrank == 1) then
  1570. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1571. bMinDmg = 202
  1572. bMaxDmg = 247
  1573. mana = 125
  1574. a = bMinDmg+bonusSpellDmg
  1575. b = bMaxDmg+bonusSpellDmg
  1576. c = (a+b)/2
  1577. z = TalentHoly6
  1578. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1579. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1580. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1581.  
  1582. -- Soins --
  1583.  
  1584. elseif(spellname =="Soins" and spellrank == 4) then
  1585. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1586. bMinDmg = 734
  1587. bMaxDmg = 827
  1588. mana = 305 * TalentHoly3
  1589. a = bMinDmg+bonusSpellDmg
  1590. b = bMaxDmg+bonusSpellDmg
  1591. c = (a+b)/2
  1592. d = 3 - TalentHoly2
  1593. z = TalentHoly6
  1594. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1595. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1596. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1597.  
  1598. elseif(spellname =="Soins" and spellrank == 3) then
  1599. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1600. bMinDmg = 586
  1601. bMaxDmg = 662
  1602. mana = 255 * TalentHoly3
  1603. a = bMinDmg+bonusSpellDmg
  1604. b = bMaxDmg+bonusSpellDmg
  1605. c = (a+b)/2
  1606. d = 3 - TalentHoly2
  1607. z = TalentHoly6
  1608. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1609. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1610. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1611.  
  1612. elseif(spellname =="Soins" and spellrank == 2) then
  1613. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1614. bMinDmg = 445
  1615. bMaxDmg = 507
  1616. mana = 205 * TalentHoly3
  1617. a = bMinDmg+bonusSpellDmg
  1618. b = bMaxDmg+bonusSpellDmg
  1619. c = (a+b)/2
  1620. d = 3 - TalentHoly2
  1621. z = TalentHoly6
  1622. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1623. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1624. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1625.  
  1626. elseif(spellname =="Soins" and spellrank == 1) then
  1627. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1628. Rankdown = (100-(20-16)*3.75)/100
  1629. bMinDmg = 307
  1630. bMaxDmg = 353
  1631. mana = 155 * TalentHoly3
  1632. a = bMinDmg+(bonusSpellDmg*Rankdown)
  1633. b = bMaxDmg+(bonusSpellDmg*Rankdown)
  1634. c = (a+b)/2
  1635. d = 3 - TalentHoly2
  1636. z = TalentHoly6
  1637. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1638. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1639. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1640.  
  1641. -- Soins inférieurs --
  1642.  
  1643. elseif(spellname =="Soins inférieurs" and spellrank == 3) then
  1644. bonusSpellDmg = (2.5 / 3.5) * GetSpellBonusHealing()
  1645. Rankdown = (100-(20-10)*3.75)/100
  1646. bMinDmg = 143
  1647. bMaxDmg = 165
  1648. mana = 75 * TalentHoly3
  1649. a = bMinDmg+(bonusSpellDmg*Rankdown)
  1650. b = bMaxDmg+(bonusSpellDmg*Rankdown)
  1651. c = (a+b)/2
  1652. z = TalentHoly6
  1653. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1654. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1655. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/2.5,0) .. " hps")
  1656.  
  1657. elseif(spellname =="Soins inférieurs" and spellrank == 2) then
  1658. bonusSpellDmg = (2 / 3.5) * GetSpellBonusHealing()
  1659. Rankdown = (100-(20-4)*3.75)/100
  1660. bMinDmg = 76
  1661. bMaxDmg = 91
  1662. mana = 45 * TalentHoly3
  1663. a = bMinDmg+(bonusSpellDmg*Rankdown)
  1664. b = bMaxDmg+(bonusSpellDmg*Rankdown)
  1665. c = (a+b)/2
  1666. z = TalentHoly6
  1667. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1668. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1669. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/2,0) .. " hps")
  1670.  
  1671. elseif(spellname =="Soins inférieurs" and spellrank == 1) then
  1672. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusHealing()
  1673. Rankdown = (100-(20-1)*3.75)/100
  1674. bMinDmg = 47
  1675. bMaxDmg = 58
  1676. mana = 30 * TalentHoly3
  1677. a = bMinDmg+(bonusSpellDmg*Rankdown)
  1678. b = bMaxDmg+(bonusSpellDmg*Rankdown)
  1679. c = (a+b)/2
  1680. z = TalentHoly6
  1681. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1682. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1683. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/1.5,0) .. " hps")
  1684.  
  1685. -- Soins supérieurs --
  1686.  
  1687. elseif(spellname =="Soins supérieurs" and spellrank == 4) then
  1688. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1689. bMinDmg = 1813
  1690. bMaxDmg = 2021
  1691. mana = 655 * TalentHoly3
  1692. a = bMinDmg+bonusSpellDmg
  1693. b = bMaxDmg+bonusSpellDmg
  1694. c = (a+b)/2
  1695. d = 3 - TalentHoly2
  1696. z = TalentHoly6
  1697. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1698. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1699. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1700.  
  1701. elseif(spellname =="Soins supérieurs" and spellrank == 3) then
  1702. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1703. bMinDmg = 1470
  1704. bMaxDmg = 1642
  1705. mana = 545 * TalentHoly3
  1706. a = bMinDmg+bonusSpellDmg
  1707. b = bMaxDmg+bonusSpellDmg
  1708. c = (a+b)/2
  1709. d = 3 - TalentHoly2
  1710. z = TalentHoly6
  1711. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1712. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1713. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1714.  
  1715. elseif(spellname =="Soins supérieurs" and spellrank == 2) then
  1716. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1717. bMinDmg = 1178
  1718. bMaxDmg = 1318
  1719. mana = 455 * TalentHoly3
  1720. a = bMinDmg+bonusSpellDmg
  1721. b = bMaxDmg+bonusSpellDmg
  1722. c = (a+b)/2
  1723. d = 3 - TalentHoly2
  1724. z = TalentHoly6
  1725. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1726. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1727. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1728.  
  1729. elseif(spellname =="Soins supérieurs" and spellrank == 1) then
  1730. bonusSpellDmg = (3 / 3.5) * GetSpellBonusHealing()
  1731. bMinDmg = 924
  1732. bMaxDmg = 1039
  1733. mana = 370 * TalentHoly3
  1734. a = bMinDmg+bonusSpellDmg
  1735. b = bMaxDmg+bonusSpellDmg
  1736. c = (a+b)/2
  1737. d = 3 - TalentHoly2
  1738. z = TalentHoly6
  1739. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1740. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1741. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm" .. " -- " .. round(c*z/d,0) .. " hps")
  1742.  
  1743. -- Prière de soins --
  1744.  
  1745. elseif(spellname =="Prière de soins" and spellrank == 4) then
  1746. bonusSpellDmg = ((3 / 3.5 )/ 3) * GetSpellBonusHealing()
  1747. bMinDmg = 939
  1748. bMaxDmg = 991
  1749. mana = 1030 * TalentHoly5
  1750. a = bMinDmg+bonusSpellDmg
  1751. b = bMaxDmg+bonusSpellDmg
  1752. c = (a+b)/2
  1753. z = TalentHoly6
  1754. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1755. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1756. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm to " .. round(c*z/mana*5,2) .. " hpm")
  1757.  
  1758. elseif(spellname =="Prière de soins" and spellrank == 3) then
  1759. bonusSpellDmg = ((3 / 3.5 )/ 3) * GetSpellBonusHealing()
  1760. bMinDmg = 675
  1761. bMaxDmg = 713
  1762. mana = 770 * TalentHoly5
  1763. a = bMinDmg+bonusSpellDmg
  1764. b = bMaxDmg+bonusSpellDmg
  1765. c = (a+b)/2
  1766. z = TalentHoly6
  1767. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1768. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1769. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm to " .. round(c*z/mana*5,2) .. " hpm")
  1770.  
  1771. elseif(spellname =="Prière de soins" and spellrank == 2) then
  1772. bonusSpellDmg = ((3 / 3.5 )/ 3) * GetSpellBonusHealing()
  1773. bMinDmg = 458
  1774. bMaxDmg = 487
  1775. mana = 560 * TalentHoly5
  1776. a = bMinDmg+bonusSpellDmg
  1777. b = bMaxDmg+bonusSpellDmg
  1778. c = (a+b)/2
  1779. z = TalentHoly6
  1780. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1781. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1782. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm to " .. round(c*z/mana*5,2) .. " hpm")
  1783.  
  1784. elseif(spellname =="Prière de soins" and spellrank == 1) then
  1785. bonusSpellDmg = ((3 / 3.5 )/ 3) * GetSpellBonusHealing()
  1786. bMinDmg = 312
  1787. bMaxDmg = 333
  1788. mana = 410 * TalentHoly5
  1789. a = bMinDmg+bonusSpellDmg
  1790. b = bMaxDmg+bonusSpellDmg
  1791. c = (a+b)/2
  1792. z = TalentHoly6
  1793. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " - " .. round(b,0) ..
  1794. "\n|cFF0080FF" .. round(a*z,0) .. " - " .. round(b*z,0) ..
  1795. "|cFFFAAF00" .. " -- " .. round(c*z/mana,2) .. " hpm to " .. round(c*z/mana*5,2) .. " hpm")
  1796.  
  1797. -- Mot de pouvoir : Bouclier --
  1798.  
  1799. elseif(spellname =="Mot de pouvoir : Bouclier" and spellrank == 10) then
  1800. bonusSpellDmg = (0.1) * GetSpellBonusHealing()
  1801. bMinDmg = 942
  1802. mana = 500 * TalentDisc2
  1803. a = (bMinDmg*TalentDisc1)+bonusSpellDmg
  1804. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. "\n|cFF0080FF" .. round(a,0) ..
  1805. "|cFFFAAF00" .. " -- " .. round((a/mana),2) .. " hpm")
  1806.  
  1807. -- Rénovation --
  1808.  
  1809. elseif(spellname =="Rénovation" and spellrank == 9) then
  1810. bonusSpellDmg = GetSpellBonusHealing()
  1811. bMinDmg = 810
  1812. mana = 365*TalentDisc2
  1813. a = (bMinDmg+bonusSpellDmg)/5
  1814. b = a * TalentHoly1 * TalentHoly6
  1815. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1816. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1817. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1818.  
  1819. elseif(spellname =="Rénovation" and spellrank == 8) then
  1820. bonusSpellDmg = GetSpellBonusHealing()
  1821. bMinDmg = 650
  1822. mana = 305*TalentDisc2
  1823. a = (bMinDmg+bonusSpellDmg)/5
  1824. b = a * TalentHoly1 * TalentHoly6
  1825. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1826. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1827. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1828.  
  1829. elseif(spellname =="Rénovation" and spellrank == 7) then
  1830. bonusSpellDmg = GetSpellBonusHealing()
  1831. bMinDmg = 510
  1832. mana = 250*TalentDisc2
  1833. a = (bMinDmg+bonusSpellDmg)/5
  1834. b = a * TalentHoly1 * TalentHoly6
  1835. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1836. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1837. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1838.  
  1839. elseif(spellname =="Rénovation" and spellrank == 6) then
  1840. bonusSpellDmg = GetSpellBonusHealing()
  1841. bMinDmg = 400
  1842. mana = 205*TalentDisc2
  1843. a = (bMinDmg+bonusSpellDmg)/5
  1844. b = a * TalentHoly1 * TalentHoly6
  1845. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1846. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1847. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1848.  
  1849. elseif(spellname =="Rénovation" and spellrank == 5) then
  1850. bonusSpellDmg = GetSpellBonusHealing()
  1851. bMinDmg = 315
  1852. mana = 170*TalentDisc2
  1853. a = (bMinDmg+bonusSpellDmg)/5
  1854. b = a * TalentHoly1 * TalentHoly6
  1855. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1856. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1857. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1858.  
  1859. elseif(spellname =="Rénovation" and spellrank == 4) then
  1860. bonusSpellDmg = GetSpellBonusHealing()
  1861. bMinDmg = 245
  1862. mana = 140*TalentDisc2
  1863. a = (bMinDmg+bonusSpellDmg)/5
  1864. b = a * TalentHoly1 * TalentHoly6
  1865. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1866. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1867. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1868.  
  1869. elseif(spellname =="Rénovation" and spellrank == 3) then
  1870. bonusSpellDmg = GetSpellBonusHealing()
  1871. bMinDmg = 175
  1872. mana = 105*TalentDisc2
  1873. a = (bMinDmg+bonusSpellDmg)/5
  1874. b = a * TalentHoly1 * TalentHoly6
  1875. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1876. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1877. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1878.  
  1879. elseif(spellname =="Rénovation" and spellrank == 2) then
  1880. bonusSpellDmg = GetSpellBonusHealing()
  1881. Rankdown = (100-(20-14)*3.75)/100
  1882. bMinDmg = 100
  1883. mana = 65*TalentDisc2
  1884. a = (bMinDmg+(bonusSpellDmg*Rankdown))/5
  1885. b = a * TalentHoly1 * TalentHoly6
  1886. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1887. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1888. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1889.  
  1890. elseif(spellname =="Rénovation" and spellrank == 1) then
  1891. bonusSpellDmg = GetSpellBonusHealing()
  1892. Rankdown = (100-(20-8)*3.75)/100
  1893. bMinDmg = 45
  1894. mana = 30*TalentDisc2
  1895. a = (bMinDmg+(bonusSpellDmg*Rankdown))/5
  1896. b = a * TalentHoly1 * TalentHoly6
  1897. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFF00FF00" .. round(a,0) .. " *5 = " .. round(a,0)*5 ..
  1898. "\n|cFF0080FF" .. round(b,0) .. " *5 = " .. round(b,0)*5 ..
  1899. "|cFFFAAF00" .. " -- " .. round(b/mana,2)*5 .. " hpm" .. " -- " .. round(b/15,0)*5 .. " hps")
  1900.  
  1901. -- Châtiment --
  1902.  
  1903. elseif(spellname =="Châtiment" and spellrank == 8) then
  1904. bonusSpellDmg = (2.5 / 3.5) * GetSpellBonusDamage(2)
  1905. bMinDmg = 384
  1906. bMaxDmg = 429
  1907. mana = 280
  1908. a = bMinDmg+bonusSpellDmg
  1909. b = bMaxDmg+bonusSpellDmg
  1910. c = (a+b)/2
  1911. d = 2.5 - TalentHoly2
  1912. z = TalentDisc3 * TalentHoly4
  1913. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFFFFF00" .. round(a,0) .. " - " .. round(b,0) ..
  1914. "\n|cFFFF0000" .. round(z*a,0) .. " - " .. round(z*b,0) ..
  1915. "|cFFFAAF00" .. " -- " .. round(z*c/mana,2) .. " dpm" .. " -- " .. round(z*c/d,0) .. " dps")
  1916.  
  1917. -- Flammes sacrées --
  1918.  
  1919. elseif(spellname =="Flammes sacrées" and spellrank == 8) then
  1920. bonusSpellDmg = 0.6 * GetSpellBonusDamage(2)
  1921. bonusSpellDmgBis = 0 + 0 * GetSpellBonusDamage(2)
  1922. bMinDmg = 355
  1923. bMaxDmg = 449
  1924. cMinDmg = 197
  1925. mana = 255
  1926. a = bMinDmg+bonusSpellDmg
  1927. b = bMaxDmg+bonusSpellDmg
  1928. c = (cMinDmg+bonusSpellDmgBis)/5
  1929. d = 3.5 - TalentHoly2
  1930. z = TalentDisc3 * TalentHoly4
  1931. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFFFFF00" .. round(a,0) .. " - " .. round(b,0) ..
  1932. " & " .. round(c,0) .. " *5 = " .. round(c,0)*5 ..
  1933. "\n|cFFFF0000" .. round(z*a,0) .. " - " .. round(z*b,0) .. " & " .. round(z*c,0) .. " *5 = " .. round(z*c,0)*5)
  1934.  
  1935. -- Attaque mentale --
  1936.  
  1937. elseif(spellname =="Attaque mentale" and spellrank == 9) then
  1938. bonusSpellDmg = (1.5 / 3.5) * GetSpellBonusDamage(6)
  1939. bMinDmg = 508*1.1
  1940. bMaxDmg = 537*1.1
  1941. mana = 350
  1942. a = bMinDmg+bonusSpellDmg
  1943. b = bMaxDmg+bonusSpellDmg
  1944. c = (a+b)/2
  1945. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " - " .. round(b,0) ..
  1946. "\n|cFFFF0000" .. round((TalentShado3*a),0) .. " - " .. round((TalentShado3*b),0) ..
  1947. "|cFFFAAF00" .. " -- " .. round((TalentShado3*c/mana),2) .. " dpm" .. " -- " .. round((TalentShado3*c/1.5),0) .. " dps")
  1948.  
  1949. -- Fouet mental --
  1950.  
  1951. elseif(spellname =="Fouet mental" and spellrank == 6) then
  1952. bonusSpellDmg = 0.45 * GetSpellBonusDamage(6)
  1953. Rankdown = 1
  1954. bMinDmg = 426
  1955. mana = 205
  1956. a = (bMinDmg+(bonusSpellDmg*Rankdown))/3
  1957. z = TalentShado2*TalentShado3
  1958. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " *3 = " .. round(a,0)*3 ..
  1959. "\n|cFFFF0000" .. round((z*a),0) .. " *3 = " .. round((z*a),0)*3 ..
  1960. "|cFFFAAF00" .. " -- " .. round((z*a/mana),2)*3 .. " dpm" .. " -- " .. round((z*a/3),0)*3 .. " dps")
  1961.  
  1962. elseif(spellname =="Fouet mental" and spellrank == 5) then
  1963. bonusSpellDmg = 0.45 * GetSpellBonusDamage(6)
  1964. Rankdown = 1
  1965. bMinDmg = 330
  1966. mana = 165
  1967. a = (bMinDmg+(bonusSpellDmg*Rankdown))/3
  1968. z = TalentShado2*TalentShado3
  1969. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " *3 = " .. round(a,0)*3 ..
  1970. "\n|cFFFF0000" .. round((z*a),0) .. " *3 = " .. round((z*a),0)*3 ..
  1971. "|cFFFAAF00" .. " -- " .. round((z*a/mana),2)*3 .. " dpm" .. " -- " .. round((z*a/3),0)*3 .. " dps")
  1972.  
  1973. elseif(spellname =="Fouet mental" and spellrank == 4) then
  1974. bonusSpellDmg = 0.45 * GetSpellBonusDamage(6)
  1975. Rankdown = 1
  1976. bMinDmg = 261
  1977. mana = 135
  1978. a = (bMinDmg+(bonusSpellDmg*Rankdown))/3
  1979. z = TalentShado2*TalentShado3
  1980. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " *3 = " .. round(a,0)*3 ..
  1981. "\n|cFFFF0000" .. round((z*a),0) .. " *3 = " .. round((z*a),0)*3 ..
  1982. "|cFFFAAF00" .. " -- " .. round((z*a/mana),2)*3 .. " dpm" .. " -- " .. round((z*a/3),0)*3 .. " dps")
  1983.  
  1984. elseif(spellname =="Fouet mental" and spellrank == 3) then
  1985. bonusSpellDmg = 0.45 * GetSpellBonusDamage(6)
  1986. Rankdown = 1
  1987. bMinDmg = 186
  1988. mana = 100
  1989. a = (bMinDmg+(bonusSpellDmg*Rankdown))/3
  1990. z = TalentShado2*TalentShado3
  1991. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " *3 = " .. round(a,0)*3 ..
  1992. "\n|cFFFF0000" .. round((z*a),0) .. " *3 = " .. round((z*a),0)*3 ..
  1993. "|cFFFAAF00" .. " -- " .. round((z*a/mana),2)*3 .. " dpm" .. " -- " .. round((z*a/3),0)*3 .. " dps")
  1994.  
  1995. elseif(spellname =="Fouet mental" and spellrank == 2) then
  1996. bonusSpellDmg = 0.45 * GetSpellBonusDamage(6)
  1997. Rankdown = 1
  1998. bMinDmg = 126
  1999. mana = 70
  2000. a = (bMinDmg+(bonusSpellDmg*Rankdown))/3
  2001. z = TalentShado2*TalentShado3
  2002. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " *3 = " .. round(a,0)*3 ..
  2003. "\n|cFFFF0000" .. round((z*a),0) .. " *3 = " .. round((z*a),0)*3 ..
  2004. "|cFFFAAF00" .. " -- " .. round((z*a/mana),2)*3 .. " dpm" .. " -- " .. round((z*a/3),0)*3 .. " dps")
  2005.  
  2006. elseif(spellname =="Fouet mental" and spellrank == 1) then
  2007. bonusSpellDmg = 0.45 * GetSpellBonusDamage(6)
  2008. Rankdown = 1
  2009. bMinDmg = 75
  2010. mana = 45
  2011. a = (bMinDmg+(bonusSpellDmg*Rankdown))/3
  2012. z = TalentShado2*TalentShado3
  2013. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0) .. " *3 = " .. round(a,0)*3 ..
  2014. "\n|cFFFF0000" .. round((z*a),0) .. " *3 = " .. round((z*a),0)*3 ..
  2015. "|cFFFAAF00" .. " -- " .. round((z*a/mana),2)*3 .. " dpm" .. " -- " .. round((z*a/3),0)*3 .. " dps")
  2016.  
  2017. -- Mot de l'ombre : Douleur --
  2018.  
  2019. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 8) then
  2020. bonusSpellDmg = GetSpellBonusDamage(6)
  2021. Rankdown = 1
  2022. bMinDmg = 1136
  2023. mana = 470*TalentDisc2
  2024. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2025. z = TalentShado2*TalentShado3
  2026. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2027. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2028. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2029.  
  2030. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 7) then
  2031. bonusSpellDmg = GetSpellBonusDamage(6)
  2032. Rankdown = (100-(60-50))/100
  2033. bMinDmg = 896
  2034. mana = 385*TalentDisc2
  2035. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2036. z = TalentShado2*TalentShado3
  2037. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2038. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2039. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2040.  
  2041. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 6) then
  2042. bonusSpellDmg = GetSpellBonusDamage(6)
  2043. Rankdown = (100-(60-42))/100
  2044. bMinDmg = 680
  2045. mana = 305*TalentDisc2
  2046. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2047. z = TalentShado2*TalentShado3
  2048. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2049. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2050. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2051.  
  2052. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 5) then
  2053. bonusSpellDmg = GetSpellBonusDamage(6)
  2054. Rankdown = 1
  2055. bMinDmg = 488
  2056. mana = 230*TalentDisc2
  2057. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2058. z = TalentShado2*TalentShado3
  2059. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2060. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2061. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2062.  
  2063. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 4) then
  2064. bonusSpellDmg = GetSpellBonusDamage(6)
  2065. Rankdown = 1
  2066. bMinDmg = 312
  2067. mana = 155*TalentDisc2
  2068. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2069. z = TalentShado2*TalentShado3
  2070. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2071. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2072. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2073.  
  2074. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 3) then
  2075. bonusSpellDmg = GetSpellBonusDamage(6)
  2076. Rankdown = (((18*3)/20)+1)/4
  2077. bMinDmg = 176
  2078. mana = 95*TalentDisc2
  2079. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2080. z = TalentShado2*TalentShado3
  2081. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2082. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2083. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2084.  
  2085. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 2) then
  2086. bonusSpellDmg = GetSpellBonusDamage(6)
  2087. Rankdown = (((10*3)/20)+1)/4
  2088. bMinDmg = 88
  2089. mana = 50*TalentDisc2
  2090. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2091. z = TalentShado2*TalentShado3
  2092. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2093. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2094. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2095.  
  2096. elseif(spellname =="Mot de l'ombre : Douleur" and spellrank == 1) then
  2097. bonusSpellDmg = GetSpellBonusDamage(6)
  2098. Rankdown = (((4*3)/20)+1)/4
  2099. bMinDmg = 40
  2100. mana = 25*TalentDisc2
  2101. a = (bMinDmg+(bonusSpellDmg*Rankdown*TalentShado1))/8
  2102. z = TalentShado2*TalentShado3
  2103. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2104. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2105. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2106.  
  2107. -- Peste dévorante --
  2108.  
  2109. elseif(spellname =="Peste dévorante" and spellrank == 6) then
  2110. bonusSpellDmg = 0.5 * GetSpellBonusDamage(6)
  2111. bMinDmg = 904*1.1
  2112. mana = 985*TalentDisc2
  2113. a = (bMinDmg+bonusSpellDmg)/8
  2114. z = TalentShado3
  2115. getglobal(frame:GetName().."TextLeft"..frame:NumLines()):SetText(olddesc .. "\n|cFFB318EC" .. round(a,0).. " *8 = " .. round(a,0)*8 ..
  2116. "\n|cFFFF0000" .. round((z*a),0) .. " *8 = " .. round((z*a),0)*8 ..
  2117. "|cFFFAAF00" .. " -- " .. round(((z*a)/mana),2)*8 .. " dpm" .. " -- " .. round(((z*a)/24),0)*8 .. " dps")
  2118.  
  2119. end
  2120.  
  2121. -- Fin --
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127. if TheoryCraft_TooltipData[olddesc] == nil then
  2128. TheoryCraft_TooltipData[olddesc] = {}
  2129. end
  2130. TheoryCraft_DeleteTable(TheoryCraft_TooltipData[olddesc])
  2131. TheoryCraft_CopyTable(summeddata, TheoryCraft_TooltipData[olddesc])
  2132. if TheoryCraft_TooltipData[olddesc]["schools"] == nil then
  2133. TheoryCraft_TooltipData[olddesc]["schools"] = {}
  2134. end
  2135. TheoryCraft_CopyTable(i.Schools, TheoryCraft_TooltipData[olddesc]["schools"])
  2136. GenerateTooltip(frame, TheoryCraft_TooltipData[olddesc], i, spellrank)
  2137.  
  2138. if macro then
  2139. TheoryCraft_TooltipData[oldspellname.."MACRO("..spellrank..")"] = olddesc
  2140. end
  2141. TheoryCraft_TooltipData[spellname.."("..spellrank..")"] = olddesc
  2142. TheoryCraft_TooltipData[olddesc]["basedescription"] = olddesc
  2143.  
  2144.  
  2145. if (i.shoot) or (i.ismelee) or (i.isranged) then
  2146. if getglobal(frame:GetName().."TextLeft2") then
  2147. TheoryCraft_TooltipData[olddesc]["wandlineleft2"] = getglobal(frame:GetName().."TextLeft2"):GetText()
  2148. end
  2149. if getglobal(frame:GetName().."TextRight2") and getglobal(frame:GetName().."TextRight2"):IsVisible() then
  2150. TheoryCraft_TooltipData[olddesc]["wandlineright2"] = getglobal(frame:GetName().."TextRight2"):GetText()
  2151. end
  2152. if getglobal(frame:GetName().."TextLeft3") and getglobal(frame:GetName().."TextLeft3"):IsVisible() then
  2153. TheoryCraft_TooltipData[olddesc]["wandlineleft3"] = getglobal(frame:GetName().."TextLeft3"):GetText()
  2154. end
  2155. if getglobal(frame:GetName().."TextRight3") and getglobal(frame:GetName().."TextRight3"):IsVisible() then
  2156. TheoryCraft_TooltipData[olddesc]["wandlineright3"] = getglobal(frame:GetName().."TextRight3"):GetText()
  2157. end
  2158. if getglobal(frame:GetName().."TextLeft4") then
  2159. if getglobal(frame:GetName().."TextLeft4"):GetText() ~= olddesc then
  2160. TheoryCraft_TooltipData[olddesc]["wandlineleft4"] = getglobal(frame:GetName().."TextLeft4"):GetText()
  2161. end
  2162. end
  2163. else
  2164. if getglobal(frame:GetName().."TextLeft3") then
  2165. if (getglobal(frame:GetName().."TextLeft3"):GetText()) then
  2166. if (getglobal(frame:GetName().."TextLeft3"):GetText() ~= olddesc) and (strfind(getglobal(frame:GetName().."TextLeft3"):GetText(), (TheoryCraft_Locale.CooldownRem) or "Cooldown remaining: ") == nil) then
  2167. TheoryCraft_TooltipData[olddesc]["basecasttime"] = getglobal(frame:GetName().."TextLeft3"):GetText()
  2168. end
  2169. end
  2170. end
  2171. if getglobal(frame:GetName().."TextRight2") and getglobal(frame:GetName().."TextRight2"):IsVisible() then
  2172. TheoryCraft_TooltipData[olddesc]["spellrange"] = getglobal(frame:GetName().."TextRight2"):GetText()
  2173. end
  2174. if getglobal(frame:GetName().."TextRight3") and getglobal(frame:GetName().."TextRight3"):IsVisible() then
  2175. TheoryCraft_TooltipData[olddesc]["cooldown"] = getglobal(frame:GetName().."TextRight3"):GetText()
  2176. if (i.overcooldown) and (TheoryCraft_TooltipData[olddesc]["averagedam"]) then
  2177. if (strfind(TheoryCraft_TooltipData[olddesc]["cooldown"], "%d+.%d+"..TheoryCraft_Locale.Cooldown)) then
  2178. TheoryCraft_TooltipData[olddesc]["dps"] = TheoryCraft_TooltipData[olddesc]["averagedam"]/tonumber(findpattern(TheoryCraft_TooltipData[olddesc]["cooldown"], "%d+.%d+"))
  2179. elseif (strfind(TheoryCraft_TooltipData[olddesc]["cooldown"], "%d+"..TheoryCraft_Locale.Cooldown)) then
  2180. TheoryCraft_TooltipData[olddesc]["dps"] = TheoryCraft_TooltipData[olddesc]["averagedam"]/tonumber(findpattern(TheoryCraft_TooltipData[olddesc]["cooldown"], "%d+"))
  2181. end
  2182. end
  2183. end
  2184. end
  2185. TheoryCraft_TooltipData[olddesc]["spellname"] = spellname
  2186. TheoryCraft_TooltipData[olddesc]["spellrank"] = spellrank
  2187. TheoryCraft_TooltipData[olddesc]["spellnumber"] = i2
  2188. TheoryCraft_TooltipData[olddesc]["dontdpsafterresists"] = i.dontdpsafterresists
  2189. TheoryCraft_TooltipData[olddesc]["isheal"] = i.isheal
  2190. TheoryCraft_TooltipData[olddesc]["iscombo"] = i.iscombo
  2191. TheoryCraft_TooltipData[olddesc]["cancrit"] = i.cancrit
  2192. TheoryCraft_TooltipData[olddesc]["shoot"] = i.shoot
  2193. TheoryCraft_TooltipData[olddesc]["ismelee"] = i.ismelee
  2194. TheoryCraft_TooltipData[olddesc]["isranged"] = i.isranged
  2195. TheoryCraft_TooltipData[olddesc]["autoshot"] = i.autoshot
  2196. TheoryCraft_TooltipData[olddesc]["armor"] = i.armor
  2197. TheoryCraft_TooltipData[olddesc]["binary"] = i.binary
  2198. TheoryCraft_TooltipData[olddesc]["dodps"] = i.dodps
  2199. TheoryCraft_TooltipData[olddesc]["isseal"] = i.isseal
  2200. TheoryCraft_TooltipData[olddesc]["drain"] = i.drain
  2201. TheoryCraft_TooltipData[olddesc]["holynova"] = i.holynova
  2202. TheoryCraft_TooltipData[olddesc]["dontdomax"] = i.dontdomax
  2203. TheoryCraft_TooltipData[olddesc]["overcd"] = i.overcooldown
  2204. if (TheoryCraft_Settings["GenerateList"] == "") or (string.find(TheoryCraft_Settings["GenerateList"], string.gsub(spellname, "-", "%%-").."%("..spellrank.."%)")) then
  2205. TheoryCraft_TooltipData[olddesc]["showonbutton"] = true
  2206. end
  2207. if TheoryCraft_Data["reporttimes"] then
  2208. TheoryCraft_Data["buttonsgenerated"] = TheoryCraft_Data["buttonsgenerated"]+1
  2209. TheoryCraft_Data["timetaken"] = TheoryCraft_Data["timetaken"]+GetTime()-timer
  2210. end
  2211. end
  2212.  
  2213. local data2 = {}
  2214.  
  2215. local function UpdateTarget(data)
  2216. if data == nil then return end
  2217. data["resistscore"] = 0
  2218. if data["basemanacost"] and data["manacost"] then
  2219. if UnitPower("player") >= data["basemanacost"] then
  2220. data["spellcasts"] = 1+math.floor((UnitPower("player")-(data["basemanacost"] or data["manacost"]))/data["manacost"])
  2221. if data["dpm"] and data["maxoomdam"] then
  2222. data["maxoomdamremaining"] = data["dpm"]*data["manacost"]*data["spellcasts"]
  2223. end
  2224. if data["hpm"] and data["maxoomheal"] then
  2225. data["maxoomhealremaining"] = data["hpm"]*data["manacost"]*data["spellcasts"]
  2226. end
  2227. else
  2228. data["spellcasts"] = 0
  2229. if data["maxoomdam"] then
  2230. data["maxoomdamremaining"] = 0
  2231. end
  2232. if data["maxoomheal"] then
  2233. data["maxoomdamremaining"] = 0
  2234. end
  2235. end
  2236. end
  2237.  
  2238. if data.iscombo then
  2239. if data["description"] == nil then return end
  2240. local points = GetComboPoints()
  2241. data["mindamage"] = data["combo"..points.."mindamage"] or 0
  2242. data["maxdamage"] = data["combo"..points.."maxdamage"] or 0
  2243. if (data["comboconvert"]) and (points > 0) then
  2244. local add = (UnitPower("player")-35)*data["comboconvert"]
  2245. data["mindamage"] = data["mindamage"]+add
  2246. data["maxdamage"] = data["maxdamage"]+add
  2247. end
  2248. data["critdmgmin"] = data["mindamage"]*(data["critbonus"]+1)
  2249. data["critdmgmax"] = data["maxdamage"]*(data["critbonus"]+1)
  2250. data["averagedamnocrit"] = (data["maxdamage"]+data["mindamage"])/2
  2251. data["averagecritdam"] = data["averagedamnocrit"]*data["critbonus"]
  2252. data["averagedam"] = data["averagedamnocrit"]+data["averagecritdam"]*(data["critdmgchance"] or 0)/100
  2253. data["description"] = data["beforecombo"]
  2254. local search = TheoryCraft_MeleeComboReader
  2255. search = string.gsub(search, "%(%%d%+%)", points, 1)
  2256. local replace = TheoryCraft_MeleeComboReplaceWith
  2257. replace = "%*"..string.gsub(replace, "%$points%$", points).."%*"
  2258. data["description"] = string.gsub(data["description"], search, replace)
  2259. end
  2260. if data["isheal"] then return end
  2261. if data["armor"] and TheoryCraft_Settings["mitigation"] then
  2262. TheoryCraft_DeleteTable(data2)
  2263. TheoryCraft_CopyTable(data, data2)
  2264. data = data2
  2265.  
  2266. local armormult = TheoryCraft_Data.armormultinternal
  2267. if data["description"] then
  2268. if data["mindamage"] then
  2269. data["description"] = string.gsub(data["description"], round(data["mindamage"]), round(data["mindamage"]*armormult))
  2270. end
  2271. if data["maxdamage"] then
  2272. data["description"] = string.gsub(data["description"], round(data["maxdamage"]), round(data["maxdamage"]*armormult))
  2273. end
  2274. end
  2275.  
  2276. if data["mindamage"] then data["mindamage"] = data["mindamage"]*armormult end
  2277. if data["maxdamage"] then data["maxdamage"] = data["maxdamage"]*armormult end
  2278. if data["critdmgmin"] then data["critdmgmin"] = data["critdmgmin"]*armormult end
  2279. if data["critdmgmax"] then data["critdmgmax"] = data["critdmgmax"]*armormult end
  2280. if data["nextstrdam"] then data["nextstrdam"] = data["nextstrdam"]*armormult end
  2281. if data["nextagidam"] then data["nextagidam"] = data["nextagidam"]*armormult end
  2282. if data["nexthitdam"] then data["nexthitdam"] = data["nexthitdam"]*armormult end
  2283. if data["nextcritdam"] then data["nextcritdam"] = data["nextcritdam"]*armormult end
  2284. if data["dpm"] then data["dpm"] = data["dpm"]*armormult end
  2285. if data["dps"] then data["dps"] = data["dps"]*armormult end
  2286. if data["averagedam"] then data["averagedam"] = data["averagedam"]*armormult end
  2287. if data["averagedamnocrit"] then data["averagedamnocrit"] = data["averagedamnocrit"]*armormult end
  2288. if data["maxoomdam"] then data["maxoomdam"] = data["maxoomdam"]*armormult end
  2289. if data["maxoomdamremaining"] then data["maxoomdamremaining"] = data["maxoomdamremaining"]*armormult end
  2290. if data["maxoomdamfloored"] then data["maxoomdamfloored"] = data["maxoomdamfloored"]*armormult end
  2291.  
  2292.  
  2293. if data["asrotationdps"] then data["asrotationdps"] = data["asrotationdps"]*armormult end
  2294. if data["msrotationdps"] then data["asrotationdps"] = data["asrotationdps"]*armormult end
  2295. if data["arcrotationdps"] then data["arcrotationdps"] = (data["arcrotationdps"] - (data["arcmagicdps"] or 0))*armormult + (data["arcmagicdps"] or 0) end
  2296.  
  2297. return data
  2298. end
  2299. if data["ismelee"] then return end
  2300. if data["isseal"] then return end
  2301. if data["autoshot"] then return end
  2302.  
  2303. local penamount = 0
  2304. if data["schools"] then
  2305. for k, v in pairs(data["schools"]) do
  2306. penamount = penamount + TheoryCraft_GetStat(v.."penetration")
  2307. for k, v2 in pairs(TheoryCraft_PrimarySchools) do
  2308. if (type(v2) == "table") and (v2.name == v) and (TheoryCraft_Settings["resistscores"][v2.name]) then
  2309. if TheoryCraft_Settings["resistscores"][v2.name] == "~" then
  2310. data["resistscore"] = data["resistscore"]+1000
  2311. else
  2312. data["resistscore"] = data["resistscore"]+TheoryCraft_Settings["resistscores"][v2.name]
  2313. end
  2314. end
  2315. end
  2316. end
  2317. end
  2318. if data["resistscore"] > 0 then
  2319. if data["resistscore"] < penamount then
  2320. data["resistscore"] = 0
  2321. else
  2322. data["resistscore"] = data["resistscore"]-penamount
  2323. end
  2324. end
  2325. penamount = data["resistscore"]
  2326. if penamount < 0 then
  2327. penamount = 0
  2328. end
  2329.  
  2330. data["resistscore"] = data["resistscore"]/(UnitLevel("player")*20/3)
  2331. if (data["resistscore"] > 0.75) and (data["resistscore"] < 2.5) then
  2332. data["resistscore"] = 0.75
  2333. end
  2334.  
  2335. data["resistlevel"] = UnitLevel("target")
  2336. local playerlevel = UnitLevel("player")
  2337. if data["resistlevel"] == -1 then
  2338. data["resistlevel"] = 63
  2339. end
  2340. if data["resistlevel"] == 0 then
  2341. data["resistlevel"] = playerlevel
  2342. end
  2343. data["resistrate"] = data["resistlevel"]-playerlevel
  2344. if UnitIsPlayer("target") then
  2345. if (data["resistrate"] < -2) then
  2346. data["resistrate"] = 1
  2347. elseif (data["resistrate"] == -2) then
  2348. data["resistrate"] = 2
  2349. elseif (data["resistrate"] == -1) then
  2350. data["resistrate"] = 3
  2351. elseif (data["resistrate"] == 0) then
  2352. data["resistrate"] = 4
  2353. elseif (data["resistrate"] == 1) then
  2354. data["resistrate"] = 5
  2355. elseif (data["resistrate"] == 2) then
  2356. data["resistrate"] = 6
  2357. elseif (data["resistrate"] > 2) then
  2358. data["resistrate"] = 13+(data["resistrate"]-3)*7
  2359. end
  2360. else
  2361. if (data["resistrate"] < -2) then
  2362. data["resistrate"] = 1
  2363. elseif (data["resistrate"] == -2) then
  2364. data["resistrate"] = 2
  2365. elseif (data["resistrate"] == -1) then
  2366. data["resistrate"] = 3
  2367. elseif (data["resistrate"] == 0) then
  2368. data["resistrate"] = 4
  2369. elseif (data["resistrate"] == 1) then
  2370. data["resistrate"] = 5
  2371. elseif (data["resistrate"] == 2) then
  2372. data["resistrate"] = 6
  2373. elseif (data["resistrate"] > 2) then
  2374. data["resistrate"] = 17+(data["resistrate"]-3)*11
  2375. end
  2376. end
  2377. if (data["resistrate"] > 99) then
  2378. data["resistrate"] = 99
  2379. end
  2380. data["resistrate"] = data["resistrate"]+(data["hitbonus"] or 0)
  2381. local toomuchhit
  2382. if (data["resistrate"] < 2) then
  2383. toomuchhit = 1
  2384. data["resistrate"] = 1
  2385. end
  2386. local damworth
  2387. if (data["nexthitdam"]) and (not data["dontdpsafterresists"]) then
  2388.  
  2389. local misschance = data["resistrate"]
  2390.  
  2391. local critchance = (data["critchance"] or 0)
  2392. if (misschance + critchance) > 100 then
  2393. critchance = 100-misschance
  2394. end
  2395. local hitchance = 100-critchance-misschance
  2396.  
  2397. local averagehitdam = (data["averagedamnocrit"] or 0)*(data["manamultiplier"] or 1)
  2398. local averagecritdam = ((data["averagedamnocrit"] or 0)*(data["manamultiplier"] or 1)+(data["averagecritdam"] or 0))
  2399. if TheoryCraft_Settings["dontcrit"] then
  2400. hitchance = hitchance + critchance
  2401. critchance = 0
  2402. end
  2403. hitchance = hitchance/100*averagehitdam
  2404. critchance = critchance/100*averagecritdam
  2405. data["dpsafterresists"] = round((hitchance+critchance)/data["casttime"], 1)
  2406. end
  2407.  
  2408. if not TheoryCraft_Settings["dontresist"] then
  2409. return
  2410. end
  2411. TheoryCraft_DeleteTable(data2)
  2412. TheoryCraft_CopyTable(data, data2)
  2413. data = data2
  2414.  
  2415. local resistmult = (1-data["resistscore"])
  2416. if data["binary"] then
  2417. if resistmult > 1 then
  2418. resistmult = 1
  2419. end
  2420. end
  2421. if resistmult < 0 then
  2422. resistmult = 0
  2423. penamount = 0
  2424. end
  2425.  
  2426. if data["nextcritdam"] then data["nextcritdam"] = data["nextcritdam"] * resistmult end
  2427. if data["nexthitdam"] then data["nexthitdam"] = data["nexthitdam"] * resistmult end
  2428.  
  2429. if data["overcd"] == nil then
  2430. if data["dps"] and data["dpsafterresists"] then
  2431. resistmult = resistmult * data["dpsafterresists"]/data["dps"]
  2432. data["dps"] = data["dpsafterresists"]
  2433. end
  2434. end
  2435. if data["binary"] then
  2436. data["resistrate"] = data["resistrate"] + data["resistscore"]*100
  2437. if data["resistrate"] > 100 then
  2438. data["resistrate"] = 100
  2439. end
  2440. end
  2441.  
  2442. if data["damworth"] then data["damworth"] = data["damworth"] * resistmult end
  2443.  
  2444. if penamount < 10 then
  2445. if data["nextpendam"] then
  2446. data["nextpendam"] = data["nextpendam"] * (penamount/10)
  2447. end
  2448. end
  2449. data["dontshowupto"] = ""
  2450.  
  2451. if data["nexthitdamequive"] and data["nexthitdam"] and data["damworth"] then data["nexthitdamequive"] = data["nexthitdam"] / data["damworth"] end
  2452. if data["nextcritdamequive"] and data["nextcritdam"] and data["damworth"] then data["nextcritdamequive"] = data["nextcritdam"] / data["damworth"] end
  2453. if data["nextpendamequive"] and data["nextpendam"] and data["damworth"] then data["nextpendamequive"] = data["nextpendam"] / data["damworth"] end
  2454.  
  2455. if data["damworth"] == 0 then data["nexthitdamequive"] = 0 end
  2456. if data["damworth"] == 0 then data["nextcritdamequive"] = 0 end
  2457.  
  2458. if data["dps"] then data["dps"] = data["dps"] * resistmult end
  2459. if data["withdotdps"] then data["withdotdps"] = data["withdotdps"] * resistmult end
  2460. if data["dpsdam"] then data["dpsdam"] = data["dpsdam"] * resistmult end
  2461. if data["averagedam"] then data["averagedam"] = data["averagedam"] * resistmult end
  2462. if data["averagedamnocrit"] then data["averagedamnocrit"] = data["averagedamnocrit"] * resistmult end
  2463. if data["dpm"] then data["dpm"] = data["dpm"] * resistmult end
  2464. if data["withdotdpm"] then data["withdotdpm"] = data["withdotdpm"] * resistmult end
  2465. if data["maxoomdam"] then data["maxoomdam"] = data["maxoomdam"] * resistmult end
  2466. if data["maxevocoomdam"] then data["maxevocoomdam"] = data["maxevocoomdam"] * resistmult end
  2467. if toomuchhit then data["nexthitdam"] = 0 data["nexthitdamequive"] = "At max, 0.00" end
  2468. if penamount == 0 then data["nextpendamequive"] = "At max, 0.00" end
  2469. return data
  2470. end
  2471.  
  2472. function TheoryCraft_GetSpellDataByFrame(frame, force)
  2473. if frame == nil then return nil end
  2474. if frame:NumLines() == 0 then return nil end
  2475. if getglobal(frame:GetName().."TextLeft"..frame:NumLines()) == nil then return nil end
  2476. local desc = getglobal(frame:GetName().."TextLeft"..frame:NumLines()):GetText()
  2477. if (frame:NumLines() == 1) and (desc ~= "Attack") then
  2478. local pos = strfind(desc, "%(%d+%)")
  2479. if not pos then return nil end
  2480. local data = TheoryCraft_GetSpellDataByName(string.sub(desc, 1, pos-1), tonumber(string.sub(desc, pos+1, string.len(desc)-1)), force, true)
  2481. if data == nil then return nil end
  2482. if data.spellnumber == nil then return nil end
  2483. frame:SetSpellBookItem(data.spellnumber,BOOKTYPE_SPELL)
  2484. return data
  2485. end
  2486. if TheoryCraft_TooltipData[desc] and TheoryCraft_TooltipData[desc].spellname then
  2487. return UpdateTarget(TheoryCraft_TooltipData[desc]) or TheoryCraft_TooltipData[desc]
  2488. end
  2489. TheoryCraft_GenerateTooltip(frame, nil, nil, nil, true, nil, force)
  2490. return UpdateTarget(TheoryCraft_TooltipData[desc]) or TheoryCraft_TooltipData[desc]
  2491. end
  2492.  
  2493. function TheoryCraft_GetSpellDataByName(spellname, spellrank, force, macro)
  2494. if spellrank == nil then spellrank = 0 end
  2495. local description = TheoryCraft_TooltipData[spellname.."("..spellrank..")"] or (macro and TheoryCraft_TooltipData[spellname.."MACRO("..spellrank..")"])
  2496. if (description) then
  2497. if TheoryCraft_TooltipData[description] and TheoryCraft_TooltipData[description].spellname then
  2498. return UpdateTarget(TheoryCraft_TooltipData[description]) or TheoryCraft_TooltipData[description]
  2499. end
  2500. end
  2501. TheoryCraft_GenerateTooltip(nil, spellname, spellrank, nil, true, macro)
  2502. if TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."("..spellrank..")"]] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."("..spellrank..")"]].spellname then
  2503. return UpdateTarget(TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."("..spellrank..")"]]) or TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."("..spellrank..")"]]
  2504. elseif TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."MACRO("..spellrank..")"]] and TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."MACRO("..spellrank..")"]].spellname then
  2505. return UpdateTarget(TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."MACRO("..spellrank..")"]]) or TheoryCraft_TooltipData[TheoryCraft_TooltipData[spellname.."MACRO("..spellrank..")"]]
  2506. end
  2507. end
  2508.  
  2509. function TheoryCraft_GetSpellDataByDescription(description, force)
  2510. if TheoryCraft_TooltipData[description] and TheoryCraft_TooltipData[description].spellname then
  2511. return UpdateTarget(TheoryCraft_TooltipData[description]) or TheoryCraft_TooltipData[description]
  2512. end
  2513. if (force ~= true) and (TheoryCraft_Settings["GenerateList"] ~= "") then
  2514. return
  2515. end
  2516. local i = 1
  2517. local spellname, spellrank
  2518. local testdesc
  2519. while (true) do
  2520. spellname, spellrank = GetSpellBookItemName(i,BOOKTYPE_SPELL)
  2521. if spellname == nil then break end
  2522. spellrank = tonumber(findpattern(spellrank, "%d+"))
  2523. if spellrank == nil then spellrank = 0 end
  2524. TCTooltip:SetOwner(UIParent,"ANCHOR_NONE")
  2525. TCTooltip:SetSpellBookItem(i,BOOKTYPE_SPELL)
  2526. testdesc = getglobal("TCTooltipTextLeft"..TCTooltip:NumLines()):GetText()
  2527. if testdesc == description then
  2528. TheoryCraft_GenerateTooltip(TCTooltip, spellname, spellrank, i, true)
  2529. return UpdateTarget(TheoryCraft_TooltipData[description]) or TheoryCraft_TooltipData[description]
  2530. end
  2531. i = i + 1
  2532. end
  2533. end
  2534.  
  2535. function TheoryCraft_GenerateAll()
  2536. TheoryCraft_DeleteTable(TheoryCraft_TooltipData)
  2537. TheoryCraft_DeleteTable(TheoryCraft_UpdatedButtons)
  2538. if TheoryCraft_UpdateOutfitTab then TheoryCraft_UpdateOutfitTab() end
  2539. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement