| 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 |