Editing Module:AbilityHints

Warning: You are not logged in. Once you make an edit, a temporary account will be created for you. Learn more. Log in or create an account to continue receiving notifications after this account expires, and to access other features.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
-- Small item icons on ability cards showing how an ability interacts with items (dispellable, reduced, blocked, etc.).
-- Ability interaction hints: small item icons on ability cards showing how an
-- Used by Template:AbilitySection. Styles are there too.
-- ability interacts with items (dispellable, reduced, blocked, etc.).
 
-- Membership is decided by Module:AbilityTable.is_member so these icons always
-- label_dict_key names the [[Data:Dictionary]] entry holding the tooltip text. It is
-- agree with the dynamic ability-interaction tables.
-- resolved at render time rather than here, so the tooltip follows the page language
-- and so no frame is needed while the module is still loading.
local CONFIG = {
    { list = "melee",            file = "Melee Lifesteal.png",  label_dict_key = "AbilityHintsMelee" },
    { list = "dontbreakstealth", file = "Veil Walker.png",      label_dict_key = "AbilityHintsDontBreakStealth" },
    { list = "movementbased",    file = "Slowing Hex.png",      label_dict_key = "AbilityHintsMovementBased" },
    { list = "debuffresist",    file = "Debuff Reducer.png",  label_dict_key = "AbilityHintsDebuffResist" },
    { list = "heal",            file = "Healing Booster.png",  label_dict_key = "AbilityHintsHeal" },
    { list = "healingtempo",    file = "Healing Tempo.png",    label_dict_key = "AbilityHintsHealingTempo" },
    { list = "reactivebarrier",  file = "Reactive Barrier.png", label_dict_key = "AbilityHintsReactiveBarrier" },
    { list = "dispelmagic",      file = "Dispel Magic.png",    label_dict_key = "AbilityHintsDispelMagic" },
    { list = "indomitable",      file = "Indomitable.png",      label_dict_key = "AbilityHintsIndomitable" },
    { list = "unstoppable",      file = "Unstoppable.png",      label_dict_key = "AbilityHintsUnstoppable" },
    { list = "platedarmor",      file = "Plated Armor.png",    label_dict_key = "AbilityHintsPlatedArmor" },
    { list = "summons",          file = "Monster Rounds.png",  label_dict_key = "AbilityHintsSummons" },
}
 
-- Tooltip wording for a manually placed icon, keyed by its iconbox state. Each entry
-- takes the item title as {{{1}}}, so translations can put the object where their
-- grammar wants it rather than always after the verb. The enhanced state has no entry
-- of its own: the glow already marks it, so it falls through to the normal wording.
local STATE_DICT_KEYS = {
    normal  = "AbilityHintsInteracts",
    disabled = "AbilityHintsInteractsNot",
    partial  = "AbilityHintsInteractsPartial",
}


local AbilityTable = require("Module:AbilityTable")
local AbilityTable = require("Module:AbilityTable")
local dictionary = require("Module:Dictionary")
local icon_module  = require("Module:Icon")
local resource_lookup = mw.loadJsonData("Data:ResourceLookup.json")
local ability_data = mw.loadJsonData("Data:AbilityData.json")
local item_data = mw.loadJsonData("Data:ItemData.json")


local p = {}
local p = {}


-- Display order: item type (Weapon => Vitality => Spirit), then cost, then name.
-- Display order. Each entry is either:
local function sort_key(file)
--  { list = "...", item = "...", tip = "..." }  a single icon shown when the ability is in `list`
    local base = mw.ustring.lower((file:gsub('%.%w+$', '')))
--  { group = "..." }                            a grouped relationship (see GROUPS)
    local entry = resource_lookup[base]
local CONFIG = {
     local item = (entry ~= nil and entry.type == 'item') and item_data[entry.key] or nil
     { list = "melee",          item = "Melee Lifesteal",  tip = "Benefits from melee items" },
     if item == nil then
     { list = "movementbased",  item = "Slowing Hex",      tip = "Disabled by Slowing Hex" },
        return { 99, math.huge, base }
{ list = "debuffresist",   item = "Debuff Reducer",   tip = "Duration reduced by Debuff Resist" },
     end
     { list = "heal",            item = "Healing Booster",  tip = "Healing amplified by Healing Booster and affected by healing reduction" },
     local slot = item["Slot"]
     { group = "reactive_indomitable" },
     local slot_rank = (slot == "Weapon" and 1) or (slot == "Armor" and 2) or (slot == "Tech" and 3) or 98
     { list = "dispelmagic",    item = "Dispel Magic",    tip = "Effect can be dispelled" },
     return {
    { list = "unstoppable",    item = "Unstoppable",      tip = "Disable prevented by Unstoppable" },
        slot_rank,
     { list = "platedarmor",     item = "Plated Armor",     tip = "On-shot effect prevented by Plated Armor" },
        tonumber(item["Cost"]) or math.huge,
}
        mw.ustring.lower(item["Name"] or base),
    }
end


local function compare(a, b)
-- Grouped relationships: two related lists collapse into ONE full-size icon
    for i = 1, 3 do
-- whose item and tooltip depend on which of the two the ability matches.
        if a.sort[i] ~= b.sort[i] then return a.sort[i] < b.sort[i] end
