Neverwinter Wiki
Регистрация
Advertisement

Для документации этого модуля может быть создана страница Модуль:Item/doc

--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
-- Модуль Item используется для отображения информации об игровых предметах в Neverwinter Wiki. --
-- Author: Oleksii (Shaleych) --------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------

local get_args = require('Модуль:Arguments').getArgs
local error_list = mw.loadData( "Модуль:Item/error" ) -- переменная error_list содержит список ошибок, которые могут возникнуть при использовании модуля
local attributes = mw.loadData('Модуль:Item/Attributes') -- Параметры предметов
local armor_set_powers_data = mw.loadData('Модуль:Item/ArmorSetPowersData') -- переменная armor_set_powers_data содержит информацию об умениях комплектов экипировки
local weapon_set_powers_data = mw.loadData('Модуль:Item/WeaponSetPowersData') -- переменная weapon_set_powers_data содержит информацию об умениях комплектов оружия
local companion_powers_data = mw.loadData('Module:Companion/Powers') -- переменная companion_powers_data содержит информацию об умениях компаньонов
local list_of_modules = mw.loadData( "Модуль:Item/list_of_modules" ) -- переменная list_of_modules содержит список вышедших дополнений для игры
local item_icon = require('Модуль:Item_icon') -- переменная item_icon содержит модуль для отображения иконок предметов

local p = {}
local h = {}
local cargo = mw.ext.cargo
local gsub = mw.ustring.gsub
local find = mw.ustring.find
local sub  = mw.ustring.sub

-- Переменная fields_cargo используется для создания таблицы, которая будет заполнена данными и сохранена в базе данных Cargo. Каждый элемент таблицы представляет собой одно поле, которое будет сохранено в базе данных.
local fields_cargo = {}

--Функция для подсветки параметров предметов
function p.attribHighlight(frame)
	local description = frame.args[1]
	for _, attrib in ipairs(attributes) do
		for _, name in ipairs(attrib.name) do
			description = string.gsub(description, name, '[[' .. attrib.name[1] .. '|<span class="slate">' .. name .. '</span>]]')
		end
	end
	return description
end

-- Функция для проверки, загружен ли модуль данных
function checkDataLoaded(data)
	if (data == nil) then
		error("Error: "..data.." is not loaded!") -- Выводит ошибку, если данные не загружены.
		return false
	end

	return true -- Если данные загружены, продолжить выполнение модуля.
end

-- Функция для поиска совпадений в массиве (используется в основном для args.item_categories (категории предмета))
function table.find(t, values)
    if not t or type(t) ~= "table" or not values then
        return false
    end

    -- Если передана строка, преобразовываем её в одноэлементный массив
    if type(values) == "string" then
        values = {values}
    end

    for i, v in ipairs(t) do
        for j, val in ipairs(values) do
            if mw.ustring.lower(v) == mw.ustring.lower(val) then
                return true
            end
        end
    end

    return false
end

-- Функция для разделения чисел запятой
function commaValue(amount)
	local formatted = amount
	while true do  
	  formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
		if (k==0) then
			break
		end
	end
	return formatted
end

-- Функция для округления чисел  
function round(val, decimal)
	if (decimal) then
	  return math.floor((val * 10^decimal) + 0.5) / (10^decimal)
	else
		return math.floor(val+0.5)
	end
end

