diff ObjectiveTracker/BonusObjectiveData.lua @ 43:9480bd904f4c

- file name organizing
author Nenue
date Mon, 25 Apr 2016 13:51:58 -0400
parents ObjectiveTracker/BonusObjectives.lua@03ed70f846de
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/BonusObjectiveData.lua	Mon Apr 25 13:51:58 2016 -0400
@@ -0,0 +1,311 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 4/13/2016 7:48 PM
+local B = select(2,...).frame
+local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local Default, Quest = T.DefaultHandler, T.Quest
+local print = B.print('Tracker')
+local lprint = B.print('Line')
+local iprint = B.print('Info')
+local Bonus = T.Bonus
+
+local UnitName, GetRealmName, GetQuestObjectiveInfo, GetTasksTable, GetTaskInfo = UnitName, GetRealmName, GetQuestObjectiveInfo, GetTasksTable, GetTaskInfo
+local GetMapNameByID, GetCurrentMapAreaID = GetMapNameByID, GetCurrentMapAreaID
+local tinsert, ipairs, pairs, tostring, wipe = tinsert, ipairs, pairs, tostring, table.wipe
+local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime
+local TASK_DISPLAY_TEST = 1 -- 1: normal (is nearby or on the map) 2: strict (is nearby) 3: data exists
+
+--- Holds data for recently completed tasks
+local completedTasks = {}
+
+--- Returns a tasks table modified to include recently completed objectives
+local InternalGetTasksTable = function()
+  local print = Bonus.print
+  local char = UnitName("player")
+  local realm = GetRealmName()
+  local tasks = GetTasksTable()
+
+  for questID, data in pairs(Bonus.Info) do
+    print('GetTasksTable', questID, #data.objectives)
+    for i, o in ipairs(data.objectives) do
+      print('GetTasksTable', questID, i, o.text)
+    end
+  end
+
+  for questID, data in pairs(completedTasks) do
+    if questID > 0  then
+      local found = false
+      for i = 1, #tasks do
+        if tasks[i] == questID then
+          found = true
+          break
+        end
+      end
+      -- if it's not part of the current table, then try to insert it where it was last found
+      if not found then
+        if data.watchIndex < #tasks then
+          tinsert(tasks, data.watchIndex, data)
+        else
+          tinsert(tasks, data)
+        end
+      end
+    end
+  end
+  return tasks
+end
+
+--- Returns an entry from the composed tasks table if possible, otherwise makes an API pull
+
+local InternalGetTaskInfo = function(questID)
+  if completedTasks[questID] then
+    -- if it's a recently completed task, use the information stored for it
+    return true, true, #completedTasks[questID].objectives
+  else
+    return GetTaskInfo(questID)
+  end
+end
+
+--- Same as above but for the objective entries
+local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex)
+  if ( completedTasks[questID] ) then
+    print('using internal data')
+    return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true;
+  else
+    return GetQuestObjectiveInfo(questID, objectiveIndex, false);
+  end
+end
+
+--- end redundant copy of silliness
+------------------------------------------------------------------------------------------
+
+Bonus.Completed = {}
+Bonus.POI = {}
+Bonus.Scenario = {}
+Bonus.QuestBlock = {}
+Bonus.WatchInfo = {}
+
+local function CanShowTask(isInArea, isOnMap, existingTask, numObjectives)
+  if TASK_DISPLAY_TEST == 1 then
+    return (isInArea)
+  elseif TASK_DISPLAY_TEST == 2 then
+    return (isInArea and(isOnMap and existingTask))
+  elseif TASK_DISPLAY_TEST == 3 then
+    return true
+  end
+end
+
+function Bonus:GetNumWatched ()
+
+  local print = self.print
+  print(self.name, self)
+
+  local tasks = InternalGetTasksTable()
+  local numWatched = 0
+  local numAll = 0
+  local existingTasks = {}
+  wipe(self.WatchList)
+  print('|cFF'..self.internalColor..'Bonus.GetNumWatched()|r', #tasks)
+  print('InternalGetTaskInfo')
+
+  for i, questID in ipairs(tasks) do
+    local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID)
+    local existingTask = self.InfoBlock[questID]
+    local displayObjectiveHeader = false;
+    local displayTask = CanShowTask(isInArea, isOnMap, existingTask)
+    if displayTask then
+      print('TaskInfo', '|cFF00FF00showable objective list', questID)
+      self.Info[questID] = self.Info[questID] or {}
+
+      local t = self.Info[questID]
+      if (isOnMap or isInArea) and existingTask then
+        t.areaID = GetCurrentMapAreaID()
+        local _
+        t.mapName, _, _, t.isMicroDungeon, t.microDungeonMapName = GetMapInfo()
+        print('InternalGetTaskInfo', 'map data', t.areaID, t.mapName)
+      end
+
+      local taskTitle
+      t.id = questID
+      t.objectives = {}
+      local isComplete = true;
+      for objectiveIndex = 1, numObjectives do
+        local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false);
+        displayObjectiveHeader = displayObjectiveHeader or displayAsObjective;
+        if not taskTitle then
+          if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then
+            taskTitle = text
+            text = ''
+          end
+        end
+
+
+        print('TaskObjective', text, objectiveType, finished, displayAsObjective)
+        t.objectives[objectiveIndex] = t.objectives[objectiveIndex] or  {}
+        local  o = t.objectives[objectiveIndex]
+
+        o.index = objectiveIndex
+        o.text = text
+        o.type = objectiveType
+        o.finished = finished
+        o.displayAsObjective = displayAsObjective
+        isComplete = (isComplete and finished)
+      end
+
+      T.SetRewards(t, questID)
+
+      -- didn't get a name from progress bar? what about area name
+      if not taskTitle then
+        if isInArea then
+          taskTitle = GetMapNameByID(GetCurrentMapAreaID())
+        end
+      end
+      t.numObjectives = numObjectives
+      t.isInArea = isInArea
+      t.isOnMap = isOnMap
+      t.existingTask = existingTask
+      t.questID = questID
+      t.id = questID
+      t.taskIndex = i
+      t.title = taskTitle
+      t.isComplete = isComplete
+      self.WatchList[i] = t
+    elseif existingTask then
+      print('TaskInfo', '|cFFFF4400hideable task', questID)
+      existingTask:Hide()
+    end
+
+
+    print ('TaskInfo', i, '|cFFFFFF00'.. questID..'|r', '('..(isInArea and '|cFF88FF88' or '|cFF666666') .. 'isInArea|r', 'AND', (isOnMap and '|cFF88FF88' or '|cFF666666') .. 'isOnMap|r)', 'OR', (existingTask and '|cFF88FF88' or '|cFF666666') .. 'existingTask|r', (displayTask and '|cFF00FF00show|r' or '|cFFFF4400hide|r'))
+  end
+
+
+  self.numWatched = #self.WatchList
+  self.numAll = #existingTasks
+  return self.numWatched, self.numWatched, self.WatchList
+end
+
+Bonus.OnEvent = function(block, event, ...)
+  if event == 'QUEST_LOG_UPDATE' then
+    local info = block.info
+
+    local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(info.questID)
+    if not CanShowTask(isInArea, isOnMap, block, numObjectives) then
+      block:Hide()
+    end
+  end
+end
+
+Bonus.GetBlock = function(self, index)
+  local block = Default.GetBlock(self, index)
+  block:SetScript('OnEvent', self.OnEvent)
+  block:RegisterEvent('QUEST_LOG_UPDATE')
+  return block
+end
+
+--- info cleanup done when  turn-ins are detected
+Bonus.OnTurnIn = function(self, block, questID, xp, money)
+  --[=[
+  local info = self.Info[questID]
+  if info.rewardInfo and #info.rewardInfo >= 1 then
+    for i, reward in ipairs(info.rewardInfo) do
+      --[[
+        type = 'item',
+        index = i ,
+        name = name,
+        texture = texture,
+        count = count,
+        quality = quality,
+        isUsable = isUsable
+       ]]
+      print(' reward ', i, ' ', reward.type, reward.name, reward.count)
+
+    end
+  end
+
+  print('|cFFFF8800'..block:GetName()..':OnTurnIn call', questID, xp, money)
+  local savedTasks = B.Conf.TasksLog or {}
+
+  info.completedTime = GetTime()
+  info.animate = true
+  T.SetAnimate(self.updateReasonModule)
+  savedTasks[questID] = {
+    id = questID,
+    title = info.title,
+    finished = true,
+    numObjectives = info.numObjectives,
+    objectives = info.objectives,
+    rewardInfo = info.rewardInfo,
+  }
+  B.Conf.TasksLog = savedTasks
+
+  print(' ## CONF TASKLOG ##')
+  for i, t in pairs(savedTasks[questID]) do
+    print('    |cFFFFFF00'.. tostring(i)..'|r', t)
+
+  end
+  for o, j in ipairs(savedTasks[questID].objectives) do
+    print('     |cFF00FFFF#'.. o ..'|r', j.type, j.finished)
+  end
+
+  print('adding', info.title, 'to cache')
+  --]=]
+end
+
+Bonus.GetInfo = function(self, taskIndex)
+  print(self.name, self)
+  return self.WatchInfo[taskIndex]
+end
+
+
+
+--- Update hooks
+Bonus.UpdateObjectives = function(handler, block, blockSchema)
+  block.schema = blockSchema or 'default'
+  local info = block.info
+  block.title:SetText(info.title)
+
+
+  Default.UpdateObjectives(handler, block)
+  return blockSchema
+end
+
+Bonus.UpdateLine = function(handler, block, data)
+  local info = block.info
+  local print = lprint
+  local text, attachment = '', nil
+  if data.type == 'progressbar' then
+    print('    |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
+    local percent = 100
+    if not data.finished then
+      percent = GetQuestProgressBarPercent(info.questID)
+    end
+    data.value = percent
+    data.maxValue = 100
+
+    attachment = T.GetWidget(data, 'StatusBar', info.questID..'-'..data.index)
+    attachment:SetParent(block)
+    print(attachment:GetNumPoints())
+    for i = 1, attachment:GetNumPoints() do
+      print('  ',attachment:GetPoint(i))
+    end
+
+    attachment.value = percent
+    attachment.maxValue = 100
+    attachment.status:SetFormattedText(PERCENTAGE_STRING, percent)
+    --attachment:SetParent(handler.frame)
+    --print(attachment.status:GetText())
+    print('    |cFFFF0022** text:|r', data.text, '|cFFFF0022value:|r', data.value, '|cFFFF0022max:|r', data.maxValue)
+  end
+  text = data.text
+  return text, attachment, 'default'
+end
+
+Bonus.Select = function(handler, block)
+  print(handler, block)
+  handler:OnTurnIn(block, block.info.questID)
+end
+Bonus.Remove = function(self)
+
+end
\ No newline at end of file