Module:Sandbox/Monster Domosed/AbilityTable/ComplexRenderers: Difference between revisionsGive feedback
No edit summary |
No edit summary |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 404: | Line 404: | ||
end | 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"). | ||
local function | -- A trailing colon on a Title is stripped so it reads cleanly in "(...)". | ||
local _card_labels = nil | |||
if type( | local function build_card_label_map() | ||
return | if _card_labels then return _card_labels end | ||
_card_labels = {} | |||
if type(mw) ~= "table" or type(mw.loadJsonData) ~= "function" then | |||
return _card_labels | |||
end | end | ||
local ok, cards = pcall(mw.loadJsonData, "Data:AbilityCards.json") | |||
if not ok or type(cards) ~= "table" then return _card_labels end | |||
local | -- 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) | local function walk(node) | ||
if | 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 | for _, v in pairs(node) do | ||
if type(v) == "table" then | if type(v) == "table" then walk(v) end | ||
end | end | ||
end | end | ||
walk( | walk(cards) | ||
return | return _card_labels | ||
end | end | ||
| Line 440: | Line 454: | ||
function p.RenderSpiritScaling(ability) | function p.RenderSpiritScaling(ability) | ||
local props = {} | local props = {} | ||
-- Build a Key -> display Name lookup for the prop names. The flattened | |||
-- top-level prop only keeps { Value, Scale }, while the human-readable | |||
-- Name lives alongside the Key in the nested Info1/Info2 entries, so scan | |||
-- the whole record for any entry pairing a string Key with a string Name. | |||
local names, seen = {}, {} | |||
local function walk(node) | |||
if type(node) ~= "table" or seen[node] then return end | |||
seen[node] = true | |||
local k, n = node["Key"], node["Name"] | |||
if type(k) == "string" and type(n) == "string" then names[k] = n end | |||
for _, v in pairs(node) do | |||
if type(v) == "table" then walk(v) end | |||
end | |||
end | |||
walk(ability) | |||
-- Gather every base Spirit-scaling instance (skip the Upgrades table). | -- Gather every base Spirit-scaling instance (skip the Upgrades table). | ||
| Line 449: | Line 479: | ||
and type(scale["Value"]) == "number" | and type(scale["Value"]) == "number" | ||
and scale["Value"] ~= 0 then | and scale["Value"] ~= 0 then | ||
local label = | -- Prefer a Name carried directly on the prop, then any label | ||
-- 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"] | |||
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 | ||