Editing Module:ItemData/nav

Warning: You are not logged in. Once you make an edit, a temporary account will be created for you. Learn more. Log in or create an account to continue receiving notifications after this account expires, and to access other features.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
local p = {}
local p = {}
local items_data = mw.loadJsonData("Data:ItemData.json")
local items_data = mw.loadJsonData("Data:ItemData.json")
Line 7: Line 5:
local util_module = require('Module:Utilities')
local util_module = require('Module:Utilities')


-- Exceptions if the link is different from the item name
--exceptions if the link is different from the item name
local linkOverrides = {
local linkOverrides = {
     ["Bullet Lifesteal"] = "Bullet Lifesteal (item)",
     ["Bullet Lifesteal"] = "Bullet Lifesteal (item)",
Line 13: Line 11:
}
}


-- The card navboxes put every item on a single page, so their cards opt into
--With debug_mode on, it outputs unprocessed wikitext
-- the cheaper ItemBox rendering via lowGraphics. This swaps the paper texture
--With debug_mode off/unspecified, it processes the wikitext
-- from the normal-mode multiply (which blends two images and is re-rasterised
-- every scrolled frame) to a transparent-paper overlay that is a single
-- cacheable image, the one change that carried the navbox scroll cost. The wear
-- and icon masks stay at full detail, since a single-image mask caches fine.
-- See [[Template:ItemBox]]. Only the ItemBox branch of write_wrapped_item_list
-- uses this; the ItemIcon lists are unaffected.
local LOW_GRAPHICS = "|lowGraphics=true"
 
-- Cached items grouped by slot to prevent redundant full-table evaluations
local cached_slots = nil
local function get_items_by_slot(slot)
    if not cached_slots then
        cached_slots = { table = {}, Weapon = {}, Armor = {}, Tech = {} }
        for item_key, item_data in pairs(items_data) do
            local this_slot = item_data["Slot"]
            if this_slot and cached_slots[this_slot] then
                table.insert(cached_slots[this_slot], { key = item_key, data = item_data })
            end
        end
    end
    return cached_slots[slot] or {}
end
 
-- With debug_mode on, it outputs unprocessed wikitext
local function process_debug_mode(wikitext, debug_mode)
local function process_debug_mode(wikitext, debug_mode)
    if debug_mode == 'true' then
if debug_mode == 'true' then
        return wikitext
return wikitext
    elseif debug_mode == 'false' or debug_mode == nil then
elseif debug_mode == 'false' or debug_mode == nil then
        return mw.getCurrentFrame():preprocess(wikitext)
return mw.getCurrentFrame():preprocess(wikitext)
    else
else
        return "debug_mode must be 'true' or 'false'"
return "debug_mode must be 'true' or 'false'"
    end
end
end
end


-- Writes list of items of a certain slot within the min and max soul bounds
--Writes list of items of a certain slot within the min and max soul bounds
-- Each item is wrapped and separated. For example of wrapping/separator, see
-- get_item_nav_bulletpoints. 'sep' should not be combined with 'right_wrap',
-- as the trailing separator should also be removed from the string
-- filter_mode parameter: nil/"all", "exclude_street_brawl", or "street_brawl_only"
local function write_wrapped_item_list(slot, min_souls, max_souls, template, sep, filter_mode)
local function write_wrapped_item_list(slot, min_souls, max_souls, template, sep, filter_mode)
     if slot ~= 'Weapon' and slot ~= 'Armor' and slot ~= 'Tech' then
     if slot ~= 'Weapon' and slot ~= 'Armor' and slot ~= 'Tech' then
Line 59: Line 37:
     if min_souls == nil or max_souls == nil then return 'Min/Max souls must be numerical' end
     if min_souls == nil or max_souls == nil then return 'Min/Max souls must be numerical' end
      
      
    -- Normalize filter_mode to handle unset parameter
     filter_mode = filter_mode or "all"
     filter_mode = filter_mode or "all"
      
      
     -- Lifted out of the loop: Language code doesn't change per item
     -- Retrieve all items that fit the bounds and filter criteria
    local lang_code = lang_module.get_lang_code()
   
     local items = {}
     local items = {}
    local slot_items = get_items_by_slot(slot) -- Drastically reduces search pool size
     for item_key, item_data in pairs(items_data) do
   
        -- future proofing; Disabled will be renamed to IsDisabled soon
     for _, item_entry in ipairs(slot_items) do
         local this_cost = tonumber(item_data["Cost"])
         local item_key = item_entry.key
         local this_slot = item_data["Slot"]
         local item_data = item_entry.data
          
          
         local this_cost = tonumber(item_data["Cost"])
         -- Filter logic for Street Brawl items
         local is_street_brawl = item_data["StreetBrawl"] == true
         local is_street_brawl = item_data["StreetBrawl"] == true
         local should_include = true
         local should_include = true
          
          
        -- Filter logic for Street Brawl items
         if filter_mode == "street_brawl_only" and not is_street_brawl then
         if filter_mode == "street_brawl_only" and not is_street_brawl then
             should_include = false
             should_include = false
