view ObjectiveTracker/BonusObjectives.lua @ 37:e84d645c8ab8

- revised the tracker update function to build its complete data list up front and use the values as points of comparison for determining possible out of place blocks, which will be iterated over afterward to remove what wasn't re-used - also entailed revising the exact role of global event handlers and function hooks, limiting their directions of communication so one doesn't end up calling the other multiple or inifinity times - schema handling polish
author Nenue
date Mon, 18 Apr 2016 07:56:23 -0400
parents a487841050be
children 1f8f9cc3d956
line wrap: on
line source
--- ${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 = tinsert, ipairs, pairs, tostring
local GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime = GetQuestProgressBarPercent, PERCENTAGE_STRING, GetTime
local STICKY_TASKS = true

--- Returns a tasks table modified to include recently completed objectives
local InternalGetTasksTable = function()
  local savedTasks = T.Conf.TasksLog
  local char = UnitName("player")
  local realm = GetRealmName()
  local tasks = GetTasksTable()

  for questID, data in pairs(Bonus.Info) do

    print('  -- questID:', questID, #data.objectives)
    for i, o in ipairs(data.objectives) do
      print('    --', i, o.text)
    end

  end


  for questID, data in pairs(savedTasks) 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)
  local completedTasks = T.Conf.TasksLog
  if completedTasks[questID] then
    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)
  local completedTasks = T.Conf.TasksLog
  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 = {}
function Bonus:GetNumWatched ()
  if true then return 0, 0, nil end
  local print = iprint
  print(self.name, self)

  local tasks = InternalGetTasksTable()
  local numWatched = 0
  local numAll = 0
  local existingTasks = {}
  self.WatchInfo = {}
  print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks)
  print(' |cFF00FFFFInternalGetTaskInfo|r:')
  for i, questID in ipairs(tasks) do
    local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID)
    local existingTask = self.QuestBlock[questID]
    local displayObjectiveHeader = false;
    local test = (isInArea or (isOnMap and existingTask))
    --local test = true
    if test then
      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('|cFF00FF00scooping map info (questID '..questID..'):|r', t.areaID, t.mapName)
      end

      local taskTitle
      t.objectives = {}
      local taskFinished = 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('  --', 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
      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
      self.WatchInfo[i] = t
    end

    print ('    |cFF00FF88#', i, 'questID', questID, 'inArea', isInArea, 'onMap', isOnMap, 'existing', (existingTask and 'Y' or 'N'), (test and '|cFF00FF00show|r' or '|cFFFF0088hide|r'))
  end

  for i = 1, #self.usedBlocks do
    self.usedBlocks[i]:Hide()
  end


  self.numAll = #tasks
  self.numWatched = #self.WatchInfo
  print('  stats:', self.numAll, 'active tasks,', self.numWatched, 'nearby or animating')
  --return #tasks
  return #self.WatchInfo
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)
  Default.UpdateObjectives(handler, block)
  return 'default'
end

Bonus.UpdateLine = function(handler, block, line, data)
  local info = block.info
  local print = lprint
  local text, attachment = '', nil
  line.displayColor = 'FFFFFF'
  if data.type == 'progressbar' then
    print('    |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
    local percent = 100
    attachment = T.SetWidget(line, data, 'ProgressBar', info.questID..'-'..data.index)
    if not data.finished then
      percent = GetQuestProgressBarPercent(info.questID)
    end
    data.value = percent
    data.maxValue = 100

    print(attachment:GetNumPoints())
    for i = 1, attachment:GetNumPoints() do
      print('  ',attachment:GetPoint(i))
    end


    attachment.value = percent
    attachment.maxValue = 100
    attachment:SetPoint('TOP', line, 'TOP', 0, 0)
    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
end

Bonus.Select = function(handler, block)
  print(handler, block)
  handler:OnTurnIn(block, block.info.questID)
end
Bonus.Remove = function(self)

end