| Latest revision |
Your text |
| Line 1: |
Line 1: |
| local p = {} | | local p = {} |
| local heroes_data = mw.loadJsonData("Data:HeroData.json") | | local heroes_data = mw.loadJsonData("Data:HeroData.json") |
| local hero_release_module = require('Module:HeroData/release')
| |
| local lang_module = require('Module:Lang') | | local lang_module = require('Module:Lang') |
| local utilities = require('Module:Utilities')
| |
|
| |
|
| -- Cache to store results of get_heroes if called multiple times in one page render | | -- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]] |
| local heroes_cache = {}
| |
| | |
| -- Shared helper function
| |
| local function get_heroes(in_herolabs)
| |
| -- Return cached result if it exists
| |
| if heroes_cache[in_herolabs] then
| |
| return heroes_cache[in_herolabs]
| |
| end
| |
| | |
| local heroes = {}
| |
| | |
| for hero_key, hero_data in pairs(heroes_data) do
| |
| -- hero_werewolf_transformed is consolidated in Silver's page
| |
| if hero_data["Name"] ~= nil and hero_key ~= 'hero_werewolf_transformed' then
| |
| | |
| local this_hero_status = hero_release_module.get_hero_release_status(hero_key)
| |
| | |
| if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or
| |
| (in_herolabs == 'false' and this_hero_status == 'Released')) then
| |
| | |
| local is_recommended = hero_data['IsRecommended'] or false
| |
| | |
| --- Create a sort key for each hero to ensure correct alphabetical ordering.
| |
| local hero_name = lang_module.get_string(hero_key, nil, 'en')
| |
| local sort_key_to_find = hero_key .. '_sort'
| |
| local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en')
| |
| | |
| local sort_key
| |
| -- Detect translation failure if the returned string contains the original search key
| |
| if string.find(potential_sort_key, sort_key_to_find, 1, true) then
| |
| sort_key = hero_name
| |
| else
| |
| sort_key = potential_sort_key
| |
| end
| |
| | |
| -- NOTE: Check if lang_module.get_string(hero_key, 'en') returns the same value as hero_name.
| |
| -- If the second argument defaults to nil natively, you can optimize further by setting: link = hero_name
| |
| local hero_link = lang_module.get_string(hero_key, 'en')
| |
| | |
| -- Store reusable hero data
| |
| local hero = {
| |
| key = hero_key,
| |
| name = hero_name,
| |
| sort_key = sort_key,
| |
| link = hero_link,
| |
| recommended = tostring(is_recommended)
| |
| }
| |
| | |
| table.insert(heroes, hero)
| |
| end
| |
| end
| |
| end
| |
| | |
| -- Sort heroes
| |
| table.sort(heroes, function(a, b)
| |
| return a.sort_key < b.sort_key
| |
| end)
| |
| | |
| heroes_cache[in_herolabs] = heroes
| |
| return heroes
| |
| end
| |
| | |
| -- for [[Template:Deadlock_Wiki/Heroes]]
| |
| function p.get_hero_nav_cards(frame) | | function p.get_hero_nav_cards(frame) |
| local text_size = frame.args['text_size']
| | local in_herolabs = frame.args['in_herolabs'] --true or false |
| local card_size = frame.args['card_size']
| | local text_size = frame.args['text_size'] |
| local in_herolabs = frame.args['in_herolabs'] or 'false'
| | local card_size = frame.args['card_size'] |
| local debug_mode = frame.args['debug_mode'] == 'true'
| | local sticker_size = frame.args['sticker_size'] |
| | local herolabs_text_size = frame.args['herolabs_text_size'] |
| | local debug_mode = frame.args['debug_mode'] |
| | |
| | -- Turn debug_mode from string to bool, default to false |
| | if debug_mode == nil then |
| | debug_mode = false |
| | elseif debug_mode == 'true' then |
| | debug_mode = true |
| | elseif debug_mode == 'false' then |
| | debug_mode = false |
| | end |
|
| |
|
| local heroes = get_heroes(in_herolabs)
| | if in_herolabs ~= 'true' and in_herolabs ~= 'false' then |
| local parts = {}
| | return 'in_herolabs must be either true or false' |
| | | end |
| for _, hero in ipairs(heroes) do
| | |
| table.insert(parts, string.format('{{Hero card2|heroName=%s|cardSize=%s|textSize=%s|isHeroLabs=%s}}',
| | --Iterate heroes |
| hero.link, card_size, text_size, in_herolabs))
| | local heroes = {} |
| end
| | for hero_key, hero_data in pairs(heroes_data) do |
| | | if hero_data["Name"] ~= nil then |
| local ret = table.concat(parts)
| | -- if herolabs is requested, only needs to have herolabs=true |
| | | -- otherwise, needs to be not disabled, in development, nd herolabs is nil or false |
| if debug_mode then
| | this_in_herolabs = hero_data['InHeroLabs'] |
| return ret
| | if this_in_herolabs == nil then this_in_herolabs = false end |
| else
| | |
| return frame:preprocess(ret)
| | if ((in_herolabs == 'true' and this_in_herolabs) or |
| end
| | (in_herolabs == 'false' and not hero_data['IsDisabled'] and not hero_data['InDevelopment'] and not this_in_herolabs)) then |
| | |
| | local is_recommended = hero_data['IsRecommended'] |
| | if is_recommended == nil then |
| | is_recommended = false |
| | end |
| | |
| | local hero_str = '|name=' .. lang_module.get_string(hero_key, nil, 'en') .. '|link=' .. lang_module.get_string(hero_key, 'en') .. '|recommended=' .. tostring(is_recommended) |
| | |
| | table.insert(heroes, hero_str) |
| | end |
| | end |
| | end |
| | |
| | --Order list alphabetically |
| | table.sort(heroes) --O(nlogn) |
| | |
| | --Add each item to output |
| | local ret = '' |
| | for index, hero_name in ipairs(heroes) do |
| | ret = ret .. '{{Hero card2' .. hero_name |
| | ret = ret .. '|text_size=' .. text_size |
| | ret = ret .. '|herolabs=' .. in_herolabs |
| | ret = ret .. '|card_size=' .. card_size |
| | ret = ret .. '|sticker_size=' .. sticker_size |
| | ret = ret .. '|herolabs_text_size=' .. herolabs_text_size |
| | ret = ret .. '}} ' |
| | end |
| | |
| | --Remove the last space |
| | ret = string.sub(ret, 1, -(string.len(' '))-1) |
| | |
| | |
| | if debug_mode then |
| | return ret |
| | else -- evaluate wikitext if not in debug mode |
| | return frame:preprocess(ret) |
| | end |
| end | | end |
|
| |
| -- for [[Template:Roster]]
| |
| function p.get_hero_roster(frame)
| |
| local in_herolabs = frame.args['in_herolabs'] or 'false'
| |
| local debug_mode = frame.args['debug_mode'] == 'true'
| |
|
| |
| local heroes = get_heroes(in_herolabs)
| |
| local parts = {}
| |
|
| |
| for _, hero in ipairs(heroes) do
| |
| table.insert(parts, string.format('{{HeroRosterCard|name=%s|key=%s}}', hero.name, hero.key))
| |
| end
| |
|
| |
| local ret = table.concat(parts)
| |
|
| |
| if debug_mode then
| |
| return ret
| |
| else
| |
| return frame:preprocess(ret)
| |
| end
| |
| end
| |
|
| |
| -- for [[Template:Quotes Navbox]] etc.
| |
| p.get_hero_bulletpoints = function(frame)
| |
| local subpage = frame.args['1']
| |
| local in_herolabs = frame.args['in_herolabs'] or 'false'
| |
| local debug_mode = frame.args['debug_mode'] == 'true'
| |
| local no_redlinks = frame.args['no_redlinks'] == 'true'
| |
|
| |
| local heroes = get_heroes(in_herolabs)
| |
| local parts = {}
| |
|
| |
| for _, hero in ipairs(heroes) do
| |
| -- Lua optimization: clean ternary fallback for page_title assignment
| |
| local page_title = subpage and (hero.link .. '/' .. subpage) or hero.name
| |
|
| |
| -- Skip redlinks entirely when enabled
| |
| if not (no_redlinks and not utilities.page_exists(page_title)) then
| |
| local item
| |
| if subpage then
| |
| item = string.format('{{PageRef|%s|alt_link=%s}}', hero.link, page_title)
| |
| else
| |
| item = string.format('{{HeroIcon|%s}}', hero.link)
| |
| end
| |
| table.insert(parts, item)
| |
| end
| |
| end
| |
|
| |
| local ret = table.concat(parts, ' • ')
| |
|
| |
| if debug_mode then
| |
| return ret
| |
| else
| |
| return frame:preprocess(ret)
| |
| end
| |
| end
| |
|
| |
| -- for image galleries
| |
| p.get_hero_gallery = function(frame)
| |
| local file_name = frame.args['1'] or ''
| |
| local description = frame.args['2'] or ''
| |
| local in_herolabs = frame.args['in_herolabs'] or 'false'
| |
| local debug_mode = frame.args['debug_mode'] == 'true'
| |
|
| |
| local heroes = get_heroes(in_herolabs)
| |
| local parts = {}
| |
|
| |
| for _, hero in ipairs(heroes) do
| |
| table.insert(parts, string.format('File:%s%s|%s%s\n', hero.link, file_name, hero.name, description))
| |
| end
| |
|
| |
| local ret = '<gallery>\n' .. table.concat(parts) .. '</gallery>'
| |
|
| |
| if debug_mode then
| |
| return ret
| |
| else
| |
| return frame:preprocess(ret)
| |
| end
| |
| end
| |
|
| |
| -- Generate 3D model gallery
| |
| function p.get_hero_models(frame)
| |
| local in_herolabs = frame.args['in_herolabs'] or 'false'
| |
| local debug_mode = frame.args['debug_mode'] == 'true'
| |
|
| |
| local heroes = get_heroes(in_herolabs)
| |
| local parts = {}
| |
|
| |
| for _, hero in ipairs(heroes) do
| |
| table.insert(parts, string.format('{{3D Model|%s}}', hero.name))
| |
| end
| |
|
| |
| local ret = table.concat(parts)
| |
|
| |
| if debug_mode then
| |
| return ret
| |
| else
| |
| return frame:preprocess(ret)
| |
| end
| |
| end
| |
|
| |
| return p | | return p |