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.
247 lines
9.0 KiB
247 lines
9.0 KiB
--[[ The sideline is a place to put teams for intermediate use, such as when
|
|
saving, receiving, renaming, etc.
|
|
|
|
Instead of ferrying parts of teams piecemeal through the dialogs, all
|
|
interactions with teams will begin by placing them on the sideline. When
|
|
done, they're pushed back into the saved teams.
|
|
|
|
When starting to deal with a team:
|
|
rematch:SetSideline("name of team" or npcID[,{team table},loadout])
|
|
|
|
Any manipulation of this team should be from the return of:
|
|
{team table}, "name of team", "orinal name" = rematch:GetSideline()
|
|
If the name of the team needs changed:
|
|
rematch:RenameSideline("name of team" or npcID)
|
|
|
|
When the team is ready to get integrated into saved teams:
|
|
rematch:PushSideline()
|
|
|
|
]]
|
|
|
|
local _,L = ...
|
|
local rematch = Rematch
|
|
local settings, saved
|
|
|
|
-- the table that contains the sideline team, will usually only have one:
|
|
-- { ["teamName" or npcID] = {team table} }
|
|
local sideline = {}
|
|
-- context stores information about how the sideline is to be used, to be set
|
|
-- after a team is sidelined with rematch:SetSidelineContext("var",value) and
|
|
-- retrieved with rematch:GetSidelineContact("var")
|
|
-- wiped when a new team is sidelined with originalKey immediately added
|
|
local context = {}
|
|
|
|
-- keys into the team table for notes and preferences (that don't always get pushed)
|
|
local extraKeys = {"notes","minHP","allowMM","expectedDD","maxXP","minXP","maxHP"}
|
|
|
|
rematch:InitModule(function()
|
|
settings = RematchSettings
|
|
saved = RematchSaved
|
|
end)
|
|
|
|
-- copies a table (max one sub-table deep)
|
|
local function copy(t1,t2)
|
|
for k,v in pairs(t1) do
|
|
if type(v)=="table" then
|
|
t2[k] = {}
|
|
for x,y in pairs(v) do
|
|
t2[k][x] = y
|
|
end
|
|
else
|
|
t2[k] = v
|
|
end
|
|
end
|
|
end
|
|
|
|
-- for named keys (that have to be unique), returns the key if it's already unused,
|
|
-- or key (2), key (3), etc until it finds an unused key
|
|
local function uniqueKey(key)
|
|
if not saved[key] then
|
|
return key -- name is already unique (not used for a team key)
|
|
end
|
|
local oldkey = key:match("(.+) %(%d%)") or key -- drop name (x) if it has one already
|
|
local index = 2
|
|
local newKey
|
|
repeat
|
|
newKey = format("%s (%d)",oldkey,index) -- name (2)
|
|
index = index+1
|
|
until not saved[newKey]
|
|
return newKey
|
|
end
|
|
|
|
-- copies a team to the sideline. Used when starting to deal with a new
|
|
-- (or old) team. If a dialog can reappear (such as a save dialog returning
|
|
-- on a cancelled confirmation) this should be called before dialogs start
|
|
-- getting involved.
|
|
-- key: pass nil to generate a new unique name ("New Team (2)")
|
|
-- team: pass nil to generate a new team for current tab
|
|
-- loadout: pass true to copy loadout pets to the new sideline team
|
|
function rematch:SetSideline(key,team,loadout)
|
|
wipe(sideline)
|
|
wipe(context)
|
|
|
|
key = key or uniqueKey(L["New Team"])
|
|
|
|
-- special case for an imported team being sidelined
|
|
if key==1 and team then
|
|
key = team.teamName or rematch:GetNameFromNpcID(1)
|
|
end
|
|
|
|
sideline[key] = {}
|
|
|
|
if type(team)=="table" then -- if team table alreayd provided, copy its data
|
|
copy(team,sideline[key])
|
|
else -- if not, we're forming a new team; set tab to current team tab
|
|
sideline[key].tab = settings.SelectedTab>1 and settings.SelectedTab or nil
|
|
if type(key)=="number" then -- if key is an npcID, set name of team
|
|
sideline[key].teamName = rematch:GetNameFromNpcID(key)
|
|
end
|
|
end
|
|
|
|
-- if loadout true, copy the currently loaded pets to the sidelined pet slots
|
|
if loadout then
|
|
for i=1,3 do
|
|
local petID,ability1,ability2,ability3 = C_PetJournal.GetPetLoadOutInfo(i)
|
|
local specialPetID = rematch:GetSpecialSlot(i)
|
|
if specialPetID==0 then -- if this slot is queue controlled
|
|
sideline[key][i] = {0}
|
|
elseif specialPetID=="ignored" then -- ignored slot
|
|
sideline[key][i] = {"ignored"}
|
|
elseif specialPetID and rematch:GetSpecialPetIDType(specialPetID)=="random" then
|
|
sideline[key][i] = {specialPetID}
|
|
elseif petID then -- for normal pets, get its speciesID and add it too
|
|
local speciesID = C_PetJournal.GetPetInfoByPetID(petID)
|
|
sideline[key][i] = {petID,ability1,ability2,ability3,speciesID}
|
|
else -- empty slot?
|
|
sideline[key][i] = {}
|
|
end
|
|
end
|
|
-- if loaded team has notes and preferences, copy those to sideline too
|
|
if settings.loadedTeam and saved[settings.loadedTeam] then
|
|
for k,v in pairs(extraKeys) do
|
|
sideline[key][v] = saved[settings.loadedTeam][v]
|
|
end
|
|
end
|
|
rematch:SetSidelineContext("loadout",true) -- notes that this team was made from current pets
|
|
end
|
|
|
|
rematch:SetSidelineContext("originalKey",key)
|
|
rematch:SetSidelineContext("originalName",type(key)=="number" and sideline[key].teamName or key)
|
|
return sideline[key],key
|
|
end
|
|
|
|
-- copies existing sideline to a new team with newKey as index and deletes the old
|
|
-- REMEMBER: need to GetSideline() again because tables are changed!
|
|
function rematch:ChangeSidelineKey(newKey)
|
|
local oldTeam, oldKey = rematch:GetSideline()
|
|
if newKey and oldKey and newKey~=oldKey then
|
|
sideline[newKey] = {}
|
|
copy(oldTeam,sideline[newKey])
|
|
sideline[oldKey] = nil
|
|
end
|
|
end
|
|
|
|
-- returns the table of the sidelined team and its current key
|
|
function rematch:GetSideline()
|
|
local teamKey,team = next(sideline)
|
|
return team,teamKey
|
|
end
|
|
|
|
-- pushes the sideline team into RematchSaved huzzah!
|
|
function rematch:PushSideline()
|
|
rematch:HideDialog()
|
|
local team,key = rematch:GetSideline()
|
|
local originalKey = rematch:GetSidelineContext("originalKey")
|
|
local loadout = rematch:GetSidelineContext("loadout")
|
|
local backupNotes -- place to store backup notes and preferences in case they shouldn't be pushed
|
|
|
|
-- if a team saving over another existing team, backup existing team's notes/preferences
|
|
if saved[key] then
|
|
backupNotes = {}
|
|
for k,v in pairs(extraKeys) do
|
|
backupNotes[v] = saved[key][v]
|
|
end
|
|
end
|
|
|
|
saved[key] = {} -- create new one with clean slate
|
|
copy(team,saved[key]) -- copy sideline to saved
|
|
|
|
-- if we just overwrote another existing team, restore its original notes/preferences if it had any
|
|
-- unless the overwrite notes checkbox was used and OverwriteNotes is true
|
|
if not (rematch:GetSidelineContext("AskingOverwriteNotes") and settings.OverwriteNotes) and not rematch:GetSidelineContext("deleteOriginal") and not rematch:GetSidelineContext("receivedTeam") then
|
|
for k,v in pairs(extraKeys) do
|
|
if backupNotes then
|
|
saved[key][v] = backupNotes[v]
|
|
else
|
|
saved[key][v] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
if (loadout or settings.loadedTeam==originalKey) and (not rematch:GetSidelineContext("receivedTeam") or settings.loadedTeam==key) and not (InCombatLockdown() or C_PetBattles.IsInBattle() or C_PetBattles.GetPVPMatchmakingInfo()) then
|
|
-- this is the current pets being pushed, do anything related to loaded team here
|
|
settings.loadedTeam = key
|
|
-- Loadteam in case any funny business with imported/received teams (changed loaded team)
|
|
-- also a LoadTeam will reassert leveling slots and run ProcessQueue
|
|
rematch:LoadTeam(key)
|
|
end
|
|
|
|
-- add any new pets to the sanctuary
|
|
for i=1,3 do
|
|
rematch:AddToSanctuary(team[i][1],true)
|
|
end
|
|
|
|
if originalKey~=key and rematch:GetSidelineContext("deleteOriginal") then
|
|
saved[originalKey] = nil
|
|
end
|
|
if type(key)=="string" then
|
|
saved[key].teamName = nil -- don't keep redundant teamName when a team is keyed by its name
|
|
end
|
|
|
|
rematch.petsInTeams:Invalidate() -- next time petsInTeams used, get new data
|
|
rematch:UpdateUI()
|
|
end
|
|
|
|
-- sets and returns single values from the sideline context table.
|
|
-- example: rematch:SetSidelineContext("loadout",true)
|
|
function rematch:SetSidelineContext(var,value) context[var]=value end
|
|
function rematch:GetSidelineContext(var) return context[var] end
|
|
|
|
-- returns the displayed name of the sidelined team
|
|
function rematch:GetSidelineTitle(color)
|
|
local team,teamKey = rematch:GetSideline()
|
|
if type(teamKey)=="number" then
|
|
if color then
|
|
return format("\124cffffffff%s\124r",team.teamName)
|
|
else
|
|
return team.teamName
|
|
end
|
|
else
|
|
return teamKey
|
|
end
|
|
end
|
|
|
|
-- Call when a sideline team needs to be made unique. (Creating a "New Team"
|
|
-- or when choosing "Save as a new team" in import/receive.)
|
|
-- If the sideline team's key is already unique, no changes are made.
|
|
-- If the key isn't unique, the key will be converted to a named key (if needed)
|
|
-- and a number appended to make it unique: "New Team (3)" "Aki the Chosen (2)"
|
|
function rematch:MakeSidelineUnique()
|
|
local team,key = rematch:GetSideline()
|
|
if not saved[key] then
|
|
return -- team is already unique, that was easy!
|
|
end
|
|
-- all npcID-keyed teams that are not unique get their key changed to the team's name
|
|
if type(key)=="number" then
|
|
key = team.teamName
|
|
team.teamName = nil
|
|
rematch:ChangeSidelineKey(key)
|
|
if not saved[key] then
|
|
return -- text name of team for this npcID is unique
|
|
end
|
|
end
|
|
-- at this point, key is a string that's not unique
|
|
local newKey = uniqueKey(key)
|
|
-- now, newKey is a unique key
|
|
rematch:ChangeSidelineKey(newKey)
|
|
end
|
|
|