annotate Turok/Modules/Timer/Icon.lua @ 11:0b1a2f3dbfc4 tip

aura duration override triggering activation twice when aura data still exists briefly after duration end
author Nenue
date Mon, 22 Feb 2016 03:11:54 -0500
parents 9400a0ff8540
children
rev   line source
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