Модуль:UnitData: различия между версиями

Нет описания правки
Нет описания правки
 
(не показано 30 промежуточных версий этого же участника)
Строка 57: Строка 57:
local item_data  = require ('Module:ItemData/data')
local item_data  = require ('Module:ItemData/data')
local unit        = args['unit'] or args[1]
local unit        = args['unit'] or args[1]
local source      = "source"
local str        = ""
local str        = mw.ustring.format('<h2>Способ получения</h2>')
local i          = 0
local i          = 0
local result      = get[source](unit)
local result      = get["source"](unit)
local data        = recipe_data[unit]
local data        = recipe_data[unit]
if (result ~= "Добыча") then
str = str .. mw.ustring.format('<h2>Способ получения</h2>')
end
if (result == "Крафт") then
if (result == "Крафт") then
Строка 69: Строка 72:
for k, v in ipairs(data) do
for k, v in ipairs(data) do
i = i + 1
i = i + 1
str = str .. mw.ustring.format('{{RecipeImage|%s|%d}}', unit, k)
if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
else
str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
end
end
end
end
end
Строка 107: Строка 114:
for k, v in ipairs(data) do
for k, v in ipairs(data) do
i = i + 1
i = i + 1
str = str .. mw.ustring.format('{{RecipeImage|%s|%d}}', unit, k)
if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
else
str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
end
end
end
end
end
Строка 117: Строка 128:
for k, v in ipairs(loot_data) do
for k, v in ipairs(loot_data) do
for k1, v1 in ipairs(v) do
for k1, v1 in ipairs(v) do
if (v[k1][1] == item) then
if (v[k1][1] == unit) then
for k2, v2 in pairs(item_data) do
for k2, v2 in pairs(item_data) do
for k3, v3 in pairs(item_data[k2]["loot"]) do
for k3, v3 in pairs(item_data[k2]["loot"]) do
Строка 130: Строка 141:
str = str .. mw.ustring.format('</div>')
str = str .. mw.ustring.format('</div>')
elseif (result == "Крафт/Босс") then
elseif (result == "Крафт/Босс") then
str = str .. mw.ustring.format('<div class="recipes">')
str = str .. mw.ustring.format('<div class="recipes"><div class="owl-carousel owl-theme recipes-carousel">')
for k, v in ipairs(data) do
if data ~= nil then
str = str .. mw.ustring.format('{{rp|%s|%d}}', unit, k)
for k, v in ipairs(data) do
i = i + 1
if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
else
str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
end
end
end
end
str = str .. mw.ustring.format('</div>')
if i == 0 then
str = str .. "Нет данных"
end
str = str .. mw.ustring.format('</div></div>')
str = str .. mw.ustring.format('<div class="bosses" style="width:fit-content; width: -moz-fit-content">')
str = str .. mw.ustring.format('<div class="bosses" style="width:fit-content; width: -moz-fit-content">')
for k, v in pairs(boss_data) do
for k, v in pairs(boss_data) do
for k2, v2 in pairs(boss_data[k]["loot"]) do
for k2, v2 in pairs(boss_data[k]["loot"]) do
if (v2[1] == item) then
if (v2[1] == unit) then
str = str .. mw.ustring.format('[[Файл:%s|100px|ссылка=%s/босс]]', boss_data[k]["icon"], k)
str = str .. mw.ustring.format('[[Файл:%s|100px|ссылка=%s/босс]]', boss_data[k]["icon"], k)
end
end
Строка 170: Строка 191:
str = str .. mw.ustring.format('</div>')
str = str .. mw.ustring.format('</div>')
elseif (result == "Магазин") then
elseif (result == "Магазин") then
str = str .. mw.ustring.format('<div class="shop" style="width:fit-content; width: -moz-fit-content">')
str = str .. mw.ustring.format('[[Файл:icon_shop.png|x100px|ссылка=Магазин]]', "Магазин")
str = str .. mw.ustring.format('</div>')
elseif (result == "Магазин/Крафт") then
str = str .. mw.ustring.format('<div class="recipes"><div class="owl-carousel owl-theme recipes-carousel">')
if data ~= nil then
for k, v in ipairs(data) do
i = i + 1
if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
else
str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
end
end
end
if i == 0 then
str = str .. "Нет данных"
end
str = str .. mw.ustring.format('</div></div>')
str = str .. mw.ustring.format('<div class="shop" style="width:fit-content; width: -moz-fit-content">')
str = str .. mw.ustring.format('<div class="shop" style="width:fit-content; width: -moz-fit-content">')
str = str .. mw.ustring.format('[[Файл:icon_shop.png|x100px|ссылка=Магазин]]', "Магазин")
str = str .. mw.ustring.format('[[Файл:icon_shop.png|x100px|ссылка=Магазин]]', "Магазин")
Строка 176: Строка 216:


return frame:preprocess(tostring(str))
return frame:preprocess(tostring(str))
end
function p.getAllianceIcon(frame)
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
local icons_data = require ('Module:IconData/alliances')
local alliance  = args['alliance'] or args[1]
local size      = args['size'] or args[2]
local icon      = ""
local str        = ""
if icons_data[alliance] ~= nil then
icon = icons_data[alliance]
else
return "-"
end
str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance)
return frame:preprocess(tostring(str))
end
function p.getUnitCategories(frame)
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
local unit_data      = require ('Module:UnitData/data')
local categories_data = require ('Module:HeroData/categories')
local unit            = args['unit'] or args[1]
local categories      = {}
local str            = ""
if unit_data[unit]["categories"] ~= nil then
    for _, v in ipairs(unit_data[unit]["categories"]) do
str = str .. mw.ustring.format('[[Категория:%s]]\n', categories_data[v])
end
end
return frame:preprocess(tostring(str))
end
function p.getUnitCategoriesTable(frame)
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
local unit_data      = require ('Module:UnitData/data')
local categories_data = require ('Module:HeroData/categories')
local races          = require ('Module:HeroData/races')
local classes        = require ('Module:HeroData/classes')
local alliances      = require ('Module:HeroData/alliances')
local category        = args['category'] or args[1]
local units          = {}
local race            = ""
local class          = ""
local alliance        = ""
    local tableNode      = mw.html.create('table')
   
    for k, v in lib.pairsByAlphabeticalKeys(unit_data) do
    if unit_data[k]['categories'] ~= nil then
    for k1, v1 in ipairs(unit_data[k]['categories']) do
    if category == categories_data[unit_data[k]['categories'][k1]] then
    table.insert(units, k)
    end
    end
    end
    end
   
    tableNode
        :addClass('custom-table active-hover sortable')
        :cssText('width: 100%; text-align: center; display: table;')
        :newline()
   
    tableNode
        :tag('tr')
            :css('white-space', 'nowrap')
            :tag('th')
                :wikitext('Имя')
                :done()
            :tag('th')
            :attr('class', 'unsortable')
                :css('width', '60px')
                :wikitext('Иконка')
                :done()
            :tag('th')
                :css('width', '80px')
                :wikitext('Раса')
                :done()
            :tag('th')
                :css('width', '80px')
                :wikitext('Класс')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('Альянс')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('HP')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('DEF')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('ATK')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('WIS')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('AGI')
                :done()
            :done()
   
    for k1, v1 in lib.pairsByAlphabeticalKeys(units) do
    if unit_data[v1]['race'] ~= nil then
    race = races[unit_data[v1]['race']]
    else
    race = "-"
    end
   
    if unit_data[v1]['class'] ~= nil then
    class = classes[unit_data[v1]['class']]
    else
    class = "-"
    end
   
    if unit_data[v1]['alliance'] ~= nil then
    alliance = alliances[unit_data[v1]['alliance']]
    else
    alliance = "-"
    end
   
        local rowNode = mw.html.create('tr')
        rowNode
            :tag('td')
                :attr('data-sort-value', v1)
                :wikitext(mw.ustring.format('[[%s]]', unit_data[v1]['name']))
                :done()
            :tag('td')
                :wikitext(mw.ustring.format('%s', p.getUnitIcon(unit_data[v1]['name'], "35px")))
                :done()
            :tag('td')
                :attr('data-sort-value', race)
                :wikitext(mw.ustring.format('%s', lib.ternary(type(unit_data[v1]['race']) ~= "nil",
                mw.ustring.format('[[:Категория:%s (раса)|%s]]', race, race),
                "-")))
                :done()
            :tag('td')
                :attr('data-sort-value', class)
                :wikitext(mw.ustring.format('%s', lib.ternary(unit_data[v1]['class'] ~= nil,
                mw.ustring.format('[[:Категория:%s (класс)|%s]]', class, class),
                "-")))
                :done()
            :tag('td')
                :attr('data-sort-value', alliance)
                :wikitext(mw.ustring.format('%s',  lib.ternary(unit_data[v1]['alliance'] ~= nil, AllianceIcon(alliance, "45px"), "-")))
                :done()
            :tag('td')
                :wikitext(mw.ustring.format('%s', lib.ternary(unit_data[v1]['stats']['hp_base'] == nil, "N/A", unit_data[v1]['stats']['hp_base'])))
                :done()
            :tag('td')
                :wikitext(mw.ustring.format('%s', lib.ternary(unit_data[v1]['stats']['def_base'] == nil, "N/A", unit_data[v1]['stats']['def_base'])))
                :done()
            :tag('td')
                :wikitext(string.format('%s', lib.ternary(unit_data[v1]['type'] == nil, "N/A", lib.ternary(unit_data[v1]['type'] == 1 or unit_data[v1]['type'] == 4, setUnitMainStat(unit_data[v1]['stats']['atk_base']), unit_data[v1]['stats']['atk_base']))))
                :done()
            :tag('td')
                :wikitext(string.format('%s', lib.ternary(unit_data[v1]['type'] == nil, "N/A", lib.ternary(unit_data[v1]['type'] == 2 or unit_data[v1]['type'] == 4 or unit_data[v1]['type'] == 5, setUnitMainStat(unit_data[v1]['stats']['wis_base']), unit_data[v1]['stats']['wis_base']))))
                :done()
            :tag('td')
                :wikitext(string.format('%s', lib.ternary(unit_data[v1]['type'] == nil, "N/A", lib.ternary(unit_data[v1]['type'] == 3 or unit_data[v1]['type'] == 5, setUnitMainStat(unit_data[v1]['stats']['agi_base']), unit_data[v1]['stats']['agi_base']))))
                :done()
        :done()
        tableNode:node(rowNode):newline()
    end
   
    return frame:preprocess(tostring(tableNode))
