| 
Nenue@6
 | 
     1 --- ${PACKAGE_NAME}
 | 
| 
Nenue@6
 | 
     2 -- @file-author@
 | 
| 
Nenue@6
 | 
     3 -- @project-revision@ @project-hash@
 | 
| 
Nenue@6
 | 
     4 -- @file-revision@ @file-hash@
 | 
| 
Nenue@6
 | 
     5 -- Created: 1/15/2016 6:31 PM
 | 
| 
Nenue@6
 | 
     6 local T, _G = Turok, _G
 | 
| 
Nenue@6
 | 
     7 local mod = T.modules.TimerControl
 | 
| 
Nenue@6
 | 
     8 local GetTime, floor, unpack, tconcat = GetTime, floor, unpack, table.concat
 | 
| 
Nenue@6
 | 
     9 local HIDDEN, PASSIVE, ACTIVE = 0, 1,2
 | 
| 
Nenue@6
 | 
    10 --@debug@
 | 
| 
Nenue@6
 | 
    11 local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
 | 
| 
Nenue@6
 | 
    12 local print = function(...)
 | 
| 
Nenue@6
 | 
    13   if _G.Devian and _G.DevianDB.workspace ~= 1 then
 | 
| 
Nenue@6
 | 
    14     _G.print('Icon', ...)
 | 
| 
Nenue@6
 | 
    15   end
 | 
| 
Nenue@6
 | 
    16 end
 | 
| 
Nenue@6
 | 
    17 --@end-debug@
 | 
| 
Nenue@6
 | 
    18 local GetPrint = function(trace)
 | 
| 
Nenue@6
 | 
    19   if trace then
 | 
| 
Nenue@6
 | 
    20     return print
 | 
| 
Nenue@6
 | 
    21   else
 | 
| 
Nenue@6
 | 
    22     return function() end
 | 
| 
Nenue@6
 | 
    23   end
 | 
| 
Nenue@6
 | 
    24 end
 | 
| 
Nenue@6
 | 
    25 
 | 
| 
Nenue@6
 | 
    26 T.defaults.spirit.icon = {
 | 
| 
Nenue@6
 | 
    27   combatFade = true,
 | 
| 
Nenue@6
 | 
    28   alpha = 1,
 | 
| 
Nenue@6
 | 
    29   alpha_passive = 1,
 | 
| 
Nenue@6
 | 
    30   alpha_active = 1,
 | 
| 
Nenue@6
 | 
    31   alpha_ooc_passive = 0,
 | 
| 
Nenue@6
 | 
    32   alpha_ooc_active = 1,
 | 
| 
Nenue@6
 | 
    33   alpha_ooc = 0.25,
 | 
| 
Nenue@6
 | 
    34   size = 48,
 | 
| 
Nenue@6
 | 
    35   container = 'default',
 | 
| 
Nenue@6
 | 
    36   strata = 'LOW',
 | 
| 
Nenue@6
 | 
    37   fade_in_time = 0.2,
 | 
| 
Nenue@6
 | 
    38   fade_out_time = 0.3,
 | 
| 
Nenue@6
 | 
    39   anchor = 'BOTTOM', anchorTo = 'BOTTOM',
 | 
| 
Nenue@6
 | 
    40   parent = 1,
 | 
| 
Nenue@6
 | 
    41   size = 48,
 | 
| 
Nenue@6
 | 
    42   width = 48, height = 48,
 | 
| 
Nenue@6
 | 
    43   x = 0,
 | 
| 
Nenue@6
 | 
    44   y = 0,
 | 
| 
Nenue@6
 | 
    45   strata = 'MEDIUM',
 | 
| 
Nenue@6
 | 
    46   padding = 3,
 | 
| 
Nenue@6
 | 
    47   spacing = 1,
 | 
| 
Nenue@6
 | 
    48   foreground_inset=  0,
 | 
| 
Nenue@6
 | 
    49 }
 | 
| 
Nenue@6
 | 
    50 
 | 
| 
Nenue@6
 | 
    51 local p = mod.prototype.display.icon
 | 
| 
Nenue@6
 | 
    52 
 | 
| 
Nenue@6
 | 
    53 p.type='display'
 | 
| 
Nenue@6
 | 
    54 p.inherits = 'TurokIconTemplate'
 | 