local GROUPS = {
    end
     reactive_indomitable = {
    return false
        a = "reactivebarrier",
end
         b = "indomitable",
 
        a_only = { item = "Reactive Barrier", tip = "Triggers Reactive Barrier<br>does <b>not</b> trigger Indomitable" },
-- partial: split the icon so the top-left half is grayscale (mirrors the iconbox-partial box icon).
        b_only = { item = "Indomitable",      tip = "Blocked by Indomitable<br>does <b>not</b> trigger Reactive Barrier" },
-- An empty link makes the icon non-clickable; automatic hints link from their tooltip text instead.
        both  = { item = "Reactive Barrier", tip = "Triggers Reactive Barrier<br>Blocked by Indomitable" },
local function icon_img(file, link, partial)
    },
     link = link or ''
}
    if partial then
         return '<span class="ability-hint-icon"><span class="ability-hint-split">'
            .. '[[File:' .. file .. '|24px|link=' .. link .. ']]'
            .. '<span class="ability-hint-split-gray">[[File:' .. file .. '|24px|link=]]</span>'
            .. '</span></span>'
    end
    return '<span class="ability-hint-icon">[[File:' .. file .. '|24px|link=' .. link .. ']]</span>'
end


local function hint_icon(def)
-- Renders one item icon as a title-less external link (so Page Previews / Popups
     return '<span class="ability-hint">' .. icon_img(def.file)
-- ignores it) wrapping just the image.
        .. '<span class="ability-hint-tip">' .. dictionary.translate(def.label_dict_key) .. '</span></span>'
local function icon_img(item)
     local url = tostring(mw.uri.canonicalUrl(item))
    return icon_module._render(item, { size = '24px', ['icon-only'] = 'true', link = url })
end
end


local function manual_icon(m)
-- One full-size hint icon with a tooltip.
    local cls = 'ability-hint'
local function hint_icon(item, tip)
    local dict_key = STATE_DICT_KEYS.normal
     return '<span class="ability-hint">' .. icon_img(item)
    local partial = false
    if m.state == 'disabled' then
        cls = cls .. ' ability-hint--disabled'
        dict_key = STATE_DICT_KEYS.disabled
    elseif m.state == 'partial' then
        dict_key = STATE_DICT_KEYS.partial
        partial = true
    elseif m.state == 'enhanced' then
        cls = cls .. ' ability-hint--enhanced'
    end
    local tip = dictionary.translate(dict_key, nil, nil, { m.title })
        .. '<br>' .. dictionary.translate('AbilityHintsClickReveal')
     return '<span class="' .. cls .. '">' .. icon_img(m.file, '#' .. m.anchor, partial)
         .. '<span class="ability-hint-tip">' .. tip .. '</span></span>'
         .. '<span class="ability-hint-tip">' .. tip .. '</span></span>'
end
end


function p.get_icons(ability_key, ability_num, manual)
-- Renders the interaction icon rail for one ability.
     manual = manual or {}
--  ability_key  the ability's internal key (AbilityCards .Key)
--  ability_num  the ability's slot (1-4); coerced to number
-- Returns rail HTML, or '' when the ability has no interactions.
function p.get_icons(ability_key, ability_num)
     local record = ability_data[ability_key]
    if record == nil then return '' end
    local num = tonumber(ability_num)


     local manual_by_file = {}
    -- Membership for every list referenced by CONFIG or GROUPS.
     for _, m in ipairs(manual) do
     local member = {}
         manual_by_file[mw.ustring.lower(m.file)] = m
     local function check(list)
         if list ~= nil and member[list] == nil then
            member[list] = AbilityTable.is_member(list, record, num)
        end
     end
     end
    local entries = {}
    local placed = {}
    local num = tonumber(ability_num)
     for _, def in ipairs(CONFIG) do
     for _, def in ipairs(CONFIG) do
         if AbilityTable.is_member(def.list, ability_key, num) then
         if def.list then
             local key = mw.ustring.lower(def.file)
             check(def.list)
             local m = manual_by_file[key]
        elseif def.group then
             if m ~= nil then
             local g = GROUPS[def.group]
                table.insert(entries, { file = m.file, html = manual_icon(m) })
             check(g.a)
                placed[key] = true
             check(g.b)
             else
                table.insert(entries, { file = def.file, html = hint_icon(def) })
            end
         end
         end
     end
     end


     for _, m in ipairs(manual) do
    local icons = {}
         if not placed[mw.ustring.lower(m.file)] then
     for _, def in ipairs(CONFIG) do
             table.insert(entries, { file = m.file, html = manual_icon(m) })
         if def.group 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))
         end
         end
     end
     end


     if #entries == 0 then return '' end
     if #icons == 0 then return '' end
 
    for _, e in ipairs(entries) do e.sort = sort_key(e.file) end
    table.sort(entries, compare)
 
    local icons = {}
    for _, e in ipairs(entries) do table.insert(icons, e.html) end
 
     return '<div class="ability-section-hints">' .. table.concat(icons) .. '</div>'
     return '<div class="ability-section-hints">' .. table.concat(icons) .. '</div>'
end
end


return p
return p
Please note that all contributions to The Deadlock Wiki are considered to be released under the Creative Commons Attribution-NonCommercial-ShareAlike (see Deadlock:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template

Pages included on this page: