League of Legends Wiki
League of Legends Wiki

Данная группа модулей используются для хранения, обработки и выдачи информации о предметах Teamfight Tactics.

Список модулей[]

From Модуль:TFTItemData/doc

-- Содержит функции, необходимые для вызова информации о предметах TFT
-- <pre>
local p            = {}
local lib          = require("Модуль:Feature")
local uError       = require("Dev:User error")
local IL           = require("Модуль:ImageLink")
local maintenance  = require("Модуль:Maintenance data")
local ERROR_CATEGORY = "TFTItemData errors"

-- Собирает 4 массива предметов:
-- 1. Общий список улучшений
-- 2. Список первых 9 улучшений указанного предмета
-- 3. Список из рецептов этих 9 улучшений
-- 4. Список оставшихся улучшений указанного предмета
-- Результат передается в grid-генераторы для выдачи в инфобоксе или подсказке
local function collectItemBuilds(item, set)
	local callStatus, builds = pcall(p.get, {item, set, "builds"})
	if(not(callStatus) or builds == "") then
		return error("", 0)
	end
	builds = lib.cloneTable(builds)
	-- Для Grid будут использованы только первые 9 предметов из списка улучшений
	-- Если у предмета есть ещё улучшения (например, сумрачные из 5 набора), то
	-- они будут перечислены списком под сеткой
	local mainBuilds = {}
	local recipeList = {}
	local auxBuilds = {}
	
	for i in ipairs(builds) do
		if(#mainBuilds < 9) then
			table.insert(mainBuilds, builds[i])
			local callStatus, recipe = pcall(p.get, {builds[i], set, "recipe"})
			if(not(callStatus)) then 
				return error("NoRecipe", 0)
			end
			table.insert(recipeList, recipe)
		else
			table.insert(auxBuilds, builds[i])
		end
	end
	return builds, mainBuilds, recipeList, auxBuilds
end

--[[
  Обертка для вызова геттера полей предмета, указанных в Модуль:TFTItemData/data
  Принимает в виде таблицы на вход: название предмета, номер набора и название поля.
]]
function p.get(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    local get = require ("Module:TFTItemData/getter")
    local itemName = args["item"] or args[1]
    local set = tonumber(args["set"]) or tonumber(args[2]) or nil
    local datatype = args["datatype"] or args[3]
    local output = args["output"] or args[4]
    local returnSet = (args["returnSet"] or args[5] or "true") == "true" -- В вызове из шаблона всегда указан false
    
    local result, set = get[datatype](itemName, set)
    if(result == nil) then
        return ""
    elseif(output ~= nil and type(result) == "table") then
        if(args["index"]) then
            local i = tonumber(args["index"])
            if(result[i]) then 
                return result[i], set
            else
                return "", set
            end
        end
        if(output == "csv") then
            return lib.tbl_concat{result}
        elseif(output == "custom") then 
            return frame:preprocess(lib.tbl_concat({
            	result, 
            	prepend = args["prepend"], 
            	append = args["append"], 
            	separator = args["separator"], 
            	index = args["index"]
            }))
        elseif(output == "template") then 
            return frame:preprocess(lib.tbl_concat{
            	result, 
            	prepend = mw.ustring.format("{{%s|", args["t_name"] or "TFTi"),
            	append = "}}",
            	separator = args["separator"]
            })
        else
        	return result, set
        end
    elseif(datatype == "passive" or datatype == "consume") then
        return frame:preprocess(result)
    else
    	if(returnSet) then 
    		return result, set 
    	else 
    		return result
    	end
    end
end

function p.tftItemIcon(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    	
    args["item"] = args["item"] or args[1]
    args["set"] = tonumber(args['set']) or tonumber(args[2]) or nil
    
    local data, set = p.get{args["item"], args["set"], "itemset"}
	args["data"] = data
	if(args["set"] == nil) then args["set"] = set end
	if(args["link"] == nil and data.link ~= nil) then args["link"] = data.link end
	if(args["image"] == nil and data.icon ~= nil) then args["image"] = data.icon end
	
    return tostring(IL.itemTFT(args))
end

function p.getLastSet(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    local item = args["item"] or args[1]
    local result, set = p.get{
    	["item"] = item,
    	["datatype"] = "itemset",
    }
    return set
end

function p.createNavboxRosterByType(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local set = tonumber(args["set"] or args[1])
	local itemType = args["type"] or args[2]
	local size = args["size"] or "48px"
	
	local callStatus, itemData = pcall(p.get, {nil, set, "fullset"})
	if(not(callStatus) or itemData == nil) then
		return uError("Ошибка при загрузке Модуль:TFTItemData/data/" .. tostring(set))
	end
	
	local rosterList = {}
	for k, v in lib.pairsByAlphabeticalKeys(itemData) do
		if(v["type"] == itemType) then
			table.insert(rosterList, p.tftItemIcon{
				["item"] = k,
				["set"] = set,
				["size"] = size,
				["separator"] = "<br />"
			})
		end
	end
	return table.concat(rosterList)
end

-- Создает таблицу улучшений базового предмета в grid разметке
function p.generateBuildsGrid(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
	
	local item = args["item"] or args[1]
	local set = tonumber(args["set"] or args[2])
	local variant = args["variant"] or "infobox"
	
	local callResult, builds, mainBuilds, recipeList, auxBuilds = pcall(collectItemBuilds, item, set)
	-- Обработка ошибок
	if(not(callResult)) then
		if(builds == "") then
			return ""
		elseif(builds == "NoRecipe") then
			return "Модуль:TFTItemData/data/" .. tostring(set) .. " не завершен"
		else 
			return uError(builds, ERROR_CATEGORY)
		end
	end
	
	local gridNode = mw.html.create("div")
	local gridElementClass
	local minorIconSize
	local majorIconSize
	if(variant == "infobox") then
		gridElementClass = "tft-item-builds__grid__element"
		minorIconSize = "36px"
		majorIconSize = "64px"
		gridNode
			:addClass("tft-item-builds__grid")
			:done()
	elseif(variant == "tooltip") then
		minorIconSize = "24px"
		majorIconSize = "48px"
		gridElementClass = "tft-tooltip_item__grid__element"
		gridNode
			:addClass("tft-tooltip_item__grid")
			:done()
	end
	
	for i, v in ipairs(mainBuilds) do
		local recipe = recipeList[i]
		local secondComponent
		if(recipe[1] == item) then
			secondComponent = recipe[2]
		else
			secondComponent = recipe[1]
		end
		
		local gridItem = mw.html.create("div")
		gridItem
			:addClass(gridElementClass)
			:tag("div")
				:wikitext(tostring(p.tftItemIcon{
					["item"] = secondComponent,
					["set"] = set,
					["text"] = "*none*",
					["size"] = minorIconSize
				}))
				:done()
				:newline()
			:tag("div")
				:wikitext(tostring(p.tftItemIcon{
					["item"] = mainBuilds[i],
					["size"] = majorIconSize,
					["set"] = set,
					["text"] = "*none*",
				}))
				:done()
			:done()
		gridNode:node(gridItem):newline()
	end
		
	local auxItemsNode
	if(#mainBuilds < #builds) then
		auxItemsNode = mw.html.create("div")
		auxItemsNode
			:tag("span")
				:addClass("tft-item-builds__aux-items__header")
				:wikitext("Прочие предметы")
				:newline()
				:done()
			
		local auxText = {}
		for i in ipairs(auxBuilds) do
			table.insert(auxText, p.tftItemIcon{auxBuilds[i], set})
		end
		auxItemsNode
			:addClass("tft-item-builds__aux-items")
			:wikitext(table.concat(auxText, "<br />"))
			:done()
	end
	return tostring(gridNode) .. tostring(auxItemsNode or "")
end

-- Итератор для прохода списка базовых предметов в порядке:
-- Меч-Лук-Жезл-Слеза-Пояс-Кольчуга-Плащ-Перчатки-Лопатка
local function _basicItemsIterator(t, shadow)
	local ITEM_ORDER = {
		["start"] = "Самый Лучший Меч",
		["Самый Лучший Меч"] = "Изогнутый лук",
		["Изогнутый лук"] = "Слишком Большой Жезл",
		["Слишком Большой Жезл"] = "Слеза богини",
		["Слеза богини"] = "Пояс великана",
		["Пояс великана"] = "Кольчуга",
		["Кольчуга"] = "Поглощающий плащ",
		["Поглощающий плащ"] = "Тренировочные перчатки",
		["Тренировочные перчатки"] = "Лопатка",
		
		["shadowStart"] = "Сумрачный меч",
		["Сумрачный меч"] = "Сумрачный лук",
		["Сумрачный лук"] = "Сумрачный жезл",
		["Сумрачный жезл"] = "Сумрачная слеза",
		["Сумрачная слеза"] = "Сумрачный пояс",
		["Сумрачный пояс"] = "Сумрачная кольчуга",
		["Сумрачная кольчуга"] = "Сумрачный плащ",
		["Сумрачный плащ"] = "Сумрачные перчатки",
		["Сумрачные перчатки"] = "Сумрачная лопатка",
	}
	local current = "start"
	if(shadow == true) then
		current = "shadowStart"
	end
	return function()
			if((current == "Лопатка") or (current == "Сумрачная лопатка")) then 
				return 
			end
			current = ITEM_ORDER[current]
			return current, t[current]
		end
end

-- Проходит по таблице улучшений в порядке: 
-- Меч-Лук-Жезл-Слеза-Пояс-Кольчуга-Плащ-Перчатки-Лопатка
local function _basicItemsBuildsIterator(t)
	local BASIC_ORDER = {
		["start"] = "bfs",
		["bfs"]   = "bow",
		["bow"]   = "nlr",
		["nlr"]   = "tear",
		["tear"]  = "belt",
		["belt"]  = "chain",
		["chain"] = "nc",
		["nc"]    = "sg",
		["sg"]    = "spatula"
	}
	local current = "start"
	return function() 
			if(current == "spatula") then return end
			current = BASIC_ORDER[current]
			return current, t[current]
		end
		
end

return p
-- </pre>
-- [[Category:Lua]]