-- Основная функция, используется для отображения информации о предмете на странице.
function p.item(frame)

    local args = get_args(frame, {parentFirst = true})

	-- Добавляет метку вверху страницы, в каком обновлении добавлен предмет
	if args["модуль"] then
		fields_cargo["module"] = args["модуль"]
		local content_indicator = 'Добавлено в модуле ' .. args["модуль"] .. ': ' .. (list_of_modules[args["модуль"]] or '')
	
		mw.getCurrentFrame():extensionTag {
			name = "indicator",
			content = content_indicator,
			args = {
				name = "module"
			}
		}
	end

	-- Таблица для хранения категорий предметов.
	local item_categories = {}

	-- Получаем уровень предмета и преобразуем его в число
	local item_level = args["уровень предмета"] and tonumber(string.gsub(args["уровень предмета"], "%,", ""), 10) or ''

	-- Если задана категория, разбиваем ее на отдельные категории, приводим к нижнему регистру и добавляем в таблицу item_categories.
	if args["категория"] then
		for i in mw.text.gsplit(args["категория"], ",%s*") do
			table.insert(item_categories, mw.ustring.lower(i))
		end
	-- Если задан тип, то он используется вместо категории. Аналогично добавляем в таблицу item_categories.
	elseif args["тип"] then
		for i in mw.text.gsplit(args["тип"], ",%s*") do
			table.insert(item_categories, mw.ustring.lower(i))
		end
	end

	local container = mw.html.create('div')
	container:addClass('tooltip-content tooltip tooltipright')
		:tag('div'):addClass('top')
		:tag('div'):addClass('tlcorner'):done()
		:tag('div'):addClass('trcorner'):done()
		:tag('div'):addClass('tedge'):done()

    local content = h.divContent()
    local group = h.Group()

	-- Качество предмета
	local item_quality = {
		["задача"] = 'quest',		
		["обычный"] = 'common',
		["необычный"] = 'uncommon',
		["редкий"] = 'rare',
		["эпический"] = 'epic',
		["легендарный"] = 'legendary',
		["мифический"] = 'mythic',
	}

	-- Название предмета
	fields_cargo["name"] = mw.title.getCurrentTitle().fullText

	-- Качество предмета
	local quality = args["качество"]
	local quality = quality and item_quality[mw.ustring.lower(quality)] or 'common'
	fields_cargo["quality"] = quality
	content
		:tag('span')
			:attr('class', quality)
			:attr('style', 'font-size: 18px;')
			:wikitext(mw.title.getCurrentTitle().fullText)
		:tag('br')
			:done()

	-- Уровень предмета
	if args["уровень предмета"] then
		fields_cargo["item_level"] = item_level
		content 		
			:tag('div') 
				:attr('class', 'white itemlevel')
				:wikitext('Уровень предмета: ' .. commaValue(item_level))
			:tag('br')
				:done()
	end

	local function dindingItem(fieldKey, argsKey)
		if args[argsKey] then
			fields_cargo[fieldKey] = args[argsKey]
			local text = args[argsKey]:gsub("при%s", 'при<br>')
			group	
				:tag('div') 
					:attr('class', 'right binding')
					:wikitext('[[Файл:Icons_Inventory_Binds.png|baseline|ссылка=]] <span class=common>' .. mw.getContentLanguage():ucfirst(text) .. '</span>')
		end
	end
	
	dindingItem("bind", "привязка")
	dindingItem("bind2", "привязка2")

	content:node(group):tag('br'):done()

	-- Вспомогательный текст
	if args.item_categories then
		if mw.ustring.find( args.item_categories, "[тТ]олько для спутников" ) then
			content
		    :tag('div') 
		    :attr('class', 'right gold')
		    :wikitext('Только для спутников')
		    :tag('br')
		    :done()
	    elseif table.find(item_categories, "купон") then
			content 	
		    :tag('div')
		    :attr('class', 'right green')
			:wikitext('Дважды щелкните,<br>чтобы использовать купон')
			:tag('br')
			:done()
	    elseif table.find(item_categories, {"набор", "полезные наборы"}) then
			content 	
		    :tag('div')
		    :attr('class', 'right green')
			:wikitext('Дважды щелкните,<br>чтобы<br>взять/использовать')
			:done()
			:tag('br')
		elseif table.find(item_categories, "набор усиления доспехов") then
			content 	
			:tag('div')
			:attr('class', 'right green')
			:wikitext('Дважды щелкните,<br>чтобы применить')
			:done()
			:tag('br')
		elseif mw.ustring.find( args.item_categories, "[бБ]есплатное изменение внешнего вида" ) then
			content	
			:tag('div')
			:wikitext('Это предмет <b>первого уровня</b>, который обычно используют для превращения.')
			:done()
		elseif mw.ustring.find( args.item_categories, "[мМ]атериал" ) then
			if mw.ustring.lower(args['качество']) == 'редкий' then
				content:tag('div'):wikitext('Ресурс для ремесленных работ.'):done():tag('br')
			elseif mw.ustring.lower(args['качество']) == 'эпический' or mw.ustring.lower(args['качество']) == 'легендарный' then
				content:tag('div'):wikitext('Ресурс для мастерских ремесленных заданий.'):done():tag('br')
			end
		elseif table.find(item_categories, {"шляпа (стиль)", "тело (стиль)", "штаны (стиль)", "ноги (стиль)"}) then
			content	
			:tag('div')
			:attr('class', 'right green')
			:wikitext('Щелкните дважды для<br>преобразования')
			:done()
			:tag('br')
		end
	end

	if args.item_categories and mw.ustring.lower(args.item_categories) == "артефакт" then
		-- Время восстановления артефактов в секундах.
		local rank = {
			["необычный"] = '180',
			["редкий"] = '160',
			["эпический"] = '140',
			["легендарный"] = '120',
			["мифический"] = '60',
		}

		content
			:wikitext('<span class="beige" style="display: block;">Время восстановления: ' .. rank[mw.ustring.lower(args["качество"])] .. 'с</span>')
			:tag('br')
			:done()
	end

	-- Проверяем наличие аргумента "умение усиления"
	if args["умение усиления"] then
		-- Присваиваем значение аргумента полю "enhancement_power" в таблице "Items"
		fields_cargo["enhancement_power"] = args["умение усиления"]	
		group = h.Group()
		
		local tables = 'Powers'
    	local fields = 'name, item_ui_equip_power'
        local powers_args = { where = 'name = "' .. args["умение усиления"] .. '"' }
		local result = cargo.query( tables, fields, powers_args )
		local r = result[1]
		
		group:wikitext('<span class="green">Умение усиления: </span> ' .. r['item_ui_equip_power']):tag('br'):done()
		content:node(group):tag('br'):done()
	end

	-- Если есть бонусное умение игрока, добавляем его в поле "player_bonus_power" таблицы "fields_cargo"
	if args["бонусное умение игрока"] then
		local player_bonus_power = args["бонусное умение игрока"]
		fields_cargo["player_bonus_power"] = player_bonus_power
		
		-- Создаем группу элементов
		local group = h.Group()
		
		-- Если значение бонусного умения игрока не найдено в таблице "companion_powers_data", добавляем значение которое указано в args["бонусное умение игрока"].
		if companion_powers_data[player_bonus_power] == nil then
			local description = player_bonus_power

			for _, attrib in ipairs(attributes) do
				for _, name in ipairs(attrib.name) do
					description = string.gsub(description, name, '[[' .. attrib.name[1] .. '|<span class="slate">' .. name .. '</span>]]')
				end
			end

			group:wikitext('<span class="green">Бонусное умение игрока: </span> '..  description):tag('br'):done()
		
		-- Если значение найдено в таблице, но не содержит поля "quality", выводим его обычную версию.
		elseif companion_powers_data[player_bonus_power].quality == nil then
			local power_data = companion_powers_data[player_bonus_power]
			group:wikitext('<span class="green">Бонусное умение игрока: </span> '..  power_data):tag('br'):done()
		
		-- Если значение найдено в таблице и содержит поле "quality", выводим его в зависимости от аргумента "качество".
		else
			local power_data = companion_powers_data[player_bonus_power]
			local quality_key = mw.ustring.lower(args["качество"])
			local quality_value = power_data.quality[item_quality[quality_key]]
			group:wikitext('<span class="green">Бонусное умение игрока: </span> '..  quality_value):tag('br'):done()
		end
		
		-- Добавляем группу элементов в переменную "content"
		content:node(group):done()
	end

	-- Проверяем, что тип указан и категория предмета равна "скакун"
	if (args["тип"] and table.find(item_categories, "скакун")) then
			
		fields_cargo["equip_power_name"] = args["умение экипировки"]
		fields_cargo["combat_power_name"] = args["боевое умение"]

		local function queryPower(power_type)
			local tables = 'Powers'
			local fields = 'name, type, power_use, item_ui_equip_power, hit_points, power, accuracy, combat_advantage, critical_strike, critical_severity, critical_avoidance, forte, stamina_regen, deflect, awareness, movement_speed, defense, stat_universal'
			local args_power = {
				where = 'type = "' .. power_type .. '" AND name = "' .. args[power_type] .. '"'
			}
			return cargo.query(tables, fields, args_power)[1]
		end
		
		-- Боевое умение
		local r_combat_power = queryPower("боевое умение")
		
		-- Умение экипировки
		local r_equip_power = queryPower("умение экипировки")

		group = h.Group():wikitext('<span class="green">Боевое умение: </span> '.. r_combat_power["power_use"]):tag('br'):done():tag('br'):done()

		local wikitext = {}
		for _, stat in ipairs(attributes) do
			if r_equip_power[stat.fields_cargo] then
				local value = commaValue(r_equip_power[stat.fields_cargo])
				table.insert(wikitext, '+' .. value .. ' [[' .. stat.name[1] .. '|<span class="slate">' .. stat.name[1] .. '</span>]]')
			end
		end

		group:wikitext('<span class="green">Умение экипировки: </span> '.. (#wikitext == 0 and (r_equip_power['power_use'] ~= '' and r_equip_power['power_use'] or r_equip_power['item_ui_equip_power']) or table.concat(wikitext, '<br>')) .. '<br>+' .. commaValue(r_equip_power['stat_universal']) .. ' <span class="slate">Общий рейтинг</span>'):done()

		content:node(group):tag('br'):done()
	end

	if args.item_categories and table.find(item_categories, {"только для спутников", "спутник", "скакун", "клинок", "оружие", "левая рука", "голова", "доспехи", "руки", "ноги", "кольцо", "рубаха", "штаны", "артефакт", "шея", "пояс", "волшебный камень", "набор усиления доспехов"}) then
		group = h.Group('item_stats')
	
		-- Значения характеристик экипировки
		for _, attrib in ipairs({
			{"сила", "Strength", "СИЛ"},
			{"выносливость", "Constitution", "ВЫН"},
			{"ловкость", "Dexterity", "ЛОВ"},
			{"интеллект", "Intelligence", "ИНТ"},
			{"мудрость", "Wisdom", "МДР"},
			{"обаяние", "Charisma", "ОБА"}
		}) do
			if args[attrib[1]] then
				fields_cargo[mw.ustring.lower(attrib[2])] = args[attrib[1]]
			end
		end

		if args["урон"] then
			--fields_cargo["damage"] = args["урон"]
			group:tag('span'):wikitext("+" .. args["урон"] .. ' <span class="slate">Урон</span>'):tag('br'):done()
		end

		if args["параметры"] then
			-- Функция для проверки наличия подстроки "_1", "_2" или "_3" в строке
			local function containsSpecialValues(str)
				-- Проверяем наличие подстрок в строке и возвращаем true, если хотя бы одна из них найдена
				return str:find("_1") or str:find("_2") or str:find("_3")
			end

			if containsSpecialValues(args["параметры"]) then
			-- Данный код автоматически рассчитывает параметры предмета на основе его уровня.
			-- На каждый один уровень добавляется 0.75/0.90 к параметру/общему рейтингу.
			-- Например: 0.75 * уровень предмета (1200) = +900 к критическому урону.

				-- Пустой массив для хранения параметров предмета.
				local item_stats = {}
							
				for i in mw.text.gsplit(args["параметры"], ",%s*") do
					table.insert(item_stats, mw.ustring.lower(i))
				end

				-- Вычисляем количество параметров в таблице item_stats.
				local number_of_stats = #item_stats

				if args["уровень предмета"] then
					if tonumber(item_level) then
						item_level = tonumber(item_level)
					else
						error("Ошибка: Невозможно преобразовать уровень предмета в число.")
					end
				else
					error("Ошибка: Аргумент 'уровень предмета' отсутствует.")
				end

				local has_1 = false
				local has_2 = {has = false, count = 0}
				local has_3 = false
				
				-- Проверяем наличие параметров _1, _2 и _3
				for i = 1, #item_stats do
					local stat = item_stats[i]
				
					if stat:find('_1') then
						has_1 = true
					elseif stat:find('_2') then
						has_2.has = true
						has_2.count = has_2.count + 1
					elseif stat:find('_3') then
						has_3 = true
					end
				end
				
				-- Применяем коэффициенты умножения в зависимости от условий
				for i = 1, #item_stats do
					local stat = item_stats[i]
					local multiplier = 1.0
				
					if stat:find('_1') then
						if has_2.has and not has_3 and has_2.count == 1 then
							-- Кольцо
							if mw.ustring.find(args.item_categories, "[кК]ольцо") then
								multiplier = 2.25
							else
								multiplier = 1.125
							end
						else
							-- Кольцо
							if mw.ustring.find(args.item_categories, "[кК]ольцо") and not mw.ustring.find(args.item_categories, "[тТ]олько для спутников") then
								multiplier = 3
								-- Кольцо, Сфера, Шея, Талисман, Икона, Священный символ, Клинок, Дальний бой, Щит, Гримуар, Темляк, Рубаха, Штаны
							elseif table.find(item_categories, {"кольцо", "сфера", "шея", "талисман", "икона", "священный символ", "клинок", "дальний бой", "щит", "гримуар", "темляк", "рубаха", "штаны"}) then
								if (table.find(item_categories, {"только для спутников", "рубаха", "штаны"}) and number_of_stats == 1) then
									multiplier = 1.5
								else
									multiplier = 0.75
								end
							else
								if has_2.count > 1 then
									multiplier = 0.60
							  	else
								  	multiplier = 0.75
							  	end
							end
						end
					elseif stat:find('_2') then
						if number_of_stats == 2 then
							-- Кольцо
							if mw.ustring.find(args.item_categories, "[кК]ольцо") then
								multiplier = 0.75
							else
								multiplier = 0.375
							end
						elseif has_2.count > 1 then
						  	-- multiplier = 0.375 OLD MODS
							  multiplier = (mw.ustring.find(args.item_categories, "[тТ]олько для спутников") and 0.375 or 0.45) -- MOD 27
						else
							multiplier = 0.45
						end
					elseif stat:find('_3') then
						multiplier = 0.3
					end

					-- Создаем имя атрибута без индекса (_1, _2, _3)
					local attribute_name = string.gsub(stat, "_%d", "")
					local attribute_value = round(item_level * multiplier)
				
					for _, attrib in ipairs(attributes) do
						if attribute_name == attrib.name[2] then
							fields_cargo[attrib.fields_cargo] = attribute_value
							group:tag('span'):wikitext("+".. commaValue(attribute_value) .. ' [[' .. attrib.name[1] .. '|<span class="slate">' .. attrib.name[1] .. '</span>]]'):tag('br'):done()
							break -- Найдено соответствие, выходим из внутреннего цикла
						end
					end
				end
			else
			--------------------------------------------------------------------------------------------------------------
			-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
			-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
			-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
			-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
			-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
			--------------------------------------------------------------------------------------------------------------
			-- Данный код автоматически рассчитывает параметры предмета на основе его уровня.
			-- На каждый один уровень добавляется 0.75/0.90 к параметру/общему рейтингу.
			-- Например: 0.75 * уровень предмета (1200) = +900 к критическому урону.

			-- Пустой массив для хранения параметров предмета.
			local item_stats = {}
						
			for i in mw.text.gsplit(args["параметры"], ",%s*") do
				table.insert(item_stats, mw.ustring.lower(i))
			end
			
			local has_stats = {}
			for _, stat_pair in ipairs(attributes) do
				local stat_name, basic_stat_name = stat_pair.name[2], stat_pair.name[2] .. ' basic'
				has_stats[stat_name] = table.find(item_stats, stat_name)
				has_stats[basic_stat_name] = table.find(item_stats, basic_stat_name)
			end

			-- Вычисляем количество параметров в таблице item_stats.
			local number_of_stats = #item_stats

			-- Проверяем, что значение параметра "уровень предмета" может быть преобразовано в числовой формат.
			if not item_level then
				error("Неверный уровень предмета: " .. args["уровень предмета"])
			end

			local has_power, has_basic_bower = table.find(item_stats, "могущество"), table.find(item_stats, "могущество basic")


			-- Значение основного параметра
			local basic_value_stat

			-- Голова, Руки, Доспехи, Ноги
			if args.item_categories:match("[гГ]олова") or args.item_categories:match("[рР]уки") or args.item_categories:match("[дД]оспехи") or args.item_categories:match("[нН]оги") then
				if item_level < 1600 then
					basic_value_stat = round(0.45 * item_level)
				else
					basic_value_stat = round(0.6 * item_level)
				end
				
			-- Рубаха, Штаны
			elseif mw.ustring.find(args.item_categories, "[рР]убаха") or mw.ustring.find(args.item_categories, "[шШ]таны") then
				if item_level <= 1200 then
					basic_value_stat = round(1.0 * item_level)
				elseif item_level > 1200 then	
					basic_value_stat = round(1.5 * item_level)
				end

			-- Артефакт, Пояс, Шея
			elseif mw.ustring.find(args.item_categories, "[аА]ртефакт") or mw.ustring.find(args.item_categories, "[пП]ояс") or mw.ustring.find(args.item_categories, "[шШ]ея")then
				basic_value_stat = round(item_level)

			-- Сфера, Талисман, Икона, Священный символ, Клинок, Дальний бой, Щит, Гримуар, Темляк
			elseif mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк") then
				basic_value_stat = round(0.75 * item_level)

			-- Кольцо
			elseif mw.ustring.find(args.item_categories, "[кК]ольцо") then
				basic_value_stat = round(item_level * 2.25)
			end

	 		-- Значение дополнительного параметра
			local value_stat

			-- Голова, Руки, Доспехи, Ноги
			if mw.ustring.find(args.item_categories, "[гГ]олова") or mw.ustring.find(args.item_categories, "[рР]уки") or mw.ustring.find(args.item_categories, "[дД]оспехи") or mw.ustring.find(args.item_categories, "[нН]оги") then
				if number_of_stats == 1 then
					value_stat = round(0.75 * item_level)
				elseif number_of_stats == 2 then
					value_stat = round(0.75 * item_level)					
				elseif item_level < 1600 then
					value_stat = round(0.3 * item_level)
				else
					value_stat = round(0.45 * item_level)
				end

			-- Кольцо
			elseif mw.ustring.find(args.item_categories, "[кК]ольцо") then
				if (table.find(item_categories, "только для спутников") and number_of_stats == 1) then
					value_stat = round(0.75 * item_level * 2)
				elseif number_of_stats == 1 then
					value_stat = round(item_level * 3)
				else				
					value_stat = round(item_level * 0.75)
				end

			-- Шея, Пояс
			elseif mw.ustring.find(args.item_categories, "[шШ]ея") or mw.ustring.find(args.item_categories, "[пП]ояс") then

				local isWordFound = false

				for _, word in ipairs(item_stats) do
					if string.find(word, "basic") then
					  	isWordFound = true
					  	break
					end
				end

				if number_of_stats == 3 then
					value_stat = round(0.75 * item_level / 1.5)
				elseif number_of_stats == 1 then
					value_stat = round(0.75 * item_level * 2)
				elseif isWordFound then
					value_stat = round(0.5 * item_level)
				else 
					value_stat = round(0.75 * item_level)
				end

			-- Рубаха, Штаны
			elseif mw.ustring.find(args.item_categories, "[рР]убаха") or mw.ustring.find(args.item_categories, "[шШ]таны") then
				if number_of_stats == 1 then
					value_stat = round(1.5 * item_level)
				else				
					value_stat = round(0.75 * item_level)
				end

			-- Артефакт
			elseif mw.ustring.find(args.item_categories, "[аА]ртефакт") then
				if number_of_stats == 2 then
					value_stat = round(1.125 * item_level)
				else
					value_stat = round(0.75 * item_level)
				end

			-- Сфера, Талисман, Икона, Священный символ, Клинок, Дальний бой, Щит, Гримуар, Темляк
			elseif mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк") then
				if (table.find(item_categories, "только для спутников") and number_of_stats == 1) then
					value_stat = round(0.75 * item_level * 2)
				else
					value_stat = round(0.75 * item_level)
				end

			-- Значение по умолчанию
			else
				value_stat = round(0.75 * item_level)
			end

			-- Проверяем наличие параметра "Точность" в списке параметров.
			if has_stats["точность"] or has_stats["точность basic"] then
				if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
					fields_cargo["accuracy"] = value_stat / 2
					group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Точность</span>'):tag('br'):done()
				elseif has_stats["точность basic"] then
					fields_cargo["accuracy"] = basic_value_stat
					group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Точность</span>'):tag('br'):done()
				else
					fields_cargo["accuracy"] = value_stat
					group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Точность</span>'):tag('br'):done()
				end
			end

			-- Проверяем наличие параметра "Могущество" в списке параметров.
			if has_stats["могущество"] or has_stats["могущество basic"] then
				local power_value = has_stats["могущество basic"] and basic_value_stat or value_stat
				fields_cargo["power"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Могущество</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Боевое преимущество" в списке параметров.
			if has_stats["боевое преимущество"] or has_stats["боевое преимущество basic"] then
				local power_value = has_stats["боевое преимущество basic"] and basic_value_stat or value_stat
				fields_cargo["combat_advantage"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Боевое преимущество</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Вероятность критического удара" в списке параметров.
			if has_stats["вероятность критического удара"] or has_stats["вероятность критического удара basic"] then
				if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
					fields_cargo["critical_strike"] = value_stat / 2
					group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Вероятность критического удара</span>'):tag('br'):done()
				elseif has_stats["вероятность критического удара basic"] then
					fields_cargo["critical_strike"] = basic_value_stat
					group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Вероятность критического удара</span>'):tag('br'):done()
				else
					fields_cargo["critical_strike"] = value_stat
					group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Вероятность критического удара</span>'):tag('br'):done()
				end
			end

			-- Проверяем наличие параметра "Парирование" в списке параметров.
			if has_stats["парирование"] or has_stats["парирование basic"] then
				local power_value = has_stats["парирование basic"] and basic_value_stat or value_stat
				fields_cargo["deflect"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Парирование</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Сила парирования" в списке параметров.
			if has_stats["сила парирования"] or has_stats["сила парирования basic"] then
				local power_value = has_stats["сила парирования basic"] and basic_value_stat or value_stat
				fields_cargo["deflect_severity"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Сила парирования</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Бонус к контролю" в списке параметров.
			if has_stats["бонус к контролю"] or has_stats["бонус к контролю basic"] then
				local power_value = has_stats["бонус к контролю basic"] and basic_value_stat or value_stat
				fields_cargo["control_bonus"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Бонус к контролю</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Сильная сторона" в списке параметров.
			if has_stats["сильная сторона"] or has_stats["сильная сторона basic"] then
				local power_value = has_stats["сильная сторона basic"] and basic_value_stat or value_stat
				fields_cargo["forte"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Сильная сторона</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Критическое уклонение" в списке параметров.
			if has_stats["критическое уклонение"] or has_stats["критическое уклонение basic"] then
				if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
					fields_cargo["critical_avoidance"] = value_stat / 2
					group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Критическое уклонение</span>'):tag('br'):done()
				elseif has_stats["критическое уклонение basic"] then
					fields_cargo["critical_avoidance"] = basic_value_stat
					group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Критическое уклонение</span>'):tag('br'):done()
				else
					fields_cargo["critical_avoidance"] = value_stat
					group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Критическое уклонение</span>'):tag('br'):done()
				end
			end

			-- Проверяем наличие параметра "Критический урон" в списке параметров.
			if has_stats["критический урон"] or has_stats["критический урон basic"] then
				if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
					fields_cargo["critical_severity"] = value_stat / 2
					group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Критический урон</span>'):tag('br'):done()
				elseif has_stats["критический урон basic"] then
					fields_cargo["critical_severity"] = basic_value_stat
					group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Критический урон</span>'):tag('br'):done()
				else
					fields_cargo["critical_severity"] = value_stat
					group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Критический урон</span>'):tag('br'):done()
				end
			end

			-- Проверяем наличие параметра "Осведомленность" в списке параметров.
			if has_stats["осведомленность"] or has_stats["осведомленность basic"] then
				local power_value = has_stats["осведомленность basic"] and basic_value_stat or value_stat
				fields_cargo["awareness"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Осведомленность</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Исходящее лечение" в списке параметров.
			if has_stats["исходящее лечение"] or has_stats["исходящее лечение basic"] then
				local power_value = has_stats["исходящее лечение basic"] and basic_value_stat or value_stat
				fields_cargo["outgoing_healing"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Исходящее лечение</span>'):tag('br'):done()
			end
			
			-- Проверяем наличие параметра "Сопротивляемость контролю" в списке параметров.
			if has_stats["сопротивляемость контролю"] or has_stats["сопротивляемость контролю basic"] then
				local power_value = has_stats["сопротивляемость контролю basic"] and basic_value_stat or value_stat
				fields_cargo["control_resist"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Сопротивляемость контролю</span>'):tag('br'):done()
			end

			-- Проверяем наличие параметра "Принимаемое лечение" в списке параметров.
			if has_stats["принимаемое лечение"] or has_stats["принимаемое лечение basic"] then
				local power_value = has_stats["принимаемое лечение basic"] and basic_value_stat or value_stat
				fields_cargo["incoming_healing"] = power_value
				group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Принимаемое лечение</span>'):tag('br'):done()
			end

			if mw.ustring.find(args["параметры"], "[вВ]осстановления здоровья") then
				if number_of_stats == 2 or number_of_stats == 3 then
					-- fields_cargo[""] = '1.5%'
					group
						:tag('span')
							:wikitext('+1.5% <span class="slate">Восстановления здоровья</span>')
							:tag('br')
							:done()
				elseif number_of_stats == 4 then
					-- fields_cargo[""] = '0.75%'
					group
						:tag('span')
							:wikitext('+0.75% <span class="slate">Восстановления здоровья</span>')
							:tag('br')
							:done()
				end
			end
			if mw.ustring.find(args["параметры"], "[вВ]осстановление бодрости") then
				if number_of_stats == 3 then
					-- fields_cargo["stat_movement"] = '1.5%'
					group
						:tag('span')
							:wikitext('+1.5% <span class="slate">Восстановление бодрости</span>')
							:tag('br')
							:done()
				elseif number_of_stats == 4 then
					-- fields_cargo["stat_movement"] = '0.75%'
					group
						:tag('span')
							:wikitext('+0.75% <span class="slate">Восстановление бодрости</span>')
							:tag('br')
							:done()
				end
			end
			if mw.ustring.find(args["параметры"], "[пП]олучение очков действия") then
				if number_of_stats == 2 or number_of_stats == 3 then
					fields_cargo["utility_action_point_gain"] = '1.5%'
					group
						:tag('span')
							:wikitext('+1.5% <span class="slate">Получение очков действия</span>')
							:tag('br')
							:done()
				elseif number_of_stats == 4 then
					fields_cargo["utility_action_point_gain"] = '0.75%'
					group
						:tag('span')
							:wikitext('+0.75% <span class="slate">Получение очков действия</span>')
							:tag('br')
							:done()
				end
			end	
			if mw.ustring.find(args["параметры"], "[сС]корость движения") then
				if number_of_stats == 3 then
					fields_cargo["movement_speed"] = '1.5%'
					group
						:tag('span')
							:wikitext('+1.5% <span class="slate">Скорость движения</span>')
							:tag('br')
							:done()
				elseif number_of_stats == 4 then
					fields_cargo["movement_speed"] = '0.75%'
					group
						:tag('span')
							:wikitext('+0.75% <span class="slate">Скорость движения</span>')
							:tag('br')
							:done()
				end
			end	
			if mw.ustring.find(args["параметры"], "[сС]корость восстановления") then
				if number_of_stats == 3 then
					-- fields_cargo["movement_speed"] = '1.5%'
					group
						:tag('span')
							:wikitext('+1.5% <span class="slate">Скорость восстановления</span>')
							:tag('br')
							:done()
				elseif number_of_stats == 4 then
					-- fields_cargo["movement_speed"] = '0.75%'
					group
						:tag('span')
							:wikitext('+0.75% <span class="slate">Скорость восстановления</span>')
							:tag('br')
							:done()
				end
			end
			if mw.ustring.find(args["параметры"], "[вВ]осстановление здоровья") then
				if number_of_stats == 3 then
					fields_cargo["stat_regeneration"] = '1.5%'
					group
						:tag('span')
							:wikitext('+1.5% <span class="slate">Восстановление здоровья</span>')
							:tag('br')
							:done()
				elseif number_of_stats == 4 then
					fields_cargo["stat_regeneration"] = '0.75%'
					group
						:tag('span')
							:wikitext('+0.75% <span class="slate">Восстановление здоровья</span>')
							:tag('br')
							:done()
				end
			end		
		end
	end

	-- Проверяем, находится ли предмет в категории "атака/оборона/полезное"
	if table.find(item_categories, "атака/оборона/полезное") then

		-- Определяем, сколько параметров содержит предмет (1 или 2)
		local number_of_stats = #mw.text.split(args['атака'], ",%s*")
		
		if number_of_stats == 1 then
			-- Умножаем уровень предмета на 1.5, если предмет содержит только один параметр
			item_level = round(item_level * 1.5)
		elseif number_of_stats == 2 then
			-- Умножаем уровень предмета на 0.825, если предмет содержит два параметра
			item_level = round(item_level * 0.825)
		end

		-- Определяем порядок категорий
		local category_order = { "атака", "оборона", "полезное" }

		-- Создаем новую таблицу для хранения префиксов
		local prefixes = {}

		-- Обходим каждую категорию в заданном порядке
		for _, category in ipairs(category_order) do
			-- Проверяем наличие аргумента с текущей категорией
			if args[category] then
				-- Обходим каждое значение в текущей категории
				for value in mw.text.gsplit(args[category], ",%s*") do
					-- Обходим каждое поле в Attributes
					for _, attrib in ipairs(attributes) do
						if mw.ustring.lower(value) == attrib.name[2] then
							fields_cargo[attrib.fields_cargo] = commaValue(item_level)
							-- Форматируем префикс для вывода
							local prefix = '<span class="green">' .. attrib.slot .. ':</span> +' .. commaValue(item_level) .. ' [[' .. attrib.name[1] .. '|<span class="slate">' .. attrib.name[1] .. '</span>]]'
							-- Добавляем префикс в таблицу
							table.insert(prefixes, prefix)
							break
						end
					end
				end
			end
		end

		-- Объединяем префиксы в одну строку, разделяя их <br> (переносом строки)
		group:tag("span"):wikitext(table.concat(prefixes, '<br>')):tag("br"):done()
	end
		
		content:node(group):tag('br'):done()
	end

	for _, field in pairs(attributes) do
		local first_name = field.name[2]
		if args[first_name] and tonumber(args[first_name]) then
			local value = args[first_name]
			fields_cargo[field.fields_cargo] = value
			if table.find(item_categories, "набор усиления доспехов") then
				prefix = string.format('<span class="green">На себе: </span><span class="slate">%s</span>: +%s', field.name[1], value )
			elseif table.find(item_categories, "знаки") then
				prefix = string.format('<span class="gold">(максимум)</span><br>Когда применяется к скакуну:<br><span class="green">Ячейка знаков:</span> +%s <span class="slate">%s</span>', value, field.name[1])
			elseif table.find(item_categories, "только для спутников") then
				local level = args["уровень предмета"]:gsub(",", "")
				prefix = string.format('+%d <span class="slate">%s</span>', commaValue(string.format("%.0f", 0.75 * tonumber(level))), field.name[1])
			else
				if not table.find(item_categories, "атака/оборона/полезное") then
					prefix = string.format('+%s <span class="slate">%s</span>', value, field.name[1])
				end
			end
			group:tag("span"):wikitext(prefix):tag("br"):done()
		end
	end

	-- Вычисление значения общего рейтинга на основе уровня предмета
	if args["уровень предмета"] and not (table.find(item_categories, "набор усиления доспехов") or table.find(item_categories, "дополнение") or table.find(item_categories, "инструмент") or table.find(item_categories, "бой")) then
		if args["тип"] then

			local stat_universal = nil
			fields_cargo["stat_universal"] = stat_universal
			
			if not mw.ustring.find(args.item_categories, "[кК]ольцо") and not mw.ustring.find(args.item_categories, "[оО]шейники скакунов") then
				stat_universal = commaValue(math.ceil(0.9 * string.gsub(args["уровень предмета"], ",", "")))
			elseif args["модуль"] == '8' and mw.ustring.find(args.item_categories, "[кК]ольцо") then
				stat_universal = commaValue(math.ceil(0.8 * string.gsub(args["уровень предмета"], ",", "")/ 2))
			elseif mw.ustring.find(args.item_categories, "[кК]ольцо") then
				stat_universal = commaValue(math.ceil(0.8 * string.gsub(args["уровень предмета"], ",", "")))
			elseif mw.ustring.find(args.item_categories, "[оО]шейники скакунов") then
				stat_universal = commaValue(math.ceil(string.gsub(args["уровень предмета"], ",", "")/ 2))
			end

			if args.item_categories and mw.ustring.find(args.item_categories, "[оО]шейники скакунов") then
				group:tag('span'):wikitext('<span style="color:#50CC3D">На себе: </span><span class="slate">Общий рейтинг</span>: +' .. stat_universal):tag('br'):done()
			elseif args.item_categories and mw.ustring.find(args.item_categories, "[зЗ]наки") then
				group:tag('span'):wikitext('<span class="green">Ячейка знаков:</span> +' .. stat_universal.. ' <span class="slate">Общий рейтинг</span>'):tag('br'):done()
			else
				group:tag('span'):wikitext("+".. stat_universal ..' <span class="slate">Общий рейтинг</span>'):tag('br'):done()
			end
		end
	end

	if args["время восстановления"] then
		group:wikitext('<br><span class="beige" style="display: block;">Время восстановления: ' .. args["время восстановления"] .. 'с</span><br>'):done()
	end

	if args["использовать"] then
		local description = args["использовать"]
		for _, attrib in ipairs(attributes) do
			for _, name in ipairs(attrib.name) do
				description = string.gsub(description, name, '[[' .. attrib.name[1] .. '|<span class="slate">' .. name .. '</span>]]')
			end
		end
		fields_cargo["item_use"] = description
		group:wikitext('<span class="green">Использовать: </span>' .. description):tag('br'):done()
	end	

	local function equip(field_name)
		local equip = args[field_name]	

		if equip then
			local power_name, power_description = equip:match("(.+);(.+)")
	
			for _, info in ipairs(attributes) do
				for _, name in ipairs(info.name) do
					power_description = string.gsub(power_description or equip, name, '[['..info.name[1]..'|<span class="slate">' .. name .. '</span>]]')
				end
			end
			
			-- Выделяем жирным все цифры в power_description, с учетом знака %
			power_description = string.gsub(power_description, '(%d+)%%', '<span style="font-weight:bold;">%1%%</span>')
			power_description = string.gsub(power_description, '(%d+)', '<span style="font-weight:bold;">%1</span>')

			fields_cargo['equip_power'] = (string.find(equip, ";") and power_name .. '; ' ..  power_description:gsub('<br><br>', '<br>') or power_description:gsub('<br><br>', '<br>'))
	
			group:tag('span')
				:wikitext('<span style="color:#50CC3D">На себе: </span>' .. (string.find(equip, ";") and '<span class="green">' .. power_name .. '</span><br> ' .. power_description or power_description))
				:tag('br')
				:done()
		end
	end
	
	equip("на себе")
	equip("на себе2")

	if args["осталось времени боя"] then
		group = h.Group()
		:tag('span')
			:wikitext('Осталось времени боя: ' .. args["осталось времени боя"])
			:tag('br')
			:done()
		content:node(group):tag('br'):done()
	end
	if args["ячейка усиления"] then
		local overload_slot = args["ячейка усиления"]
		group = h.Group()

		for _, info in ipairs(attributes) do
			for _, name in ipairs(info.name) do
				overload_slot = string.gsub(overload_slot, name, '[['..name..'|<span class="slate">' .. name .. '</span>]]')
			end
		end
		fields_cargo["overload_slot"] = mw.ustring.gsub(overload_slot, '<br><br>', '<br>')
		group:tag('span')
			:wikitext('<span class="green">Ячейка усиления: </span> ' .. overload_slot)
			:tag('br')
			:done()
		content:node(group):tag('br'):done()
	end

	--Описание бонуса и особого таланта для профессии

	if args["специализация"] then
		group = h.Group()
			:tag('span')
			:wikitext('<span class="green">Профессия:</span> +' .. args["специализация"] ..  ' <span class="slate">Cпециализация</span>')
			:done()
		content:node(group):tag('br'):done()
	end
	if args["фокус"] then
		group = h.Group()
		:tag('span')
			:wikitext('<span class="green">Профессия:</span> +' .. args["фокус"] ..  ' <span class="slate">Фокус</span>')
			:tag('br')
			:done()
		content:node(group):tag('br'):done()
	end
	if args["коэффициент скорости"] then
		group = h.Group()
		:tag('span')
			:wikitext('<span class="green">Профессия:</span> +' .. args["коэффициент скорости"] ..  '% <span class="slate">Коэффициент скорости</span>')
			:tag('br')
			:done()
		content:node(group):tag('br'):done()
	end
	if args["особый талант"] then
		local power_name, power_description = args["особый талант"]:match("(.+);(.+)")
		group = h.Group()
			:tag('span')
				:wikitext('<span class="green">Особый талант: </span><span class="gold">' .. power_name .. '</span><br> ' .. power_description)
				:tag('br')
				:done()	
		content:node(group):tag('br'):done()
	end
	
	-- Вспомогательный текст
	if args.item_categories then
		if mw.ustring.find( args.item_categories, "[иИ]кона" ) and not mw.ustring.find( args.item_categories, "[тТ]олько для спутников" ) then
			group
				:tag('div')
					:wikitext('<span class="green">Модификация: </span>В этой ячейке будет содержаться бонусный параметр, который выбирается из нескольких особых параметров, предоставляемых эпическими и легендарными артефактами. Выберите «Управление артефактными умениями» в меню предмета, чтобы определиться, какой параметр вставить в ячейку.')
					:done()
				:tag('div')
					:wikitext('<span class="green">Модификация: </span>В этой ячейке будет содержаться усиление к одной из 10 классовых особенностей, относящихся к вашему классу. Выберите «Управление артефактными умениями» в меню предмета, чтобы определиться, какое усиление вставить в ячейку.')
					:done()
		elseif mw.ustring.find( args.item_categories, "[еЕ]да" ) then
			group = h.Group()
			:tag('div')
				:wikitext('Одновременно можно получить только один бонус от пищи.')
				:done()
			content:node(group):tag('br'):done()
		end
	end

	-- Ячейка усиления
	if (args.item_categories and table.find(item_categories, {"голова", "доспехи", "руки", "ноги", "шея", "кольцо", "пояс", "рубаха", "штаны"}) and not (table.find(item_categories, "бесплатное изменение внешнего вида") or table.find(item_categories, "только для спутников"))) then
		group = h.Group('slots')
			:tag('span') 
				:attr('class', 'irslot')
				:wikitext('Усиленный: <span class="gray">Пусто</span>')
				:tag('br')
				:done()
		content:node(group):tag('br'):done()
	end

	-- Комлект предметов
	if args["комплект"] then
		local set_name = args["комплект"]
		fields_cargo["item_set"] = set_name
		group = h.Group()
		
		local tables = 'Items'
		local fields = 'Items.name, Items.item_set, Items.item_type, Items.requires_class'
		local args_items_table = {
			where = 'Items.item_set = "'.. args["комплект"] .. '"',
			orderBy = 'Items._pageName',
		}
		
		if args["требуется класс"] then
			args_items_table.where = args_items_table.where .. ' AND Items.requires_class HOLDS LIKE "%' .. args["требуется класс"] .. '%"'
		end
	
		local result = cargo.query( tables, fields, args_items_table )

		local armor_set_data = armor_set_powers_data[set_name]
		local weapon_set_data = weapon_set_powers_data[set_name]

		-- Список предметов комплекта
		local set_items = {} -- Переменная для хранения названий требуемых предметов для комплекта
		local num_set_items = 0 -- Переменная для хранения количества требуемых предметов для комплекта

		if armor_set_data and armor_set_data.set_items then
			for _, item in ipairs(armor_set_data.set_items) do
				table.insert(set_items, '<div><span class="gray" style="margin-left: 1.25em;">'.. item ..'</span></div>')
			end
			num_set_items = #set_items
		else
			local unique_item_types = {}
		
			for _, item in ipairs(result) do
				local name = item['Items.name']
				local categorie = item['Items.item_type']
			
				-- Добавление нового предмета в таблицу set_items
				table.insert(set_items, { name = name, categorie = categorie })
		
				-- Подсчет уникальных типов предметов
				if not unique_item_types[categorie] then
					unique_item_types[categorie] = true
					num_set_items = num_set_items + 1
				end
			end
		end		

		local tbl = mw.html.create('table')
		local tr = tbl:tag("tr")
		tr:tag("td"):attr("colspan", "2"):wikitext('Комплект «' .. set_name .. '» (0/'.. num_set_items ..')'):done()

		if armor_set_data and armor_set_data.set_items then
			for index, set_item in ipairs(armor_set_data.set_items) do
				tr = tbl:tag("tr")
				tr:tag("td"):wikitext('<div><span class="gray" style="margin-left: 1.25em;">'.. set_item ..'</span></div>')
			end
		else
			local grouped = {}
			local unique_types = {}
			
			-- Группировка предметов по типам
			for _, item in ipairs(set_items) do
				grouped[item.categorie] = grouped[item.categorie] or {}
				table.insert(grouped[item.categorie], item.name)
			end
			
			for _, names in pairs(grouped) do
				if #names > 1 then
					tr = tbl:tag("tr")
					tr:tag("td"):attr("colspan", "2"):wikitext('<span class="gray" style="margin-left: 1.25em;">Одно из перечисленного:</span>'):done()
					tr = tbl:tag("tr")
					for _, name in ipairs(names) do
						tr = tbl:tag("tr")
						tr:tag("td"):wikitext('<div><span class="gray" style="margin-left: 2.50em;">' .. name .. '</span></div>'):done()
					end
				else
					table.insert(unique_types, names[1])
				end
			end
			
			for _, name in ipairs(unique_types) do
				tr = tbl:tag("tr")
				tr:tag("td"):wikitext('<div><span class="gray" style="margin-left: 1.25em;>' .. name .. '</span></div>'):done()
			end
		end
		group:tag('span'):wikitext(tostring(tbl)):done()

		-- Описание бонуса комплекта
		tbl = mw.html.create('table')

		tr = tbl:tag("tr"):attr('style', 'vertical-align: top;')
		tr:tag("td"):wikitext('<span class="gray"> ' .. num_set_items ..' из комплекта:</span>'):done()

		if table.find(item_categories, {"голова", "доспехи", "руки", "ноги", "шея", "кольцо", "пояс", "рубаха", "штаны", "артефакт"}) then
			local description = (armor_set_data and armor_set_data.description) or string.format(error_list.no_found_set_in_data, set_name)
			for _, info in ipairs(attributes) do
				for _, name in ipairs(info.name) do
					description = string.gsub(description, name, '<span class="slate">' .. name .. '</span>')
				end
			end
			tr:tag("td"):wikitext('<span class="gray"> ' .. description .. '</span>'):done()
		elseif table.find(item_categories, {"оружие", "клинок", "темляк", "икона", "талисман", "щит", "гримуар"}) then
			tr:tag("td"):wikitext('<span class="gray"> ' .. weapon_set_data .. '</span>'):done()
		end

		group:tag('span'):wikitext(tostring(tbl)):tag('br'):done()

		content:node(group):done()
	end

	-- Проверка наличия категории у предмета и ее сравнение с "скакун"
	if args.item_categories and mw.ustring.lower(args.item_categories) == "скакун" then
		-- Создание объекта группы 'slots'
		local group = h.Group('slots')

		-- Цикл по четырем ячейкам
		for i = 1, 4 do
			-- Получение текущей ячейки
			local current_slot = args["ячейка" .. i]

			-- Проверка, что ячейка не пуста
			if current_slot then
				-- Добавление информации о ячейке в таблицу Cargo
				fields_cargo["slot" .. i] = current_slot

				-- Определение стиля ячейки в зависимости от ее содержимого
				local slot_style = mw.ustring.lower(current_slot) == "универсальная ячейка" and 'muslot' or 'slot'

				-- Вывод информации о ячейке
				group:tag('span'):addClass(slot_style):wikitext(mw.getContentLanguage():ucfirst(current_slot) .. ': <span class="gray">Нет знаков</span>'):tag('br'):done()
			end
		end

		content:node(group):tag('br'):done()
	end

	-- Вспомогательный текст для сундука
	if args.item_categories and mw.ustring.find(args.item_categories, "[сC]ундук") then
		if args["описание"] then	
			group = h.Group()
			:tag('div')
			:wikitext('Тармалунские обменные слитки в количестве от 10 до 18 шт.<br>Чтобы открыть этот сундук, нужен <span class="epic">зачарованный ключ</span>.')
			:done()	
			content:node(group):tag('br'):done()
		end		
	end

	-- Содержимое сундуков/наборов
	if args["содержимое"] then
		group = h.Group()
			:tag('div')
				:attr('class', '')
				:wikitext(args["содержимое"])
				:done()
		content:node(group):tag('br'):done()
	end

	-- Вспомогательный текст для сундука
	if args.item_categories and mw.ustring.find(args.item_categories, "[сC]ундук") then
		if args["описание"] == nil then
			group = h.Group()
				:tag('div')
					:wikitext('Тармалунские обменные слитки в количестве от 10 до 18 шт.<br>Чтобы открыть этот сундук, нужен <span class="epic">зачарованный ключ</span>.')
					:done()	
			content:node(group):tag('br'):done()
		end	
	end
    
	if args["усиленный"] then
		--fields_cargo["item_use"] = args["усиленный"]
		group = h.Group()
			:wikitext('<span class="green"">Усиленный: </span>' .. args["усиленный"])
			:tag('br')
			:done()
		content:node(group):tag('br'):done()
	end

	-- Описание предмета
	if args["описание"] then
		fields_cargo["description"] = args["описание"]
		group = h.Group()
			:tag('span')
				:attr("class", "slate")
				:wikitext(args["описание"])
				:tag('br'):done()
		content:node(group):tag('br'):done()
	end
    if args["осталось времени"] then
		content 		
			:tag('div') 
				:attr('class', 'left')
				:wikitext('Осталось времени: ' .. args["осталось времени"])
    end

	-- Вспомогательный текст для знаков скакунов
	if args.item_categories and table.find(item_categories, "знаки") then
		group = h.Group()
		:tag('div') :attr('class', 'slate'):wikitext('Знаки дают бонусы и повышают параметры, если их вставить в ячейки скакуна в конюшне.'):tag('br'):done()
		content:node(group):tag('br'):done()
	end

	-- Вспомогательный текст для волшебных камней
	if args.item_categories and table.find(item_categories, "бонус") then
		group = h.Group()
		:tag('div') :attr('class', 'slate'):wikitext('Этот волшебный камень можно вставлять в бонусные ячейки.'):tag('br'):done()
		content:node(group):tag('br'):done()
	end

	-- Максимальное количество и недельный лимит валюты
	if args["maximumQuantity"] or args["weeklyLimit"] then
		group = h.Group()
		if args["maximumQuantity"] then
			group
			:tag('span')
				:wikitext('Максимальное количество: ' .. args["maximumQuantity"])
				:tag('br')
				:done()
		end
		if args["weeklyLimit"] then
			group
			:tag('span') 
				:wikitext('Недельный лимит: ' .. args["weeklyLimit"])
				:tag('br')
				:done()
		end
		content:node(group):tag('br'):done()
	end

	-- Item coupon message
	if args.item_categories and table.find(item_categories, "купон") then
		group = h.Group()
			:tag('p'):wikitext('Вы можете использовать этот купон на рынке ZEN.'):done()
			:tag('p'):wikitext('При покупке вы можете использовать только один купон.'):done()
			:tag('p'):wikitext('Действие купона не суммируется со специальными скидками. Применяется та скидка, которая дает больший эффект.'):done()
		content:node(group):done()
	end

	-- Флаги предмета
	if args.item_categories then 
    	local item_types = {}
		for i in mw.text.gsplit(args.item_categories, ",%s*") do
			table.insert(item_types, mw.getContentLanguage():ucfirst(i))
		end
		fields_cargo["categories"] = args.item_categories
    	content:tag('div') :attr('class', 'left'):wikitext(table.concat(item_types, ", ")):done()
    end

	-- Ранг удивительного предмета
	if args.item_categories and table.find(item_categories, "удивительный предмет") then
		local rank = tonumber(args["ранг"])
		if rank == 7 then
			content:tag('span')
				:addClass('left')
				:wikitext("Ранг: 7 (максимум)")
		elseif rank and rank > 7 then
			error("Не существует удивительного предмета с таким рангом!")
		elseif rank and rank >= 1 and rank <= 6 then
			local nextRank = {1, 3, 10, 25, 100, 500}
			content:tag('span')
				:addClass('left')
				:wikitext("Ранг: " .. rank .. " (0/" .. nextRank[rank] .. " до следующего ранга)")
		end
	end

	-- Требуемый класс
    if args["требуется класс"] then
    	local requires_class = {}
		for i in mw.text.gsplit(args["требуется класс"], ",%s*") do
			table.insert(requires_class, mw.getContentLanguage():ucfirst(i))
		end
		fields_cargo["requires_class"] = table.concat(requires_class, ", ")
    	content:tag('div'):attr('class', 'left'):wikitext('Требуется класс: ' .. table.concat(requires_class, ", ")):done()
    end

	-- Требуемый минимальный уровень для экипировки предмета
	if args.item_categories and not (mw.ustring.find(args.item_categories, "[сС]путник") or mw.ustring.find(args.item_categories, "[сС]какун") or args["требуется уровень профессии"]) then
		local item_min_level = args["минимальный уровень"] or "Нет требования к уровню"
		fields_cargo["item_min_level"] = item_min_level
		content:tag('div'):attr('class', 'left'):wikitext(args["минимальный уровень"] and 'Минимальный уровень: ' .. args["минимальный уровень"] or 'Нет требования к уровню')
	end

	-- Требуемый уровень професии
	if args.item_categories and args["требуется уровень профессии"] then
		local prof_min_level = args["требуется уровень профессии"]
		fields_cargo[""] = prof_min_level
		content:tag('div'):attr('class', 'left'):wikitext('Требуется уровень профессии: ' .. args["требуется уровень профессии"])
	end

	-- Вспомогательный текст для артефактов
	if args.item_categories and (table.find(item_categories, "артефакт") or table.find(item_categories, "волшебный камень")) and mw.ustring.lower(args["качество"]) == 'мифический' then
		content:tag('div'):attr('class', 'left gold'):wikitext('Максимальное качество'):tag('br'):done()
	end

	-- Стоимость продажи предмета
    if args["цена продажи"] then
        if mw.ustring.lower(args["цена продажи"]) == 'нпнв' then
            content:tag('div'):addClass('right'):wikitext("Невозможно продать<br>Нельзя выбросить") 
		elseif mw.ustring.lower(args["цена продажи"]) == 'невозможно продать' then
			content:tag('div'):addClass('right'):wikitext(mw.getContentLanguage():ucfirst(args["цена продажи"])) 
        elseif args["цена продажи"] ~= "" then
            content:tag('div'):addClass('right'):wikitext(frame:expandTemplate{title = 'Валюта',args = {args["цена продажи"]}})
        end
    elseif args.item_categories and (mw.ustring.find( args.item_categories, "[сС]какун" ) or mw.ustring.find( args.item_categories, "[сС]путник" ) or mw.ustring.find( args.item_categories, "[вВ]алюты событий" ) or mw.ustring.find( args.item_categories, "[вВ]алюты кампаний" )) then
			content:tag('div'):addClass('right'):wikitext('Невозможно продать')
	elseif args.item_categories and args["качество"] then
		local sell_price = {
			['необычный'] = '1013',
			['редкий'] = '3418',
			['эпический'] = table.find(item_categories, {"шляпа (стиль)", "тело (стиль)", "ноги (стиль)"}) and '442' or '16043',
			['легендарный'] = '32086',
			['мифический'] = '48129'
		}
		content:tag('div') :addClass('right'):wikitext(frame:expandTemplate{title = 'Валюта',args = {sell_price[mw.ustring.lower(args["качество"])]}})
	else
		content:tag('div') :attr('class', 'right'):wikitext('Невозможно продать')
    end

    if args["очки обработки"] then
		content:tag('div'):addClass('right'):wikitext('[[Файл:Currency_Icon_Refinementpoints.png|x14px|ссылка=]]&nbsp;' .. args["очки обработки"])
	elseif args.item_categories and table.find(item_categories, {"голова", "руки", "доспехи", "ноги", "кольцо"}) then
		local refinement_points = {
			["необычный"] = '50',
			["редкий"] = '150',
			["эпический"] = '300',
			["легендарный"] = '330',
			["мифический"] = '365',
		}
		local quality = mw.ustring.lower(args["качество"] or '')
		local points = refinement_points[quality] or '0'

		content:tag('div'):attr('class', 'right'):wikitext('[[Файл:Currency_Icon_Refinementpoints.png|x14px|ссылка=]]&nbsp;' .. points)
    end

	--Добавляет иконку предмета в нижней части подсказки
    if args["иконка"] then
		fields_cargo["icon"] = args["иконка"]
		content:tag('div') :attr('style', 'text-align: center'):wikitext('[[Файл:' .. args["иконка"] .. '|64px|ссылка=]]')
    end
    
	-- Функция сравнения ячеек скакуна и бонуса
	-- horse_cells: таблица с ячейками скакуна
	-- bonus_cells: таблица с ячейками бонуса
	-- Возвращает true, если ячейки скакуна совпадают с ячейками бонуса
	if args.item_categories and table.find(item_categories, "скакун") then
		local function checkHorseBonusMatch(horse_cells, bonus_cells)
			local match = true -- Переменная, обозначающая, совпадают ли ячейки
			local used_cells = {} -- Таблица, содержащая индексы использованных ячеек
			
			-- Проверяем, что количество ячеек в скакуне и бонусе совпадает, если нет, то проверяем частичное совпадение для определенных случаев
			if #horse_cells ~= #bonus_cells then
				if (#horse_cells == 3 and #bonus_cells == 4) then
					match = false -- Если нет частичного совпадения, возвращаем false
				end
			end
		
			-- Перебираем ячейки скакуна
			for i, horse_cell in pairs(horse_cells) do
				local found_match = false -- Переменная, обозначающая, найдено ли совпадение
		
				-- Перебираем ячейки бонуса
				for j, bonus_cell in pairs(bonus_cells) do
					if horse_cell == bonus_cell and not used_cells[j] then
						-- Если ячейки совпадают и ячейка не использована ранее
						used_cells[j] = true -- Отмечаем ячейку, как использованную
						found_match = true -- Обозначаем, что найдено совпадение
						break -- Прерываем цикл по ячейкам бонуса
					end
				end
				
				-- Если совпадение не найдено, то проверяем, есть ли у скакуна универсальная ячейка
				if not found_match and horse_cell ~= "Универсальная ячейка" then
					match = false -- Иначе, ячейки не совпадают
					break -- Прерываем цикл по ячейкам скакуна
				else
					found_match = true -- Помечаем, что найдено совпадение
				end
			end
			return match -- Возвращаем результат сравнения
		end

		local tables = 'Insignia_bonuses'
		local fields = 'name, slot1, slot2, slot3, slot4'
		local args_insignia_bonuses = {orderBy = 'name'}
		local result = cargo.query(tables, fields, args_insignia_bonuses)
		local insignia_bonuses = {}

		for _, item in pairs(result) do
			local horse_insignias = {}
			local bonus_insignias = {}
			for i = 1, 4 do
				local bonus_insignia = item["slot"..i]
				if bonus_insignia ~= '' then
					table.insert(bonus_insignias, bonus_insignia)
				end
				local horse_insignia = args["ячейка"..i]
				if horse_insignia ~= '' then
					table.insert(horse_insignias, horse_insignia)
				end
			end
			if checkHorseBonusMatch(horse_insignias, bonus_insignias) then
				table.insert(insignia_bonuses, item.name)
			end
		end
		-- Добавляет результат в поле "insignia_bonuses" таблицы "fields_cargo".
		fields_cargo["insignia_bonuses"] = table.concat(insignia_bonuses, ', ')
	end

	if args["коллекция"] then
		fields_cargo["collection"] = args["коллекция"]
	end

	if args["удален"] then
		fields_cargo["removed"] = args["удален"]
	end

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

	-- Получаем название текущей страницы в качестве аргумента для поиска информации
	local item_title = mw.title.getCurrentTitle().fullText

	--Поиск торговцев, у которых можно купить предмет.
	local vendorTables = 'Cost, NPCs'
    local vendorFields = 'Cost.merchant, Cost.item, NPCs._pageName, NPCs.zone'
    local vendorArgs = {
        join = 'Cost.merchant = NPCs._pageName',
        where = 'Cost.item="' .. item_title .. '"',
    }
    local vendor_result = cargo.query( vendorTables, vendorFields, vendorArgs )

	--Поиск сундуков/наборов, в которых может содержатся предмет.
	local containsTables = 'Contains'
	local containsFields = '_pageName, name, contains_item, quantity'
	local containsArgs = {
		where = 'contains_item = "' .. item_title .. '"',
		orderBy = '_pageName',
	}
	local contains_result = cargo.query( containsTables, containsFields, containsArgs )

	--Поиск предмета в профессиях, если предмет создается в мастерской
	local recipesTables = 'Recipes'
	local recipesFields = 'name, professions, source, level'
	local recipesArgs = {
		where = 'name = "' .. item_title .. '"',
		orderBy = '_pageName',
	}
	local recipes_result = cargo.query( recipesTables, recipesFields, recipesArgs )

	-- Создаем массив для местоположений и добавляем местоположения, где можно найти предмет
	local locations = {}

	--Показ торговцев, где продается предмет
	if #vendor_result > 1 then
		table.insert(locations, '&#42; Торговцы расходуемыми предметами <span style="font-size: 13px">(см. подробнее на странице предмета)</span>')
	else
		-- Если предмет продается у торговцев, добавляем их в переменную "locations"
		for _, row in ipairs(vendor_result) do
			if row['Cost.merchant'] ~= nil and row['NPCs.zone'] ~= nil then
				table.insert(locations, string.format('&#42; [[%s]] <span style="font-size: 13px">(торговец в [[%s]])</span>', row['Cost.merchant'], row['NPCs.zone']))
			else
				-- Если предмет продается в магазине кампании
				local merchant = row['Cost.merchant']
				--[[if string.find(merchant, "Кампания") ~= nil then
					zone = "Магазин кампании" or ''
				end]]--
				table.insert(locations, string.format('&#42; [[%s]] <span style="font-size: 13px">(Магазин кампании)</span>', merchant))
			end
		end
	end

	--Показ сундуков, где выпадет предмет
	if #contains_result > 1 then
		table.insert(locations, '&#42; Сундуки <span style="font-size: 13px">(см. подробнее на странице предмета)</span>')
	else
		for _,row in ipairs(contains_result) do
			table.insert(locations, '&#42; ' .. item_icon.Main({args={row._pageName,""}}))
		end
	end

	--Показ рецептов, где создается предмет
	for _, profession in ipairs(recipes_result) do
		local count = 0 -- переменная для подсчета количества профессий

		for _ in string.gmatch(profession.professions, "[^,]+") do
			count = count + 1
		end

		-- Если предмет создается через мастерские рецепты
        if profession.source ~= nil then
            table.insert(locations, '&#42; ' .. item_icon.Main({args={profession.source,""}}))              
        else -- Если предмет создается через стандартные рецепты
			table.insert(locations, '&#42; Професс' .. (count > 1 and 'ии: ' or 'ия: ') .. profession.professions .. ' (уровень ' .. profession.level ..')')
        end
	end

	--Добавление пользовательских местонахождении предмета (если они есть).
	if args["locations"] then
		fields_cargo["locations"] = args["locations"]
		for location in mw.text.gsplit(args["locations"], ";%s*") do
			table.insert(locations, '&#42; ' .. location)
		end
	end

	content 		
		:tag('div')
			:attr('class', 'gold locations')
			:wikitext('<hr>\nЭто можно найти здесь:<br>' .. table.concat(locations, '<br>'))
			
	--Конец кода (Показ торговцев/сундуков/рецептов, где продается/выпадет/создается предмет)

    container:node(content)

	-- Cargo tables
	local APPEARANCES_TABLE = "Items"

	--Добавляет значение аргумента "умения" в поле "powers" таблицы "fields_cargo".
	fields_cargo["powers"] = args["умения"]

	--Добавляет значение аргумента "умение спутника" в поле "pet_power" таблицы "fields_cargo".
	for i = 1, 6 do
		if args["умение спутника"..i] then
			fields_cargo["pet_power"..i] = args["умение спутника"..i]
		end
	end

	--Добавляет значение аргумента "тип" в поле "item_type" таблицы "fields_cargo".
	fields_cargo["item_type"] = args["тип"]
	--Добавляет значение аргумента "очки коллекции" в поле "collection_score" таблицы "fields_cargo".
	fields_cargo["collection_score"] = args["очки коллекции"]

	if args["удален"] == nil then
		frame:callParserFunction("#cargo_store:_table=" .. APPEARANCES_TABLE, fields_cargo)
	end
	
	container
		:tag('div'):addClass('bottom')
		:tag('div'):addClass('blcorner'):done()
		:tag('div'):addClass('brcorner'):done()
		:tag('div'):addClass('bedge'):done()

    return container
end

function h.Group(class)
    return mw.html.create('span')
		:attr( 'class', 'group ' .. (class or '') )
end

function h.divContent(class)
    return mw.html.create('div')
        :attr( 'class', 'content ' .. (class or '') )
end

return p
Advertisement