| 
Nenue@6
 | 
    55 
 | 
| 
Nenue@6
 | 
    56 --- if config flags need to overrided
 | 
| 
Nenue@6
 | 
    57 p.cvars = {
 | 
| 
Nenue@6
 | 
    58   enableIcon = true
 | 
| 
Nenue@6
 | 
    59 }
 | 
| 
Nenue@6
 | 
    60 --- Negotiate the config differences between different display states
 | 
| 
Nenue@6
 | 
    61 -- Hidden  - display is or should (via fade-out) be hidden
 | 
| 
Nenue@6
 | 
    62 -- Passive - display is visible, but no timing information is processed
 | 
| 
Nenue@6
 | 
    63 -- Active  - display is visible and counting time; on expiration, it will downgrade itself to passive or hidden
 | 
| 
Nenue@6
 | 
    64 p.Init = function(self)
 | 
| 
Nenue@6
 | 
    65   local print = GetPrint(self.trace)
 | 
| 
Nenue@6
 | 
    66 
 | 
| 
Nenue@6
 | 
    67   print('display.Icon.Load')
 | 
| 
Nenue@6
 | 
    68   local c = self.cvars
 | 
| 
Nenue@6
 | 
    69   if c.type == 'aura' then
 | 
| 
Nenue@6
 | 
    70     self.spiral:SetReverse(true)
 | 
| 
Nenue@6
 | 
    71   else
 | 
| 
Nenue@6
 | 
    72     self.spiral:SetReverse(false)
 | 
| 
Nenue@6
 | 
    73   end
 | 
| 
Nenue@6
 | 
    74 
 | 
| 
Nenue@6
 | 
    75   if not self.icon:IsShown() then
 | 
| 
Nenue@6
 | 
    76     self.icon:Show()
 | 
| 
Nenue@6
 | 
    77   end
 | 
| 
Nenue@6
 | 
    78   print('icon texture=', self.spellIcon or self.itemIcon)
 | 
| 
Nenue@6
 | 
    79   self.icon:SetTexture(self.spellIcon or self.itemIcon)
 | 
| 
Nenue@6
 | 
    80 end
 | 
| 
Nenue@6
 | 
    81 
 | 
| 
Nenue@9
 | 
    82 local function Icon_UpdateCooldown(self)
 | 
| 
Nenue@9
 | 
    83   self.spiral:Show()
 | 
| 
Nenue@9
 | 
    84   self.spiral:SetCooldown(self.charges and self.chargeStart or (self.override and self.override_start or self.start), self.charges and self.chargeDuration or (self.override and self.override_duration or self.duration))
 | 
| 
Nenue@9
 | 
    85   print('spiral:Play() new', self.charges and self.chargeStart or self.start, self.charges and self.chargeDuration or self.duration)
 | 
| 
Nenue@9
 | 
    86 end
 | 
| 
Nenue@6
 | 
    87 
 | 
| 
Nenue@6
 | 
    88 --- Advances the display state, applying any visual transitions as necessary;
 | 
| 
Nenue@6
 | 
    89 -- @param self frame object
 | 
| 
Nenue@6
 | 
    90 -- @param newState state value; 1 for inactive, 2 for untimed active, 3 for timed active
 | 
| 
Nenue@6
 | 
    91 -- @param forcePrevious force the frame's lastState to this value to block off OnUpdate difference tests
 | 
| 
Nenue@6
 | 
    92 -- even if forced, the actual history value will still be used for method scope
 | 
| 
Nenue@6
 | 
    93 p.SetState = function(self, newState, forcePrevious)
 | 
| 
Nenue@6
 | 
    94 
 | 
| 
Nenue@6
 | 
    95   --print(cWord(self:GetName()), 'state change issued:', cNum(state), cType(previous))
 | 
| 
Nenue@6
 | 
    96 
 | 
| 
Nenue@6
 | 
    97   local previous = self.displayState
 | 
| 
Nenue@6
 | 
    98   self.prevState = forcePrevious and forcePrevious or previous
 | 
| 
Nenue@6
 | 
    99   self.displayState = newState
 | 
| 
Nenue@6
 | 
   100   print('SetState', cNum(newState), '(from '..cType(previous)..')', cText(self.timerName))
 | 