end
function setUnitMainStat(str)
    local spanNode = mw.html.create('span')
   
    if str == nil then
    str = "N/A"
    end
   
    spanNode
        :addClass('rarity-glpar')
        :wikitext(mw.ustring.format('%s', str))
    :done()
    return tostring(spanNode)
end
function p.getUnitIcon(unit, size, count, tooltip, link)
local unit_data    = require ('Module:UnitData/data')
local rarity_data  = require ('Module:HeroData/rarities')
local rarity, icon = ""
if size == nil then
size = "30px"
end
if count == nil then
count = ""
end
if tooltip == nil then
tooltip = ""
else
tooltip = "true"
end
if link == nil then
link = ""
end
if lib.lookup(unit_data, unit) then
icon = unit_data[unit]["icon"]
else
return unit
end
if rarity_data[unit_data[unit]["rarity"]] and rarity_data[unit_data[unit]["rarity"]] ~= nil then
rarity = rarity_data[unit_data[unit]["rarity"]]
else
rarity = "обычный"
end
return mw.ustring.format('{{UnitIcon|%s|%s|%s|size=%s|count=%s|link=%s|tooltip=%s}}', unit, icon, rarity, size, count, link, tooltip)
end
end


Строка 215: Строка 487:
end
end
if rarity_data[unit_data[args['unit']]["rarity"]] and rarity_data[unit_data[args['unit']]["rarity"]] ~= nil then
if unit_data[args['unit']]["rarity"] and unit_data[args['unit']]["rarity"] ~= nil then
rarity = rarity_data[unit_data[args['unit']]["rarity"]]
rarity = rarity_data[unit_data[args['unit']]["rarity"]]
else
else
Строка 221: Строка 493:
end
end
return frame:preprocess(mw.ustring.format('{{ii|%s|%s|%s|size=%s|count=%s|link=%s|caption=%s}}', args['unit'], icon, rarity, size, count, link, caption))
if args['tooltip'] == nil then
tooltip = ""
else
if args['tooltip'] == "true" then
tooltip = args['unit']
else
tooltip = ""
end
end
return frame:preprocess(mw.ustring.format('{{UnitIcon|%s|%s|%s|size=%s|count=%s|link=%s|caption=%s|tooltip=%s}}', args['unit'], icon, rarity, size, count, link, caption, tooltip))
end
end


