<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=~2026-CoverMirageLifesteal670</id>
	<title>The Deadlock Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=~2026-CoverMirageLifesteal670"/>
	<link rel="alternate" type="text/html" href="https://deadlock.wiki/Special:Contributions/~2026-CoverMirageLifesteal670"/>
	<updated>2026-09-11T06:25:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://deadlock.wiki/Module:AbilityHints?diff=93486</id>
		<title>Module:AbilityHints</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:AbilityHints?diff=93486"/>
		<updated>2026-07-16T06:48:01Z</updated>

		<summary type="html">&lt;p&gt;~2026-CoverMirageLifesteal670: update tooltip for stealth (it&amp;#039;s vergir)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Small item icons on ability cards showing how an ability interacts with items (dispellable, reduced, blocked, etc.).&lt;br /&gt;
-- Used by Template:AbilitySection. Styles are there too.&lt;br /&gt;
&lt;br /&gt;
local AbilityTable = require(&amp;quot;Module:AbilityTable&amp;quot;)&lt;br /&gt;
local ability_data = mw.loadJsonData(&amp;quot;Data:AbilityData.json&amp;quot;)&lt;br /&gt;
local resource_lookup = mw.loadJsonData(&amp;quot;Data:ResourceLookup.json&amp;quot;)&lt;br /&gt;
local item_data = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Automatic hints that get shown without corresponding {{AbilityInteraction}}. Powered by Module:AbilityTable&lt;br /&gt;
local CONFIG = {&lt;br /&gt;
    { list = &amp;quot;melee&amp;quot;,            file = &amp;quot;Melee Lifesteal.png&amp;quot;,  tip = &amp;quot;Benefits from melee items (e.g. [[Melee Lifesteal]])&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;dontbreakstealth&amp;quot;, file = &amp;quot;Veil Walker.png&amp;quot;,      tip = &amp;quot;Casting does not break stealth from [[Veil Walker]] or [[Shadow Weave]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;movementbased&amp;quot;,    file = &amp;quot;Slowing Hex.png&amp;quot;,      tip = &amp;quot;Disabled by [[Slowing Hex]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;debuffresist&amp;quot;,     file = &amp;quot;Debuff Reducer.png&amp;quot;,   tip = &amp;quot;Debuff duration reduced by [[Debuff Resist]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;heal&amp;quot;,             file = &amp;quot;Healing Booster.png&amp;quot;,  tip = &amp;quot;[[Healing]] amplified by [[Healing Booster]] and affected by healing reduction&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;reactivebarrier&amp;quot;,  file = &amp;quot;Reactive Barrier.png&amp;quot;, tip = &amp;quot;Triggers [[Reactive Barrier]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;dispelmagic&amp;quot;,      file = &amp;quot;Dispel Magic.png&amp;quot;,     tip = &amp;quot;Effect can be [[Dispel Magic|dispelled]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;indomitable&amp;quot;,      file = &amp;quot;Indomitable.png&amp;quot;,      tip = &amp;quot;Disable prevented by [[Indomitable]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;unstoppable&amp;quot;,      file = &amp;quot;Unstoppable.png&amp;quot;,      tip = &amp;quot;Negative status effects suppressed by [[Unstoppable]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;platedarmor&amp;quot;,      file = &amp;quot;Plated Armor.png&amp;quot;,     tip = &amp;quot;On-shot effect prevented by [[Plated Armor]]&amp;quot; },&lt;br /&gt;
    { list = &amp;quot;summons&amp;quot;,          file = &amp;quot;Monster Rounds.png&amp;quot;,   tip = &amp;quot;Summons affected by [[Monster Rounds]] and [[Heroic Aura]]&amp;quot; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Display order: item slot (Weapon, then Vitality, then Spirit), then cost, then name.&lt;br /&gt;
local function sort_key(file)&lt;br /&gt;
    local base = mw.ustring.lower((file:gsub(&#039;%.%w+$&#039;, &#039;&#039;)))&lt;br /&gt;
    local entry = resource_lookup[base]&lt;br /&gt;
    local item = (entry ~= nil and entry.type == &#039;item&#039;) and item_data[entry.key] or nil&lt;br /&gt;
    if item == nil then&lt;br /&gt;
        return { 99, math.huge, base }&lt;br /&gt;
    end&lt;br /&gt;
    local slot = item[&amp;quot;Slot&amp;quot;]&lt;br /&gt;
    local slot_rank = (slot == &amp;quot;Weapon&amp;quot; and 1) or (slot == &amp;quot;Armor&amp;quot; and 2) or (slot == &amp;quot;Tech&amp;quot; and 3) or 98&lt;br /&gt;
    return {&lt;br /&gt;
        slot_rank,&lt;br /&gt;
        tonumber(item[&amp;quot;Cost&amp;quot;]) or math.huge,&lt;br /&gt;
        mw.ustring.lower(item[&amp;quot;Name&amp;quot;] or base),&lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function compare(a, b)&lt;br /&gt;
    for i = 1, 3 do&lt;br /&gt;
        if a.sort[i] ~= b.sort[i] then return a.sort[i] &amp;lt; b.sort[i] end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- partial: split the icon so the top-left half is grayscale (mirrors the iconbox-partial box icon).&lt;br /&gt;
-- An empty link makes the icon non-clickable; automatic hints link from their tooltip text instead.&lt;br /&gt;
local function icon_img(file, link, partial)&lt;br /&gt;
    link = link or &#039;&#039;&lt;br /&gt;
    if partial then&lt;br /&gt;
        return &#039;&amp;lt;span class=&amp;quot;ability-hint-icon&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ability-hint-split&amp;quot;&amp;gt;&#039;&lt;br /&gt;
            .. &#039;[[File:&#039; .. file .. &#039;|24px|link=&#039; .. link .. &#039;]]&#039;&lt;br /&gt;
            .. &#039;&amp;lt;span class=&amp;quot;ability-hint-split-gray&amp;quot;&amp;gt;[[File:&#039; .. file .. &#039;|24px|link=]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
            .. &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return &#039;&amp;lt;span class=&amp;quot;ability-hint-icon&amp;quot;&amp;gt;[[File:&#039; .. file .. &#039;|24px|link=&#039; .. link .. &#039;]]&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hint_icon(def)&lt;br /&gt;
    return &#039;&amp;lt;span class=&amp;quot;ability-hint&amp;quot;&amp;gt;&#039; .. icon_img(def.file)&lt;br /&gt;
        .. &#039;&amp;lt;span class=&amp;quot;ability-hint-tip&amp;quot;&amp;gt;&#039; .. def.tip .. &#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function manual_icon(m)&lt;br /&gt;
    local cls = &#039;ability-hint&#039;&lt;br /&gt;
    local verb = &#039;Interacts with&#039;&lt;br /&gt;
    local partial = false&lt;br /&gt;
    if m.state == &#039;disabled&#039; then&lt;br /&gt;
        cls = cls .. &#039; ability-hint--disabled&#039;&lt;br /&gt;
        verb = &#039;Does not interact with&#039;&lt;br /&gt;
    elseif m.state == &#039;partial&#039; then&lt;br /&gt;
        verb = &#039;Interacts partially with&#039;&lt;br /&gt;
        partial = true&lt;br /&gt;
    end&lt;br /&gt;
    return &#039;&amp;lt;span class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039; .. icon_img(m.file, &#039;#&#039; .. m.anchor, partial)&lt;br /&gt;
        .. &#039;&amp;lt;span class=&amp;quot;ability-hint-tip&amp;quot;&amp;gt;&#039; .. verb .. &#039; &#039; .. m.title .. &#039;.&amp;lt;br&amp;gt;Click to reveal more info.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get_icons(ability_key, ability_num, manual)&lt;br /&gt;
    manual = manual or {}&lt;br /&gt;
&lt;br /&gt;
    local manual_by_file = {}&lt;br /&gt;
    for _, m in ipairs(manual) do&lt;br /&gt;
        manual_by_file[mw.ustring.lower(m.file)] = m&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local entries = {}&lt;br /&gt;
    local placed = {}&lt;br /&gt;
&lt;br /&gt;
    local record = ability_data[ability_key]&lt;br /&gt;
    if record ~= nil then&lt;br /&gt;
        local num = tonumber(ability_num)&lt;br /&gt;
        for _, def in ipairs(CONFIG) do&lt;br /&gt;
            if AbilityTable.is_member(def.list, record, num) then&lt;br /&gt;
                local key = mw.ustring.lower(def.file)&lt;br /&gt;
                local m = manual_by_file[key]&lt;br /&gt;
                if m ~= nil then&lt;br /&gt;
                    table.insert(entries, { file = m.file, html = manual_icon(m) })&lt;br /&gt;
                    placed[key] = true&lt;br /&gt;
                else&lt;br /&gt;
                    table.insert(entries, { file = def.file, html = hint_icon(def) })&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, m in ipairs(manual) do&lt;br /&gt;
        if not placed[mw.ustring.lower(m.file)] then&lt;br /&gt;
            table.insert(entries, { file = m.file, html = manual_icon(m) })&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #entries == 0 then return &#039;&#039; end&lt;br /&gt;
&lt;br /&gt;
    for _, e in ipairs(entries) do e.sort = sort_key(e.file) end&lt;br /&gt;
    table.sort(entries, compare)&lt;br /&gt;
&lt;br /&gt;
    local icons = {}&lt;br /&gt;
    for _, e in ipairs(entries) do table.insert(icons, e.html) end&lt;br /&gt;
&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;ability-section-hints&amp;quot;&amp;gt;&#039; .. table.concat(icons) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-CoverMirageLifesteal670</name></author>
	</entry>
</feed>