| 
Nenue@6
 | 
   101   --_G.print('Prototype.'..self.cvars.type, 'SetState', cNum(newState), '(from '..cType(previous)..')', cText(self.timerName))
 | 
| 
Nenue@6
 | 
   102 
 | 
| 
Nenue@6
 | 
   103   --- Change transitions
 | 
| 
Nenue@6
 | 
   104   if newState ~= previous then
 | 
| 
Nenue@6
 | 
   105     print(cText('  Transition'))
 | 
| 
Nenue@6
 | 
   106     if newState == HIDDEN then
 | 
| 
Nenue@6
 | 
   107       print(cText('  to HIDDEN'))
 | 
| 
Nenue@6
 | 
   108     -- to HIDDEN
 | 
| 
Nenue@6
 | 
   109       if previous then
 | 
| 
Nenue@6
 | 
   110       -- has to have been ACTIVE or PASSIVE at this point
 | 
| 
Nenue@6
 | 
   111         if previous == ACTIVE then
 | 
| 
Nenue@6
 | 
   112           print('     from ACTIVE')
 | 
| 
Nenue@6
 | 
   113           self.spiral:StopAnimating()
 | 
| 
Nenue@6
 | 
   114         else
 | 
| 
Nenue@6
 | 
   115           print('     from PASSIVE')
 | 
| 
Nenue@6
 | 
   116         end
 | 
| 
Nenue@6
 | 
   117 
 | 
| 
Nenue@6
 | 
   118         self.Intro:Stop()
 | 
| 
Nenue@6
 | 
   119         if self.event then
 | 
| 
Nenue@6
 | 
   120           print('      set by event script')
 | 
| 
Nenue@6
 | 
   121           self.Outro:Play()
 | 
| 
Nenue@6
 | 
   122         else
 | 
| 
Nenue@6
 | 
   123           print('      non-event source')
 | 
| 
Nenue@6
 | 
   124           self:Hide()
 | 
| 
Nenue@6
 | 
   125         end
 | 
| 
Nenue@6
 | 
   126       end
 | 
| 
Nenue@6
 | 
   127       -- want to end here if HIDDEN from nil
 | 
| 
Nenue@6
 | 
   128     else
 | 
| 
Nenue@6
 | 
   129       -- to ACTIVE or PASSIVE
 | 
| 
Nenue@6
 | 
   130       self.Outro:Stop() -- stop any running outro
 | 
| 
Nenue@6
 | 
   131 
 | 
| 
Nenue@6
 | 
   132 
 | 
| 
Nenue@6
 | 
   133       if newState == ACTIVE then
 | 
| 
Nenue@6
 | 
   134 
 | 
| 
Nenue@6
 | 
   135         -- and is ACTIVE
 | 
| 
Nenue@6
 | 
   136         self:Show()
 | 
| 
Nenue@9
 | 
   137         Icon_UpdateCooldown(self)
 | 
| 
Nenue@6
 | 
   138       end
 | 
| 
Nenue@6
 | 
   139 
 | 
| 
Nenue@6
 | 
   140       if previous and previous ~= HIDDEN then
 | 
| 
Nenue@6
 | 
   141         print(cText('  from vis'))
 | 
| 
Nenue@6
 | 
   142       -- from visible
 | 
| 
Nenue@6
 | 
   143         if self.event then
 | 
| 
Nenue@6
 | 
   144           self.refresh = true
 | 
| 
Nenue@6
 | 
   145         end
 | 
| 
Nenue@6
 | 
   146       else
 | 
| 
Nenue@6
 | 
   147         print(cText('  from non-vis'))
 | 
| 
Nenue@6
 | 
   148         if self.event then
 | 
| 
Nenue@6
 | 
   149           self.Intro:Play()
 | 
| 
Nenue@6
 | 
   150         else
 | 
| 
Nenue@6
 | 
   151           self:Show()
 | 
| 
Nenue@6
 | 
   152         end
 | 
| 
Nenue@6
 | 
   153       end
 | 
| 
Nenue@6
 | 
   154     end
 | 
| 
Nenue@6
 | 
   155   else
 | 
| 
Nenue@6
 | 
   156     --- No-change transitions
 | 
| 
Nenue@6
 | 
   157     if newState == ACTIVE then
 | 
| 
Nenue@6
 | 
   158       -- ACTIVE to ACTIVE
 | 
