Module:Sandbox/Monster Domosed/AbilityTable/ComplexRenderers: Difference between revisions

No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 402: Line 402:


     return cells
     return cells
end
-- Memoized Key -> label map built from Data:AbilityCards.json. The flat
-- AbilityData.json records only carry { Value, Scale }; the human-readable
-- label lives inside the Info1/Info2 prop entries of AbilityCards.json, where
-- Title takes precedence over Name ("On Perfect Hold" before "Perfect Damage").
-- A trailing colon on a Title is stripped so it reads cleanly in "(...)".
local _card_labels = nil
local function build_card_label_map()
    if _card_labels then return _card_labels end
    _card_labels = {}
    if type(mw) ~= "table" or type(mw.loadJsonData) ~= "function" then
        return _card_labels
    end
    local ok, cards = pcall(mw.loadJsonData, "Data:AbilityCards.json")
    if not ok or type(cards) ~= "table" then return _card_labels end
    -- Label for a single prop entry: Title wins, else Name; strip any
    -- trailing colon/whitespace (a Title like "On Perfect Hold:" -> "On Perfect Hold").
    local function entry_label(entry)
        local label = entry["Title"] or entry["Name"]
        if type(label) ~= "string" then return nil end
        if entry["Title"] ~= nil then label = label:gsub(":%s*$", "") end
        return label
    end
    local seen = {}
    local function walk(node)
        if type(node) ~= "table" or seen[node] then return end
        seen[node] = true
        local k = node["Key"]
        if type(k) == "string" and (node["Title"] ~= nil or node["Name"] ~= nil) then
            local label = entry_label(node)
            if label and label ~= "" then _card_labels[k] = label end
        end
        for _, v in pairs(node) do
            if type(v) == "table" then walk(v) end
        end
    end
    walk(cards)
    return _card_labels
end
end


Line 438: Line 479:
               and type(scale["Value"]) == "number"
               and type(scale["Value"]) == "number"
               and scale["Value"] ~= 0 then
               and scale["Value"] ~= 0 then
                 -- Prefer a Name carried directly on the prop, then a name
                 -- Prefer a Name carried directly on the prop, then any label
                 -- recovered from the nested Key/Name entries, else the key.
                 -- recovered from nested Key/Title-or-Name entries inside this
                -- record, then the AbilityCards label map (Title over Name),
                -- else the key.
                 local label = type(v["Name"]) == "string" and v["Name"]
                 local label = type(v["Name"]) == "string" and v["Name"]
                               or names[k] or k
                               or names[k]
                              or build_card_label_map()[k]
                              or k
                 table.insert(props, { key = k, value = scale["Value"], name = label })
                 table.insert(props, { key = k, value = scale["Value"], name = label })
             end
             end