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