Line 82: Line 57:
         end
         end
          
          
         if should_include and item_data["Name"] ~= nil and item_data["IsDisabled"] == false and this_cost ~= nil then
         if should_include and item_data["Name"] ~= nil and item_data["IsDisabled"] == false and this_cost ~= nil and this_slot ~= nil then
             if this_cost >= min_souls and this_cost < max_souls then
             if slot == this_slot and this_cost >= min_souls and this_cost < max_souls then
                 local item_name_english = lang_module.get_string(item_key, "en")
                 local item_name_english = lang_module.get_string(item_key, "en") -- Get the English name
                 local item_link = linkOverrides[item_name_english] or item_name_english
                 local item_link = linkOverrides[item_name_english] or item_name_english -- Use override link if available
                 local item_name_local = lang_module.get_string(item_key, lang_code)
                local lang_code = lang_module.get_lang_code() -- Get the language code from the subpage
                 local item_name_local = lang_module.get_string(item_key, lang_code) -- Get the localized name
                  
                  
                -- Construct the template based on the type
                 local item_template
                 local item_template
                 if template == "ItemIcon" then
                 if template == "ItemIcon" then
                     if lang_code == "en" then
                     if lang_code == "en" then
                         item_template = "{{ItemIcon|" .. item_name_english .. "|size=26px}}"
                        -- For English pages, do not include lang or localized name
                         item_template = "{{ItemIcon|" .. item_name_english .. "}}"
                     else
                     else
                         item_template = "{{ItemIcon|" .. item_name_english .. "|lang=" .. lang_code .. "|l1=" .. item_name_local .. "|size=26px}}"
                        -- For non-English pages, include lang and localized name
                         item_template = "{{ItemIcon|" .. item_name_english .. "|lang=" .. lang_code .. "|l1=" .. item_name_local .. "}}"
                     end
                     end
                   
                    local search_data = item_name_english
                    if lang_code ~= "en" and item_name_local then
                        search_data = search_data .. " " .. item_name_local
                    end
                   
                    item_template = '<span class="item-nav-search-wrapper"><span class="item-nav-search-item" data-item-name="' .. search_data .. '">' .. item_template .. '</span>'
                 elseif template == "ItemBox" then
                 elseif template == "ItemBox" then
                     if lang_code == "en" then
                     if lang_code == "en" then
                         if is_street_brawl then
                        -- For English pages, do not include item_loc or link
                             item_template = "{{ItemBox|itemName=" .. item_name_english .. "|overrideLinkClick=" .. item_link .. "|overrideTier=5" .. LOW_GRAPHICS .. "}}"
                        -- Display cost as "Legendary" for street brawl items
                         if is_street_brawl == true then
                             item_template = "{{ItemBox|item_name=" .. item_name_english .. "|link=" .. item_link .. "|item_price=Legendary" .. "}}"
                         else
                         else
                             item_template = "{{ItemBox|itemName=" .. item_name_english .. "|overrideLinkClick=" .. item_link .. LOW_GRAPHICS .. "}}"
                             item_template = "{{ItemBox|item_name=" .. item_name_english .. "|link=" .. item_link .. "}}"
                         end
                         end
                     else
                     else
                         local link_local = item_link .. "/" .. lang_code
                        -- For non-English pages, include item_loc and link
                         if is_street_brawl then
                         local link_local = item_link .. "/" .. lang_code -- Add subpage for non-English languages
                             item_template = "{{ItemBox|itemName=" .. item_name_english .. "|overrideLinkClick=" .. link_local .. "|item_price={{#invoke:Lang|get_string|Citadel_ItemDraft_Legendary}}" .. LOW_GRAPHICS .. "}}"
                         if is_street_brawl == true then
                             item_template = "{{ItemBox|item_name=" .. item_name_english .. "|item_loc=" .. item_name_local .. "|link=" .. link_local ..
                            "|item_price={{#invoke:Lang|get_string|Citadel_ItemDraft_Legendary}}" .. "}}"
                         else
                         else
                            item_template = "{{ItemBox|itemName=" .. item_name_english .. "|overrideLinkClick=" .. link_local .. LOW_GRAPHICS .. "}}"
                        item_template = "{{ItemBox|item_name=" .. item_name_english .. "|item_loc=" .. item_name_local .. "|link=" .. link_local .. "}}"
                         end
                         end
                     end
                     end
