You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

307 lines
13 KiB

local _,L = ...
local rematch = Rematch
local collection = RematchDialog.CollectionReport
local report, settings
collection.chartNames = { L["Total Collected Pets"], L["Unique Collected Pets"], L["Pets Not Collected"], L["Percent Collected"], L["Max Level Pets"], L["Rare Quality Pets"], L["Unique Pets In the Journal"] }
collection.chartColors = { -- first is pet types colors, second is sources colors
{ {0.03125,0.56640625,0.88671875}, {0.07421875,0.4375,0.07421875}, {0.78125,0.765625,0.30078125}, {0.40625,0.28125,0.3125}, {0.46875,0.328125,0.25}, {0.65625,0.4375,0.96875}, {0.96875,0.640625,0}, {0.73828125,0.140625,0.11328125}, {0.03125,0.66796875,0.69921875}, {0.625,0.625,0.5625} },
{ {0.29296875,0.4921875,0.33984375}, {0.81640625,0.796875,0.55859375}, {0.89453125,0.61328125,0.03125}, {0.73046875,0.72265625,0.6875}, {0.90625,0.421875,0.09375}, {0.40234375,0.49609375,0.62109375}, {0.3828125,0.1484375,0.6796875}, {0.48046875,0.66015625,0.67578125}, {0.56640625,0.05859375,0.171875}, {0.19140625,0.65625,0.66796875} }
}
-- texcoords for source icons
collection.chartSourceCoords = { {0,0.25,0,0.25},{0.25,0.5,0,0.25},{0.5,0.75,0,0.25},{0.75,1,0,0.25}, {0,0.25,0.25,0.5},{0.25,0.5,0.25,0.5},{0.5,0.75,0.25,0.5},{0.75,1,0.25,0.5}, {0,0.25,0.5,0.75},{0.25,0.5,0.5,0.75} }
rematch:InitModule(function()
settings = RematchSettings
collection.report = {petIDs={},speciesIDs={},rarities={},chart={}}
report = collection.report -- data for the reports are kept here
end)
function rematch:ShowCollectionReport()
if rematch:IsDialogOpen("CollectionReport") then
rematch:HideDialog()
return
end
collection:GenerateReportData()
local dialog = rematch:ShowDialog("CollectionReport",300,480,L["Collection Statistics"],nil,nil,nil,OKAY)
dialog.CollectionReport:SetPoint("TOP",0,-40)
dialog.CollectionReport:Show()
local frame = dialog.CollectionReport -- the frame that contains the report
frame.InGame:SetText(format(L["There are %s%d\124r unique pets in the journal"],rematch.hexWhite,report.ingame))
frame.OwnedLabel:SetText(L["Pets Collected"])
frame.MaxLevelLabel:SetText(L["Pets At Max Level"])
frame.RaresLabel:SetText(L["Rare Quality Pets"])
frame.TotalLabel:SetText(L["Total"])
frame.UniqueLabel:SetText(L["Unique"])
frame.OwnedTotal:SetText(report.owned)
frame.OwnedUnique:SetText(report.unique)
frame.MaxLevelTotal:SetText(report.lev25total)
frame.MaxLevelUnique:SetText(report.lev25unique)
frame.RaresTotal:SetText(report.rarestotal)
frame.RaresUnique:SetText(report.raresunique)
frame.DuplicatesLabel:SetText(L["Duplicate Collected Pets"])
frame.AvgLevelLabel:SetText(L["Average Battle Pet Level"])
frame.MissingLabel:SetText(L["Pets Not Collected"])
frame.Duplicates:SetText(report.duplicates)
frame.AvgLevel:SetText(format("%.1f",report.avglevel))
frame.Missing:SetText(report.missing)
frame.Complete:SetText(format(L["You have %s%.1f%%\124r of those unique pets"],rematch.hexWhite,report.complete))
for i=4,1,-1 do
frame.RarityBar[i]:SetVertexColor(ITEM_QUALITY_COLORS[i-1].r,ITEM_QUALITY_COLORS[i-1].g,ITEM_QUALITY_COLORS[i-1].b)
frame.RarityBar[i]:ClearAllPoints()
if i==4 then
frame.RarityBar[i]:SetPoint("LEFT",frame.RarityBarBorder,"LEFT",7,0)
else
frame.RarityBar[i]:SetPoint("LEFT",frame.RarityBar[i+1],"RIGHT")
end
frame.RarityBar[i]:SetWidth(max(1,210*report.rarities[i]))
end
-- one-time initialization of stuff first time a report/chart is shown
if not rematch:GetMenu("CollectionReportMenu") then
rematch:RegisterMenu("CollectionReportMenu", {
{ text=collection.CollectionChartMenuText, index=7, func=collection.CollectionChartMenuFunc, tooltipBody=L["All unique pets in the journal. This is all obtainable unique pets."] },
{ text=collection.CollectionChartMenuText, index=1, func=collection.CollectionChartMenuFunc, tooltipBody=L["All pets you've collected, including duplicates."] },
{ text=collection.CollectionChartMenuText, index=2, func=collection.CollectionChartMenuFunc, tooltipBody=L["The unique pets you've collected, not including duplicates."] },
{ text=collection.CollectionChartMenuText, index=3, func=collection.CollectionChartMenuFunc, tooltipBody=L["The unique pets you're missing."] },
{ text=collection.CollectionChartMenuText, index=4, func=collection.CollectionChartMenuFunc, tooltipBody=L["How much of each category's unique pets you've collected as a percent."] },
{ text=collection.CollectionChartMenuText, index=5, func=collection.CollectionChartMenuFunc, tooltipBody=L["All of your level 25 pets, including duplicates."] },
{ text=collection.CollectionChartMenuText, index=6, func=collection.CollectionChartMenuFunc, tooltipBody=L["All of your rare quality pets, including duplicates."] },
})
frame.ChartTypeComboBox.OnClick = function(self)
rematch:ToggleMenu("CollectionReportMenu","TOPRIGHT",self,"BOTTOMRIGHT",0,2)
end
frame.ChartTypeComboBox.Text:SetJustifyH("CENTER")
frame.ChartTypeComboBox.Text:SetPoint("BOTTOMRIGHT",-5,3)
frame.ChartTypeComboBox.Text:SetFontObject(GameFontNormal)
frame.ChartTypesRadioButton.Text:SetText(L["Pet Types"])
frame.ChartSourcesRadioButton.Text:SetText(L["Sources"])
frame.Chart.Columns = {}
for i=1,10 do
frame.Chart.Columns[i] = CreateFrame("Button",nil,frame.Chart,"RematchChartColumnTemplate")
frame.Chart.Columns[i]:SetPoint("BOTTOMLEFT",8+(i-1)*25,8)
frame.Chart.Columns[i]:SetID(i)
frame.Chart.Columns[i]:SetScript("OnEnter",collection.ChartColumnOnEnter)
frame.Chart.Columns[i]:SetScript("OnLeave",rematch.HideTooltip)
end
end
collection:UpdateChart()
end
function collection:UpdateChart()
local frame = rematch.Dialog.CollectionReport -- the frame that contains the report
frame.ChartTypeComboBox.Text:SetText(collection.chartNames[settings.CollectionChartType])
frame.ChartTypesRadioButton:SetChecked(not settings.CollectionChartSources)
frame.ChartSourcesRadioButton:SetChecked(settings.CollectionChartSources)
local forSources = settings.CollectionChartSources
local colors = forSources and collection.chartColors[2] or collection.chartColors[1]
local maxHeight = 0
for i=1,10 do
frame.Chart.Columns[i].Bar:SetVertexColor(unpack(colors[i]))
if forSources then
frame.Chart.Columns[i].Icon:SetTexture("Interface\\AddOns\\Rematch\\Textures\\sources")
frame.Chart.Columns[i].Icon:SetTexCoord(unpack(collection.chartSourceCoords[i]))
else
rematch:FillPetTypeIcon(frame.Chart.Columns[i].Icon,i,"Interface\\Icons\\Icon_PetFamily_")
frame.Chart.Columns[i].Icon:SetTexCoord(0.075,0.925,0.075,0.925)
end
frame.Chart.Columns[i].Value:SetText(report.chart[i])
maxHeight = max(maxHeight,report.chart[i])
end
for i=1,10 do
if report.chart[i]==0 then
frame.Chart.Columns[i].Bar:SetHeight(1)
else
frame.Chart.Columns[i].Bar:SetHeight((report.chart[i]/maxHeight)*100)
end
end
end
function collection:CollectionChartMenuText()
return collection.chartNames[self.index]
end
-- when new chart type chosen from dropdown
function collection:CollectionChartMenuFunc()
settings.CollectionChartType = self.index
collection:GenerateReportData()
collection:UpdateChart()
end
-- when radio button clicked to choose types vs sources
function collection:ChartRadioOnClick()
settings.CollectionChartSources = self:GetID()==2
collection:GenerateReportData()
collection:UpdateChart()
end
function collection:ChartColumnOnEnter()
local name = _G[(settings.CollectionChartSources and "BATTLE_PET_SOURCE_" or "BATTLE_PET_NAME_")..self:GetID()]
if name then
rematch.ShowTooltip(self,name)
end
end
-- gathers all petIDs and speciesIDs in their report tables and assigns them a hash
-- of level*1000+rarity*100+chart if forRarity is false
-- of rarity*10000+level*100+chart if forRarity is true
function collection:GatherReportHash(forRarity)
local roster = Rematch.Roster
local showSources = settings.CollectionChartSources
wipe(report.petIDs)
wipe(report.speciesIDs)
if showSources then
roster:GetSpeciesSource() -- gather all species' sources if charting sources
end
-- gather owned pets into report.petIDs and missing pets
-- all pets (owned or not) go into report.speciesIDs, indexed by speciesID (highest level of species)
for petID in roster:AllPets() do
if type(petID)=="string" then
local speciesID,_,level,_,_,_,_,_,_,petType = C_PetJournal.GetPetInfoByPetID(petID)
local _,_,_,_,rarity = C_PetJournal.GetPetStats(petID)
local chart = showSources and roster:GetSpeciesSource(speciesID) or petType
if showSources and chart>10 then
chart = 1 -- chart 11 is "Discovery" sources; adding them to Drop category
end
local hash
if forRarity then
hash = rarity*10000 + level*100 + chart
else
hash = level*1000 + rarity*100 + chart
end
report.petIDs[petID] = hash
local old = report.speciesIDs[speciesID]
if not old or hash>old then
report.speciesIDs[speciesID] = hash
end
elseif type(petID)=="number" then
report.speciesIDs[petID] = showSources and roster:GetSpeciesSource(petID) or select(3,C_PetJournal.GetPetInfoBySpeciesID(petID))
end
end
end
function collection:GenerateReportData()
collection:GatherReportHash(false) -- gather hash values for all pets with priority for level
-- tally the bananas (and all other pets too) for stats at top of dialog
report.owned, report.unique, report.ingame = 0,0,0
report.lev25total, report.lev25unique = 0,0
for k,v in pairs(report.petIDs) do
report.owned = report.owned + 1
report.lev25total = report.lev25total + (floor(v/1000)==25 and 1 or 0)
end
for k,v in pairs(report.speciesIDs) do
if v>100 then -- if hash is > 100 then it has stats (and is owned)
report.unique = report.unique + 1
report.lev25unique = report.lev25unique + (floor(v/1000)==25 and 1 or 0)
end
report.ingame = report.ingame + 1
end
report.missing = report.ingame - report.unique
report.duplicates = report.owned - report.unique
report.complete = (1-(report.missing/report.ingame))*100
-- average battle pet level excludes non-battle pets, so it's added up separately
report.avglevel=0
local avglevelcount = 0
for petID in rematch.Roster:AllOwnedPets() do
local _,_,level,_,_,_,_,_,_,_,_,_,_,_,canBattle = C_PetJournal.GetPetInfoByPetID(petID)
if canBattle then
avglevelcount = avglevelcount + 1
report.avglevel = report.avglevel + level
end
end
report.avglevel = avglevelcount>0 and (report.avglevel / avglevelcount) or 0
-- gather rarity bar data
collection:GatherReportHash(true) -- gather hash values for all pets with priority for rarity
for k,v in pairs(report.speciesIDs) do
if v>100 then
local rarity = floor(v/10000)
report.rarities[rarity] = (report.rarities[rarity] or 0) + 1
end
end
-- rarities: 1=poor, 2=common, 3=uncommon, 4=rare
for i=1,4 do
report.rarities[i] = (report.rarities[i] or 0)/report.ingame
end
-- while hash sorted for rarity, get total and unique rarity counts
report.rarestotal, report.raresunique = 0,0
for k,v in pairs(report.petIDs) do
if floor(v/10000)==4 then
report.rarestotal = report.rarestotal + 1
end
end
for k,v in pairs(report.speciesIDs) do
if v>100 and floor(v/10000)==4 then
report.raresunique = report.raresunique + 1
end
end
-- gather chart data (settings.CollectionChartType)
-- 1 = Total Collected Pets (petIDs)
-- 2 = Unique Collected Pets (speciesIDs)
-- 3 = Pets Not Collected (speciesIDs)
-- 4 = Percent Completed (speciesIDs) -- this is unique/ingame for each type/source
-- 5 = Max Level Pets (petIDs)
-- 6 = Rare Quality Pets (petIDs)
-- 7 = All Pets In The Game (speciesIDs)
settings.CollectionChartType = settings.CollectionChartType or 1
local chartType = settings.CollectionChartType
for i=1,11 do
report.chart[i] = 0
end
local data -- data set is either petIDs or speciesIDs depending on what's being charted (see above)
if chartType==1 or chartType==5 or chartType==6 then
data = report.petIDs
else
data = report.speciesIDs
end
for id,hash in pairs(data) do
local column = hash%100
if chartType==1 or chartType==7 then
report.chart[column] = report.chart[column] + 1
elseif chartType==3 then
if hash<100 then
report.chart[column] = report.chart[column] + 1
end
elseif chartType==4 or chartType==2 then
if hash>=100 then
report.chart[column] = report.chart[column] + 1
end
elseif chartType==5 then
local level = floor((hash%10000)/100)
if level==25 then
report.chart[column] = report.chart[column] + 1
end
elseif chartType==6 then
local rarity = floor(hash/10000)
if rarity==4 then
report.chart[column] = report.chart[column] + 1
end
end
end
-- for percent completed (chartType 4), add up each possible chart type
if chartType==4 then
for i=1,10 do
local total = 0
for _,hash in pairs(report.speciesIDs) do
if hash%100==i then
total = total + 1
end
end
report.chart[i] = floor(report.chart[i]*100/total+0.5) -- and divide it into count of unique pets
end
end
end