Site News
Warning: This wiki contains spoilers. Read at your own risk!

Social media: If you would like, please join our Discord server, and/or follow us on Twitter (X) or Tumblr!

Module:FEH skill availability: Difference between revisions

From Fire Emblem Wiki, your source on Fire Emblem information. By fans, for fans.
mNo edit summary
(Removed unused skillList function)
 
Line 196: Line 196:
skills[i] = name .. ' ' .. i
skills[i] = name .. ' ' .. i
end
end
end
end
function skillList()
local i = 1
while in_args['skill' .. i] ~= nil do -- for each skill# that exists
skills[i] = in_args['skill' .. i] -- adds skill# field to skill list
i = i + 1 -- increment
end
end
end
end


return p
return p

Latest revision as of 00:57, 1 March 2024

A function for {{FEH skill availability}}. Has two functions:

  • main, where most of the program is executed
  • tierSet, which main calls to fill out the list of skills based on a given base skill name and number of tiers

local p = {}
local cargo = mw.ext.cargo

function p.main(frame)
	in_args = frame:getParent().args	-- fields from template call
	
	skills = {}; name = ''	-- list of skill names, and base skill name
	
	local i = 0; num = 0; type = ''; row = ''; lastrar = 0
	
	local skl_hdr = ''	-- initializing sub-header for skill list in table
	
	blank = {
		[1] = false
	}
	
	-- availability table; numbered fields allows ipairs to iterate in order
	local avail = {}
	
	for i = 1, 10 do
		avail[i] = {}
	end
	
	local typelook = {
		["forge"] = 6,
		["trial"] = 7,
		["quest"] = 8,
		["squad"] = 9,
		["seal"] = 10
	}
	
	if in_args['skill'] ~= nil then	-- if a skill field is declared
		name = in_args['skill']	-- sets base name to that skill field
	else
		-- sets base name to page name
		name = tostring(mw.title.getCurrentTitle()):gsub("Attack", "Atk"):
			gsub("Speed", "Spd"):gsub("Defense", "Def"):
			gsub("Resistance", "Res"):gsub("⁄", "/")
	end
	
	if in_args['tiers'] ~= nil then	-- if tiers field is declared
		tierSet(in_args['tiers'])	-- calls function to fill skill list by tier
	else
		skills[1] = name	-- skill list is 1 item long, just base name
	end
	
	for k, v in pairs(in_args) do
		type = tostring(k):match("%a+")
		num = tonumber(tostring(k):match("%d+"))
		row = typelook[type]
		
		if type == "skill" and num ~= nil then
			skills[num] = v
		elseif row ~= nil and num ~= nil then
			blank[row] = true
			avail[row][num] = v
			
			if row > lastrar then	-- if current rarity is greater than last
				lastrar = row
			end
		end
	end
	
	local length = #skills	-- sets length variable to length of skill list
	
	local args = {	-- additional arguments for cargo query
		-- what data to include
		where = "_pageNamespace=0 AND skill IN (\"",
		orderBy = 'sort',	-- how to sort data
		limit = 500	-- maximum number of data rows to call
	}
	
	-- lookup table for skills, converting skill name to a number
	-- using numbers allows ipairs to conserve the order of the skills
	local skl_lookup = {
		[skills[1]] = 1
	}
	
	if length > 1 then	-- if more than 1 skill is listed
		-- sets skill header; unnecessary for fewer than 1 skill
		skl_hdr = '|-\n' ..
			'! ' .. skills[1] .. '\n'
	end
	
	names = skills[1]
	
	for i = 2, length do	-- loop for i between 2 and length
		-- expands "where" argument
		names = names .. '", "' .. skills[i]
		skl_lookup[skills[i]] = i	-- expands skill lookup table
		skl_hdr = skl_hdr .. '! ' .. skills[i] .. '\n'	-- expands skill header
	end
	
	args['where'] = args['where'] .. names:gsub("'", "\\'") .. '")'
	
	local hdr = '! style="border-top-left-radius: 10px" '	-- main header
	
	if skl_hdr ~= '' then	-- if skill header is not blank
		-- first cell of main header needs rowspan to accommodate skill header
		hdr = hdr .. 'rowspan="2" '
	end
	
	hdr = hdr .. '| Method\n' ..	-- pimary text of main header
		'! style="border-top-right-radius: 10px" '..
		'colspan="' .. length .. '"| Data\n'
	
	-- cargo query
	local results = cargo.query('FEH_skill_sets',
		'unit, _pageName, rarity, skill', args)
	
	for _, v in ipairs(results) do	-- iterates through cargo results
		rar = tonumber(v['rarity'])	-- rarity of unit
		skl = skl_lookup[v['skill']]	-- number corresponding to skill version
		
		if rar > lastrar then	-- if current rarity is greater than last
			lastrar = rar
		end
		blank[rar] = true
		
		-- if skill at given rarity has not appeared yet
		if avail[rar][skl] == nil then
			avail[rar][skl] = ''	-- declares as empty string
		else
			avail[rar][skl] = avail[rar][skl] .. ' • '	-- adds seperator
		end
		
		-- adds unit
		avail[rar][skl] = avail[rar][skl] ..
			'[[' .. v['_pageName'] .. '#' .. v['unit'] .. '|' .. v['unit'] .. ']]'
	end
	
	-- initializes main output variable and temporary row variable
	local output = ''; local row = ''
	
	local misc = {
		[6] = "[[Weapon Refinery|Forge]]",
		[7] = "[[Tempest Trials]]",
		[8] = "Sacred Seal quests",
		[9] = "[[Squad Assault]]",
		[10] = "[[Sacred Seal Forge]]"
	}
	
	for k, v in ipairs(avail) do	-- iterates through avail table
		last = k == lastrar	-- when last row is reached
		
		if blank[k] == true then	-- if row is not empty
			row = '|-\n'	-- starts new row
			if last then	-- if last row is reached
				-- adds corner rounding
				row = row .. '| style="border-bottom-left-radius: 10px" '
			end
			
			-- sets first cell of row
			if k > 5 then	-- non-unit rows
				row = row .. '| ' .. misc[k] .. '\n'
			else	-- unit rows
				row = row .. '| Unit (' .. ('★'):rep(k) .. ')\n'
			end
			
			for i = 1, length do	-- iterates for each skill
				-- if last row and last column is reached
				if last and i == length then
					-- add corner rounding
					row = row .. '| style="border-bottom-right-radius: 10px" '
				end
				
				row = row .. '| '
				
				if v[i] == nil then	-- if table element is empy
					row = row .. '—'	-- sets cell to em dash
				else
					row = row .. v[i]	-- sets cell to element content
				end
				
				row = row .. '\n'
			end
			
			output = output .. row	-- adds row to output
		end
	end
	
	return hdr .. skl_hdr .. output	-- final output
end

function tierSet(tiers)
	local i = 0
	
	-- if tiers is set to + or II
	if tiers == '+' or tiers == 'II' then
		-- sets skill list as base name and base name with + or II
		skills[1] = name
		skills[2] = name .. tiers:gsub('II', ' II')
	else
		for i = 1, tiers do	-- iterates for number of specified tiers
			-- sets skill list as base name and tiers 1–# set
			skills[i] = name .. ' ' .. i
		end
	end
end

return p