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