Module:HeroData/nav: Difference between revisionsGive feedback
Gammaton32 (talk | contribs) made hero labs default as false |
Gammaton32 (talk | contribs) Undo revision 71849 by Gammaton32 (talk) Tag: Undo |
||
| Line 25: | Line 25: | ||
debug_mode = false | debug_mode = false | ||
end | end | ||
if in_herolabs ~= 'true' and in_herolabs ~= 'false' then | |||
if in_herolabs | return 'in_herolabs must be either true or false' | ||
in_herolabs | |||
end | end | ||
Revision as of 19:40, 17 May 2026
Overview
Generates hero navigation cards
Functions
get_hero_nav_cards
For Template:Hero Navbox on Heroes, individual hero pages like Abrams, and the home page.
Examples
First with debug_mode on, to help visualize what the output's source looks like.
{{#invoke:HeroData/nav|get_hero_nav_cards
|text_size=13
|card_size=88
|in_herolabs=false
|debug_mode=true
}}
Lua error at line 99: attempt to concatenate local 'sticker_size' (a nil value).
Now with debug_mode defaulted to false (off) to see actual visual output.
{{#invoke:HeroData/nav|get_hero_nav_cards
|text_size=13
|card_size=88
|in_herolabs=false
}}
Lua error at line 99: attempt to concatenate local 'sticker_size' (a nil value).
Parameters
- text_size - Font size of the hero name
- card_size - Size of the hero card
- in_herolabs - Get hero labs heroes (there are none at the moment)
- debug_mode - (OPTIONAL) Defaults to false. With true, the output is raw wikitext source that isn't processed, allowing to see more clearly what is ran.
debug_mode is the only optional parameter. All other parameters are required. Template:Hero card2 utilizes this with some default values, see there for suggested values.
get_hero_roster
For Template:Roster on Heroes, generate a list using Template:HeroRosterCard.
get_hero_bulletpoints
For navboxes such as Template:Quotes Navbox, generate a bulletpoint list of heroes.
Add the name of a subpage to link to specific subpages. It will still display only the hero name but link to the subpage instead.
Add variable "no_redlinks=true" to hide red links (non-existent pages).
Examples
{{#invoke:HeroData/nav|get_hero_bulletpoints}}
Script error: The function "get_hero_bulletpoints" does not exist.
To link to "/Movement" subpages:
{{#invoke:HeroData/nav|get_hero_bulletpoints|Movement}}
Script error: The function "get_hero_bulletpoints" does not exist.
Hide redlinks:
{{#invoke:HeroData/nav|get_hero_bulletpoints|Movement|no_redlinks=true}}
Script error: The function "get_hero_bulletpoints" does not exist.
local p = {}
local heroes_data = mw.loadJsonData("Data:HeroData.json")
local hero_release_module = require('Module:HeroData/release')
local lang_module = require('Module:Lang')
-- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]]
function p.get_hero_nav_cards(frame)
local in_herolabs = frame.args['in_herolabs'] -- true or false
local text_size = frame.args['text_size']
local card_size = frame.args['card_size']
local sticker_size = frame.args['sticker_size']
local herolabs_text_size = frame.args['herolabs_text_size']
local debug_mode = frame.args['debug_mode']
-- Variable to use {{HeroRosterCard}} instead.
local roster = frame.args['roster']
local lang_code = lang_module.get_lang_code() -- Get the language code
-- 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
if in_herolabs ~= 'true' and in_herolabs ~= 'false' then
return 'in_herolabs must be either true or false'
end
-- Only add subpage if not English
local subpage_str = ''
if lang_code ~= 'en' then
subpage_str = '/' .. lang_code
end
-- Iterate heroes
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 this_in_herolabs == nil then this_in_herolabs = false end
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']
if is_recommended == nil then
is_recommended = false
end
-- Create a sort key for each hero to ensure correct alphabetical ordering.
-- This logic handles special cases like "The Doorman" by looking for a "_sort" version of the hero's key in the language files.
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
-- The lang_module returns the requested key (wrapped in HTML) if a translation is not found.
-- We detect this failure by checking if the returned string contains the key we originally searched for.
if string.find(potential_sort_key, sort_key_to_find, 1, true) then
-- If the key is found in the result, it means the translation failed. Fall back to the hero's display name for sorting.
sort_key = hero_name
else
-- If the key is NOT found, it means we received a valid sort key (e.g., "Doorman"). Use it.
sort_key = potential_sort_key
end
local hero_wikitext = '|name=' .. hero_name ..
'|link=' .. lang_module.get_string(hero_key, 'en') ..
'|subpage=' .. subpage_str ..
'|recommended=' .. tostring(is_recommended)
-- Store the sort key and the wikitext together in a table for sorting.
table.insert(heroes, {sort_key = sort_key, wikitext = hero_wikitext})
end
end
end
-- Sort the list of heroes alphabetically based on their assigned sort_key.
table.sort(heroes, function(a, b)
return a.sort_key < b.sort_key
end)
-- Build the final wikitext output from the now-sorted table.
local ret = ''
for index, hero_object in ipairs(heroes) do
if roster == 'true' then
ret = ret .. '{{HeroRosterCard' .. hero_object.wikitext
ret = ret .. '}} '
else
ret = ret .. '{{Hero card2' .. hero_object.wikitext
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
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
return p