Line 126: Line 102:
      
      
     -- Order list alphabetically
     -- Order list alphabetically
     table.sort(items)
     table.sort(items) -- O(nlogn)
      
      
     -- Append closing tags and bullets
     -- Add each item to output
     if template == "ItemIcon" then
     -- Each item is already wrapped in the template, so no need for additional wrapping
        local total_items = #items
    local ret = table.concat(items, sep)
        for i = 1, total_items do
            if i == total_items then
                items[i] = items[i] .. '</span>'
            else
                items[i] = items[i] .. '<span class="item-nav-search-sep"> &bull; </span></span>'
            end
        end
    end
      
      
     return table.concat(items, sep)
     return ret
end
end


-- for [[Template:Item Navbox]]
-- for [[Template:Item Navbox]]
-- Supports filter parameter via frame.args["filter"]
function p.get_item_nav_bulletpoints(slot, min_souls, max_souls, debug_mode, filter_mode)
function p.get_item_nav_bulletpoints(slot, min_souls, max_souls, debug_mode, filter_mode)
    -- Handle the case where it's called via #invoke (i.e., from wikitext)
     if type(slot) == "table" and slot.args then
     if type(slot) == "table" and slot.args then
         local frame = slot
         local frame = slot
Line 153: Line 123:
         filter_mode = frame.args["filter"]
         filter_mode = frame.args["filter"]
     end
     end
      
     local item_list = write_wrapped_item_list(slot, min_souls, max_souls, "ItemIcon", '', filter_mode)
     local sep = ' &bull; '
     local item_list = write_wrapped_item_list(slot, min_souls, max_souls, "ItemIcon", sep, filter_mode)
     return process_debug_mode(item_list, debug_mode)
     return process_debug_mode(item_list, debug_mode)
end
end


-- for [[Template:Infobox ShopItems]]
-- for [[Template:Infobox ShopItems]]
-- Supports filter parameter via frame.args["filter"]
function p.get_item_nav_cards(slot, min_souls, max_souls, debug_mode, filter_mode)
function p.get_item_nav_cards(slot, min_souls, max_souls, debug_mode, filter_mode)
    -- Handle the case where it's called via #invoke (i.e., from wikitext)
     if type(slot) == "table" and slot.args then
     if type(slot) == "table" and slot.args then
         local frame = slot
         local frame = slot
Line 168: Line 143:
         filter_mode = frame.args["filter"]
         filter_mode = frame.args["filter"]
     end
     end
      
     local item_list = write_wrapped_item_list(slot, min_souls, max_souls, "ItemBox", ' ', filter_mode)
     local sep = ' '
     local item_list = write_wrapped_item_list(slot, min_souls, max_souls, "ItemBox", sep, filter_mode)
     return process_debug_mode(item_list, debug_mode)
     return process_debug_mode(item_list, debug_mode)
end
end


-- for [[Template:Item Navbox]] subgroup rows
-- for [[Template:Item Navbox]] subgroup rows
-- Writes price tiers and appends Street Brawl section if items exist
function p.write_item_slot_subgroup(frame)
function p.write_item_slot_subgroup(frame)
    local slot = frame.args[1]
local slot = frame.args[1]
    local type_func = frame.args[2]
local type = frame.args[2]
    local debug_mode = frame.args['debug_mode']
local debug_mode = frame.args['debug_mode']
    local street_brawl_label = frame.args['street_brawl_label'] or '{{Legendary|{{#invoke:Lang|get_string|Citadel_ItemDraft_Legendary}}}}'
local street_brawl_label = frame.args['street_brawl_label'] or "Street Brawl"
   
    if slot == nil then return "'slot' parameter is required" end
