Module:AbilityHints: Difference between revisions

Replace the reactive/indomitable split icon with a grouped single icon whose image and tooltip depend on which of the two lists match (with help from vergir-bot LLM)
Revert groups/combinations: reactivebarrier and indomitable are plain separate icons again (with help from vergir-bot LLM)
Line 10: Line 10:
local p = {}
local p = {}


-- Display order. Each entry is either:
-- Display order. Each entry: { list = "...", item = "...", tip = "..." }
--  { list = "...", item = "...", tip = "..." }   a single icon shown when the ability is in `list`
-- The icon is shown when the ability is a member of `list`.
--  { group = "..." }                            a grouped relationship (see GROUPS)
local CONFIG = {
local CONFIG = {
     { list = "melee",          item = "Melee Lifesteal",  tip = "Benefits from melee items" },
     { list = "melee",          item = "Melee Lifesteal",  tip = "Benefits from melee items" },
Line 18: Line 17:
{ list = "debuffresist",    item = "Debuff Reducer",  tip = "Duration reduced by Debuff Resist" },
{ list = "debuffresist",    item = "Debuff Reducer",  tip = "Duration reduced by Debuff Resist" },
     { list = "heal",            item = "Healing Booster",  tip = "Healing amplified by Healing Booster and affected by healing reduction" },
     { list = "heal",            item = "Healing Booster",  tip = "Healing amplified by Healing Booster and affected by healing reduction" },
     { group = "reactive_indomitable" },
     { list = "reactivebarrier", item = "Reactive Barrier", tip = "Triggers Reactive Barrier" },
     { list = "dispelmagic",    item = "Dispel Magic",    tip = "Effect can be dispelled" },
     { list = "dispelmagic",    item = "Dispel Magic",    tip = "Effect can be dispelled" },
    { list = "indomitable",    item = "Indomitable",      tip = "Effect blocked by Indomitable" },
     { list = "unstoppable",    item = "Unstoppable",      tip = "Disable prevented by Unstoppable" },
     { list = "unstoppable",    item = "Unstoppable",      tip = "Disable prevented by Unstoppable" },
     { list = "platedarmor",    item = "Plated Armor",    tip = "On-shot effect prevented by Plated Armor" },
     { list = "platedarmor",    item = "Plated Armor",    tip = "On-shot effect prevented by Plated Armor" },
}
-- Grouped relationships: two related lists collapse into ONE full-size icon
-- whose item and tooltip depend on which of the two the ability matches.
local GROUPS = {
    reactive_indomitable = {
        a = "reactivebarrier",
        b = "indomitable",
        a_only = { item = "Reactive Barrier", tip = "Triggers Reactive Barrier<br>does <b>not</b> trigger Indomitable" },
        b_only = { item = "Indomitable",      tip = "Blocked by Indomitable<br>does <b>not</b> trigger Reactive Barrier" },
        both  = { item = "Reactive Barrier", tip = "Triggers Reactive Barrier<br>Blocked by Indomitable" },
    },
}
}


Line 57: Line 45:
     if record == nil then return '' end
     if record == nil then return '' end
     local num = tonumber(ability_num)
     local num = tonumber(ability_num)
    -- Membership for every list referenced by CONFIG or GROUPS.
    local member = {}
    local function check(list)
        if list ~= nil and member[list] == nil then
            member[list] = AbilityTable.is_member(list, record, num)
        end
    end
    for _, def in ipairs(CONFIG) do
        if def.list then
            check(def.list)
        elseif def.group then
            local g = GROUPS[def.group]
            check(g.a)
            check(g.b)
        end
    end


     local icons = {}
     local icons = {}
     for _, def in ipairs(CONFIG) do
     for _, def in ipairs(CONFIG) do
         if def.group then
         if AbilityTable.is_member(def.list, record, num) then
            local g = GROUPS[def.group]
            local ma, mb = member[g.a], member[g.b]
            local case
            if ma and mb then
                case = g.both
            elseif ma then
                case = g.a_only
            elseif mb then
                case = g.b_only
            end
            if case then
                table.insert(icons, hint_icon(case.item, case.tip))
            end
        elseif def.list and member[def.list] then
             table.insert(icons, hint_icon(def.item, def.tip))
             table.insert(icons, hint_icon(def.item, def.tip))
         end
         end