| 
Nenue@9
 | 
   159       Icon_UpdateCooldown(self)
 | 
| 
Nenue@6
 | 
   160     else
 | 
| 
Nenue@6
 | 
   161       print(cPink('stopping spiral'))
 | 
| 
Nenue@6
 | 
   162       self.spiral:Hide()
 | 
| 
Nenue@6
 | 
   163     end
 | 
| 
Nenue@6
 | 
   164 
 | 
| 
Nenue@6
 | 
   165     -- non-HIDDEN to non-HIDDEN and not a dry fire
 | 
| 
Nenue@6
 | 
   166     if self.event and newState ~= HIDDEN then
 | 
| 
Nenue@6
 | 
   167       self.refresh = true
 | 
| 
Nenue@6
 | 
   168     end
 | 
| 
Nenue@6
 | 
   169   end
 | 
| 
Nenue@6
 | 
   170 
 | 
| 
Nenue@6
 | 
   171   if newState ~= HIDDEN then
 | 
| 
Nenue@6
 | 
   172     print(cText('  CVars:'))
 | 
| 
Nenue@6
 | 
   173     local c
 | 
| 
Nenue@6
 | 
   174     if newState == ACTIVE then
 | 
| 
Nenue@9
 | 
   175       if self.override then
 | 
| 
Nenue@9
 | 
   176         c = self.cvars.override
 | 
| 
Nenue@9
 | 
   177         print('apply override profile')
 | 
| 
Nenue@9
 | 
   178       else
 | 
| 
Nenue@9
 | 
   179         print('apply active profile')
 | 
| 
Nenue@9
 | 
   180         c = self.cvars.active
 | 
| 
Nenue@9
 | 
   181       end
 | 
| 
Nenue@9
 | 
   182 
 | 
| 
Nenue@6
 | 
   183       self.fillState = 1
 | 
| 
Nenue@6
 | 
   184     else
 | 
| 
Nenue@6
 | 
   185       print('apply passive profile')
 | 
| 
Nenue@6
 | 
   186       c = self.cvars.passive
 | 
| 
Nenue@6
 | 
   187       self.fillState = 2
 | 
| 
Nenue@6
 | 
   188     end
 | 
| 
Nenue@6
 | 
   189 
 | 
| 
Nenue@6
 | 
   190     if self.icon and c.icon then
 | 
| 
Nenue@6
 | 
   191 
 | 
| 
Nenue@6
 | 
   192       print(cText('    '), cWord('desat=')..cBool(c.icon.desaturated), cWord('color=')..cNum(tconcat(c.icon.color, ', ')))
 | 
| 
Nenue@6
 | 
   193       self.icon:SetVertexColor(unpack(c.icon.color))
 | 
| 
Nenue@6
 | 
   194       self.icon:SetDesaturated(c.icon.desaturated)
 | 
| 
Nenue@6
 | 
   195     end
 | 
| 
Nenue@6
 | 
   196     self:UpdateAlpha(T.inCombat, self.displayState, self.fillState)
 | 
| 
Nenue@6
 | 
   197   end
 | 
| 
Nenue@6
 | 
   198 end
 | 
| 
Nenue@6
 | 
   199 
 | 
| 
Nenue@6
 | 
   200 p.Update = function(self)
 | 
| 
Nenue@6
 | 
   201 
 | 
| 
Nenue@6
 | 
   202   if self.displayState == 0 and self.prevState ~= 0 then
 | 
| 
Nenue@6
 | 
   203     print('flip to', self.displayState)
 | 
| 
Nenue@6
 | 
   204     self.prevState = self.displayState -- quietly advance state
 | 
| 
Nenue@6
 | 
   205     self.percent = 1
 | 
| 
Nenue@6
 | 
   206     self.valueFull = 0
 | 
| 
Nenue@6
 | 
   207     self.value = 0
 | 
| 
Nenue@6
 | 
   208     self:SetText()
 | 
| 
Nenue@6
 | 
   209   elseif self.displayState == 1 and self.prevState ~= 1 then
 | 
| 
Nenue@6
 | 
   210     print('flip to', self.displayState)
 | 
| 
Nenue@6
 | 
   211     self.prevState = self.displayState -- quietly advance state
 | 
