Module:Infobox item: Difference between revisions

added ITEM_NAME_OVERRIDES
append_label: prefer per-stat StatLinks target over generic attribute-type link (fixes e.g. Debuff Resist → Ability Duration) (with help from vergir-bot LLM)
 
(5 intermediate revisions by 3 users not shown)
Line 15: Line 15:
local tostring = tostring
local tostring = tostring
local type = type
local type = type
-- Status Effect Icon Map
local STATUS_EFFECT_ICON_MAP = {
    StatusEffectDisarmed = {img='Status_Disarm.png',        link='Disarm',  color='Red'},
    StatusEffectEMP      = {img='Status_Silence.png',      link='Silence',  color='Purple'},
    StatusEffectInvisible= {img='Invisible.png',            link='Invisible',color='Green'},
    StatusEffectStun    = {img='Status_Stun.png',          link='Stun',    color='NoColor'},
    StatusEffectSlow    = {img='Status_Movement_Slow.png', link='Slow',    color='Purple'},
}


-- Pre-computed constants
-- Pre-computed constants
Line 32: Line 41:
-- Item name override mapping (old name -> new name)
-- Item name override mapping (old name -> new name)
local ITEM_NAME_OVERRIDES = {
local ITEM_NAME_OVERRIDES = {
     ["Backstabber"] = "Stalker",
     ["debuff remover"] = "Dispel Magic",
    ["backstabber"] = "Stalker",
}
}


Line 65: Line 75:


local function resolve_item_name(name)
local function resolve_item_name(name)
     -- Check if there's an override for this name
     -- Check if there's an override for this name (case-insensitive)
     return ITEM_NAME_OVERRIDES[name] or name
     local lowercase_name = name:lower()
    local override = ITEM_NAME_OVERRIDES[lowercase_name]
    if override then
        return override
    end
   
    -- If no override, try to find the item in data and return its proper Name
    -- First try direct key lookup
    if data[name] and not data[name].IsDisabled then
        return data[name].Name or name
    end
   
    -- Then try case-insensitive search by Name field
    local lowercase_search = name:lower()
    for _, v in pairs(data) do
        if v.Name and v.Name:lower() == lowercase_search and not v.IsDisabled then
            return v.Name
        end
    end
   
    -- Fallback to original name
    return name
end
end


Line 205: Line 236:
     if label == "" then return val_str end
     if label == "" then return val_str end


     -- Resolve link priority: Override > Attribute Map Link > JSON Stat Link
     -- Resolve link priority: Override > JSON Stat Link > Attribute Map Link
     local link_target = link_override
     local link_target = link_override
     if not link_target or link_target == "" then
     if not link_target or link_target == "" then
         link_target = attr_link
         link_target = stat_links[prop_key]
     end
     end
     if not link_target or link_target == "" then
     if not link_target or link_target == "" then
         link_target = stat_links[prop_key]
         link_target = attr_link
     end
     end


Line 275: Line 306:
         icon_str = format("{{Icon/%s|[[File:%s|%spx|link=%s]]}}", color, img, 18, link or "")
         icon_str = format("{{Icon/%s|[[File:%s|%spx|link=%s]]}}", color, img, 18, link or "")
     end
     end
    return {
        icon = icon_str,
        link = link
    }
end
--------------------------------------------------------------------------------
-- Status Effect Icon helper
--------------------------------------------------------------------------------
local function resolve_status_effect_icon(prop_key)
    local effect_config = STATUS_EFFECT_ICON_MAP[prop_key]
    if not effect_config then return nil end
    local color = effect_config.color or "NoColor"
    local img = effect_config.img or "GenericProperty.png"
    local link = effect_config.link
    -- Construct icon using the defined color template
    local icon_str = format(
        "{{Icon/%s|[[File:%s|18px|link=%s]]}}",
        color, img, link or ""
    )


     return {
     return {
Line 400: Line 455:


     return append_conditional(val_str, allow_conditional, usage_flags)
     return append_conditional(val_str, allow_conditional, usage_flags)
end
--------------------------------------------------------------------------------
-- Status Effect formatting helper
--------------------------------------------------------------------------------
local function format_status_effect(prop_key)
    local lang_str = format("[[{{#invoke:Lang|get_string|Citadel_%s}}]]", prop_key)
        .. " [[{{#invoke:Lang|get_string|Citadel_StatusEffect}}]]"
   
    -- Get icon for this status effect
    local icon_style = resolve_status_effect_icon(prop_key)
    if icon_style and icon_style.icon then
        return icon_style.icon .. " " .. lang_str
    end
   
    return lang_str
end
end


Line 466: Line 538:
     if item.StreetBrawl == true then
     if item.StreetBrawl == true then
         insert(lines, "| street_brawl = true")
         insert(lines, "| street_brawl = true")
    end
   
    -- Pass through nocat arg to the Infobox item template if provided
    local nocat = frame.args.nocat
    if nocat and nocat ~= "" then
        insert(lines, "| nocat = " .. nocat)
     end
     end


Line 531: Line 609:
         main_formatter = function(obj)
         main_formatter = function(obj)
             if obj.Key:match("^StatusEffect") then
             if obj.Key:match("^StatusEffect") then
                 return format(STATUS_FMT, obj.Key)
                 return format_status_effect(obj.Key)
             end
             end
             return format_value_enhanced(
             return format_value_enhanced(
Line 539: Line 617:
         end
         end
         alt_formatter = function(obj)
         alt_formatter = function(obj)
            if obj.Key:match("^StatusEffect") then
                return format_status_effect(obj.Key)
            end
             return format_value_enhanced(
             return format_value_enhanced(
                 resolved_name, obj.Key, obj.Value, obj.Type,
                 resolved_name, obj.Key, obj.Value, obj.Type,
Line 548: Line 629:
         main_formatter = function(obj)
         main_formatter = function(obj)
             if obj.Key:match("^StatusEffect") then
             if obj.Key:match("^StatusEffect") then
                 return format(STATUS_FMT, obj.Key)
                 return format_status_effect(obj.Key)
             end
             end
             return format_value(
             return format_value(
Line 556: Line 637:
         end
         end
         alt_formatter = function(obj)
         alt_formatter = function(obj)
            if obj.Key:match("^StatusEffect") then
                return format_status_effect(obj.Key)
            end
             return format_value(
             return format_value(
                 obj.Key, obj.Value, obj.Type, obj.LocTokenOverride,
                 obj.Key, obj.Value, obj.Type, obj.LocTokenOverride,