comparison ObjectiveTracker/Quests.lua @ 28:c33c17dd97e7

file renames
author Nenue
date Wed, 13 Apr 2016 20:19:37 -0400
parents
children adcd7c328d07
comparison
equal deleted inserted replaced
27:c3aa94bc6be2 28:c33c17dd97e7
1 local B = select(2,...).frame
2 local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
3 local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
4 local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText
5 local Default, Quest = T.DefaultHandler, T.Quest
6 local format = format
7 local print = B.print('Tracker')
8 local lprint = B.print('Line')
9 local iprint = B.print('Info')
10
11 local colors = T.colors
12
13 local tprint = B.print('Tracker')
14 Quest.Update = function(self, reason, ...)
15 local print = tprint
16 print('QuestTracker:Update() received')
17 T.UpdateActionButtons()
18 Default.Update(self, reason, ...)
19 end
20
21 T.Quest.numButtons = 0
22 local usedButtons = T.Quest.itemButtons
23 local freeButtons = T.Quest.freeButtons
24
25 Quest.UpdateObjectives = function(handler, block)
26 local print = lprint
27 print('|cFF00FFFFUpdateObjectives()')
28 local info = block.info
29
30 local titlebg, textbg = colors.default.titlebg, colors.default.textbg
31 print((info.isAccount and 'isAccount' or ''), (info.isFaction and 'isFaction' or ''), (info.isDaily and 'isDaily' or ''), (info.isWeekly and 'isWeekly' or ''), info.tagID, info.tagName)
32
33 if info.isAccount then
34 if info.isFaction then
35 print(' faction', info.tagID)
36 titlebg, textbg = colors['faction_'..info.tagID].titlebg, colors.default.textbg
37 else
38 print(' account', info.isAccount, info.isFaction)
39 titlebg, textbg = colors.account.titlebg, colors.account.textbg
40 end
41 elseif info.isDaily then
42 print(' daily', info.frequency)
43 titlebg, textbg = colors.daily.titlebg, colors.daily.textbg
44 elseif info.isWeekly then
45 print(' weekly', info.frequency)
46 titlebg, textbg = colors.weekly.titlebg, colors.weekly.textbg
47 end
48
49 block.titlebg:SetGradientAlpha(unpack(titlebg))
50 block.statusbg:SetGradientAlpha(unpack(textbg))
51
52 local completionText
53 if info.isComplete then
54 if info.isAutoComplete then
55 local questID, popupType = GetAutoQuestPopUp(info.questLogIndex)
56 if popupType == 'COMPLETE' then
57 print(' :: auto-complete quest :: set the message')
58 info.completionText = T.strings.CLICK_TO_COMPLETE
59 end
60 else
61 if not completionText or info.completionText then
62 info.completionText = GetQuestLogCompletionText(info.questLogIndex)
63 end
64 end
65 print(' :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"')
66 end
67
68 Default.UpdateObjectives(handler, block)
69 end
70
71 Quest.UpdateLine = function(handler, block, line, data)
72 local print = lprint
73 local objectiveType = data.type
74 local r, g, b, a = 0, 1, 1, 1
75
76 line.progress = 0
77 if data.finished then
78 line.progress = 2
79 r, g, b, a = 0, 1, 0, 1
80 elseif objectiveType == 'monster' then
81 r, g, b, a = 1, .55, .2, 1
82 elseif objectiveType == 'item' then
83 r, g, b, a = .8, .8, .8, 1
84 elseif objectiveType == 'object' then
85 r, g, b, a = 1, 1, 1, 1
86 elseif objectiveType == 'player' then
87 r, g, b, a = 0, 0.8, 1, 1
88 end
89 print(format(' |cFF%02X%02X%02X%0.1f, %0.1f, %0.1f|r', (r * 255), g * 255, b * 255, r, g, b))
90
91 line.displayColor = {r, g, b, a}
92 line.status:SetTextColor(r, g, b, a)
93 line.displayText = data.text
94
95 return line
96 end
97
98 -----------------------------
99 --- QUEST
100 Quest.POI = {}
101 Quest.QuestBlock = {}
102 Quest.LogBlock = {}
103 Quest.LogInfo = {}
104
105 function Quest:GetNumWatched ()
106 print(self.name, self)
107 self.numAll = GetNumQuestLogEntries()
108 self.numWatched = GetNumQuestWatches()
109 return self.numWatched, self.numAll
110 end
111 Quest.GetInfo = function (self, watchIndex)
112 local print = iprint
113 print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)')
114 local questID, title, questIndex, numObjectives, requiredMoney, _,
115 _, isAutoComplete, failureTime, timeElapsed, questType, _, _, _, _ = GetQuestWatchInfo(watchIndex)
116
117 if not questIndex then
118 return
119 end
120
121
122 local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
123
124
125 if not questID then
126 return
127 end
128 Quest.Info[questID] = Quest.Info[questID] or {}
129
130 local q = Quest.Info[questID]
131 q.watchIndex = watchIndex
132 q.type = 'Quest'
133 q.questID = questID
134 q.title = title
135 q.level = level
136 q.displayQuestID = displayQuestID
137 q.suggestedGroup = suggestedGroup
138 q.questLogIndex = questIndex
139 q.numObjectives = numObjectives
140 q.requiredMoney = requiredMoney
141 q.isComplete = isComplete
142 q.startEvent = startEvent
143 q.isAutoComplete = isAutoComplete
144 q.failureTime = failureTime
145 q.timeElapsed = timeElapsed
146 q.questType = questType
147 q.isTask = isTask
148 q.isStory = isStory
149 q.isOnMap = isOnMap
150 q.hasLocalPOI = hasLocalPOI
151 q.frequency = frequency
152 q.isComplete = isComplete
153 q.isStory = isStory
154 q.isTask = isTask
155
156 --- resolve icon type and template
157 local questTagID, tagName = GetQuestTagInfo(questID)
158 local tagID
159
160 local factionGroup = GetQuestFactionGroup(questID);
161 if( questTagID and questTagID == QUEST_TAG_ACCOUNT ) then
162 if( factionGroup ) then
163 tagID = "ALLIANCE";
164 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
165 tagID = "HORDE";
166 end
167 q.isFaction = true
168 else
169 tagID = QUEST_TAG_ACCOUNT;
170 q.isAccount = true
171 end
172 q.typeTag = QUEST_TAG_TCOORDS[tagID]
173 elseif ( factionGroup) then
174 tagID = "ALLIANCE";
175 if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
176 tagID = "HORDE";
177 end
178 q.isFaction = true
179 end
180
181 if( frequency == LE_QUEST_FREQUENCY_DAILY and (not isComplete or isComplete == 0) ) then
182 tagID = "DAILY";
183 q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"]
184 q.isDaily = true
185 elseif( frequency == LE_QUEST_FREQUENCY_WEEKLY and (not isComplete or isComplete == 0) )then
186 tagID = "WEEKLY";
187 q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"]
188 q.isWeekly = true
189 elseif( questTagID ) then
190 tagID = questTagID;
191 end
192
193 if ( isComplete and isComplete < 0 ) then
194 q.completionTag = QUEST_TAG_TCOORDS["FAILED"]
195 q.isFailed = true
196 elseif isComplete then
197 q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"]
198 end
199
200
201 q.tagID = questTagID
202 q.tagName = tagName
203 --q.isBreadCrumb = isBreadCrumb
204 q.completionText= GetQuestLogCompletionText(questIndex)
205 q.numObjectives = GetNumQuestLeaderBoards(questIndex)
206 q.objectives = {}
207 for i = 1, q.numObjectives do
208 local text, type, finished = GetQuestLogLeaderBoard(i, questIndex)
209 print(format(' #%d %s %s %s', i, tostring(type), tostring(text), tostring(finished)))
210 q.objectives[i] = {
211 index = i,
212 type = type,
213 text = text,
214 finished = finished
215 }
216 if type == 'event' then
217 elseif type == 'monster' then
218 elseif type == 'object' then
219 elseif type == 'reputation' then
220 elseif type == 'item' then
221 end
222 end
223
224 if requiredMoney >= 1 then
225 local money = GetMoney()
226 local moneyText = money
227 local requiredSilver, requiredCopper
228 local requiredGold = (requiredMoney > 10000) and (floor(requiredMoney/10000)) or nil
229 if mod(requiredMoney, 10000) ~= 0 then
230 requiredSilver = (requiredMoney > 100) and (mod(requiredMoney, 10000) / 100) or nil
231 if mod(requiredMoney, 100) ~= 0 then
232 requiredCopper = mod(requiredMoney, 100)
233 end
234 end
235
236 -- round the money value down
237 if requiredMoney > 9999 and not (requiredSilver or requiredCopper) then
238 moneyText = floor(money/10000)
239 elseif requiredMoney < 10000 and mod(requiredMoney,100) == 0 then
240 moneyText = floor(money/100)
241 end
242
243 local text = moneyText
244 local index = #q.objectives + 1
245 local finished = (GetMoney() >= requiredMoney)
246
247 if not finished then
248 text = text .. ' / ' .. GetCoinTextureString(requiredMoney, 12)
249 else
250 text = '' .. GetCoinTextureString(requiredMoney, 12)
251 end
252 q.objectives[index] = {
253 index = index,
254 type = 'progressbar',
255 quantity = money,
256 requiredQuantity = requiredMoney,
257 text = text,
258 finished = finished
259 }
260 print(format(' #%d %s %s %s', index, 'money', text, tostring(finished)))
261 end
262
263
264 local link, icon, charges = GetQuestLogSpecialItemInfo(questIndex)
265 local start, duration, enable = GetQuestLogSpecialItemCooldown(questIndex)
266 if link or icon or charges then
267 q.specialItem = {
268 questID = questID,
269 questIndex = questIndex,
270 link = link,
271 charges = charges,
272 icon = icon,
273 start = start,
274 duration = duration,
275 enable = enable,
276 }
277 end
278
279 if QuestHasPOIInfo(questID) then
280 local distance, onContinent = GetDistanceSqToQuest(questIndex)
281 if distance ~= nil and distance > 0 then
282 self.POI[questIndex] = {
283 questIndex = questIndex,
284 questID = questID,
285 distance = distance,
286 onContinent = onContinent
287 }
288 end
289 end
290
291
292 q.selected = (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue
293 self.WatchInfo[watchIndex] = q
294 self.LogInfo[questIndex] = q
295 print('- logIndex =', questIndex, 'title =', title)
296 for k,v in pairs(q) do
297 print('|cFFFFFF00'..k..'|r:', v)
298 end
299 return q
300 end
301
302 Quest.GetClosest = function()
303 local minID, minTitle
304 local minDist = math.huge
305 local numQuests = GetNumQuestLogEntries()
306 for questIndex = 1, numQuests do
307 local distance, onContinent = GetDistanceSqToQuest(questIndex)
308 local title, level, _, _, _, _, _, _, questID = GetQuestLogTitle(questIndex)
309 if onContinent and distance < minDist then
310 minDist = distance
311 minTitle = title
312 minID = questID
313 end
314 end
315
316 print('nearest quest is', minTitle, 'by', math.sqrt(minDist))
317 return minID, minTitle, minDist
318 end
319
320 Quest.OnTurnIn = function(self, questID, xp, money)
321
322 end
323
324
325 Quest.Select = function(self)
326
327 if self.info.isAutoComplete and self.info.isComplete then
328 ShowQuestComplete(self.info.questLogIndex)
329 else
330 SetSuperTrackedQuestID(self.info.questID)
331 end
332 end
333
334 Quest.Link = function(self)
335
336 local questLink = GetQuestLink(self.info.questLogIndex);
337 if ( questLink ) then
338 ChatEdit_InsertLink(questLink);
339 end
340 end
341
342 Quest.Open = function(self)
343
344 QuestMapFrame_OpenToQuestDetails(self.info.questID)
345 end
346
347 Quest.Remove = function(self)
348
349 print('removing', self.info.questLogIndex, 'from watcher')
350 RemoveQuestWatch(self.info.questLogIndex)
351 end