Module:HeroData/nav: Difference between revisions

From Deadlock Wiki
Jump to navigation Jump to search
Sur (talk | contribs)
get_hero_nav_cards initial
 
Sur (talk | contribs)
m Hero card2 now uses link param for localization
 
(9 intermediate revisions by the same user not shown)
Line 3: Line 3:
local lang_module = require('Module:Lang')
local lang_module = require('Module:Lang')


-- for [[Template:Hero Navbox]], i.e. {{Hero Card Nav|Hero=Abrams}} {{Hero Card Nav|Hero=Bebop}}
-- for [[Template:Deadlock_Wiki/Heroes]] on home page, i.e. [[Template:Hero card2]]
function p.get_hero_nav_cards(frame)
function p.get_hero_nav_cards(frame)
local current_or_upcoming = frame.args[1]
local in_herolabs = frame.args['in_herolabs'] --true or false
if current_or_upcoming ~= 'Current' and current_or_upcoming ~= 'Upcoming' then
local text_size = frame.args['text_size']
return 'First parameter must be Current or Upcoming'
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']
-- 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
end
local ret = ''
--Iterate heroes
local heroes = {}
for hero_key, hero_data in pairs(heroes_data) do
for hero_key, hero_data in pairs(heroes_data) do
local card = ''
if hero_data["Name"] ~= nil then
-- if herolabs is requested, only needs to have herolabs=true
if hero_data["Name"] ~= nil and hero_data["IsDisabled"] == false then
-- otherwise, needs to be not disabled, in development, nd herolabs is nil or false
if (hero_data["InDevelopment"] == false and current_or_upcoming == 'Current' or hero_data["InDevelopment"] == true and current_or_upcoming == 'Upcoming') then
this_in_herolabs = hero_data['InHeroLabs']
card = '{{Hero Card Nav|Hero=' .. lang_module.get_string(hero_key) .. '}}'
if this_in_herolabs == nil then this_in_herolabs = false end
if ((in_herolabs == 'true' and this_in_herolabs) or
(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
ret = ret .. card .. ' '
end
end
end
end
return ret
--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
return p
return p

Latest revision as of 15:36, 8 November 2024

Overview[edit source]

Generates hero navigation cards

Functions[edit source]

get_hero_nav_cards[edit source]

For Template:Hero Navbox on Heroes, individual hero pages like Abrams, and the home page.

Examples[edit source]

First with debug_mode on, to help visualize what the output's source looks like.

{{#invoke:HeroData/nav|get_hero_nav_cards
|in_herolabs=true
|text_size=11
|card_size=card_size|88
|sticker_size=sticker_size|30
|herolabs_text_size=herolabs_text_size|6
|debug_mode=true
}}

{{Hero card2|name=Calico|link=Calico|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}} {{Hero card2|name=Fathom|link=Fathom|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}} {{Hero card2|name=Holliday|link=Holliday|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}} {{Hero card2|name=Magician|link=Magician|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}} {{Hero card2|name=Trapper|link=Trapper|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}} {{Hero card2|name=Viper|link=Viper|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}} {{Hero card2|name=Wrecker|link=Wrecker|recommended=false|text_size=11|herolabs=true|card_size=88|sticker_size=30|herolabs_text_size=6}}


Now with debug_mode defaulted to false (off) to see actual visual output.

{{#invoke:HeroData/nav|get_hero_nav_cards
|in_herolabs=true
|text_size=11
|card_size=88
|sticker_size=30
|herolabs_text_size=6
}}

Hero Labs

Calico

Hero Labs

Fathom

Hero Labs

Holliday

Hero Labs

Magician

Hero Labs

Trapper

Hero Labs

Viper

Hero Labs

Wrecker

Parameters[edit source]

  • text_size - Font size of the hero name
  • card_size - Size of the hero card
  • sticker_size - Size of the Recommended or Hero lab stickers that appear in the top right corner
  • herolabs_text_size - Font size of the 'Hero Labs' text that appears for heroes in Hero Labs
  • 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.


local p = {}
local heroes_data = mw.loadJsonData("Data:HeroData.json")
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']
	
	-- 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
	
	--Iterate heroes
	local heroes = {}
	for hero_key, hero_data in pairs(heroes_data) do
		if hero_data["Name"] ~= nil then
			-- if herolabs is requested, only needs to have herolabs=true
			-- otherwise, needs to be not disabled, in development, nd herolabs is nil or false
			this_in_herolabs = hero_data['InHeroLabs']
			if this_in_herolabs == nil then this_in_herolabs = false end
			
			if ((in_herolabs == 'true' and this_in_herolabs) or
				(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
return p