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