function p.getAllianceIcon(frame)
function AllianceIcon(alliance, size)
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
local icons_data = require ('Module:IconData/alliances')
local icons_data = require ('Module:IconData/alliances')
local alliance  = args['alliance'] or args[1]
local size      = args['size'] or args[2]
local icon      = ""
local icon      = ""
local str        = ""
local str        = ""
Строка 241: Строка 519:
str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance)
str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance)
return frame:preprocess(tostring(str))
return tostring(str)
end
 
function p.getUnitIcon(unit, size, count, link)
local unit_data    = require ('Module:UnitData/data')
local rarity_data  = require ('Module:ItemData/rarities')
local rarity, icon = ""
if size == nil then
size = "30px"
end
if count == nil then
count = ""
end
if link == nil then
link = ""
end
if lib.lookup(unit_data, unit) then
icon = unit_data[unit]["icon"]
else
return unit
end
if rarity_data[unit_data[unit]["rarity"]] and rarity_data[unit_data[unit]["rarity"]] ~= nil then
rarity = rarity_data[unit_data[unit]["rarity"]]
else
rarity = "обычный"
end
return mw.ustring.format('{{ui|%s|%s|%s|size=%s|count=%s|link=%s}}', unit, icon, rarity, size, count, link)
end
end


return p
return p

Текущая версия от 07:23, 25 июня 2023

Данная группа модулей хранит информацию обо всех юнитах из Крушителей подземелий. Перечень модулей:

Информация из Модуль:UnitData/doc


local p = {}

local lib = require('Module:Feature')
local libItem = require('Module:ItemData')

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:UnitData/getter')
    local unit     = args['unit'] or args[1]
    local datatype = args['datatype'] or args[2]
    local output   = args['output'] or args[3] or nil
    
    local result = get[datatype](unit)
    
    if output ~= nil and type(result) == "table" then
        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 = "{{" .. args['t_name'] .. "|", append = "}}", separator = args['separator']})
        end
    elseif result == nil then
        return ""
    else
        return result
    end
end

