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 |