League of Legends Wiki

Want to contribute to this wiki?
Sign up for an account, and get started!
You can even turn off ads in your preferences.

Come join the LoL Wiki community Discord server!

READ MORE

League of Legends Wiki
Advertisement

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]]
Advertisement