Module:AbilityTable

From The Deadlock Wiki
Revision as of 22:41, 10 May 2026 by Vergir (talk | contribs) (Create AbilityTables module for data-driven ability tables using GameData framework (with help from vergir-bot LLM))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

This module exposes two functions.

  • render generates a table of hero abilities matching a named list, and is invoked via {{AbilityTable}}.
  • is_member(list, ability_key, ability_num) is a shared function that decides whether a single ability belongs to a list (applying the same properties and exclusions); it is used both internally by render and externally by Module:AbilityHints, so the ability-hint icons always stay in sync with these tables.

See also


-- Module:AbilityTables
-- Renders sortable wikitables of abilities filtered by a named stat.
-- Backing module for Template:AbilityTable.
--
-- Usage on wiki pages: {{AbilityTable|charges}}
--
-- Adding a new stat:
--   1. Add an entry to friendly_to_internal below, mapping the friendly
--      name (lowercase) to the list of internal AbilityData property keys.
--   2. The table will appear automatically on any page using {{AbilityTable|<stat>}}.

local p = {}
local GameData = require("Module:GameData")

-- Maps lowercase friendly stat names to internal AbilityData property keys.
-- A single friendly name may map to multiple internal keys if the stat can
-- be represented differently across abilities.
local friendly_to_internal = {
    ["charges"] = { "AbilityCharges" },
}

-- Entry point invoked by Template:AbilityTable.
-- frame.args[1] is the friendly stat name (e.g. "charges").
function p.abilityPropTable(frame)
    local stat = mw.text.trim(frame.args[1] or ""):lower()

    local internal_keys = friendly_to_internal[stat]
    if not internal_keys then
        return '<span class="error">AbilityTable: unknown stat "' .. stat .. '".</span>'
    end

    local abilities = GameData.get_entities(GameData.Dataset.ABILITIES, internal_keys)

    if #abilities == 0 then
        return "No abilities found for stat: " .. stat
    end

    -- Sort alphabetically by ability name
    table.sort(abilities, function(a, b)
        return (a["Name"] or "") < (b["Name"] or "")
    end)

    -- Render wikitable
    local out = {}
    table.insert(out, '{| class="wikitable sortable"')
    table.insert(out, "! Ability")

    for _, ability in ipairs(abilities) do
        local ability_cell = frame:expandTemplate{
            title = "AbilityIcon",
            args  = { ability["Key"] or ability["Name"] }
        }
        table.insert(out, "|-")
        table.insert(out, "| " .. ability_cell)
    end

    table.insert(out, "|}")
    return table.concat(out, "\n")
end

return p