if slot == nil then return "'slot' parameter is required" end
   
    local template_args = {
-- Define base args
        ["groupstyle"] = "background-color:" .. util_module.get_slot_color(slot) .. ";width:10%;min-width:70px;border-radius: 8px 0 0 8px",
local template_title = "Navbox subgroup"
        ["grouppadding"] = "5px",
local template_args = {
        ["listpadding"] = "0 0.25rem",
["groupstyle"] = "background-color:" .. util_module.get_slot_color(slot) .. ";width:10%;min-width:70px;border-radius: 8px 0 0 8px",
    }
["grouppadding"] = "5px",
   
["listpadding"] = "0 0.25rem",
    local soul_style = "font-size: 12px; text-shadow: 1px 1px rgba(0, 0, 0, 0.3);"
}
    local prices = generic_module.get_item_price_per_tier()
    local group_index = 1
local soul_style = "font-size: 12px; text-shadow: 1px 1px rgba(0, 0, 0, 0.3);"
   
local prices = generic_module.get_item_price_per_tier()
    for i, souls in ipairs(prices) do
local group_index = 1
        local min_souls = souls
       
for i, souls in ipairs(prices) do
        if min_souls ~= 0 then  
min_souls = souls
            local max_souls = prices[i+1] or (min_souls * 10)
           
--Skip 0 to i1 as no items cost less than 500
            local list
if min_souls ~= 0 then  
            if type_func == 'get_item_nav_cards' then
-- Determine upper bound for soul tier
                list = p.get_item_nav_cards(slot, min_souls, max_souls, debug_mode, "exclude_street_brawl")
max_souls = prices[i+1]
            elseif type_func == 'get_item_nav_bulletpoints' then
if max_souls == nil then
                list = p.get_item_nav_bulletpoints(slot, min_souls, max_souls, debug_mode, "exclude_street_brawl")
max_souls = min_souls * 10
            else
end
                return "'type' should be get_item_nav_cards or get_item_nav_bulletpoints"
            end
-- Generate list for this price tier, excluding Street Brawl items
           
local list
            if list and list ~= "" then
if type=='get_item_nav_cards' then
                template_args["group" .. group_index] = frame:expandTemplate{title="Souls", args={[1] = min_souls, ["Shadow"] = soul_style}}
list = p.get_item_nav_cards(slot, min_souls, max_souls, debug_mode, "exclude_street_brawl")
                template_args["list" .. group_index] = list
elseif type=='get_item_nav_bulletpoints' then
                group_index = group_index + 1
list = p.get_item_nav_bulletpoints(slot, min_souls, max_souls, debug_mode, "exclude_street_brawl")
            end
else
        end
return "'type' should be get_item_nav_cards or get_item_nav_bulletpoints"
    end
end
   
    local sb_list
-- Only add the group if there are items in this tier
    if type_func == 'get_item_nav_cards' then
if list and list ~= "" then
        sb_list = p.get_item_nav_cards(slot, 0, 999999, debug_mode, "street_brawl_only")
template_args["group" .. group_index] = frame:expandTemplate{title="Souls", args={[1] = min_souls, ["Shadow"] = soul_style}}
    elseif type_func == 'get_item_nav_bulletpoints' then
template_args["list" .. group_index] = list
        sb_list = p.get_item_nav_bulletpoints(slot, 0, 999999, debug_mode, "street_brawl_only")
group_index = group_index + 1
    end
end
   
end
    if sb_list and sb_list ~= "" then
end
        local sb_style = "color:#98ffde; font-family:'Retail Demo', sans-serif; text-wrap: nowrap; text-shadow: 0px 0px 2px #2c312e, 1.3px 1.3px rgba(0, 0, 0, 0.2);padding:5px;"
        local sb_link_text = "[[Street Brawl{{if_lang}}|<span style=\"" .. sb_style .. "\"><b>" .. street_brawl_label .. "</b></span>]]"
-- Add Street Brawl section at the bottom of the slot
        template_args["group" .. group_index] = frame:preprocess(sb_link_text)
local sb_min = 0
        template_args["list" .. group_index] = sb_list
local sb_max = 999999
    end
   
local sb_list
    return frame:expandTemplate{title="Navbox subgroup", args=template_args}
