view Turok/Modules/Timer/Aura.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 0b1a2f3dbfc4
line wrap: on
line source
--- Turok - Aura.lua
-- @file-author@
-- @project-revision@ @project-hash@
-- @file-revision@ @file-hash@
-- Created: 12/25/2015 5:58 AM
-- Aura data collection
local GetTime, UnitAura, GetSpellDescription, GetSpellInfo = GetTime, UnitAura, GetSpellDescription, GetSpellInfo
local T, _G, tinsert = Turok, _G, tinsert
local mod = T:GetModule("TimerControl")

--@debug@
local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
local print = function(...)
  if _G.Devian and _G.DevianDB.workspace ~= 1 then
    _G.print('Aura', ...)
  end
end
--@end-debug@

T.defaults.spirit.aura = {
  counterText = "%p",
  subCounterText = "%.p",
  chargesText = "%s",
  justifyH = 'CENTER',
  justifyV = 'TOP',
  leftText = "%p",
  rightText = "%n",

  passive = {
    icon = {
      desaturated = false,
      color = {1, 1, 1, 1},
      blend = 'BLEND'
    }
  },
  active = {
    icon = {
      desaturated = false,
      color = {1, 1, 1, 1},
      blend = 'BLEND'
    }
  },
}

local p = mod.prototype.trigger.aura
p.class  = 'trigger'             -- identifier values that are visible from function scope
p.type   = 'aura'
p.cvars = { -- only define things that could break the frame here
}
p.events = {
  ['UNIT_AURA'] = true,
}

--- takes user supplied values or fills itself with the cvar values provided
p.Init = function(self, auraName, auraFilters, auraUnit)

  print('Aura.Init')
  self.unit = auraUnit and auraUnit or self.dvars.unit
  self.spellName = auraName and auraName or self.spellName
  self.filters = auraFilters and auraFilters or self.dvars.filters
  -- set inversion states, states 0 and 1 are only processed when prevState differs
  if self.cvars.inverse then
    self.flags = {
      active = 0,
      active_prev = 2,
      passive = 0,
      passive_prev = 1,
      hidden = 1,
      hidden_prev = 0,
    }
    self.duration = 1
    self.expires = 1
  else
    self.flags = {
      active = 2,
      active_prev = 0,
      passive = 1,
      passive_prev = 0,
      hidden = 0,
      hidden_prev = 1}
  end
  print(cWord('Load:'),cNum(self.spellID or self.inventoryID or self.itemID), cText(self.spellName))
end

p.Unload = function(self)
  print('unloading events')
  for k,v in pairs(p.events) do
    self:UnregisterEvent(k)
  end
end

--- Return current status data
p.Query = function(self)
  print( '    Q:', self.unit , self.spellName, nil, self.filters)
  return UnitAura(self.unit , self.spellName, nil, self.filters)
end

p.SetText = mod.SetText

--- Set supplied status data, using the list returned by p.Query()
p.Set = function(self, ...)
  self.active, self.rank, _, self.count, self.dispelType, self.duration, self.expires, self.caster,
  self.isStealable, self.shouldConsolidate, self.spellID, self.canApplyAura, self.isBossDebuff = ...
  if self.active then
    if self.cvars.duration then
      self.duration = self.cvars.duration
      print(cKey('force duration ='), cNum(self.cvars.duration))
    end
    self.start = self.expires - self.duration
  end
end

--- Handle in the frame itself to limit collateral from bugs
function p.Event(self, event, unit)
  self.event = event
  if not event then
    print(' DRY FIRE')
  elseif unit ~= self.unit then
    return
  end

  --- 3 states: nil, 0, >0

  local active, rank, _, count, dispelType, duration, expires, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff = self:Query()
  local state
  if self.cvars.duration and active ~= self.active then
    print('passive aura with forced duration')
    state = self.flags.active
    duration = self.cvars.duration
    expires = GetTime() + self.cvars.duration
  elseif (not self.cvars.duration and (duration ~= self.duration or expires ~= self.expires)) or active ~= self.active then
    if not active then
      if (not self.untriggerFunc) or self:untriggerFunc() then
        state = self.flags.hidden
      end
    else
      if (not self.triggerFunc) or self:triggerFunc() then
        if duration == 0 then
          print('passive aura')
          state = self.flags.passive
        else
          print('updating an active aura')
          state = self.flags.active
        end
        self.start = expires - duration
      end
    end
  end

  if state then
    T:Dispatch('TK_AURA_UPDATE', self.spellID, self.filters, state, self.displayState)
    self:Set(active, rank, _, count, dispelType, duration, expires, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff)
    self:SetState(state)
    print(cText('push state'), cNum(self.displayState).. ' (prev: '.. cNum(self.prevState)..')', self.timerName,  cText(active), cKey(duration), cNum(expires), cBool(self.cvars.inverse))
  else
    print(cText('no changes'), cNum(self.displayState).. ' (prev: '.. cNum(self.prevState)..')', cText(self.timerName))
  end
end

p.Value = function(self)
  return (self.charges and self.charges < self.maxCharges) and ((GetTime()  - self.chargeStart) / self.chargeDuration) or ((GetTime()  - self.start) / self.duration)
end