Fire Emblem Heroes Wiki
Register
Advertisement
Template-info Documentation

Used on each hero's page to specify and show which passives they learn, and when.

local cargo = mw.ext.cargo
local Util = require 'Module:Util'
local List = require 'Module:ListUtil'
local Hash = require 'Module:HashUtil'
local escq = require 'Module:EscQ'.main1
local getColorText = require('Module:Color')._getText

local collectArgs = function (cat, args)
	local entries = {}
	for level = 1, math.huge do
		local namekey = ('passive%s%d'):format(cat, level)
		local name = args[namekey]
		local unlock = args[namekey .. 'Unlock']
		if not Util.isNilOrEmpty(name) then
			entries[#entries + 1] = {name = name, unlock = unlock}
		elseif Util.isNilOrEmpty(unlock) then
			break
		end
	end
	return entries
end

local CATEGORIES = {'A', 'B', 'C', 'X'}

local passivesList = function (args, frame)
	local cat_entries = Hash.generate(CATEGORIES, function (cat) return collectArgs(cat, args) end)
	local all_entries = List.reduce(Hash.values(cat_entries), List.concat_self, {})
	if #all_entries == 0 then
		return '<div>This unit owns no Passive skills.</div>'
	end

	local skillQuery = Hash.from_ipairs(cargo.query('Skills', '_pageName=page,Name=name,Description=desc,SP=cost,Icon=icon', {
		where = ("Name IN (%s) AND Scategory in (%s)"):format(
			table.concat(List.map(all_entries, function (v) return ("'%s'"):format(escq(v.name)) end), ','),
			table.concat(List.map(CATEGORIES, function (v) return "'passive" .. v:lower() .. "'" end), ',')),
		groupBy = 'Name',
		limit = 100,
	}), function (v) return v.name, v end)

	local RARITY_TXT = Util.getRarityTexts()

	local tbl = mw.html.create('table'):addClass('wikitable'):addClass('default'):addClass('skills-table'):css('text-align', 'center')

	local bg = getColorText('th-color1') -- for FandomMobile
	tbl:tag('th'):cssText(bg .. ';width:30px'):wikitext('Type')
	tbl:tag('th'):cssText(bg .. ';width:40px')
	tbl:tag('th'):cssText(bg .. ';width:120px'):wikitext('Name')
	tbl:tag('th'):cssText(bg):wikitext('Description')
	tbl:tag('th'):cssText(bg .. ';width:50px'):wikitext('SP')
	tbl:tag('th'):cssText(bg .. ';width:50px'):wikitext(frame:expandTemplate {title = 'Hover', args = {'Unlock',
		'Skills are listed at the lowest rarity they can be learned at, regardless of whether or not the Hero can be obtained at that rarity.'}})

	for cat, entries in Hash.sorted_pairs(cat_entries) do
		for level, v in ipairs(entries) do
			local skill = skillQuery[v.name]
			local tr = tbl:tag('tr')
			if level == 1 then
				tr:tag('th'):attr('scope', 'rowgroup'):attr('rowspan', #entries):wikitext(cat)
			end
			tr:tag('td'):wikitext(('[[File:%s|alt=|x30px]]'):format(skill and skill.icon or 'Icon_skill_release.png'))
			tr:tag('td'):wikitext(skill and ('[[%s|%s]]'):format(skill.page, v.name) or ('[[%s]]'):format(v.name))
			tr:tag('td'):wikitext(skill and '<div style="text-align:left">' .. skill.desc .. '</div>' or '?')
			tr:tag('td'):wikitext(skill and (skill.cost == '0' and '—' or skill.cost) or '?')
			tr:tag('td'):wikitext(RARITY_TXT[tonumber(v.unlock)] or '?')
		end
	end

	return tostring(tbl)
end

return require 'Module:MakeMWModule'.makeMWModule {passivesList = passivesList}
Advertisement