Module:HeroData/nav: Difference between revisionsGive feedback
Fixed the comments |
Gammaton32 (talk | contribs) 3D model function |
||
| (22 intermediate revisions by 5 users not shown) | |||
| Line 3: | Line 3: | ||
local hero_release_module = require('Module:HeroData/release') | 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 | ||
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] | |||
-- | |||
if | |||
end | end | ||
local heroes = {} | local heroes = {} | ||
for hero_key, hero_data in pairs(heroes_data) do | for hero_key, hero_data in pairs(heroes_data) do | ||
if hero_data["Name"] ~= nil then | -- 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) | local this_hero_status = hero_release_module.get_hero_release_status(hero_key) | ||
if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or | if ((in_herolabs == 'true' and this_hero_status == 'HeroLabs') or | ||
(in_herolabs == 'false' and this_hero_status == 'Released')) then | (in_herolabs == 'false' and this_hero_status == 'Released')) then | ||
local is_recommended = hero_data['IsRecommended'] | local is_recommended = hero_data['IsRecommended'] or false | ||
--- Create a sort key for each hero to ensure correct alphabetical ordering. | |||
-- Create a sort key for each hero to ensure correct alphabetical ordering | |||
local hero_name = lang_module.get_string(hero_key, nil, 'en') | local hero_name = lang_module.get_string(hero_key, nil, 'en') | ||
local sort_key_to_find = hero_key .. '_sort' | local sort_key_to_find = hero_key .. '_sort' | ||
local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en') | local potential_sort_key = lang_module.get_string(sort_key_to_find, nil, 'en') | ||
local sort_key | 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 | if string.find(potential_sort_key, sort_key_to_find, 1, true) then | ||
sort_key = hero_name | sort_key = hero_name | ||
else | else | ||
sort_key = potential_sort_key | sort_key = potential_sort_key | ||
end | 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 = { | |||
table.insert(heroes, | key = hero_key, | ||
name = hero_name, | |||
sort_key = sort_key, | |||
link = hero_link, | |||
recommended = tostring(is_recommended) | |||
} | |||
table.insert(heroes, hero) | |||
end | end | ||
end | end | ||
end | end | ||
-- Sort | -- Sort heroes | ||
table.sort(heroes, function(a, b) | table.sort(heroes, function(a, b) | ||
return a.sort_key < b.sort_key | return a.sort_key < b.sort_key | ||
end) | end) | ||
heroes_cache[in_herolabs] = heroes | |||
return heroes | |||
end | |||
-- for [[Template:Deadlock_Wiki/Heroes]] | |||
function p.get_hero_nav_cards(frame) | |||
local text_size = frame.args['text_size'] | |||
local card_size = frame.args['card_size'] | |||
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('{{Hero card2|heroName=%s|cardSize=%s|textSize=%s|isHeroLabs=%s}}', | |||
hero.link, card_size, text_size, in_herolabs)) | |||
end | |||
local ret = table.concat(parts) | |||
if debug_mode then | |||
return ret | |||
else | |||
return frame:preprocess(ret) | |||
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>' | |||
local ret = ' | |||
if debug_mode then | |||
return ret | |||
else | |||
return frame:preprocess(ret) | |||
ret | |||
ret | |||
end | 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 | if debug_mode then | ||
return ret | return ret | ||
else | else | ||
return frame:preprocess(ret) | return frame:preprocess(ret) | ||
end | end | ||