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 |