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.
Thecornerman (talk | contribs) mNo edit summary |
Thecornerman (talk | contribs) (Removed unused skillList function) |
||
Line 196: | Line 196: | ||
skills[i] = name .. ' ' .. i | skills[i] = name .. ' ' .. i | ||
end | end | ||
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 executedtierSet
, whichmain
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