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