comparison Turok/Modules/Timer/Timer.lua @ 9:9400a0ff8540

Ugh Timer: - container update directionality - talent update iterates over a non-volatile table to carry out updates - index management steps organized - talentRow status implemented, returns the spell associated with the talent chosen from that row CombatLog: - sort out font controls and unbork arguments
author Nenue
date Sun, 21 Feb 2016 13:08:30 -0500
parents a9b8b0866ece
children
comparison
equal deleted inserted replaced
8:7790dff0fe13 9:9400a0ff8540
3 -- @project-revision@ @project-hash@ 3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@ 4 -- @file-revision@ @file-hash@
5 --- Defines common elements for the various timer HUDs 5 --- Defines common elements for the various timer HUDs
6 local ADDON, _A = ... 6 local ADDON, _A = ...
7 local _G, CreateFrame, tconcat, GetInventoryItemsForSlot, GetInventoryItemID = _G, CreateFrame, table.concat, GetInventoryItemsForSlot, GetInventoryItemID 7 local _G, CreateFrame, tconcat, GetInventoryItemsForSlot, GetInventoryItemID = _G, CreateFrame, table.concat, GetInventoryItemsForSlot, GetInventoryItemID
8 local T, F, tostring, type, max, tinsert, unpack, UIParent, loadstring = _A.Addon, _A.LibFog, tostring, type, max, table.insert, unpack, _G.UIParent, loadstring 8 local T, F, tostring, type, max, tinsert, unpack, UIParent, loadstring, rawset = _A.Addon, _A.LibFog, tostring, type, max, table.insert, unpack, _G.UIParent, loadstring, rawset
9 local mod = T.modules.TimerControl 9 local mod = T.modules.TimerControl
10 local P = mod.prototype 10 local P = mod.prototype
11 local db 11 local db
12 12
13 local pairs, ipairs, gsub, sub, setmetatable = pairs, ipairs, string.gsub, string.sub, setmetatable 13 local pairs, ipairs, gsub, sub, setmetatable, wipe = pairs, ipairs, string.gsub, string.sub, setmetatable, wipe
14 local INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2 = 14 local INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2 =
15 INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2 15 INVTYPE_FINGER, INVSLOT_FINGER1, INVSLOT_FINGER2, INVTYPE_TRINKET, INVSLOT_TRINKET1, INVSLOT_TRINKET2
16 --@debug@ 16 --@debug@
17 local DEBUG = true 17 local DEBUG = true
18 --@end-debug@ 18 --@end-debug@
21 if not DEBUG then return end 21 if not DEBUG then return end
22 if _G.Devian and _G.DevianDB.workspace ~= 1 then 22 if _G.Devian and _G.DevianDB.workspace ~= 1 then
23 _G.print('Timer', ...) 23 _G.print('Timer', ...)
24 end 24 end
25 end 25 end
26 local teprint = function(...)
27 if not DEBUG then return end
28 if _G.Devian and _G.DevianDB.workspace ~= 1 then
29 _G.print('TimerEvent',...)
30 end
31 end
32 local tfprint = function(...)
33 if not DEBUG then return end
34 if _G.Devian and _G.DevianDB.workspace ~= 1 then
35 _G.print('TimerFocus',...)
36 end
37 end
26 38
27 local Timer_GetPrintHandler = function(self) 39 local Timer_GetPrintHandler = function(self)
28 if self.trace then 40 if self.trace then
29 return function(...) 41 return function(...)
30 print(...) 42 print(...)
31 _G.print('TimerFocus', ...) 43 tfprint(...)
32 end else 44 end else
33 return print 45 return print
34 end 46 end
35 end 47 end
36 local pb_suppressed = {} 48 local pb_suppressed = {}
65 77
66 local mt_single = { 78 local mt_single = {
67 __mode = "v", 79 __mode = "v",
68 __newindex = function(t,k,v) 80 __newindex = function(t,k,v)
69 rawset(t,k,v) 81 rawset(t,k,v)
70 _G.print('DB', 'TCMeta: adding leaf', k, '=', v) 82 --_G.print('DB', 'TCMeta: adding leaf', k, '=', v)
71 end} 83 end}
72 local mt_double = { 84 local mt_double = {
73 __index = function(t,k) 85 __index = function(t,k)
74 t[k] = setmetatable({}, mt_single) 86 t[k] = setmetatable({}, mt_single)
75 _G.print('DB', 'TCMeta: add layer', k, '=', t[k]) 87 --_G.print('DB', 'TCMeta: add layer', k, '=', t[k])
76 return t[k] 88 return t[k]
77 end, 89 end,
78 __newindex = function(t,k,v) 90 __newindex = function(t,k,v)
79 rawset(t,k,v) 91 rawset(t,k,v)
80 _G.print('DB', 'TCMeta: adding to top layer', k, '=', v) 92 --_G.print('DB', 'TCMeta: adding to top layer', k, '=', v)
81 end 93 end
82 } 94 }
83 local mt_error = { 95 local mt_error = {
84 __call =function (t, txt) 96 __call =function (t, txt)
85 t.disable = true 97 t.disable = true
326 338
327 return mod.timers[id], newFrame 339 return mod.timers[id], newFrame
328 end 340 end
329 341
330 function mod.InitTimers() 342 function mod.InitTimers()
331 local print = function(...) _G.print('TimerEvent', ...) end 343 teprint('INIT TIMERS ====================')
332 print('INIT TIMERS ====================')
333 for id, spirit in pairs(mod.timers) do 344 for id, spirit in pairs(mod.timers) do
334 if spirit.disable then 345 if spirit.disable then
335 print(id, 'disabled:', tconcat(spirit.debug_info or {}, ', ')) 346 teprint(id, 'disabled:', tconcat(spirit.debug_info or {}, ', '))
336 else 347 else
337 348
338 print(cText('init'), cNum(id), cWord(spirit.name)) 349 teprint(cText('init'), cNum(id), cWord(spirit.name))
339 --- Throw a dry event to initialize values 350 --- Throw a dry event to initialize values
340 print(cText(' *'), cWord('prototype.'..cKey(spirit.dvars.type)..'.'..cWord('Load'))) 351 teprint(cText(' *'), cWord('prototype.'..cKey(spirit.dvars.type)..'.'..cWord('Load')))
341 P.trigger[spirit.dvars.type].Event(spirit) 352 P.trigger[spirit.dvars.type].Event(spirit)
342 353
343 --- Set loose 354 --- Set loose
344 print(cText(' *'), cWord('prototype')..'.'..cKey('events')..'.'..cWord('Load')) 355 teprint(cText(' *'), cWord('prototype')..'.'..cKey('events')..'.'..cWord('Load'))
345 mod.UpdateEvents(spirit, P.trigger[spirit.dvars.type].events) 356 mod.UpdateEvents(spirit, P.trigger[spirit.dvars.type].events)
346 end 357 end
347 end 358 end
348 print('INIT DONE =========================') 359 teprint('INIT DONE =========================')
349 end 360 end
350 361
351 function mod:DisableTimer(name, timer) 362 function mod:DisableTimer(name, timer)
352 local timer_frame = mod.db.timers[name] 363 local timer_frame = mod.db.timers[name]
353 if timer_frame and not timer_frame.disable then 364 if timer_frame and not timer_frame.disable then
385 end 396 end
386 397
387 local match_sub = { 398 local match_sub = {
388 {'%%c', "' .. tostring(t.caster).. '"}, 399 {'%%c', "' .. tostring(t.caster).. '"},
389 {'%%h', "' .. tostring((t.valueFull >= 60) and (math.floor(t.valueFull/60)) or t.value) .. '"}, 400 {'%%h', "' .. tostring((t.valueFull >= 60) and (math.floor(t.valueFull/60)) or t.value) .. '"},
390 {'%%i', "' .. tostring((t.valueFull >= 60) and (t.value % 60) or ((t.valueFull < 6) and math.floor((t.ValueFull * 100) % 100) or '')) .. '"}, 401 {'%%i', "' .. tostring((t.valueFull >= 60) and (math.floor(t.valueFull/60) .. ':' .. ((t.value %% 60) < 10 and '0' or '').. (t.value %% 60)) or ((t.valueFull < 6) and (t.value .. '.' .. math.floor((t.valueFull * 10) %% 10)) or t.value)) .. '"},
391 {'%%n', "' .. tostring(t.spellName) .. '"}, 402 {'%%n', "' .. tostring(t.spellName) .. '"},
392 {'%%p', "' .. tostring(t.value) .. '"}, 403 {'%%p', "' .. tostring(t.value) .. '"},
393 {'%%d', "' .. tostring(t.chargeDuration or t.duration) .. '"}, 404 {'%%d', "' .. tostring(t.chargeDuration or t.duration) .. '"},
394 {'%%%.p', "' .. string.sub(tostring((t.valueFull %% 1) * 100),0,1) .. '"}, 405 {'%%%.p', "' .. string.sub(tostring((t.valueFull %% 1) * 100),0,1) .. '"},
395 {"%%s", "' .. (t.stacks or t.charges or '') .. '"}, 406 {"%%s", "' .. (t.stacks or t.charges or '') .. '"},
514 v:Event(nil, 'target') 525 v:Event(nil, 'target')
515 end 526 end
516 end 527 end
517 528
518 --- Same thing but for talent/spec-driven 529 --- Same thing but for talent/spec-driven
530 local update_queue = {}
531 function mod.ResetTimers(heading)
532 print(cText('*** Flushing update queue for'), cWord(heading))
533 for id, frame in pairs(update_queue) do
534 print(' ', cNum(id), cKey(frame.timerName))
535 frame.disable = nil
536 wipe(frame.debug_info)
537 local res, msg = mod:EnableTimer(id, frame.dvars)
538 end
539 wipe(update_queue)
540 end
541
519 function mod:PLAYER_TALENT_UPDATE(e, unit) 542 function mod:PLAYER_TALENT_UPDATE(e, unit)
520 print('') 543 print('')
521 print('') 544 print('')
522 print(cText(e), T.specPage, T.specName) 545 print(cText(e), T.specPage, T.specName)
523 546
524 local update_queue = {}
525 for _, k in ipairs({'talentID', 'talentRow', 'specPage'}) do 547 for _, k in ipairs({'talentID', 'talentRow', 'specPage'}) do
526 for value, frameSet in pairs(mod.frames.talentID) do 548 for value, frameSet in pairs(mod.frames.talentID) do
527 for id, frame in ipairs(frameSet) do 549 for id, frame in ipairs(frameSet) do
528 print(frame.timerID, frame.timerName) 550 print(frame.timerID, frame.timerName)
529 update_queue[frame.timerID] = frame 551 update_queue[frame.timerID] = frame
530 end 552 end
531 end 553 end
532 end 554 end
533 555 mod.resetTimers('Talent')
534 for id, frame in pairs(update_queue) do
535 print('Refreshing spec-related frames', id, frame.timerName)
536 frame.disable = nil
537 table.wipe(frame.debug_info)
538 local res, msg = mod:EnableTimer(id, frame.dvars)
539 end
540
541 end 556 end
542 557
543 function mod:PLAYER_EQUIPMENT_CHANGED(e, slot, hasItem) 558 function mod:PLAYER_EQUIPMENT_CHANGED(e, slot, hasItem)
544 print(e, slot, hasItem) 559 print(e, slot, hasItem)
545 local itemCheckList 560 if mod.frames.inventoryID and mod.frames.inventoryID[slot] then
546 if mod.frames.inventoryID and mod.frames.inventoryID[slot] then 561 print(' Inventory slot:', cNum(slot))
547 print(' Inventory Frames:') 562 for i, slotFrame in ipairs(mod.frames.inventoryID[slot]) do
548 itemCheckList = GetInventoryItemsForSlot(slot, {}, false) 563 print(' ', cNum(i), cText(slotFrame.timerName))
549 for id, slotFrame in pairs(mod.frames.inventoryID[slot]) do 564 update_queue[slotFrame.timerID] = slotFrame
550 print(' * Updating', cNum(id), cWord(slotFrame.timerName)) 565 if mod.frames.itemID then
551 local res, msg = mod:EnableTimer(slotFrame.timerID, slotFrame.dvars) 566 local itemsForSlot = GetInventoryItemsForSlot(slot, {}, false)
552 print(' ', cBool(res), cText(msg)) 567 for _, itemID in pairs(itemsForSlot) do
553 end 568 if mod.frames.itemID[itemID] then
554 end 569 print(' Frames for equippable item:', cNum(itemID))
555 if itemCheckList then 570 for j, itemFrame in ipairs(mod.frames.itemID[itemID]) do
556 print(unpack(itemCheckList)) 571 print(' ', cNum(j), cText(itemFrame.timerName))
557 end 572 update_queue[itemFrame.timerID] = itemFrame
558 local itemID = GetInventoryItemID('player', slot) 573 end
559 if itemID and mod.frames.itemID[itemID] then 574 end
560 print(' Item ID Frames:') 575 end
561 for id, itemFrame in pairs(mod.frames.itemID[itemID]) do 576 end
562 print(' * Updating', cNum(id), cWord(itemFrame.timerName)) 577 end
563 578 end
564 local res, msg = mod:EnableTimer(itemFrame.timerID, itemFrame.dvars) 579 mod.ResetTimers('Equipment')
565 print(' ', cBool(res), cText(msg))
566 end
567 end
568 end 580 end
569 function mod:PET_BATTLE_OPENING_START () 581 function mod:PET_BATTLE_OPENING_START ()
570 for i, v in pairs(mod.timers) do 582 for i, v in pairs(mod.timers) do
571 if not v.disable then 583 if not v.disable then
572 print('suppressing', v:GetName()) 584 print('suppressing', v:GetName())