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.

242 lines
8.3 KiB

local BigWigs = {}
do
local _, tbl =...
tbl.core = BigWigs
end
local C = {}
local L = BigWigsAPI:GetLocale("BigWigs")
local CL = BigWigsAPI:GetLocale("BigWigs: Common")
local names = {}
local descriptions = {}
local GetSpellInfo, GetSpellTexture, GetSpellDescription, C_EncounterJournal_GetSectionInfo = GetSpellInfo, GetSpellTexture, GetSpellDescription, C_EncounterJournal.GetSectionInfo
local type, next, tonumber, gsub, lshift, band = type, next, tonumber, gsub, bit.lshift, bit.band
-- Option bitflags
local coreToggles = { "BAR", "MESSAGE", "ICON", "PULSE", "SOUND", "SAY", "PROXIMITY", "FLASH", "ME_ONLY", "EMPHASIZE", "TANK", "HEALER", "TANK_HEALER", "DISPEL", "ALTPOWER", "VOICE", "COUNTDOWN", "INFOBOX", "CASTBAR", "SAY_COUNTDOWN", "ME_ONLY_EMPHASIZE", "NAMEPLATEBAR" }
for i, toggle in next, coreToggles do
C[toggle] = lshift(1, i - 1)
if L[toggle] then
names[toggle] = L[toggle]
descriptions[toggle] = L[toggle .. "_desc"]
end
end
-- Toggles that should actually be shown in the interface options
local listToggles = { "BAR", "FLASH", "MESSAGE", "ICON", "SAY", "SAY_COUNTDOWN", "PROXIMITY", "ALTPOWER", "VOICE", "INFOBOX" }
local roleToggles = { "TANK", "HEALER", "TANK_HEALER", "DISPEL" }
-- NOTE: The toggle "OFF" is also valid for entirely disabling an option by default
local used = nil
function BigWigs:RegisterOption(key, name, desc)
if C[key] then error("Don't do that again!") end
-- Build a list of used shift indexes
if not used then
used = {}
for k, i in next, self.db.global.optionShiftIndexes do
used[i] = k
end
for i, k in next, coreToggles do
used[i - 1] = k
end
end
if self.db.global.optionShiftIndexes[key] then
local index = self.db.global.optionShiftIndexes[key]
if used[index] and used[index] ~= key then
error("Bit field shift indexes are not consistent with the stored data. BigWigs should automatically handle this, but at the moment it does not. Boss options might be completely fubar at the moment. Have fun.")
end
-- Use the stored shift index
C[key] = lshift(1, self.db.global.optionShiftIndexes[key])
else
-- Find the next free shift index
local nextShiftIndex = nil
for i = 10, 63 do
if not used[i] then
nextShiftIndex = i
break
end
end
for i, k in next, used do
if k == key then
error("That's weird, we seem to have a stored shift index for this key already.")
break
end
end
if not nextShiftIndex then error("BigWigs will now blow up. Please consult your local IT technician.") end
used[nextShiftIndex] = key
self.db.global.optionShiftIndexes[key] = nextShiftIndex
C[key] = lshift(1, nextShiftIndex)
end
if name and desc then
names[key] = name
descriptions[key] = desc
listToggles[#listToggles + 1] = key
end
end
function BigWigs:GetOptionDetails(key)
return names[key], descriptions[key]
end
function BigWigs:GetOptions()
return listToggles
end
function BigWigs:GetRoleOptions()
return roleToggles
end
-- Display role message in the option
local function getRoleStrings(module, key)
local option = module.toggleDefaults[key]
if band(option, C.TANK_HEALER) == C.TANK_HEALER then
return L.tankhealer
elseif band(option, C.TANK) == C.TANK then
return L.tank
elseif band(option, C.HEALER) == C.HEALER then
return L.healer
elseif band(option, C.DISPEL) == C.DISPEL then
return L.dispeller
end
return ""
end
local function replaceIdWithName(msg)
local id = tonumber(msg)
if id > 0 then
return GetSpellInfo(id) or BigWigs:Print(("No spell name found for boss option using id %d."):format(id))
else
local tbl = C_EncounterJournal_GetSectionInfo(-id)
if not tbl then
BigWigs:Print(("No journal name found for boss option using id %d."):format(id))
else
return tbl.title
end
end
end
local function replaceIdWithDescription(msg)
local id = tonumber(msg)
if id > 0 then
local desc = GetSpellDescription(id)
if desc then
return desc:gsub("[\r\n]+$", "") -- Remove stray CR+LF for e.g. 299250 spells that show another spell in their tooltip which isn't part of GetSpellDescription
else
BigWigs:Print(("No spell description found for boss option using id %d."):format(id))
end
else
local tbl = C_EncounterJournal_GetSectionInfo(-id)
if not tbl then
BigWigs:Print(("No journal description found for boss option using id %d."):format(id))
else
return tbl.description
end
end
end
local customBossOptions = { -- Adding core generic toggles
berserk = {L.berserk, L.berserk_desc, 136224}, -- 136224 = "Interface\\Icons\\spell_shadow_unholyfrenzy"
altpower = {L.altpower, L.altpower_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\AltPower"},
infobox = {L.infobox, L.infobox_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Info"},
proximity = {L.proximity, L.proximity_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Proximity"},
stages = {L.stages, L.stages_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Stages"},
warmup = {L.warmup, L.warmup_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Warmup"},
}
function BigWigs:GetBossOptionDetails(module, option)
local optionType = type(option)
if optionType == "table" then
option = option[1]
optionType = type(option)
end
local alternativeName = module.altNames and module.altNames[option]
if optionType == "string" then
if customBossOptions[option] then
return option, customBossOptions[option][1], customBossOptions[option][2], customBossOptions[option][3]
else
local roleDesc = ""
if not option:find("^custom_") then
roleDesc = getRoleStrings(module, option)
end
local L = module:GetLocale(true)
local title, description = L[option], L[option .. "_desc"]
if title then
if type(title) == "number" then
if not description then description = title end -- Allow a nil description to mean the same id as the title, if title is a number.
title = replaceIdWithName(title)
else
title = gsub(title, "{(%-?%d-)}", replaceIdWithName) -- Allow embedding an id in a string.
end
title = title
end
if description then
if type(description) == "number" then
description = replaceIdWithDescription(description)
else
description = gsub(description, "{(%-?%d-)}", replaceIdWithDescription) -- Allow embedding an id in a string.
description = gsub(description, "{focus}", CL.focus_only) -- Allow embedding the focus prefix.
end
description = roleDesc.. gsub(description, "{rt(%d)}", "|T13700%1:15|t")
end
local icon = L[option .. "_icon"]
if icon == option .. "_icon" then icon = nil end
if type(icon) == "number" then
if icon > 8 then
icon = GetSpellTexture(icon)
elseif icon > 0 then
icon = icon + 137000 -- Texture id list for raid icons 1-8 is 137001-137008. Base texture path is Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_%d
else
local tbl = C_EncounterJournal_GetSectionInfo(-icon)
icon = tbl.abilityIcon
end
if not icon then
BigWigs:Print(("No icon found for %s using id %d."):format(module.name, L[option .. "_icon"]))
end
elseif type(icon) == "string" and not icon:find("\\", nil, true) then
icon = "Interface\\Icons\\" .. icon
end
return option, title, description, icon, alternativeName
end
elseif optionType == "number" then
if option > 0 then
local spellName, _, icon = GetSpellInfo(option)
if not spellName then
BigWigs:Error(("Invalid option %d in module %s."):format(option, module.name))
spellName = option
end
local desc = GetSpellDescription(option)
if not desc then
BigWigs:Error(("No spell description was returned for id %d!"):format(option))
desc = option
else
desc = desc:gsub("[\r\n]+$", "") -- Remove stray CR+LF for e.g. 299250 spells that show another spell in their tooltip which isn't part of GetSpellDescription
end
local roleDesc = getRoleStrings(module, option)
return option, spellName, roleDesc..desc, icon, alternativeName
else
-- This is an EncounterJournal ID
local tbl = C_EncounterJournal_GetSectionInfo(-option)
local title, description, abilityIcon
if not tbl then
BigWigs:Error(("Invalid option %d in module %s."):format(option, module.name))
title = option
description = option
else
title, description, abilityIcon = tbl.title, tbl.description, tbl.abilityIcon
end
local roleDesc = getRoleStrings(module, option)
return option, title, roleDesc..description, abilityIcon or false, alternativeName
end
end
end
BigWigs.C = C