| 
Nenue@6
 | 
   212     self.valueFull = 0
 | 
| 
Nenue@6
 | 
   213     self.value = 0
 | 
| 
Nenue@6
 | 
   214     self.percent = 1
 | 
| 
Nenue@6
 | 
   215     self:SetText()
 | 
| 
Nenue@6
 | 
   216     print(self.percent, self.duration, self.start, self.expires)
 | 
| 
Nenue@6
 | 
   217   elseif self.displayState == 2 then
 | 
| 
Nenue@6
 | 
   218     if self.prevState ~= 2 or self.refresh then
 | 
| 
Nenue@6
 | 
   219       print('flipped to', self.displayState)
 | 
| 
Nenue@6
 | 
   220       self.prevState = self.displayState -- quietly advance state
 | 
| 
Nenue@6
 | 
   221       self.refresh = nil
 | 
| 
Nenue@6
 | 
   222     end
 | 
| 
Nenue@6
 | 
   223     -- prevState is set externally
 | 
| 
Nenue@6
 | 
   224     local time = GetTime()
 | 
| 
Nenue@6
 | 
   225     if self.expires <= time and self.charges == self.maxCharges then
 | 
| 
Nenue@9
 | 
   226       print(self.cvars.type, 'timer expired, set to', (self.cvars.persist and self.flags.passive or self.flags.hidden))
 | 
| 
Nenue@6
 | 
   227       self.percent = 1
 | 
| 
Nenue@6
 | 
   228       self.duration = 0
 | 
| 
Nenue@6
 | 
   229       self.expires = 0
 | 
| 
Nenue@6
 | 
   230       self.start=  0
 | 
| 
Nenue@6
 | 
   231       self.valueFull = self.duration
 | 
| 
Nenue@6
 | 
   232       self.value = self.duration
 | 
| 
Nenue@6
 | 
   233       self.elapsed = self.duration
 | 
| 
Nenue@6
 | 
   234       self.remaining = 0
 | 
| 
Nenue@6
 | 
   235       self:SetState(self.cvars.persist and self.flags.passive or self.flags.hidden)
 | 
| 
Nenue@6
 | 
   236     else
 | 
| 
Nenue@9
 | 
   237       -- unit_aura is too ambiguous
 | 
| 
Nenue@9
 | 
   238       if self.override and self.override_expires < time then
 | 
| 
Nenue@9
 | 
   239         self.override = nil
 | 
| 
Nenue@9
 | 
   240         self:SetState(self.flags.active)
 | 
| 
Nenue@9
 | 
   241       end
 | 
| 
Nenue@9
 | 
   242 
 | 
| 
Nenue@9
 | 
   243       if self.override then
 | 
| 
Nenue@9
 | 
   244         self.valueFull = self.override_start + self.override_duration - time
 | 
| 
Nenue@9
 | 
   245         self.percent = (time - self.override_start) / self.override_duration
 | 
| 
Nenue@9
 | 
   246       elseif self.charges and self.charges < self.charges_max then
 | 
| 
Nenue@9
 | 
   247         self.valueFull = self.charge_expires - time
 | 
| 
Nenue@9
 | 
   248         self.percent = (time - self.charge_start) / self.charge_duration
 | 
| 
Nenue@9
 | 
   249       else
 | 
| 
Nenue@9
 | 
   250         self.valueFull  = self.expires - time
 | 
| 
Nenue@9
 | 
   251         self.percent = (time - self.start) / self.duration
 | 
| 
Nenue@9
 | 
   252       end
 | 
| 
Nenue@9
 | 
   253 
 | 
| 
Nenue@6
 | 
   254       self.elapsed = time - self.start
 | 
| 
Nenue@6
 | 
   255       self.remaining = self.duration - time
 | 
| 
Nenue@6
 | 
   256 
 | 
| 
Nenue@6
 | 
   257       self.value = floor(self.valueFull)
 | 
| 
Nenue@6
 | 
   258     end
 | 
| 
Nenue@6
 | 
   259 
 | 
| 
Nenue@6
 | 
   260     --PlaySoundFile(self.cvars.sound_active)
 | 
| 
Nenue@6
 | 
   261     self:SetText()
 | 
| 
Nenue@6
 | 
   262   end
 | 
| 
Nenue@6
 | 
   263 end |