function p.getUnitAbility(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local get     = require ('Module:UnitData/getter')
	local unit    = args['unit'] or args[1]
	local ability = "abilities"
	local str     = ""
	
	local result = get[ability](unit)
	
	for k, v in ipairs(result) do
    	if tonumber(args['index']) == k then
    		str = mw.ustring.format('%s/%s/%s/%s', v[1], v[2], v[3], v[4])
    	end
    end
    
    return str
end

function p.getUnitSource(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local get         = require ('Module:UnitData/getter')
	local recipe_data = require ('Module:RecipeData/data')
	local loot_data   = require ('Module:ItemData/loot')
	local boss_data   = require ('Module:BossData/data')
	local item_data   = require ('Module:ItemData/data')
	local unit        = args['unit'] or args[1]
	local str         = ""
	local i           = 0
	
	local result      = get["source"](unit)
	local data        = recipe_data[unit]
	
	if (result ~= "Добыча") then
		str = str .. mw.ustring.format('<h2>Способ получения</h2>')
	end
	
	if (result == "Крафт") then
		str = str .. mw.ustring.format('<div class="recipes"><div class="owl-carousel owl-theme recipes-carousel">')
		if data ~= nil then
			for k, v in ipairs(data) do
				i = i + 1
				if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
					str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
				else
					str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
				end
			end
		end
		if i == 0 then
			str = str .. "Нет данных"
		end
		str = str .. mw.ustring.format('</div></div>')
	elseif (result == "Сундук") then
		str = str .. mw.ustring.format('<div class="chests" style="width:fit-content; width: -moz-fit-content">')
		for k, v in ipairs(loot_data) do
			for k1, v1 in ipairs(v) do
				if (v[k1][1] == unit) then
					for k2, v2 in pairs(item_data) do
						for k3, v3 in pairs(item_data[k2]["loot"]) do
							if (v3[1] == k) then
								str = str .. mw.ustring.format('%s', libItem.getItemIcon(k2, "100px"))
							end
						end
					end
				end
			end
		end
		str = str .. mw.ustring.format('</div>')
	elseif (result == "Босс") then
		str = str .. mw.ustring.format('<div class="bosses" style="width:fit-content; width: -moz-fit-content">')
		for k, v in pairs(boss_data) do
			for k2, v2 in pairs(boss_data[k]["loot"]) do
				if (v2[1] == unit) then
					str = str .. mw.ustring.format('[[Файл:%s|100px|ссылка=%s/босс]]', boss_data[k]["icon"], k)
				end
			end
		end
		str = str .. mw.ustring.format('</div>')
	elseif (result == "Крафт/Сундук") then
		str = str .. mw.ustring.format('<div class="recipes"><div class="owl-carousel owl-theme recipes-carousel">')
		if data ~= nil then
			for k, v in ipairs(data) do
				i = i + 1
				if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
					str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
				else
					str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
				end
			end
		end
		if i == 0 then
			str = str .. "Нет данных"
		end
		str = str .. mw.ustring.format('</div></div>')
		str = str .. mw.ustring.format('<div class="chests" style="width:fit-content; width: -moz-fit-content">')
		for k, v in ipairs(loot_data) do
			for k1, v1 in ipairs(v) do
				if (v[k1][1] == unit) then
					for k2, v2 in pairs(item_data) do
						for k3, v3 in pairs(item_data[k2]["loot"]) do
							if (v3[1] == k) then
								str = str .. mw.ustring.format('%s', libItem.getItemIcon(k2, "100px"))
							end
						end
					end
				end
			end
		end
		str = str .. mw.ustring.format('</div>')
	elseif (result == "Крафт/Босс") then
		str = str .. mw.ustring.format('<div class="recipes"><div class="owl-carousel owl-theme recipes-carousel">')
		if data ~= nil then
			for k, v in ipairs(data) do
				i = i + 1
				if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
					str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
				else
					str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
				end
			end
		end
		if i == 0 then
			str = str .. "Нет данных"
		end
		str = str .. mw.ustring.format('</div></div>')
		str = str .. mw.ustring.format('<div class="bosses" style="width:fit-content; width: -moz-fit-content">')
		for k, v in pairs(boss_data) do
			for k2, v2 in pairs(boss_data[k]["loot"]) do
				if (v2[1] == unit) then
					str = str .. mw.ustring.format('[[Файл:%s|100px|ссылка=%s/босс]]', boss_data[k]["icon"], k)
				end
			end
		end
		str = str .. mw.ustring.format('</div>')
	elseif (result == "Сундук/Босс") then
		str = str .. mw.ustring.format('<div class="chests" style="width:fit-content; width: -moz-fit-content">')
		for k, v in ipairs(loot_data) do
			for k1, v1 in ipairs(v) do
				if (v[k1][1] == unit) then
					for k2, v2 in pairs(item_data) do
						for k3, v3 in pairs(item_data[k2]["loot"]) do
							if (v3[1] == k) then
								str = str .. mw.ustring.format('%s', libItem.getItemIcon(k2, "100px"))
							end
						end
					end
				end
			end
		end
		str = str .. mw.ustring.format('</div>')
		str = str .. mw.ustring.format('<div class="bosses" style="width:fit-content; width: -moz-fit-content">')
		for k, v in pairs(boss_data) do
			for k2, v2 in pairs(boss_data[k]["loot"]) do
				if (v2[1] == unit) then
					str = str .. mw.ustring.format('[[Файл:%s|100px|ссылка=%s/босс]]', boss_data[k]["icon"], k)
				end
			end
		end
		str = str .. mw.ustring.format('</div>')
	elseif (result == "Магазин") then
		str = str .. mw.ustring.format('<div class="shop" style="width:fit-content; width: -moz-fit-content">')
		str = str .. mw.ustring.format('[[Файл:icon_shop.png|x100px|ссылка=Магазин]]', "Магазин")
		str = str .. mw.ustring.format('</div>')
	elseif (result == "Магазин/Крафт") then
		str = str .. mw.ustring.format('<div class="recipes"><div class="owl-carousel owl-theme recipes-carousel">')
		if data ~= nil then
			for k, v in ipairs(data) do
				i = i + 1
				if unit ~= "Арбалетчики" and unit ~= "Воины/2" and unit ~= "Колдуны" then
					str = str .. mw.ustring.format('{{RecipeImage2|%s|%d}}', unit, k)
				else
					str = str .. mw.ustring.format('{{RecipeImage3|%s|%d}}', unit, k)
				end
			end
		end
		if i == 0 then
			str = str .. "Нет данных"
		end
		str = str .. mw.ustring.format('</div></div>')
		str = str .. mw.ustring.format('<div class="shop" style="width:fit-content; width: -moz-fit-content">')
		str = str .. mw.ustring.format('[[Файл:icon_shop.png|x100px|ссылка=Магазин]]', "Магазин")
		str = str .. mw.ustring.format('</div>')
	end

	return frame:preprocess(tostring(str))	
end

function p.getAllianceIcon(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local icons_data = require ('Module:IconData/alliances')
	local alliance   = args['alliance'] or args[1]
	local size       = args['size'] or args[2]
	local icon       = ""
	local str        = ""
	
	if icons_data[alliance] ~= nil then
		icon = icons_data[alliance]
	else
		return "-"
	end
	
	str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance)
	
	return frame:preprocess(tostring(str))
end

function p.getUnitCategories(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local unit_data       = require ('Module:UnitData/data')
	local categories_data = require ('Module:HeroData/categories')
	local unit            = args['unit'] or args[1]
	local categories      = {}
	local str             = ""
	
	if unit_data[unit]["categories"] ~= nil then
    	for _, v in ipairs(unit_data[unit]["categories"]) do
			str = str .. mw.ustring.format('[[Категория:%s]]\n', categories_data[v])
		end
	end
	
	return frame:preprocess(tostring(str))
end

function p.getUnitCategoriesTable(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local unit_data       = require ('Module:UnitData/data')
	local categories_data = require ('Module:HeroData/categories')
	local races           = require ('Module:HeroData/races')
	local classes         = require ('Module:HeroData/classes')
	local alliances       = require ('Module:HeroData/alliances')
	local category        = args['category'] or args[1]
	local units           = {}
	local race            = ""
	local class           = ""
	local alliance        = ""
    local tableNode       = mw.html.create('table')
    
    for k, v in lib.pairsByAlphabeticalKeys(unit_data) do
    	if unit_data[k]['categories'] ~= nil then
	    	for k1, v1 in ipairs(unit_data[k]['categories']) do
	    		if category == categories_data[unit_data[k]['categories'][k1]] then
	    			table.insert(units, k)
	    		end
	    	end
	    end
    end
    
    tableNode
        :addClass('custom-table active-hover sortable')
        :cssText('width: 100%; text-align: center; display: table;')
        :newline()
    
    tableNode
        :tag('tr')
            :css('white-space', 'nowrap')
            :tag('th')
                :wikitext('Имя')
                :done()
            :tag('th')
            	:attr('class', 'unsortable')
                :css('width', '60px')
                :wikitext('Иконка')
                :done()
            :tag('th')
                :css('width', '80px')
                :wikitext('Раса')
                :done()
            :tag('th')
                :css('width', '80px')
                :wikitext('Класс')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('Альянс')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('HP')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('DEF')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('ATK')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('WIS')
                :done()
            :tag('th')
                :css('width', '60px')
                :wikitext('AGI')
                :done()
            :done()
    
    for k1, v1 in lib.pairsByAlphabeticalKeys(units) do
    	if unit_data[v1]['race'] ~= nil then
    		race = races[unit_data[v1]['race']]
    	else
    		race = "-"
    	end
    	
    	if unit_data[v1]['class'] ~= nil then
    		class = classes[unit_data[v1]['class']]
    	else
    		class = "-"
    	end
    	
    	if unit_data[v1]['alliance'] ~= nil then
    		alliance = alliances[unit_data[v1]['alliance']]
    	else
    		alliance = "-"
    	end
    		
        local rowNode = mw.html.create('tr')
        rowNode
            :tag('td')
                :attr('data-sort-value', v1)
                :wikitext(mw.ustring.format('[[%s]]', unit_data[v1]['name']))
                :done()
            :tag('td')
                :wikitext(mw.ustring.format('%s', p.getUnitIcon(unit_data[v1]['name'], "35px")))
                :done()
            :tag('td')
                :attr('data-sort-value', race)
                :wikitext(mw.ustring.format('%s', lib.ternary(type(unit_data[v1]['race']) ~= "nil", 
                	mw.ustring.format('[[:Категория:%s (раса)|%s]]', race, race), 
                	"-")))
                :done()
            :tag('td')
                :attr('data-sort-value', class)
                :wikitext(mw.ustring.format('%s', lib.ternary(unit_data[v1]['class'] ~= nil, 
                		mw.ustring.format('[[:Категория:%s (класс)|%s]]', class, class), 
                	"-")))
                :done()
            :tag('td')
                :attr('data-sort-value', alliance)
                :wikitext(mw.ustring.format('%s',  lib.ternary(unit_data[v1]['alliance'] ~= nil, AllianceIcon(alliance, "45px"), "-")))
                :done()
            :tag('td')
                 :wikitext(mw.ustring.format('%s', lib.ternary(unit_data[v1]['stats']['hp_base'] == nil, "N/A", unit_data[v1]['stats']['hp_base'])))
                 :done()
            :tag('td')
                 :wikitext(mw.ustring.format('%s', lib.ternary(unit_data[v1]['stats']['def_base'] == nil, "N/A", unit_data[v1]['stats']['def_base'])))
                 :done()
            :tag('td')
                 :wikitext(string.format('%s', lib.ternary(unit_data[v1]['type'] == nil, "N/A", lib.ternary(unit_data[v1]['type'] == 1 or unit_data[v1]['type'] == 4, setUnitMainStat(unit_data[v1]['stats']['atk_base']), unit_data[v1]['stats']['atk_base']))))
                 :done()
            :tag('td')
                 :wikitext(string.format('%s', lib.ternary(unit_data[v1]['type'] == nil, "N/A", lib.ternary(unit_data[v1]['type'] == 2 or unit_data[v1]['type'] == 4 or unit_data[v1]['type'] == 5, setUnitMainStat(unit_data[v1]['stats']['wis_base']), unit_data[v1]['stats']['wis_base']))))
                 :done()
            :tag('td')
                 :wikitext(string.format('%s', lib.ternary(unit_data[v1]['type'] == nil, "N/A", lib.ternary(unit_data[v1]['type'] == 3 or unit_data[v1]['type'] == 5, setUnitMainStat(unit_data[v1]['stats']['agi_base']), unit_data[v1]['stats']['agi_base']))))
                 :done()
        	:done()
        tableNode:node(rowNode):newline()
    end
    
    return frame:preprocess(tostring(tableNode))
end

function setUnitMainStat(str)
    local spanNode = mw.html.create('span')
    
    if str == nil then
    	str = "N/A"
    end
    
    spanNode
        :addClass('rarity-glpar')
        :wikitext(mw.ustring.format('%s', str))
    :done()

    return tostring(spanNode)
end

function p.getUnitIcon(unit, size, count, tooltip, link)
	local unit_data    = require ('Module:UnitData/data')
	local rarity_data  = require ('Module:HeroData/rarities')
	local rarity, icon = ""
	
	if size == nil then
		size = "30px"
	end
	
	if count == nil then
		count = ""
	end
	
	if tooltip == nil then
		tooltip = ""
	else
		tooltip = "true"
	end
	
	if link == nil then
		link = ""
	end
	
	if lib.lookup(unit_data, unit) then
		icon = unit_data[unit]["icon"]
	else
		return unit
	end
	
	if rarity_data[unit_data[unit]["rarity"]] and rarity_data[unit_data[unit]["rarity"]] ~= nil then
		rarity = rarity_data[unit_data[unit]["rarity"]]
	else
		rarity = "обычный"
	end
	
	return mw.ustring.format('{{UnitIcon|%s|%s|%s|size=%s|count=%s|link=%s|tooltip=%s}}', unit, icon, rarity, size, count, link, tooltip)
end

function p.getIconUnit(frame)
	local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
		
	local unit_data    = require ('Module:UnitData/data')
	local rarity_data  = require ('Module:ItemData/rarities')
	local rarity, icon, size, count = ""
	
	if args['size'] == nil then
		size = "30px"
	else
		size = args['size']
	end
	
	if args['count'] == nil then
		count = ""
	else
		count = args['count']
	end
	
	if args['link'] == nil then
		link = ""
	else
		link = args['link']
	end
	
	if args['caption'] == nil then
		caption = ""
	else
		caption = args['caption']
	end
	
	if lib.lookup(unit_data, args['unit']) then
		icon = unit_data[args['unit']]["icon"]
	else
		return args['unit']
	end
	
	if unit_data[args['unit']]["rarity"] and unit_data[args['unit']]["rarity"] ~= nil then
		rarity = rarity_data[unit_data[args['unit']]["rarity"]]
	else
		rarity = "обычный"
	end
	
	if args['tooltip'] == nil then
		tooltip = ""
	else
		if args['tooltip'] == "true" then
			tooltip = args['unit']
		else
			tooltip = ""
		end
	end
	
	return frame:preprocess(mw.ustring.format('{{UnitIcon|%s|%s|%s|size=%s|count=%s|link=%s|caption=%s|tooltip=%s}}', args['unit'], icon, rarity, size, count, link, caption, tooltip))
end

function AllianceIcon(alliance, size)
	local icons_data = require ('Module:IconData/alliances')
	local icon       = ""
	local str        = ""
	
	if icons_data[alliance] ~= nil then
		icon = icons_data[alliance]
	else
		return "-"
	end
	
	str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance)
	
	return tostring(str)
end

return p