if type=='get_item_nav_cards' then
sb_list = p.get_item_nav_cards(slot, sb_min, sb_max, debug_mode, "street_brawl_only")
elseif type=='get_item_nav_bulletpoints' then
sb_list = p.get_item_nav_bulletpoints(slot, sb_min, sb_max, debug_mode, "street_brawl_only")
end
-- Only add Street Brawl group if there are items for this slot
if sb_list and sb_list ~= "" then
-- Style the link to match other tier headers with white text inside the link to prevent visited link color
local sb_style = "color:#98ffde; font-family:'Retail Demo', sans-serif; text-wrap: nowrap; text-shadow: 0px 0px 2px #2c312e, 1.3px 1.3px rgba(0, 0, 0, 0.2);"
local sb_link_text = "[[Street Brawl{{if_lang}}|<span style=\"" .. sb_style .. "\"><b>" .. street_brawl_label .. "</b></span>]]"
template_args["group" .. group_index] = frame:preprocess(sb_link_text)
template_args["list" .. group_index] = sb_list
end
return frame:expandTemplate{title=template_title, args=template_args}
end
end


-- for [[Template:Active Items]]
-- for [[Template:Active Items]]
-- Displayed when a stat does not apply to an item
local NO_VALUE = "—"
-- One expanded inline attribute as produced by [[Module:Lang]]:
-- wrapper span > icon span > spacer span > wikilink
local INLINE_ATTRIBUTE_PATTERN =
    '<span class="no%-blue%-link" style="text%-wrap:nowrap; font%-weight:bold; color:[^;"]*;">' ..
    '<span style="[^"]*">%[%[File:[^%]]*%]%]</span>' ..
    '<span style="color: inherit;"> </span> ' ..
    '%[%[([^|%]]+)|([^%]]*)%]%]</span>'
-- Range is taken from the first of these the item has a usable value for
local RANGE_PROPERTIES = { "AbilityCastRange", "Radius", "EndRadius" }
-- Rewrites the description markup [[Module:Lang]] produces
local function restyle_description(text)
    text = text:gsub(INLINE_ATTRIBUTE_PATTERN, '[[%1|%2]]')
    -- Attributes with an icon but no link keep their span; follow the site text color
    text = text:gsub('color:#ffefd7;', 'color:var(--color-base);')
    -- Diminished notes ("Cannot be used while Stunned...")
    return (text:gsub('color:#C0C0C0', 'color:var(--color-subtle)'))
end
-- Numeric value of a stat, used for sorting
local function stat_sort_value(value)
    if type(value) == "table" then value = value["Value"] end
    if value == nil then return -1 end
    return tonumber(tostring(value):match("[-%d%.]+")) or -1
end
-- First range property the item has a usable value for
local function get_range_property(item_data)
    for _, property in ipairs(RANGE_PROPERTIES) do
        local value = item_data[property]
        if value ~= nil and stat_sort_value(value) > 0 then
            return property, value
        end
    end
    return nil, nil
end
-- Builds a stat cell, falling back to an em dash when the stat does not apply
local function stat_cell(raw_value, item_name, property, postfix)
    if raw_value == nil or property == nil then
        return '| data-sort-value="-1" style="text-align:center;font-size:16px" | ' .. NO_VALUE
    end
    return string.format(
        '| data-sort-value="%s" style="text-align:center;font-size:16px" | {{#invoke:ItemData|get_prop|%s|%s}}%s',
        stat_sort_value(raw_value), item_name, property, postfix or "")
