Этот модуль зависит от:
|
Данная группа модулей используются для хранения, обработки и выдачи информации о предметах Teamfight Tactics.
Список модулей[]
- Модуль:TFTItemData — основные функции
- Модуль:TFTItemData/getter — геттер данных.
- Модуль:TFTItemData/data — хранилище (устарело)
- Модуль:TFTItemData/data/1 — хранилище указанного набора
-- Содержит функции, необходимые для вызова информации о предметах 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]]