| Nenue@6 | 1 local _G, T = _G, Turok | 
| Nenue@6 | 2 local mod = T.modules.TimerControl | 
| Nenue@6 | 3 local P = mod.prototype | 
| Nenue@6 | 4 local GetInventoryItemID, GetItemInfo, GetInventoryItemTexture = GetInventoryItemID, GetItemInfo, GetInventoryItemTexture | 
| Nenue@6 | 5 local GetSpellDescription, GetSpellInfo, GetSpellCharges = GetSpellDescription, GetSpellInfo, GetSpellCharges | 
| Nenue@6 | 6 local tinsert, type, tonumber, pairs, ipairs, unpack = tinsert, type, tonumber, pairs, ipairs, unpack | 
| Nenue@6 | 7 local UnitGUID = UnitGUID | 
| Nenue@6 | 8 local GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot = GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot | 
| Nenue@6 | 9 --@debug@ | 
| Nenue@6 | 10 local DEBUG = true | 
| Nenue@6 | 11 --@end-debug@ | 
| Nenue@6 | 12 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool | 
| Nenue@6 | 13 local print = function(...) | 
| Nenue@6 | 14   if not DEBUG then return end | 
| Nenue@6 | 15   if _G.Devian and _G.DevianDB.workspace ~= 1 then | 
| Nenue@6 | 16     _G.print('Timer', ...) | 
| Nenue@6 | 17   end | 
| Nenue@6 | 18 end | 
| Nenue@9 | 19 local tfprint = function(...) | 
| Nenue@9 | 20   if not DEBUG then return end | 
| Nenue@9 | 21   if _G.Devian and _G.DevianDB.workspace ~= 1 then | 
| Nenue@9 | 22     _G.print('TimerFocus', ...) | 
| Nenue@9 | 23   end | 
| Nenue@9 | 24 end | 
| Nenue@6 | 25 ------------------------------------------ | 
| Nenue@6 | 26 --- Parameter Prototypes | 
| Nenue@6 | 27 | 
| Nenue@6 | 28 local Timer_GetPrintHandler = function(self) | 
| Nenue@6 | 29   return self.trace and function(...) | 
| Nenue@6 | 30     print(...) | 
| Nenue@9 | 31     tfprint( ...) | 
| Nenue@6 | 32   end or print | 
| Nenue@6 | 33 end | 
| Nenue@6 | 34 | 
| Nenue@6 | 35 local Timer_UpdateIndex = function(self, key, value) | 
| Nenue@6 | 36   local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 37   --       sfk[value] = frame index key-value handle | 
| Nenue@6 | 38   --             mfkv = key-value frame index | 
| Nenue@6 | 39   -- mfkv[sfk[value]] = *frame | 
| Nenue@6 | 40   if self.frames[key] then | 
| Nenue@6 | 41     local sfk = self.frames[key] | 
| Nenue@6 | 42     -- for each unique value | 
| Nenue@6 | 43     for oldValue, index in pairs(sfk) do | 
| Nenue@6 | 44       local mfkv = mod.frames[key][oldValue] | 
| Nenue@6 | 45       -- for each offset after index | 
| Nenue@6 | 46       for i = index+1, #mfkv do | 
| Nenue@6 | 47         mfkv[i-1] = mfkv[i] -- slide it down | 
| Nenue@6 | 48       end | 
| Nenue@6 | 49       sfk[oldValue] = nil | 
| Nenue@6 | 50       print(cText('    *= self.frames')..'['..cKey(key)..']['..cNum(value)..'] =', cNum(self.frames[key][value])) | 
| Nenue@6 | 51       print(cText('    *= mod.frames')..'['..cKey(key)..']['..cNum(value)..']['..cNum(index)..'] =', cNum(self:GetName())) | 
| Nenue@6 | 52     end | 
| Nenue@6 | 53   else | 
| Nenue@6 | 54     self.frames[key] = {} | 
| Nenue@6 | 55   end | 
| Nenue@6 | 56 | 
| Nenue@6 | 57   if value then | 
| Nenue@6 | 58     local mfkv = mod.frames[key][value] | 
| Nenue@6 | 59     local sfk = self.frames[key] | 
| Nenue@6 | 60     mfkv[#mfkv+1] = self | 
| Nenue@6 | 61     sfk[value] = #mfkv | 
| Nenue@6 | 62     print('    *= self.frames['..cKey(key)..']['..cNum(value)..'] = ', sfk[value]) | 
| Nenue@6 | 63   end | 
| Nenue@6 | 64 end | 
| Nenue@6 | 65 | 
| Nenue@9 | 66 --- update conditional cvars (i.e. talentRow(5) pulls up column 3, so cvars.x = args[talentRow][3].x) | 
| Nenue@9 | 67 local Timer_SetAttributeValues = function(self, key, value) | 
| Nenue@9 | 68   print('   ', cKey(key), 'sub-value =', cNum(value)) | 
| Nenue@9 | 69   local sda = self.dvars.args | 
| Nenue@9 | 70   if sda and sda[key] then | 
| Nenue@9 | 71     print(cText('      conditional:')) | 
| Nenue@9 | 72     local dvals = (value and sda[key][value]) and sda[key][value] or sda[key].default | 
| Nenue@9 | 73     for k, v in pairs(dvals) do | 
| Nenue@9 | 74       print(cText('     '), 'cvars.'..cKey(k), '=', cWord(v)) | 
| Nenue@9 | 75       self.cvars[k] = v | 
| Nenue@9 | 76     end | 
| Nenue@9 | 77   end | 
| Nenue@9 | 78 end | 
| Nenue@9 | 79 | 
| Nenue@6 | 80 --- spellID | 
| Nenue@6 | 81 do | 
| Nenue@6 | 82   local spellID = P.status.spellID | 
| Nenue@6 | 83   spellID.Init = function(self, spellID) | 
| Nenue@6 | 84     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 85 | 
| Nenue@6 | 86     if type(spellID) == 'table' then | 
| Nenue@6 | 87       spellID = spellID[T.specPage] | 
| Nenue@6 | 88     end | 
| Nenue@6 | 89 | 
| Nenue@6 | 90     -- May have changed if invoked through a slot assignment | 
| Nenue@6 | 91     if spellID ~= self.spellID then | 
| Nenue@6 | 92       self.spellID = spellID | 
| Nenue@6 | 93       self.charges, self.maxCharges, self.chargeStart, self.chargeDuration = GetSpellCharges(spellID) | 
| Nenue@6 | 94       self.spellDescription = GetSpellDescription(spellID) | 
| Nenue@6 | 95       self.spellName, self.spellRank, self.spellIcon, self.castingTime, self.minRange, self.maxRange = GetSpellInfo(spellID) | 
| Nenue@6 | 96       --@debug@ | 
| Nenue@6 | 97       print('   ', cWord('spellID ='), cKey(self.spellID), cNum(self.spellName), cText(self.spellDescription and '<desc>' or '<empty>'))--@end-debug@ | 
| Nenue@6 | 98 | 
| Nenue@6 | 99       Timer_UpdateIndex(self, 'spellID', spellID) | 
| Nenue@6 | 100     end | 
| Nenue@6 | 101   end | 
| Nenue@6 | 102 end | 
| Nenue@6 | 103 | 
| Nenue@6 | 104 --- spellName | 
| Nenue@6 | 105 do | 
| Nenue@6 | 106   local spellName = P.status.spellName | 
| Nenue@6 | 107   spellName.Init = function(self, spellName) | 
| Nenue@6 | 108     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 109     -- attempt to get spell info | 
| Nenue@6 | 110     local exists, _, _, _, _, _, spellID =  GetSpellInfo(spellName) | 
| Nenue@6 | 111     if exists then | 
| Nenue@6 | 112       local charges, maxCharges, start, duration = GetSpellCharges(spellID or spellName) | 
| Nenue@6 | 113       Timer_UpdateIndex(self, 'spellName', nil) | 
| Nenue@6 | 114       print('   ', cKey("spellID"), '=', spellID) | 
| Nenue@6 | 115       P.status.spellID.Init(self, spellID) | 
| Nenue@6 | 116     else | 
| Nenue@6 | 117       print('   ', cPink("spellID"), '=', 'not sure') | 
| Nenue@6 | 118       Timer_UpdateIndex(self, 'spellID', nil) | 
| Nenue@6 | 119       Timer_UpdateIndex(self, 'spellName', spellName) | 
| Nenue@6 | 120     end | 
| Nenue@9 | 121     Timer_SetAttributeValues(self, 'spellName', spellID) | 
| Nenue@6 | 122   end | 
| Nenue@6 | 123 end | 
| Nenue@6 | 124 | 
| Nenue@6 | 125 | 
| Nenue@6 | 126 --- talentID | 
| Nenue@6 | 127 do | 
| Nenue@6 | 128   local talentID = P.status.talentID | 
| Nenue@6 | 129   local GetTalentInfoByID = GetTalentInfoByID | 
| Nenue@6 | 130   talentID.type = 'status' | 
| Nenue@6 | 131   talentID.Init = function(self, talentID) | 
| Nenue@6 | 132     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 133 | 
| Nenue@6 | 134     self.talentID, self.spellName, self.spellIcon, self.talentSelected = GetTalentInfoByID(talentID, T.specGroup) | 
| Nenue@6 | 135 | 
| Nenue@6 | 136     if self.talentSelected then | 
| Nenue@6 | 137       print('   ', cKey("spellName"), '=', cWord(self.spellName)) | 
| Nenue@6 | 138       P.status.spellName.Init(self, self.spellName) | 
| Nenue@6 | 139     else | 
| Nenue@6 | 140       self.disable =  true | 
| Nenue@6 | 141       self.debug_info ('Talent not selected.') | 
| Nenue@6 | 142     end | 
| Nenue@6 | 143 | 
| Nenue@6 | 144     print('   ', cKey('talentID ('..cNum(self.talentID)..', '..cNum(T.specGroup)..'):'), self.spellName, self.talentSelected ) | 
| Nenue@6 | 145     Timer_UpdateIndex(self, 'talentID', talentID) | 
| Nenue@9 | 146     Timer_SetAttributeValues(self, 'talentID', self.talentSelected and 1 or 'default') | 
| Nenue@6 | 147   end | 
| Nenue@6 | 148 end | 
| Nenue@6 | 149 | 
| Nenue@6 | 150 --- talentRow - use whatever is in that row as data | 
| Nenue@6 | 151 do | 
| Nenue@6 | 152   local talentRow = P.status.talentRow | 
| Nenue@6 | 153   talentRow.Init = function(self, row) | 
| Nenue@6 | 154     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 155     self.talentRow = row | 
| Nenue@9 | 156     local match | 
| Nenue@9 | 157     for i = 1, 3 do | 
| Nenue@9 | 158       local talentID, _, _, selected = GetTalentInfo(row, i, T.specGroup) | 
| Nenue@9 | 159       if selected then | 
| Nenue@9 | 160         P.status.talentID.Init(self, talentID) | 
| Nenue@9 | 161         match = i | 
| Nenue@9 | 162       end | 
| Nenue@9 | 163     end | 
| Nenue@9 | 164 | 
| Nenue@9 | 165     if not match then | 
| Nenue@6 | 166       self.disable = true | 
| Nenue@6 | 167       self.debug_info("No talent selected in target row.") | 
| Nenue@6 | 168     end | 
| Nenue@6 | 169     Timer_UpdateIndex(self, 'talentRow', row) | 
| Nenue@9 | 170     Timer_SetAttributeValues(self, 'talentRow', match) | 
| Nenue@6 | 171   end | 
| Nenue@6 | 172 end | 
| Nenue@6 | 173 | 
| Nenue@6 | 174 | 
| Nenue@6 | 175 --- talentOffset | 
| Nenue@6 | 176 do | 
| Nenue@6 | 177   local talentOffset = P.status.talentOffset | 
| Nenue@6 | 178   talentOffset.Init = function(self, coords) | 
| Nenue@6 | 179     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 180 | 
| Nenue@6 | 181     local tier, column = unpack(coords) | 
| Nenue@6 | 182 | 
| Nenue@6 | 183 | 
| Nenue@6 | 184     local selected, usable, _ | 
| Nenue@6 | 185     self.talentID, self.spellName, self.spellIcon, selected, usable = GetTalentInfo(tier, column, T.specGroup) | 
| Nenue@6 | 186     print('   ', cKey('talentOffset'), '=', cNum(tier), cNum(column), self.spellName, selected, usable) | 
| Nenue@6 | 187     if not (selected and usable) then | 
| Nenue@6 | 188       self.disable =  true | 
| Nenue@6 | 189       self.debug_info ((not usable) and 'Unavailable at current level.' or 'Talent not selected.') | 
| Nenue@6 | 190     end | 
| Nenue@6 | 191     Timer_UpdateIndex(self, 'talentID', self.talentID) | 
| Nenue@6 | 192   end | 
| Nenue@6 | 193 end | 
| Nenue@6 | 194 | 
| Nenue@6 | 195 --- specPage | 
| Nenue@6 | 196 do | 
| Nenue@6 | 197   local specPage = P.status.specPage | 
| Nenue@6 | 198   specPage.type = 'status' | 
| Nenue@6 | 199   specPage.Init = function(self, specPage) | 
| Nenue@6 | 200     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 201     local match | 
| Nenue@6 | 202     if tonumber(specPage) then | 
| Nenue@6 | 203       match = specPage == T.specPage | 
| Nenue@6 | 204     elseif type(specPage) == 'table' then | 
| Nenue@6 | 205       for _, pageID in ipairs(specPage) do | 
| Nenue@6 | 206         if T.specPage == pageID then | 
| Nenue@6 | 207           specPage = pageID | 
| Nenue@6 | 208           match = true | 
| Nenue@6 | 209           break | 
| Nenue@6 | 210         end | 
| Nenue@6 | 211       end | 
| Nenue@6 | 212     else | 
| Nenue@6 | 213       self.disable =  true | 
| Nenue@6 | 214       self.debug_info ('Bad value for', '('..cWord(self.timerName)..').'..cKey('specPage')) | 
| Nenue@6 | 215       Timer_UpdateIndex(self,'specPage', nil) | 
| Nenue@6 | 216     end | 
| Nenue@6 | 217 | 
| Nenue@6 | 218     if match then | 
| Nenue@6 | 219       print('   ', cKey('specPage'), '=', '['..cNum(specPage)..']') | 
| Nenue@6 | 220       Timer_UpdateIndex(self,'specPage', specPage) | 
| Nenue@6 | 221     else | 
| Nenue@6 | 222       print('   ', cKey('specPage'), '~=', '['..cNum(specPage)..']') | 
| Nenue@6 | 223       self.disable = true | 
| Nenue@6 | 224       self.debug_info('Not active spec.') | 
| Nenue@6 | 225     end | 
| Nenue@6 | 226   end | 
| Nenue@6 | 227 end | 
| Nenue@6 | 228 | 
| Nenue@6 | 229 --- itemID | 
| Nenue@6 | 230 do | 
| Nenue@6 | 231   local itemID = P.status.itemID | 
| Nenue@6 | 232   itemID.type  = 'status' | 
| Nenue@6 | 233   itemID.Init = function(self, item) | 
| Nenue@6 | 234     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 235 | 
| Nenue@6 | 236     if not self.dvars.inventoryID then | 
| Nenue@6 | 237       self.itemID = item or self.dvars.itemID | 
| Nenue@6 | 238       self.itemType = self.dvars.itemType | 
| Nenue@6 | 239     else | 
| Nenue@6 | 240       self.itemID = item | 
| Nenue@6 | 241     end | 
| Nenue@6 | 242 | 
| Nenue@6 | 243     --@debug@ | 
| Nenue@6 | 244     --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink") | 
| Nenue@6 | 245     if not self.itemID then | 
| Nenue@6 | 246       self.disable =  true | 
| Nenue@6 | 247        self.debug_info ('bad itemID value') | 
| Nenue@6 | 248     end | 
| Nenue@6 | 249 | 
| Nenue@9 | 250     local spellName = GetItemSpell(self.itemID) | 
| Nenue@6 | 251 | 
| Nenue@9 | 252     if not spellName then | 
| Nenue@6 | 253       self.disable =  true | 
| Nenue@9 | 254       self.debug_info('no spell detected') | 
| Nenue@9 | 255       if self.spellName then | 
| Nenue@9 | 256         self.spellName = nil | 
| Nenue@6 | 257       end | 
| Nenue@6 | 258     end | 
| Nenue@9 | 259 | 
| Nenue@9 | 260     Timer_UpdateIndex(self, 'spellName', spellName) | 
| Nenue@9 | 261     Timer_SetAttributeValues(self, 'itemID', spellName) | 
| Nenue@9 | 262 | 
| Nenue@6 | 263     print('   ', cKey('itemID'), cNum(self.itemID), self.isEquipped)--@end-debug@ | 
| Nenue@6 | 264   end | 
| Nenue@6 | 265 end | 
| Nenue@6 | 266 | 
| Nenue@6 | 267 do | 
| Nenue@6 | 268   local inventoryID = P.status.inventoryID | 
| Nenue@6 | 269   inventoryID.type = 'status' | 
| Nenue@6 | 270   inventoryID.Init = function(self, slot) | 
| Nenue@6 | 271     local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 272 | 
| Nenue@6 | 273     self.inventoryID = slot | 
| Nenue@9 | 274     local itemID = GetInventoryItemID(self.dvars.unit, slot) | 
| Nenue@9 | 275     local name = GetItemInfo(itemID) | 
| Nenue@6 | 276     if not PaperDoll_IsEquippedSlot(slot) then | 
| Nenue@6 | 277       self.disable = true | 
| Nenue@6 | 278       self.debug_info('slot un-equipped') | 
| Nenue@6 | 279       return | 
| Nenue@6 | 280     end | 
| Nenue@6 | 281 | 
| Nenue@9 | 282     Timer_SetAttributeValues(self, 'inventoryID', itemID) | 
| Nenue@9 | 283     P.status.itemID.Init(self, itemID) | 
| Nenue@6 | 284     self.spellIcon = GetInventoryItemTexture(self.dvars.unit, slot) | 
| Nenue@6 | 285     print('   ', cKey('inventoryID'), '=', '{'..cNum(self.inventoryID).. ' -> '.. cNum(self.itemID or 'no-equip').. '}') | 
| Nenue@6 | 286   end | 
| Nenue@6 | 287 end | 
| Nenue@6 | 288 | 
| Nenue@6 | 289 | 
| Nenue@6 | 290 --- unit | 
| Nenue@6 | 291 local unit = P.status.unit | 
| Nenue@6 | 292 unit.type = 'status' | 
| Nenue@6 | 293 unit.Init = function(self, unit) | 
| Nenue@6 | 294   local print = Timer_GetPrintHandler(self) | 
| Nenue@6 | 295 | 
| Nenue@6 | 296   self.unitGUID = UnitGUID(unit) | 
| Nenue@6 | 297   self.unit = unit | 
| Nenue@6 | 298   print('   ', cWord('unitGUID'), '=', cText(self.unitGUID)) | 
| Nenue@6 | 299   tinsert(mod.frames.unit[unit], self) | 
| Nenue@6 | 300   self.frames.unit = #mod.frames.unit[unit] | 
| Nenue@6 | 301 end |