Documentation for this module may be created at Module:TFTTraitData/doc
-- <pre>
local p = {}
local lib = require('Module:Feature')
local Md = require('Module:Maintenance data')
local get = require('Module:TFTTraitData/getter')
local getItem = require("Module:TFTItemData/getter")
function p.getset(frame)
local args = lib.frameArguments(frame)
args['item'] = args['item'] or args[1]
args['set'] = args['set'] or args[2]
local result = getItem['set'](args['item'], args['set'])
if result == "Current" then
return Md['main']{'TFTSet'}
else
return result
end
end
function p.getItem(frame)
local args = lib.frameArguments(frame)
args['item'] = args['item'] or args[1]
args['datatype'] = args['datatype'] or args[2]
args['output'] = args['output'] or args[3] or nil
args['set'] = p.getset{args['item'], args['set']}
if tostring(args['set']) == tostring(Md['main']{'TFTSet'}) then args['set'] = "Current" end
local result = getItem[args['datatype']](args['item'], args['set'], args['additionalparameter'] or "")
if args['output'] ~= nil and type(result) == "table" then
if(args["index"]) then
local i = tonumber(args["index"])
if(result[i]) then
return frame:preprocess(result[i])
else
return ""
end
end
if args['output'] == "csv" then
return lib.tbl_concat{result}
elseif args['output'] == "custom" then
return frame:preprocess(lib.tbl_concat{result, prepend = args['prepend'], append = args['append'], separator = args['separator'], index = args["index"]})
elseif args['output'] == "template" then
return frame:preprocess(lib.tbl_concat{result, prepend = "{{" .. (args['t_name'] or "TFT item") .. "|", append = "}}", separator = args['separator']})
end
elseif type(result) == "string" then
return frame:preprocess(result)
else
return result
end
end
function p.get(frame)
local args = lib.frameArguments(frame)
args['traitname'] = args['traitname'] or args[1]
args['set'] = tonumber(args['set']) or tonumber(args[2])
args['datatype'] = args['datatype'] or args[3]
-- Fixing Tooltip/TFT/Trait issue due to the page always capturing the {{{1}}}} value as '<trait name> (Teamfight Tactics)'
if args['traitname']:find(" %(Teamfight Tactics%)") then
args['traitname'] = args['traitname']:gsub(" %(Teamfight Tactics%)", "")
end
local result = get[args['datatype']](args['traitname'], args['set'])
if (args['datatype'] == "innate" or args['datatype'] == "synergy") and result ~= nil then
if args['datatype'] == "synergy" then
result = result .. synergy(args['traitname'], args['set'])
end
return frame:preprocess(result)
elseif result == nil then
return ""
else
return result
end
end
-- wrapper template Template:Teamfight_Tactics/Champions
function p.getTraits(frame)
local args = lib.frameArguments(frame)
local IL = require('Module:ImageLink')
local datatable = require('Module:TFTTraitData/data')
local cmd = require('Module:Maintenance data')
local traittable = {}
local result = ""
args['type'] = args['type'] or args[1]
args['set'] = tonumber(args['set']) or tonumber(args[2]) or tonumber(cmd.main{'TFTSet'})
for trait in pairs(datatable) do
if datatable[trait][args['set']] and datatable[trait][args['set']]['type'] == args['type'] then
table.insert(traittable, trait)
end
end
table.sort(traittable)
for _, trait in pairs(traittable) do
local temp = {
['trait'] = trait,
['set'] = args['set'],
['image'] = get['icon'](args[trait], args['set']),
['size'] = 46,
['text'] = '*none*',
['display'] = 'inline-block',
['border'] = 'false'
}
if get['icon'](datatable[trait][args['set']]['icon'], args['set']) ~= nil then
temp['image'] = get['icon'](datatable[trait][args['set']]['icon'], args['set'])
elseif datatable[trait][args['set']]['icon'] ~= nil then temp['image'] = datatable[trait][args['set']]['icon']
end
result = result .. tostring(IL.TFTtrait(temp))
end
return result
end
-- wrapper template Template:TFT_champion_synergy
function p.championSynergy(frame)
local args = lib.frameArguments(frame)
local TU = require('Module:TFTUnitData')
local s = ''
args['champion'] = args['champion'] or args[1]
args['set'] = tonumber(args['set']) or tonumber(args[2])
local origintable = TU.get{args['champion'], args['set'], "origin"}
local classtable = TU.get{args['champion'], args['set'], "class"}
for _, originname in pairs(origintable) do
s = s .. p.championSynergyTable{["traitname"] = originname, ["set"] = args['set'], ["champion"] = args['champion']}
end
for _, classname in pairs(classtable) do
s = s .. p.championSynergyTable{["traitname"] = classname, ["set"] = args['set'], ["champion"] = args['champion']}
end
return s
end
-- wrapper template Template:TFT_Group
function p.championSynergyTable(frame)
local args = lib.frameArguments(frame)
local datatable = require('Module:TFTTraitData/data')
local IL = require('Module:ImageLink')
local builder = require("Module:SimpleHTMLBuilder")
local TU = require('Module:TFTUnitData')
local lang = mw.language.new("en")
local table = builder.create('table')
args['traitname'] = args['traitname'] or args[1]
args['set'] = tonumber(args['set']) or tonumber(args[2])
-- TABLE START
table
:addClass('article-table')
:css('width', '50%')
:css('text-align', 'center')
:newline()
-- TABLE HEAD
table
:tag('th')
:attr('colspan', '2')
:css('text-align', 'center')
:wikitext(tostring(IL.TFTtrait{
['trait'] = args['traitname'],
['set'] = args['set'] or tonumber(args[2]),
['image'] = get['icon'](args['traitname'], args['set']) or get['icon'](args[1], tonumber(args[2])),
['border'] = 'false',
}))
:done()
-- TABLE ENTRY
local tableEntry = builder.create('tr')
local roster = TU.getGroup({
['synergy'] = args['traitname'],
['set'] = args['set'],
['count'] = 'true',
['display'] = 'inline-block',
['champion'] = args['champion']
})
if datatable[args['traitname']] and datatable[args['traitname']][args['set']]['item'] then
tableEntry
:tag('td')
:wikitext(roster)
:done()
:tag('td')
:css('width', '10%')
:wikitext(tostring(IL.TFTitem{
['item'] = datatable[args['traitname']][args['set']]['item'],
['set'] = args['set'] or tonumber(args[2]),
['image'] = getItem['icon'](get['item'](args['traitname'], tonumber(args['set'])), tostring(args['set'])) or getItem['icon'](get['item'](args[1], tonumber(args[2])), tostring(args[2])),
['size'] = 46,
['text'] = "*none*"
}))
:done()
else
tableEntry
:tag('td')
:attr('colspan', '2')
:wikitext(roster)
:done()
end
table
:node(tableEntry)
:newline()
-- TABLE END
table:allDone()
return tostring(table)
end
-- wrapper template Template:TFT_synergy_list
function p.synergyList(frame)
local args = lib.mergeArguments(frame)
local lang = mw.language.new("en")
local IL = require('Module:ImageLink')
local builder = require("Module:SimpleHTMLBuilder")
local TU = require('Module:TFTUnitData')
local list = builder.create('table')
args['set'] = tonumber(args['set']) or tonumber(args[1])
args['type'] = args['type'] or args[2]
list
:addClass('sortable article-table sticky-header')
:css('width', '100%')
:css('text-align', 'left')
:newline()
--TABLE HEADER
:tag('tr')
:tag('th')
:wikitext(args['type'])
:done()
:tag('th')
:wikitext('Effect')
:addClass('unsortable')
:done()
:tag('th')
:css('width', '146px')
:wikitext('Champions')
:done()
:tag('th')
:wikitext('Items')
:done()
:done()
:newline()
-- TABLE ENTRIES
local datatable = require('Module:TFTTraitData/data')
local traittable = {}
for traitname in pairs(datatable) do
if datatable[traitname][args['set']] ~= nil and datatable[traitname][args['set']]['type'] == args['type'] then
table.insert(traittable, traitname)
end
end
table.sort(traittable)
for _, traitname in pairs(traittable) do
local listentry = builder.create('tr')
-- Trait
listentry
:tag('td')
:attr('data-sort-value', traitname)
:wikitext(tostring(IL.TFTtrait{
['trait'] = traitname,
['set'] = args['set'] or tonumber(args[1]),
['image'] = get['icon'](traitname, args['set']) or get['icon'](traitname, tonumber(args[1])),
['border'] = 'false',
}))
:done()
-- Effect
listentry
:tag('td')
:wikitext(datatable[traitname][args['set']]['synergy'] .. synergy(traitname, args['set']))
:done()
-- Champions
local roster, count = TU.getGroup({
['synergy'] = traitname,
['set'] = args['set'],
['count'] = 'true',
['display'] = 'inline-block'
})
listentry
:tag('td')
:attr('data-sort-value', count)
:wikitext(roster)
:done()
-- Items
if datatable[traitname][args['set']]['item'] then
listentry
:tag('td')
:attr('data-sort-value', datatable[traitname][args['set']]['item'])
:wikitext(tostring(IL.TFTitem{
['item'] = datatable[traitname][args['set']]['item'],
['set'] = args['set'] or Md['main']{'TFTSet'},
['image'] = getItem['icon'](get['item'](traitname, tonumber(args['set'])), tostring(args['set'])) or getItem['icon'](get['item'](traitname, tonumber(args[1])), tostring(args[1])),
['size'] = 46,
['text'] = "*none*"
}))
:done()
else
listentry
:tag('td')
:done()
end
list
:node(listentry)
:newline()
end
-- TABLE END
list:allDone()
return frame:preprocess(tostring(list))
end
-- LOCAL FUNCTONS
function synergy(traitname, set)
local result = ''
local levels = get['levels'](traitname, set)
if levels ~= nil then
local sortedlevels = lib.getSortedKeys(levels)
local levelcount = 0;
local levelicons = {}
for level in pairs(levels) do
levelcount = levelcount + 1
end
local diamondtrait = get['diamondtrait'](traitname, set)
if levelcount == 1 then
if (traitname == "Supers" and (set == 8 or set == 8.5)) then
levelicons = {'gold'}
end
elseif levelcount >= 2 then
if levelcount == 2 then
if diamondtrait then
levelicons = {'gold', 'diamond'}
elseif (traitname == "Exalted" and set == 11) then
levelicons = {'silver', 'gold'}
else
levelicons = {'bronze', 'gold'}
end
elseif levelcount == 3 then
if ((traitname == "Cloud" or traitname == "Steel") and set == 2) or (traitname == "Abomination" and set == 5) then
levelicons = {'silver', 'gold', 'diamond'}
elseif diamondtrait then
levelicons = {'bronze', 'gold', 'diamond'}
else
levelicons = {'bronze', 'silver', 'gold'}
end
elseif (levelcount == 5 and ((traitname == "Dragon") and set == 7.5)) then
-- Dragons Set 7.5
levelicons = {'bronze', 'silver', 'silver', 'silver', 'gold'}
elseif (levelcount == 5 and ((traitname == "Slayer") and set == 9)) then
-- Slayer Set 9
levelicons = {'bronze', 'silver', 'gold', 'gold', 'diamond'}
elseif (levelcount == 5 and ((traitname == "Cavalier") and set == 7.5)) then
-- Cavalier Set 7.5
if diamondtrait then
levelicons = {'bronze', 'silver', 'silver', 'gold', 'diamond'}
else
levelicons = {'bronze', 'silver', 'silver', 'gold', 'gold'}
end
elseif levelcount == 6 then
-- Guild Set 7 and Heavenly Set 11
levelicons = {'bronze', 'bronze', 'silver', 'silver', 'gold', 'diamond'}
elseif levelcount == 8 then
-- Guild Set 7.5
levelicons = {'bronze', 'bronze', 'bronze', 'silver', 'silver', 'silver', 'gold', 'diamond'}
else
levelicons = {'bronze', 'silver', 'gold', 'diamond'}
end
result = result .. '<ul>'
local levelunique = get['levelunique'](traitname, set)
local pluraltrait = get['pluraltrait'](traitname, set)
for index, level in pairs(sortedlevels) do
local traittext = ''
local levelcontent = levels[index]
local levelindex = sortedlevels[index]
if levelunique then
traittext = 'Exactly ' .. levelindex .. ' type'
if levelindex >= 2 then
traittext = traittext .. 's'
end
traittext = traittext .. ' of ' .. traitname
else
traittext = levelindex .. ' '
if pluraltrait ~= nil then
traittext = traittext .. pluraltrait
elseif levelindex >= 2 then
traittext = traittext .. traitname .. 's'
else
traittext = traittext .. traitname
end
end
result = result .. '<li>[[File:' .. traitname .. ' TFT ' .. levelicons[index] .. ' icon.png|20px|link=]] ' .. traittext .. ': ' .. levels[levelindex] .. '</li>'
end
result = result .. '</ul>'
end
end
return result
end
return p
-- </pre>
-- [[Category:Lua]]