end
function p.generate_active_items_table(frame)
function p.generate_active_items_table(frame)
     local active_items = {}
     local active_items = {}
      
      
    -- 1. Collect active items and their cost
     for item_key, item_data in pairs(items_data) do
     for item_key, item_data in pairs(items_data) do
        -- Convert cost to a number; will be nil if the JSON value is null or missing
         local cost = tonumber(item_data["Cost"])
         local cost = tonumber(item_data["Cost"])
       
         if item_data["Name"] and  
         if item_data["Name"] and  
           item_data["IsDisabled"] == false and  
           item_data["IsDisabled"] == false and  
           cost ~= nil and cost > 0 and  
           cost ~= nil and cost > 0 and             -- FILTER: Must have a cost greater than 0
           item_data["Activation"] and  
           item_data["Activation"] and  
           item_data["Activation"] ~= "Passive" then
           item_data["Activation"] ~= "Passive" then
           
            local range_property, range_value = get_range_property(item_data)
              
              
             table.insert(active_items, {
             table.insert(active_items, {
Line 303: Line 246:
                 cost = cost,
                 cost = cost,
                 slot = item_data["Slot"] or "Weapon",
                 slot = item_data["Slot"] or "Weapon",
                 has_active_desc = item_data["ActiveDescription"] ~= nil,
                 has_active_desc = item_data["ActiveDescription"] ~= nil
                cooldown = item_data["AbilityCooldown"],
                duration = item_data["AbilityDuration"],
                range_property = range_property,
                range_value = range_value
             })
             })
         end
         end
     end
     end
      
      
    -- 2. Sort by name
     table.sort(active_items, function(a, b) return a.name < b.name end)
     table.sort(active_items, function(a, b) return a.name < b.name end)
      
      
     -- Optimized string compilation using a structural buffer table
     -- 3. Generate wiki markup
     local rows = {}
     local wikitext = [=[
    table.insert(rows, [=[{| class="wikitable mw-collapsible sortable" style="width:100%"  
{| class="wikitable sortable" style="width:100%"
|+{{#invoke:Dictionary|translate|Active Items}}
|+{{#invoke:Dictionary|translate|Active Items}}
! colspan="2" | {{#invoke:Lang|get_string|Citadel_HeroBuilds_CategoryNameLabel}}
! colspan="2" | {{#invoke:Lang|get_string|Citadel_HeroBuilds_CategoryNameLabel}}
Line 323: Line 263:
! {{#invoke:Lang|get_string|Citadel_Mod_Tooltip_Active}}
! {{#invoke:Lang|get_string|Citadel_Mod_Tooltip_Active}}
! {{#invoke:Lang|get_string|AbilityCooldown_label}}
! {{#invoke:Lang|get_string|AbilityCooldown_label}}
! {{#invoke:Lang|get_string|AbilityDuration_label}}
]=]
! {{#invoke:Lang|get_string|AbilityCastRange_label}}]=])
      
      
    -- 4. Add rows for each item
     for _, item in ipairs(active_items) do
     for _, item in ipairs(active_items) do
         local bg_color = util_module.get_slot_color(item.slot)
         -- Determine background color and item type
 
        local bg_color, item_type
local item_type
        if item.slot == "Armor" then
if item.slot == "Armor" then
            bg_color = "#86C921"
    item_type = "Armor"
            item_type = "Armor"
elseif item.slot == "Tech" then
        elseif item.slot == "Tech" then
    item_type = "Tech"
            bg_color = "#DE9CFF"
else
            item_type = "Tech"
    item_type = "Weapon"
        else
end
            bg_color = "#FCAC4D"
            item_type = "Weapon"
        end
          
          
         local row = string.format([=[
         -- The cost cell uses 'data-sort-value' to provide a clean number for the client-side sorter,
        -- while the cell's visible content is formatted by the {{Souls}} template.
        wikitext = wikitext .. "\n" .. string.format([=[
|-
|-
! style="background-color:%s" | [[File:%s.png|64x64px]]
! style="background-color:%s" | [[File:%s.png|64x64px]]
Line 345: Line 289:
| data-sort-value="%d" style="text-align:center;font-size:15px" | {{Souls|%d}}
| data-sort-value="%d" style="text-align:center;font-size:15px" | {{Souls|%d}}
| {{#invoke:Utilities|process_variables|%s_active_desc|%s}}{{#invoke:Utilities|process_variables|%s_desc|%s}}{{#invoke:Utilities|process_variables|%s_active|%s}}
| {{#invoke:Utilities|process_variables|%s_active_desc|%s}}{{#invoke:Utilities|process_variables|%s_desc|%s}}{{#invoke:Utilities|process_variables|%s_active|%s}}
%s
| style="text-align:center;font-size:16px" | {{#invoke:ItemData|get_prop|%s|AbilityCooldown}}s
%s
]=],
%s]=],
             bg_color,  
             bg_color,  
             item.name,  
             item.name,  
Line 354: Line 297:
             item.cost, item.cost,
             item.cost, item.cost,
             item.key, item.name, item.key, item.name, item.key, item.name,
             item.key, item.name, item.key, item.name, item.key, item.name,
             stat_cell(item.cooldown, item.name, "AbilityCooldown", "s"),
             item.name)
            stat_cell(item.duration, item.name, "AbilityDuration", "s"),
            stat_cell(item.range_value, item.name, item.range_property))
           
        table.insert(rows, row)
     end
     end
      
      
     table.insert(rows, "\n|}")
     wikitext = wikitext .. "\n|}"
     return restyle_description(frame:preprocess(table.concat(rows, "\n")))
   
     return frame:preprocess(wikitext)
end
end


return p
return p
Please note that all contributions to The Deadlock Wiki are considered to be released under the Creative Commons Attribution-NonCommercial-ShareAlike (see Deadlock:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template