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.
371 lines
13 KiB
371 lines
13 KiB
local _,L = ...
|
|
local rematch = Rematch
|
|
local settings, saved
|
|
local card = RematchWinRecordCard
|
|
|
|
rematch:InitModule(function()
|
|
settings = RematchSettings
|
|
saved = RematchSaved
|
|
|
|
card.Title:SetText(L["Win Record"])
|
|
card.Content.AltFlipHelp:SetText(L["Hold [Alt] to view totals for all teams."])
|
|
|
|
for k,v in pairs({{L["Wins:"],0,1,0},{L["Losses:"],1,0.1,0.1},{L["Draws:"],1,0.82,0}}) do
|
|
local stat = card.Content.Stats[k]
|
|
stat.Add.Icon:SetTexCoord(0.3095703125,0.337890625,0.763671875,0.8203125)
|
|
stat.Label:SetText(v[1])
|
|
stat.Add.Icon:SetDesaturated(true)
|
|
stat.Add.Icon:SetVertexColor(v[2],v[3],v[4])
|
|
stat.Percent:SetTextColor(v[2],v[3],v[4])
|
|
stat.Label:SetTextColor(v[2],v[3],v[4])
|
|
end
|
|
rematch:ConvertTitlebarCloseButton(card.CloseButton)
|
|
end)
|
|
|
|
-- returns the win record stats of a team
|
|
function rematch:GetTeamWinRecord(key)
|
|
local team = saved[key]
|
|
if team then
|
|
local wins = team.wins or 0
|
|
local losses = team.losses or 0
|
|
local draws = team.draws or 0
|
|
local battles = wins + losses + draws
|
|
return wins, losses, draws, battles
|
|
end
|
|
end
|
|
|
|
|
|
function rematch:ShowWinRecord(parent,key,force)
|
|
-- if card is locked (or ClickPetCard enabled) don't show card unless forced (via click)
|
|
if (not force and card.locked) or (settings.ClickPetCard and not force) then
|
|
return
|
|
end
|
|
-- for non-forced shows, delay showing the card
|
|
if not settings.ClickPetCard and not settings.FastPetCard and not force then
|
|
if parent and key then
|
|
card.parent = parent
|
|
card.key = key
|
|
rematch:StartTimer("ShowWinRecord",0.25,rematch.ShowWinRecord)
|
|
return
|
|
else -- if key is nil then this is the func being called from the timer above
|
|
parent = card.parent
|
|
key = card.key
|
|
end
|
|
end
|
|
local team = saved[key]
|
|
if not team then
|
|
return -- don't bother showing winrecord for a team that doesn't exist
|
|
end
|
|
if force then
|
|
card.locked = true
|
|
end
|
|
|
|
local tab = saved[key].tab or 1
|
|
|
|
card.parent = parent
|
|
card.key = key
|
|
|
|
card:UpdateWinRecord()
|
|
rematch:SmartAnchor(card,parent,nil,22,-26)
|
|
card:Show()
|
|
end
|
|
|
|
-- to be called anytime the lock state or contents of the win record needs updated
|
|
function card:UpdateWinRecord()
|
|
local key = card.key
|
|
local team = saved[key]
|
|
local content = card.Content
|
|
|
|
local results = {0,0,0,0} -- 1=wins, 2=losses, 3=draws, 4=battles
|
|
|
|
local showTotals = IsAltKeyDown() or MouseIsOver(card.Content.LeftIcon) or MouseIsOver(card.Content.RightIcon)
|
|
|
|
if showTotals then
|
|
content.Name:SetText(L["Totals Across All Teams"])
|
|
content.RightIcon.Texture:SetTexture("Interface\\Icons\\PetJournalPortrait")
|
|
content.LeftIcon.Texture:SetTexture("Interface\\Icons\\Achievement_BG_DG_Master_of_the_deepwind_gorge")
|
|
for k in pairs(saved) do
|
|
local wins,losses,draws,battles = rematch:GetTeamWinRecord(k)
|
|
results[1] = results[1] + wins
|
|
results[2] = results[2] + losses
|
|
results[3] = results[3] + draws
|
|
results[4] = results[4] + battles
|
|
end
|
|
elseif team then
|
|
-- fill in card
|
|
content.Name:SetText(rematch:GetTeamTitle(key,true))
|
|
content.RightIcon.Texture:SetTexture(settings.TeamGroups[team.tab or 1][2])
|
|
content.LeftIcon.Texture:SetTexture("Interface\\Icons\\Achievement_BG_KillXEnemies_GeneralsRoom")
|
|
results[1],results[2],results[3],results[4] = rematch:GetTeamWinRecord(key)
|
|
end
|
|
|
|
content.BattleCount:SetText(format(L["%s%s\124r Battles"],rematch.hexWhite,results[4]))
|
|
for i=1,3 do
|
|
content.Stats[i].Value:SetText(results[i])
|
|
content.Stats[i].EditBox:SetText(results[i])
|
|
content.Stats[i].Percent:SetText(results[4]>0 and format("%.1f%%",results[i]*100/results[4]) or NOT_APPLICABLE)
|
|
end
|
|
|
|
-- show/hide the Hold [Alt] to view help text depending on HideMenuHelp setting
|
|
card.Content.AltFlipHelp:SetShown(not settings.HideMenuHelp)
|
|
card:SetHeight(settings.HideMenuHelp and 222 or 236)
|
|
|
|
-- update locked state
|
|
local showEditBoxes = card.locked and not showTotals
|
|
card:SetAlpha(card.locked and 1 or 0)
|
|
for stat=1,3 do
|
|
card.Content.Stats[stat].EditBox:SetShown(showEditBoxes)
|
|
card.Content.Stats[stat].Add:SetShown(showEditBoxes)
|
|
card.Content.Stats[stat].Value:SetShown(not showEditBoxes)
|
|
card.Content.Stats[stat].Percent:SetShown(not showEditBoxes)
|
|
end
|
|
end
|
|
|
|
function rematch:HideWinRecord(maybe)
|
|
if maybe and card.locked then return end
|
|
card:Hide()
|
|
end
|
|
|
|
function card:OnHide()
|
|
card.locked = nil
|
|
card.parent = nil
|
|
card.key = nil
|
|
card:SetAlpha(1)
|
|
card:UnregisterEvent("MODIFIER_STATE_CHANGED")
|
|
end
|
|
|
|
function card:OnKeyDown(key)
|
|
if key==GetBindingKey("TOGGLEGAMEMENU") and card.locked then
|
|
rematch:HideWinRecord()
|
|
self:SetPropagateKeyboardInput(false)
|
|
elseif key=="TAB" and card.locked then
|
|
card.OnTabPressed(card.Content.Draws.EditBox)
|
|
self:SetPropagateKeyboardInput(false)
|
|
else
|
|
self:SetPropagateKeyboardInput(true)
|
|
end
|
|
end
|
|
|
|
--[[ WinRecordButton handlers ]]
|
|
|
|
-- tooltip for the little WinRecord button beside each team
|
|
function rematch:WinRecordOnEnter()
|
|
if self:GetObjectType()=="Texture" then
|
|
-- for now, anchoring to button itself; for some reason frame won't anchor to texture
|
|
rematch:ShowWinRecord(self,self:GetParent().key)
|
|
else
|
|
rematch:ShowWinRecord(self,self:GetParent().key)
|
|
end
|
|
end
|
|
|
|
function rematch:WinRecordOnLeave()
|
|
if not settings.FastPetCard then
|
|
rematch:StopTimer("ShowWinRecord")
|
|
end
|
|
rematch:HideWinRecord(true)
|
|
end
|
|
|
|
-- click of the little WinRecord button beside each team
|
|
function rematch:WinRecordOnClick(fromLoadedTeam)
|
|
local key = self.key or self:GetParent().key
|
|
if not key then
|
|
return
|
|
end
|
|
if settings.ClickPetCard then
|
|
card.locked = true
|
|
end
|
|
if key~=card.key then
|
|
rematch:ShowWinRecord(self,key,true) -- can change true to card.key and true to make reclick not locked
|
|
elseif settings.ClickPetCard then
|
|
rematch:HideWinRecord()
|
|
else
|
|
card.locked = not card.locked
|
|
end
|
|
card:UpdateWinRecord()
|
|
end
|
|
|
|
-- mousedown of the winrecord footnote
|
|
function rematch:WinRecordOnMouseDown()
|
|
if settings.SlimListButtons and settings.SlimListSmallText then
|
|
self.Text:SetFontObject(GameFontWhiteTiny)
|
|
else
|
|
self.Text:SetFontObject(GameFontHighlightSmall)
|
|
end
|
|
end
|
|
|
|
-- mouseup of the winrecord footnote
|
|
function rematch:WinRecordOnMouseUp()
|
|
if settings.SlimListButtons and settings.SlimListSmallText then
|
|
self.Text:SetFontObject(GameFontHighlightSmall)
|
|
else
|
|
self.Text:SetFontObject(GameFontHighlight)
|
|
end
|
|
end
|
|
|
|
-- fills in/colors the passed WinRecordButton, returning true if it should be shown
|
|
function rematch:FillWinRecordButton(button,key)
|
|
local wins,losses,draws,battles = rematch:GetTeamWinRecord(key)
|
|
if battles and battles>0 and not settings.HideWinRecord then
|
|
local percent = floor(wins*100/battles+0.5)
|
|
button.Text:SetText(settings.AlternateWinRecord and wins or format("%d%%",percent))
|
|
local left,right,top,bottom
|
|
if percent>=60 then
|
|
left,right,top,bottom = 0,0.296875,0,0.28125
|
|
elseif percent<=40 then
|
|
left,right,top,bottom = 0,0.296875,0.375,0.65625
|
|
else
|
|
left,right,top,bottom = 0,0.296875,0.71875,1
|
|
end
|
|
button:GetNormalTexture():SetTexCoord(left,right,top,bottom)
|
|
button:GetPushedTexture():SetTexCoord(left,right,top,bottom)
|
|
return true
|
|
end
|
|
end
|
|
|
|
--[[ Card controls while the card is locked ]]
|
|
|
|
-- tab pressed in editbox moves to next editbox
|
|
function card:OnTabPressed()
|
|
card.Content.Stats[self:GetParent():GetID()%3+1].EditBox:SetFocus(true)
|
|
end
|
|
|
|
-- click on the + button beside the Wins/Losses/Draws editboxes in the WinRecordCard controls
|
|
function card:AddButtonOnClick()
|
|
local key = card.key
|
|
local team = saved[key]
|
|
if team then
|
|
local parent = card.parent -- noting this before hiding the card and parent lost; it's what spawned the card
|
|
local stat = self:GetParent().stat
|
|
team[stat] = (team[stat] or 0) + 1
|
|
card:Hide()
|
|
rematch:UpdateUI()
|
|
if rematch.TeamPanel:IsVisible() then
|
|
rematch:ShowTeam(key)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- from clicking Save in the WinRecordCard controls
|
|
function card:SaveWinRecord()
|
|
local key = card.key
|
|
if saved[key] then
|
|
for i=1,3 do
|
|
local stat = card.Content.Stats[i].stat
|
|
saved[key][stat] = tonumber(card.Content.Stats[i].EditBox:GetText())
|
|
if saved[key][stat]==0 then
|
|
saved[key][stat] = nil -- don't save 0s, nil them out
|
|
end
|
|
end
|
|
card:Hide()
|
|
rematch:UpdateUI()
|
|
if rematch.TeamPanel:IsVisible() then
|
|
rematch:ShowTeam(key) -- flashes the team
|
|
end
|
|
if key==settings.loadedTeam and rematch.LoadedTeamPanel:IsVisible() then
|
|
rematch.LoadedTeamPanel.Bling:Show()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- from clicking Reset in the lowerleft of the WinRecordCard controls
|
|
function card:ShowResetDialog()
|
|
local key = card.key
|
|
if saved[key] then
|
|
local dialog = rematch:ShowDialog("ResetWinRecord",300,146,L["Reset Win Record"],nil,YES,card.AcceptResetWinRecord,NO)
|
|
dialog:SetContext("key",key) -- restore key
|
|
dialog:ShowText(format(L["Are you sure you want to remove all wins, losses and draws from the team \"%s\"?"],rematch:GetTeamTitle(key,true)),240,80,"TOP",0,-32)
|
|
end
|
|
end
|
|
|
|
-- from clicking Yes in ShowResetDialog
|
|
function card:AcceptResetWinRecord()
|
|
local key = rematch.Dialog:GetContext("key")
|
|
local team = saved[key]
|
|
if team then
|
|
team.wins = nil
|
|
team.losses = nil
|
|
team.draws = nil
|
|
if rematch.TeamPanel:IsVisible() then
|
|
rematch:ShowTeam(key)
|
|
else
|
|
rematch:UpdateUI()
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[ Slash-command stuff ]]
|
|
|
|
-- hopefully seldom-used function called from /rematch winrecord reset : to wipe all winrecord stats
|
|
function rematch:ShowResetAllWinRecordsDialog()
|
|
local dialog = rematch:ShowDialog("ResetAllWinRecords",300,132,L["Reset All Win Records"],L["Are you sure?"],YES,rematch.ResetAllWinRecords,NO)
|
|
dialog.Warning:SetPoint("TOPLEFT",16,-32)
|
|
dialog.Warning.Text:SetText(L["This will remove win record data for all teams and cannot be undone!"])
|
|
dialog.Warning:Show()
|
|
end
|
|
function rematch:ResetAllWinRecords()
|
|
for _,team in pairs(saved) do
|
|
team.wins = nil
|
|
team.losses = nil
|
|
team.draws = nil
|
|
end
|
|
rematch:UpdateUI()
|
|
end
|
|
|
|
-- this is from /rematch winrecord convert : teams that are named like 123-45-6 Team Name are assumed
|
|
-- to have 123 wins, 45 losses and 6 draws. It will add those into the team's winrecord and then remove
|
|
-- that portion of text from the team name.
|
|
function rematch:ShowConvertTeamNamesToWinRecordDialog()
|
|
local dialog = rematch:ShowDialog("WinRecordConvert",300,270,L["Convert Team Names To Win Records"],nil,L["Convert"],rematch.ConvertTeamNamesToWinRecord,CANCEL)
|
|
dialog:ShowText(L["This will look for teams with names that may include win-loss-draw stats and pull those into an actual win record before removing the numbers from the team name.\n\nDo you want to convert these teams?\n\nThe currently loaded team will be unloaded to prevent major complications.\n\n\124cffff1111Please backup your teams before attempting this!"],260,200,"TOP",0,-24)
|
|
end
|
|
function rematch:ConvertTeamNamesToWinRecord()
|
|
-- first gather all teams to convert into toConvert ({key,newname,win,loss,draw},{key,newname,win,loss,draw},etc}
|
|
local toConvert = {} -- table of teams to convert (don't maul saved while finding these teams)
|
|
for key,team in pairs(saved) do
|
|
local title = rematch:GetTeamTitle(key)
|
|
local win,loss,draw = title:match("(%d+)[%s%-/\\]+(%d+)[%s%-/\\]+(%d+)")
|
|
if win then -- if team named something like 12-34-5 then it's 12 wins, 34 losses, 5 draws
|
|
local newname = title:match("%d+[%s%-/\\]+%d+[%s%-/\\]+%d+%s+(.+)") or title:match("(.+)%s+%d+[%s%-/\\]+%d+[%s%-/\\]+%d+")
|
|
if newname then
|
|
tinsert(toConvert,{key,newname:trim(),tonumber(win),tonumber(loss),tonumber(draw)})
|
|
end
|
|
else
|
|
win,loss = title:match("(%d+)[%s%-/\\]+(%d+)")
|
|
if win then -- if team named something like 12-34 then it's 12 wins, 34 losses, 0 draws
|
|
local newname = title:match("%d+[%s%-/\\]+%d+%s+(.+)") or title:match("(.+)%s+%d+[%s%-/\\]+%d+")
|
|
if newname then
|
|
tinsert(toConvert,{key,newname:trim(),tonumber(win),tonumber(loss),0})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
rematch:UnloadTeam() -- unload loaded team to prevent potential catastrophe
|
|
-- here goes: data[1]=original key, data[2]=new name, data[3]-[5]=win,loss,draw
|
|
local battles = 0
|
|
for _,data in ipairs(toConvert) do
|
|
local team = rematch:SetSideline(data[1],saved[data[1]])
|
|
rematch:SetSidelineContext("deleteOriginal",true)
|
|
battles = battles + data[3] + data[4] + data[5]
|
|
for i=3,5 do
|
|
if data[i]==0 then
|
|
data[i] = nil -- don't actually store 0s (it won't hurt anything but a ton of 0s is unnecessary)
|
|
end
|
|
end
|
|
team.wins = data[3]
|
|
team.losses = data[4]
|
|
team.draws = data[5]
|
|
-- rename team to drop the win/loss(/draw) bit
|
|
if type(data[1])=="number" then -- this is a targeted team, name is just team.teamName and never conflicts
|
|
team.teamName = data[2]
|
|
else -- this is a named team where key is the name of the team; change the key
|
|
rematch:ChangeSidelineKey(data[2])
|
|
rematch:MakeSidelineUnique() -- rename if any name conflicts after name change
|
|
team = rematch:GetSideline()
|
|
end
|
|
rematch:print(rematch:GetTeamTitle(data[1]),"->",data[2],format("w:%d l:%d d:%d",data[3],data[4],data[5]))
|
|
rematch:PushSideline()
|
|
end
|
|
-- display dialog showing how many converted
|
|
local dialog = rematch:ShowDialog("WinRecordConvertDone",300,164,L["Done!"],nil,nil,nil,OKAY)
|
|
dialog:ShowText(format(L["%s%d teams and %d battles were converted."],rematch.hexWhite,#toConvert,battles),240,96,"TOP",0,-32)
|
|
end
|
|
|