Mercurial > wow > turok
view Turok/Modules/Timer/Status.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 |
line wrap: on
line source
local _G, T = _G, Turok local mod = T.modules.TimerControl local P = mod.prototype local GetInventoryItemID, GetItemInfo, GetInventoryItemTexture = GetInventoryItemID, GetItemInfo, GetInventoryItemTexture local GetSpellDescription, GetSpellInfo, GetSpellCharges = GetSpellDescription, GetSpellInfo, GetSpellCharges local tinsert, type, tonumber, pairs, ipairs, unpack = tinsert, type, tonumber, pairs, ipairs, unpack local UnitGUID = UnitGUID local GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot = GetTalentInfo, GetTalentInfoByID, GetItemSpell, PaperDoll_IsEquippedSlot --@debug@ local DEBUG = true --@end-debug@ local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool local print = function(...) if not DEBUG then return end if _G.Devian and _G.DevianDB.workspace ~= 1 then _G.print('Timer', ...) end end local tfprint = function(...) if not DEBUG then return end if _G.Devian and _G.DevianDB.workspace ~= 1 then _G.print('TimerFocus', ...) end end ------------------------------------------ --- Parameter Prototypes local Timer_GetPrintHandler = function(self) return self.trace and function(...) print(...) tfprint( ...) end or print end local Timer_UpdateIndex = function(self, key, value) local print = Timer_GetPrintHandler(self) -- sfk[value] = frame index key-value handle -- mfkv = key-value frame index -- mfkv[sfk[value]] = *frame if self.frames[key] then local sfk = self.frames[key] -- for each unique value for oldValue, index in pairs(sfk) do local mfkv = mod.frames[key][oldValue] -- for each offset after index for i = index+1, #mfkv do mfkv[i-1] = mfkv[i] -- slide it down end sfk[oldValue] = nil print(cText(' *= self.frames')..'['..cKey(key)..']['..cNum(value)..'] =', cNum(self.frames[key][value])) print(cText(' *= mod.frames')..'['..cKey(key)..']['..cNum(value)..']['..cNum(index)..'] =', cNum(self:GetName())) end else self.frames[key] = {} end if value then local mfkv = mod.frames[key][value] local sfk = self.frames[key] mfkv[#mfkv+1] = self sfk[value] = #mfkv print(' *= self.frames['..cKey(key)..']['..cNum(value)..'] = ', sfk[value]) end end --- update conditional cvars (i.e. talentRow(5) pulls up column 3, so cvars.x = args[talentRow][3].x) local Timer_SetAttributeValues = function(self, key, value) print(' ', cKey(key), 'sub-value =', cNum(value)) local sda = self.dvars.args if sda and sda[key] then print(cText(' conditional:')) local dvals = (value and sda[key][value]) and sda[key][value] or sda[key].default for k, v in pairs(dvals) do print(cText(' '), 'cvars.'..cKey(k), '=', cWord(v)) self.cvars[k] = v end end end --- spellID do local spellID = P.status.spellID spellID.Init = function(self, spellID) local print = Timer_GetPrintHandler(self) if type(spellID) == 'table' then spellID = spellID[T.specPage] end -- May have changed if invoked through a slot assignment if spellID ~= self.spellID then self.spellID = spellID self.charges, self.maxCharges, self.chargeStart, self.chargeDuration = GetSpellCharges(spellID) self.spellDescription = GetSpellDescription(spellID) self.spellName, self.spellRank, self.spellIcon, self.castingTime, self.minRange, self.maxRange = GetSpellInfo(spellID) --@debug@ print(' ', cWord('spellID ='), cKey(self.spellID), cNum(self.spellName), cText(self.spellDescription and '<desc>' or '<empty>'))--@end-debug@ Timer_UpdateIndex(self, 'spellID', spellID) end end end --- spellName do local spellName = P.status.spellName spellName.Init = function(self, spellName) local print = Timer_GetPrintHandler(self) -- attempt to get spell info local exists, _, _, _, _, _, spellID = GetSpellInfo(spellName) if exists then local charges, maxCharges, start, duration = GetSpellCharges(spellID or spellName) Timer_UpdateIndex(self, 'spellName', nil) print(' ', cKey("spellID"), '=', spellID) P.status.spellID.Init(self, spellID) else print(' ', cPink("spellID"), '=', 'not sure') Timer_UpdateIndex(self, 'spellID', nil) Timer_UpdateIndex(self, 'spellName', spellName) end Timer_SetAttributeValues(self, 'spellName', spellID) end end --- talentID do local talentID = P.status.talentID local GetTalentInfoByID = GetTalentInfoByID talentID.type = 'status' talentID.Init = function(self, talentID) local print = Timer_GetPrintHandler(self) self.talentID, self.spellName, self.spellIcon, self.talentSelected = GetTalentInfoByID(talentID, T.specGroup) if self.talentSelected then print(' ', cKey("spellName"), '=', cWord(self.spellName)) P.status.spellName.Init(self, self.spellName) else self.disable = true self.debug_info ('Talent not selected.') end print(' ', cKey('talentID ('..cNum(self.talentID)..', '..cNum(T.specGroup)..'):'), self.spellName, self.talentSelected ) Timer_UpdateIndex(self, 'talentID', talentID) Timer_SetAttributeValues(self, 'talentID', self.talentSelected and 1 or 'default') end end --- talentRow - use whatever is in that row as data do local talentRow = P.status.talentRow talentRow.Init = function(self, row) local print = Timer_GetPrintHandler(self) self.talentRow = row local match for i = 1, 3 do local talentID, _, _, selected = GetTalentInfo(row, i, T.specGroup) if selected then P.status.talentID.Init(self, talentID) match = i end end if not match then self.disable = true self.debug_info("No talent selected in target row.") end Timer_UpdateIndex(self, 'talentRow', row) Timer_SetAttributeValues(self, 'talentRow', match) end end --- talentOffset do local talentOffset = P.status.talentOffset talentOffset.Init = function(self, coords) local print = Timer_GetPrintHandler(self) local tier, column = unpack(coords) local selected, usable, _ self.talentID, self.spellName, self.spellIcon, selected, usable = GetTalentInfo(tier, column, T.specGroup) print(' ', cKey('talentOffset'), '=', cNum(tier), cNum(column), self.spellName, selected, usable) if not (selected and usable) then self.disable = true self.debug_info ((not usable) and 'Unavailable at current level.' or 'Talent not selected.') end Timer_UpdateIndex(self, 'talentID', self.talentID) end end --- specPage do local specPage = P.status.specPage specPage.type = 'status' specPage.Init = function(self, specPage) local print = Timer_GetPrintHandler(self) local match if tonumber(specPage) then match = specPage == T.specPage elseif type(specPage) == 'table' then for _, pageID in ipairs(specPage) do if T.specPage == pageID then specPage = pageID match = true break end end else self.disable = true self.debug_info ('Bad value for', '('..cWord(self.timerName)..').'..cKey('specPage')) Timer_UpdateIndex(self,'specPage', nil) end if match then print(' ', cKey('specPage'), '=', '['..cNum(specPage)..']') Timer_UpdateIndex(self,'specPage', specPage) else print(' ', cKey('specPage'), '~=', '['..cNum(specPage)..']') self.disable = true self.debug_info('Not active spec.') end end end --- itemID do local itemID = P.status.itemID itemID.type = 'status' itemID.Init = function(self, item) local print = Timer_GetPrintHandler(self) if not self.dvars.inventoryID then self.itemID = item or self.dvars.itemID self.itemType = self.dvars.itemType else self.itemID = item end --@debug@ --name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink") if not self.itemID then self.disable = true self.debug_info ('bad itemID value') end local spellName = GetItemSpell(self.itemID) if not spellName then self.disable = true self.debug_info('no spell detected') if self.spellName then self.spellName = nil end end Timer_UpdateIndex(self, 'spellName', spellName) Timer_SetAttributeValues(self, 'itemID', spellName) print(' ', cKey('itemID'), cNum(self.itemID), self.isEquipped)--@end-debug@ end end do local inventoryID = P.status.inventoryID inventoryID.type = 'status' inventoryID.Init = function(self, slot) local print = Timer_GetPrintHandler(self) self.inventoryID = slot local itemID = GetInventoryItemID(self.dvars.unit, slot) local name = GetItemInfo(itemID) if not PaperDoll_IsEquippedSlot(slot) then self.disable = true self.debug_info('slot un-equipped') return end Timer_SetAttributeValues(self, 'inventoryID', itemID) P.status.itemID.Init(self, itemID) self.spellIcon = GetInventoryItemTexture(self.dvars.unit, slot) print(' ', cKey('inventoryID'), '=', '{'..cNum(self.inventoryID).. ' -> '.. cNum(self.itemID or 'no-equip').. '}') end end --- unit local unit = P.status.unit unit.type = 'status' unit.Init = function(self, unit) local print = Timer_GetPrintHandler(self) self.unitGUID = UnitGUID(unit) self.unit = unit print(' ', cWord('unitGUID'), '=', cText(self.unitGUID)) tinsert(mod.frames.unit[unit], self) self.frames.unit = #mod.frames.unit[unit] end