Path of Exile Wiki

Wiki поддерживается сообществом, поэтому подумайте над тем, чтобы внести свой вклад.

ПОДРОБНЕЕ

Path of Exile Wiki
Trympyrym633@legacy41979389 (обсуждение | вклад)
Нет описания правки
Trympyrym633@legacy41979389 (обсуждение | вклад)
Нет описания правки
Строка 221: Строка 221:
 
args.belowStats:node(icons)
 
args.belowStats:node(icons)
 
end
 
end
  +
if args.screenshot ~= nil then
 
screenshot = '[[File:' .. args.screenshot .. '|' .. '300x300px' .. '|thumb|right]]'
 
end
 
if args.animation ~= nil then
 
animation = '[[File:' .. args.animation .. '|' .. '300x300px' .. '|thumb|right]]'
 
end
 
 
else
 
else
 
args.belowStats = mw.html.create('div')
 
args.belowStats = mw.html.create('div')
Строка 233: Строка 228:
 
:wikitext( '[[Category:' .. category .. ']]' )
 
:wikitext( '[[Category:' .. category .. ']]' )
 
end
 
end
return tostring( p._itembox(args) .. screenshot .. animation )
+
local result = p._itembox(args)
 
if args.screenshot ~= nil then
 
result = result .. '[[File:' .. args.screenshot .. '|' .. '300x300px' .. '|thumb|right]]'
 
end
 
if args.animation ~= nil then
 
result = result .. '[[File:' .. args.animation .. '|' .. '300x300px' .. '|thumb|right]]'
 
end
  +
return tostring(result)
 
end
 
end
   

Версия от 10:00, 7 июня 2016

Template info icon Документация модуля[просмотр] [править] [история] [очистить]

Модуль item (предмет) используется для работы с информацией о предметах и отображении ее различными способами (таблицы, инфоокна, ссылки)

Использование

Каждый предмет имеет свою собственную страницу, на которой хранится информации о предмете. Обращение к этой информации происходит при помощи команды #invoke: item

<onlyinclude>{{#invoke:item|item
|name = Item Name

... различные аргументы (типа Image, Armour, StackSize, Art и все прочее, чему можно задать значения)...

}}</onlyinclude>

Таким образом отображается инфоокно предмета и выбирается информация, которая будет отображена на остальных страницах. Для примера посмотрите Wurm's Molt.


Параметры

Все параметры, кроме Name (наименование) - опциональны. Их можно не указывать либо оставлять пустыми.

Параметр Описание
Name Наименование предмета
SortKey Ключ для сортировки, необходимый для работы таблицы (например Hoarder, The - т.е. сначала сортировка будет идти по слову Hoarder, игнорируя The)  – По умолчанию совпадает с Name
PageName Наименование страницы в вики page – По умолчанию совпадает с Name
Image Картинка предмета  – По умолчанию установлено PageName.png
Аrt Тоже картинка, но другая. В частности большая картинка для Гадальных карт задается именно этим параметром  – По умолчанию установлено PageName.png
Size Размер предмета в клетках  – Возможные значения (не все): 1x1, 2x2, and 2x4. По умолчанию установлено в соответствии с типом предмета.
Rarity Редкость предмета  – Только для оружия, брони, аксессуаров, флаконов и карт. Допустимые значения: Normal (Обычный), Magic (Магический), Rare (Редкий) и Unique (уникальный). По умолчанию Normal.
Type Тип предмета для задания формата выводимых данных – Допустимо: Weapon (Оружие), Armour(Броня), Accessory(Аксессуар), Flask(Флакон), Map(Карта), Currency (Валюта), Quest (Квестовый), Microtrans (Покупное) и Card (Гадальные карты).
Subtype Подтип предмета – Допустимые значения (не все): Axe(Топор), Staff(Посох), Gloves(Перчатки), Body Armour(Нагрудная броня), and Ring (Кольца) и т.п..
BaseItem База предмета. Для уникальных предметов
RequiredLevel Требования к уровню персонажа
RequiredStrength Требования к силе персонажа
RequiredDexterity Требования к ловкости персонажа
RequiredIntelligence Требования к интеллекту персонажа
PhysicalDamage Физический урон оружия
FireDamage Урон от огня оружия
ColdDamage Урон от холода оружия
LightningDamage Урон от молнии оружия
ChaosDamage Урон хаосом оружия
AverageDamage Средний урон; Например у Диадус (вероятно посчитан неправильно)
CriticalStrikeChance Шанс на критический урон
AttacksPerSecond Атак в секунду
Range Дальность оружия
Armour Показатель брони на частях броне
Evasion Показатель уклонения на частях броне
EnergyShield Показатель энергетического щита на частях брони
Block Шанс блока щитом
MapLevel Уровень монстров на карте
MapTier Уровень карты
MapGuild Тег гильдии
ItemQuantity Модификаторы количества предметов для карт
ItemRarity Модификатор качества предметов выпадаемых на картах.
MonsterPack Модификатор размера группы монстров.
StackSize Максимум единиц в стопке для валюты и т.п.
Effect Эффект при использовании. Например для флаконов, валюты, покупных эффектов и прочего.
FlaskLife Объем восстановления здоровья флаконом
FlaskMana Объем восстановления маны флаконом
FlaskDuration Длительность действия флакона
FlaskCharges Вместительность зарядов
FlaskChargesUsed Сколько тратится зарядов за одно использование
ImplicitMods Собственный свойства предмета  – Разделяйте строки кодом <br>.
RandomMods Случайные (внешние, приобретенные, не собственные) свойства  – Разделяйте строки кодом <br>.
Cosmetic Косметический эффект на предмете – Разделяйте строки кодом <br>.
FlavourText Художественный текст
HelpText Вспомогательный текст
Reward Награда (к примеру за набор гадальных карт)
Drop Место выпадения предмета
Monsters С каких монстров падет предмет

Дополнительные параметры, используемые для камней умений и камней поддержки

Параметр Описание Примечания по формату
Attributes Список атрибутов камня Принимается "Сила", "Ловкость" и "Интеллект", разделенные запятой. Пример: "Сила, Интеллект".
Tags Список тегов камня Каждый тег указывается с большой буквы, теги разделяются запятой. Пример: "Чары, Огонь, Длится"
ManaCost Расход маны "от Х до У", где Х и У - целые числа
SoulCost Расход душ Для умений ваал. Принимает целое число
noSoul Нельзя получать души Для умений ваал. Указывается в секундах.
CanStoreUses Максимальное число зарядов умения Принимает целое число. Используется для умений ваал и для умений с мульти-перезарядкой.
CooldownTime Время перезарядки Указывается в секундах, целая часть от десятичной отделяется точкой. После точки 2 знака. Пример: "3.00"
CastTime Время на применение Указывается в секундах, целая часть от десятичной отделяется точкой. Пример: "0.5"
CritChance Шанс на критический удар
DamageEffectiveness Эффективность урона Указывается в процентах. Пример: "130"
ManacostMultiplier Множитель маны Указывается в процентах. Пример: "140"
ManaReserved Удержание маны Указывается в процентах. Пример: "35"
SkillDescriptionText Описание умения
GemIcon Иконка камня умения Как камень выглядит в инвентаре. Если параметр не задан, используется "<PageName> gem icon.png"
SkillIcon Иконка умения Как умение выглядит на панели умений. Только для камней умений. Если параметр не задан, используется "<PageName> skill icon.png"
Symbol Литера камня поддержки Как отображается усиление умения этим камнем в панели умений. Только для камней поддержки.
SymbolColor Цвет фона литеры камня поддержки Принимает значение 'Red', 'Green' и 'Blue'. Если параметр не указан, используется 'Red'
QualityEffect Эффект 1% качества

Числовые значение

Есть два вариант числовых значений: диапазон урона и случайные значения. Смотрите discussion чтобы ознакомиться с различиями и необходимостью каждого из вариантов.

Диапазон урона - это два числа, разделенных дефисом (dash) (&ndash;), указывающие границы возможного урона для вычислительных нужд.Такой метод отображения очень похож на игровой:

  • Физический урон: 15–23
  • Добавляет 48–72 урона от огня

Случайное значение - это два числа разделенных словом "to" и заключенные в скобки. Таким образом показывается возможное значение для показателя при нахождении предмета.В игре вы этого не увидите, но здесь они приведены для справки.

  • Уклонение: (от 80 до 91)
  • +(от 60 до 80) к максимуму здоровья
  • (от 10 до 20)% повышение скорости атаки
  • Добавляет (от 15–25 до 24–35) урона хаосом

local p = {}
local h = {}
local views = {}
local getArgs, roundAndPad

---------------------------------------------------------------------
-- Implements {{item}}
---------------------------------------------------------------------
function p.item(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		parentFirst = true
	})
	args.view = args.view or args.View or 'full'
	if not views[args.view] then
		error('The requested view "' .. args.view .. '" does not exist')
	end
	args.format = args.format or args.Format
	args.name = args.name or args.Name
	args.pageName = args.pageName or args.PageName or args.pagename or args.Pagename or args.name
	args.art = args.art or args.Art or args.pageName .. ' card art.png'
	args.size = args.size or args.Size or '2x_'
	args.rarity = args.rarity or args.Rarity or 'Normal'
	args.type = args.type or args.Type
	args.subtype = args.subtype or args.Subtype
	args.baseItem = args.baseItem or args.BaseItem
	args.baseItemPage = args.baseItemPage or args.BaseItemPage or args.baseItem
	args.level = args.level or args.RequiredLevel
	args.strength = args.strength or args.RequiredStrength
	args.dexterity = args.dexterity or args.RequiredDexterity
	args.intelligence = args.intelligence or args.RequiredIntelligence
	args.physical = args.physicalDamage or args.PhysicalDamage
	args.fire = args.fire or args.FireDamage
	args.cold = args.cold or args.ColdDamage
	args.lightning = args.lightning or args.LightningDamage
	args.chaos = args.chaos or args.ChaosDamage
	args.averageDamage = args.averageDamage or args.AverageDamage
	args.critChance = args.critChance or args.CriticalStrikeChance or args.CritChance
	args.attacksPerSecond = args.attacksPerSecond or args.AttacksPerSecond
	args.blockChance = args.blockChance or args.Block
	args.armour = args.armour or args.Armour
	args.evasion = args.evasion or args.Evasion
	args.energyShield = args.energyShield or args.EnergyShield
	args.mapLevel = args.mapLevel or args.MapLevel
        args.mapTier = args.mapTier or args.MapTier
	args.itemQuantity = args.itemQuantity or args.itemQuantity
	args.radius = args.radius or args.Radius
	args.limit = args.limit or args.Limit
	args.stackSize = args.stackSize or args.StackSize
	args.effect = args.effect or args.Effect
	args.life = args.life or args.FlaskLife
	args.mana = args.mana or args.FlaskMana
	args.duration = args.duration or args.FlaskDuration
	args.chargeCap = args.chargeCap or args.FlaskCharges
	args.chargeUse = args.chargeUse or args.FlaskChargesUsed
	args.implicitMods = args.implicitMods or args.ImplicitMods
	args.randomMods = args.randomMods or args.RandomMods
	args.cosmeticMods = args.cosmeticMods or args.CosmeticMods
	args.helpText = args.helpText or args.HelpText
	args.flavourText = args.flavourText or args.FlavourText
	args.reward = args.Reward or args.reward
	args.drop = args.drop or args.Drop
	args.variations = args.variations or args.Variations
	args.variations = tonumber(args.variations)
	args.talismanTier = args.talismanTier or args.TalismanTier
	args.tags = args.tags or args.Tags
	args.manaCost = args.manaCost or args.ManaCost
	args.canStoreUses = args.canStoreUses or args.CanStoreUses
	args.cooldownTime = args.cooldownTime or args.CooldownTime or args.Cooldown
	args.castTime = args.castTime or args.CastTime
	args.damageEffectiveness = args.damageEffectiveness or args.DamageEffectiveness
	args.manacostMultiplier = args.manacostMultiplier or args.ManacostMultiplier
	args.skillDescriptionText = args.skillDescriptionText or args.SkillDescriptionText
	args.gemIcon = args.gemIcon or args.GemIcon or args.name .. ' gem icon.png'
	args.skillIcon = args.skillIcon or args.SkillIcon or args.pageName .. ' skill icon.png'
	args.symbol = args.symbol or args.Symbol
	args.symbolColor = args.symbolColor or args.SymbolColor
	args.soulCost = args.soulCost or args.SoulCost
	args.qualityEffect = args.qualityEffect or args.QualityEffect
	args.prophecyText = args.prophecyText or args.ProphecyText
	args.manaReserved = args.manaReserved or args.ManaReserved
	args.attributes = args.attributes or args.Attributes
	args.corrupted = args.corrupted or args.Corrupted
	args.radius = args.radius or args.Radius
        args.screenshot= args.screenshot or args.Screenshot
        args.animation= args.animation or args.Animation
	
	if args.type == 'Gem' then
		args.image = args.gemIcon
	end
	
	if args.type == 'Decoration' then
        args.image = args.image or args.Image or args.pageName .. ' Decoration.png'
        args.effect = args.effect or 'Создаёт объект в вашем убежище'
        args.helpText = args.helpText or 'Щелкните правой кнопкой мыши по предмету и затем левой по области на земле, чтобы создать объект'
    else
        args.image = args.image or args.Image or args.pageName .. '.png'
    end
	
	if args.view == 'full' and args.type == 'Gem' then
		if args.subtype == 'Support' then
			args.helpText = args.helpText or 'Это камень поддержки. Он дает преимущества не герою, а камню умения в связанных гнездах. Вставьте камень поддержки в гнездо, соединенное с гнездом усиливаемого камня активного умения. Щелкните ПКМ, чтобы вынуть камень из гнезда.'
		elseif args.subtype == 'Skill' then
			args.helpText = args.helpText or 'Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда.'
		end
	end
	
	return views[args.view](args, frame)
end

---------------------------------------------------------------------
-- Views
---------------------------------------------------------------------
function views.full(args, frame)
	args.stats = h.statsBuilder(args)
	args.class = 'itembox-full'
	args.name = '[[' .. args.pageName .. '|' .. args.name .. ']]'
	args.baseItem = args.baseItem and ('[[' .. args.baseItemPage .. '|' .. args.baseItem .. ']]') or nil
	local types = {
		['Weapon'] = {
			['Bow'] = 'Луки',
			['Claw'] = 'Когти',
			['Dagger'] = 'Кинжалы',
			['Wand'] = 'Жезлы',
			['Fishing Rod'] = 'Удочки',
			['Staff'] = 'Посохи',
			['One Handed Axe'] = 'Одноручные топоры',
			['Two Handed Axe'] = 'Двуручные топоры',
			['One Handed Mace'] = 'Одноручные булавы',
			['Two Handed Mace'] = 'Двуручные булавы',
			['One Handed Sword'] = 'Одноручные мечи',
			['Two Handed Sword'] = 'Двуручные мечи',
			['Лук'] = 'Луки',
			['Когти'] = 'Когти',
			['Кинжал'] = 'Кинжалы',
			['Жезл'] = 'Жезлы',
			['Удочка'] = 'Удочки',
			['Посох'] = 'Посохи',
			['Одноручный топор'] = 'Одноручные топоры',
			['Двуручный топор'] = 'Двуручные топоры',
			['Одноручная булава'] = 'Одноручные булавы',
			['Двуручная булава'] = 'Двуручные булавы',
			['Одноручный меч'] = 'Одноручные мечи',
			['Двуручный меч'] = 'Двуручные мечи'
		},
		['Armour'] = {
			['Body Armour'] = 'Нагрудная броня',
			['Helmet'] = 'Шлемы',
			['Shield'] = 'Щиты',
			['Boots'] = 'Обувь',
			['Gloves'] = 'Перчатки',
			['Нагрудная броня'] = 'Нагрудная броня',
			['Шлем'] = 'Шлемы',
			['Щит'] = 'Щиты',
			['Обувь'] = 'Обувь',
			['Перчатки'] = 'Перчатки'
		},
		['Accessory'] = {
			['Amulet'] = 'Амулеты',
			['Belt'] = 'Пояса',
			['Quiver'] = 'Колчаны',
			['Ring'] = 'Кольца',
			['Амулет'] = 'Амулеты',
			['Пояс'] = 'Пояса',
			['Колчан'] = 'Колчаны',
			['Кольцо'] = 'Кольца'
		},
		['Flask'] = {
			['Life'] = 'Флаконы жизни',
			['Mana'] = 'Флаконы маны',
			['Hybrid'] = 'Флаконы равновесия',
			['Utility'] = 'Особые флаконы'
		},
		['Map'] = {
			['Fragment'] = 'Обрывки карт',
			['_default'] = 'Карты'
		},
		['Gem'] = {
			['Skill'] = 'Камни умения',
			['Support'] = 'Камни поддержки'
		},
		['Jewel'] = 'Самоцветы',
		['Currency'] = 'Валюта',
		['Card'] = 'Гадальные карты',
                ['Trinket'] = 'Брелоки',
		['Quest'] = 'Вещи для заданий',
		['Prophecy'] = 'Пророчества',
		['Microtrans'] = 'Микротранзакции',
		['Самоцвет'] = 'Самоцветы',
		['Decoration'] = 'Декорации'
	}
	local category = types[args.type]
	if type(category) == 'table' then
		category = types[args.type][args.subtype or '_default']
	end
	if category then
		if args.rarity == 'Unique' then
			category = 'Уникальные ' .. string.lower(category)
		end
	else
		category = 'Предметы с неверными типами'
	end
	if args.type == 'Card' then
        args.belowStats = '[[Category:' .. category .. ']]'
	elseif args.type == 'Gem' then
		args.belowStats = mw.html.create('div')
		if args.subtype == 'Skill' then
			icons = mw.html.create('div')
				:attr('class', 'itemboximage')
				:wikitext( '[[File:' .. args.gemIcon .. '|' .. '64x64px' .. '|]]' )
				:wikitext( '[[File:' .. args.skillIcon .. '|' .. '64x64px' .. '|]]' )
			:done()
			args.belowStats:node(icons)
		elseif args.subtype == 'Support' then
			icons = mw.html.create('div')
				:attr('class', 'itemboximage')
				:wikitext( '[[File:' .. args.gemIcon .. '|' .. '64x64px' .. '|]]' )
			:done()
			args.belowStats:node(icons)
		end
		
	else
		args.belowStats = mw.html.create('div')
			:attr('class', 'itemboximage')
			:wikitext( '[[File:' .. args.image .. '|' .. p._itemsize({args.size}) .. '|]]' )
			:wikitext( '[[Category:' .. category .. ']]' )
	end
	local result = p._itembox(args)
	if args.screenshot ~= nil then
		result = result .. '[[File:' .. args.screenshot .. '|' .. '300x300px' .. '|thumb|right]]'
	end
	if args.animation ~= nil then
		result = result .. '[[File:' .. args.animation .. '|' .. '300x300px' .. '|thumb|right]]'
	end
	return tostring(result)
end

function views.standard(args, frame)
	args.stats = h.statsBuilder(args)
	args.name = '[[' .. args.pageName .. '|' .. args.name .. ']]'
	args.baseItem = args.baseItem and ('[[' .. args.baseItemPage .. '|' .. args.baseItem .. ']]') or nil
	return tostring( p._itembox(args) )
end

function views.inline(args, frame)
	if args.type == 'Gem' then
		args.image = args.gemIcon
	end
	args.stats = h.statsBuilder(args)
	args.class = 'itemboxhover itemboxhoverhide itemboxhovernojs'
	args.isHover = true
	args.itemLinkText = args.itemLinkText or args.name
	args.itemLinkArt = args.itemLinkArt and string.gsub(args.image, '%.(%a+)$', ' ' .. args.itemLinkArt .. '.%1') or args.image
	local text = ""
	if args.itemLinkLarge then
		text = '[[' .. args.pageName .. '|' .. args.itemLinkText .. ']] <br> [[File:' .. args.itemLinkArt .. '|' .. p._itemsize({args.size, '39'}) .. '|link=' .. args.pageName .. '|alt=]]'
	elseif args.itemLinkIconOnly then
		text = '[[File:' .. args.itemLinkArt .. '|38x38px|link=' .. args.pageName .. '|alt=]]'
	else
		text = '[[File:' .. args.itemLinkArt .. '|16x16px|link=|alt=]][[' .. args.pageName .. '|' .. args.itemLinkText .. ']]'
	end
	local container = mw.html.create('span')
		:tag('span')
			:attr('class', 'itemhover')
			:attr('style', 'white-space: normal;text-align:left;')
			:wikitext(text)
				
			:done()
		:node( p._itembox(args) )
	if args.type ~= 'Card' and args.type ~= 'Gem' then
		container
			:tag('span')
				:attr('class', 'itemboxhovericon itemboxhoverhide itemboxhovernojs')
				:wikitext( '[[File:' .. args.itemLinkArt .. '|' .. p._itemsize({args.size}) .. '|link=|alt=]]' )
				:done()
	end
	return tostring(container)
end

function views.tablerow(args, frame)
	if not roundAndPad then
		roundAndPad = require('Module:Decimals')._main
	end
	local otherPage = mw.title.getCurrentTitle().fullText ~= args.pageName
	local flags = args.flags and mw.text.split(args.flags, ' ', true) or {}
	for i=1, #flags do
		flags[ flags[i] ] = true
	end
	local function newNA(val)
		local cell = mw.html.create('td')
			:attr('class', 'table-na')
			:wikitext('<small>N/A</small>')
		if val ~= nil then
			cell
				:attr('data-sort-value', val)
		end
		return cell
	end
	local row = mw.html.create('tr')
	if otherPage then
		row
			:attr('id', args.name)
	end
	if flags.name then
		if args.type == 'Gem' then
			row
				:tag('td')
					:attr('data-sort-value', args.sortKey)
					:attr('align', 'left')
					:wikitext(views.inline(args, frame))
					:done()
		else
			row
				:tag('td')
					:attr('data-sort-value', args.sortKey)
					:wikitext( (otherPage and '[[' .. args.pageName .. '|' .. args.name .. ']]' or args.name) .. ' <br> [[File:' .. args.image .. '|' .. p._itemsize({args.size, '39'}) .. '|link=' .. (otherPage and args.pageName or '') .. '|alt=]]' )
					:done()
		end
	end
	if flags.base then
		row
			:tag('td')
				:attr('data-sort-value', args.baseItemPage)
				:wikitext( '[[' .. args.baseItemPage .. '|' .. args.baseItem .. ']]' )
				:done()
	end
	if flags.level then
		if args.level then
			row
				:tag('td')
					:wikitext(args.level)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if flags.str then
		if args.type == 'Gem' then
			if string.find(args.attributes, 'Сила') ~= nil then
				row
					:tag('td')
						:wikitext(frame:expandTemplate{ title = 'yes' })
						:done()	
			else
				row
					:node( newNA(0) )
			end
		elseif args.strength then
			row
				:tag('td')
					:wikitext(args.strength)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if flags.dex then
		if args.type == 'Gem' then
			if string.find(args.attributes, 'Ловкость') ~= nil then
				row
					:tag('td')
						:wikitext(frame:expandTemplate{ title = 'yes' })
						:done()	
			else
				row
					:node( newNA(0) )
			end
		elseif args.dexterity then
			row
				:tag('td')
					:wikitext(args.dexterity)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if flags.int then
		if args.type == 'Gem' then
			if string.find(args.attributes, 'Интеллект') ~= nil then
				row
					:tag('td')
						:wikitext(frame:expandTemplate{ title = 'yes' })
						:done()	
			else
				row
					:node( newNA(0) )
			end
		elseif args.intelligence then
			row
				:tag('td')
					:wikitext(args.intelligence)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if args.type == 'Weapon' then
		if flags.weapon then
			local avgDmg = tonumber(args.averageDamage) or ( (args.physical and p._itemRangeAverage({args.physical}) or 0) + (args.fire and p._itemRangeAverage({args.fire}) or 0) + (args.cold and p._itemRangeAverage({args.cold}) or 0) + (args.lightning and p._itemRangeAverage({args.lightning}) or 0) + (args.chaos and p._itemRangeAverage({args.chaos}) or 0) )
			local avgCrt = args.critChance and p._itemRangeAverage({args.critChance}) or 0
			local avgAps = args.attacksPerSecond and p._itemRangeAverage({args.attacksPerSecond}) or 0
			local damage = mw.html.create('td')
				:attr('data-sort-value', avgDmg)
			if avgDmg == 0 then
				damage
					:wikitext('0')
			else
				if args.physical then
					damage
						:node( h.newColor('physical', args.physical) )
						:tag('br'):done()
				end
				if args.fire then
					damage
						:node( h.newColor('fire', args.fire) )
						:tag('br'):done()
				end
				if args.cold then
					damage
						:node( h.newColor('cold', args.cold) )
						:tag('br'):done()
				end
				if args.lightning then
					damage
						:node( h.newColor('lightning', args.lightning) )
						:tag('br'):done()
				end
				if args.chaos then
					damage
						:node( h.newColor('chaos', args.chaos) )
				end
			end
			row
				:node(damage)
				:tag('td')
					:attr('data-sort-value', avgCrt)
					:wikitext(args.critChance)
					:done()
				:tag('td')
					:attr('data-sort-value', avgAps)
					:wikitext(args.attacksPerSecond)
					:done()
				:tag('td')
					:wikitext( roundAndPad( avgDmg * avgAps * (1 - avgCrt / 100) + avgDmg * avgAps * avgCrt / 100 * 1.5, 2 ) )
					:done()
		end
	end
	if flags.block then
		if args.blockChance then
			row
				:tag('td')
					:attr( 'data-sort-value', p._itemRangeAverage({args.blockChance}) )
					:wikitext(args.blockChance)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if flags.armour then
		if args.armour then
			row
				:tag('td')
					:attr( 'data-sort-value', p._itemRangeAverage({args.armour}) )
					:wikitext(args.armour)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if flags.evasion then
		if args.evasion then
			row
				:tag('td')
					:attr( 'data-sort-value', p._itemRangeAverage({args.evasion}) )
					:wikitext(args.evasion)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end
	if flags.energyshield then
		if args.energyShield then
			row
				:tag('td')
					:attr( 'data-sort-value', p._itemRangeAverage({args.energyShield}) )
					:wikitext(args.energyShield)
					:done()
		else
			row
				:node( newNA(0) )
		end
	end		
	if flags.flask then
		if flags.life or flags.mana then
			if flags.life then
				if args.life then
					row
						:tag('td')
							:attr( 'data-sort-value', p._itemRangeAverage({args.life}) )
							:wikitext(args.life)
							:done()
				else
					row
						:node( newNA(0) )
				end
			end
			if flags.mana then
				if args.mana then
					row
						:tag('td')
							:attr( 'data-sort-value', p._itemRangeAverage({args.mana}) )
							:wikitext(args.mana)
							:done()
				else
					row
						:node( newNA(0) )
				end
			end
			if args.duration then
				row
					:tag('td')
						:attr( 'data-sort-value', p._itemRangeAverage({args.duration}) )
						:wikitext(args.duration)
						:done()
			else
				row
					:node( newNA(0) )
			end
		end
		if flags.effect then
			if args.effect then
				row
					:tag('td')
						:attr('class', 'text-mod')
						:node(args.effect)
						:done()
			else
				row
					:node( newNA() )
			end
			if args.duration then
				row
					:tag('td')
						:attr( 'data-sort-value', p._itemRangeAverage({args.duration}) )
						:wikitext(args.duration)
						:done()
			else	
				row
					:node( newNA(0) )
			end
		end
		if args.chargeCap then
			row
				:tag('td')
					:attr( 'data-sort-value', p._itemRangeAverage({args.chargeCap}) )
					:wikitext(args.chargeCap)
					:done()
		else
			row
				:node( newNA(0) )
		end
		if args.chargeUse then
			row
				:tag('td')
					:attr( 'data-sort-value', p._itemRangeAverage({args.chargeUse}) )
					:wikitext(args.chargeUse)
					:done()
		else
			row
				:node( newNA(0) )
		end
	elseif args.type == 'Map' then
		if flags.mapLevel then
		row
			:tag('td')
				:wikitext(args.mapLevel)
				:done()
                        if flags.mapTier then
                                row
                                         :tag('td')
                                        :wikitext(args.mapTier)
                                        :done()
                        else
                                row
                                :node( newNA(0) )
                        end
		end
		if flags.qty then
			if args.itemQuantity then
				row
					:tag('td')
						:attr( 'data-sort-value', p._itemRangeAverage({args.itemQuantity}) )
						:wikitext(args.itemQuantity)
						:done()
			else
				row
					:node( newNA(0) )
			end
		end
        if flags.map then
	        row
			:tag('td')
				:wikitext(args.mapLevel)
				:done()
                        
		end
	elseif args.type == 'Jewel' then
		if flags.limit then
			if args.limit then
				row
					:tag('td')
						:wikitext(args.limit)
						:done()
			else
				row
					:node( newNA(999) )
			end
                end
                if flags.jewel then
                        if args.limit then
				row
					:tag('td')
						:wikitext(args.limit)
						:done()
			else
				row
					:node( newNA(999) )
			end
		end
		if flags.radius then
			if args.radius then
				row
					:tag('td')
						:wikitext(args.radius)
						:done()
			else
				row
					:node( newNA('zzz') )
			end
                end
                if flags.jewel then

                        if args.radius then
				row
					:tag('td')
						:wikitext(args.radius)
						:done()
			else
				row
					:node( newNA('zzz') )
			end
		end
	elseif args.type == 'Currency' then
		row
			:tag('td')
				:wikitext(args.stackSize)
				:done()
		if flags.effect then
			if args.effect then
				row
					:tag('td')
						:attr('class', 'text-mod')
						:wikitext(args.effect)
						:done()
			else
				row
					:node( newNA() )
			end
		end
	 elseif args.type == 'Card' then
        row
            :tag('td')
                :wikitext(args.stackSize)
                :done()
            :tag('td')
                :tag('div')
                    :attr('class', 'itemboxstats')
                    :wikitext(args.reward)
                    :done()
                :done()
            :tag('td')
                :wikitext(args.drop)
                :done()
	end
	if flags.mods then
		if args.implicitMods or args.randomMods or args.cosmeticMods then
			local stats = mw.html.create('div')
				:attr('class', 'itemboxstats')
			if args.implicitMods then
				stats
					:node(
						h.newGroup('text-mod')
							:wikitext(args.implicitMods)
					)
			end
			if args.randomMods then
				stats
					:node(
						h.newGroup('text-mod')
							:wikitext(args.randomMods)
					)
			end
			if args.cosmeticMods then
				stats
					:node(
						h.newGroup('text-mod')
							:wikitext(args.cosmeticMods)
					)
			end
			row
				:tag('td')
					:node(stats)
					:done()
		else
			row
				:node( newNA() )
		end
	end
	if flags.flavour then
		if args.flavourText then
			row
				:tag('td')
					:attr('class', 'text-flavour')
					:wikitext(args.flavourText)
					:done()
		else
			row
				:node( newNA() )
		end
	end
	if flags.help then
		if args.helpText then
			row
				:tag('td')
					:attr('class', 'text-help')
					:wikitext(args.helpText)
					:done()
		else
			row
				:node( newNA() )
		end
	end
	return row
end

---------------------------------------------------------------------
-- Implements {{itembox}}
---------------------------------------------------------------------
function p.itembox(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		wrappers = 'Template:Itembox'
	})
	return p._itembox(args)
end
function p._itembox(args)
	local frames = {
		['Currency'] = 'currency',
                ['Trinket'] = 'currency',
		['Microtrans'] = 'currency',
		['Gem'] = 'gem',
		['Quest'] = 'quest',
		['Prophecy'] = 'prophecy',
		['Card'] = 'divicard'
	}
	local container = mw.html.create(args.isHover and 'span' or 'div')
		container:attr( 'class', 'itembox-' .. ( string.lower(args.frame or frames[args.type] or args.rarity or 'normal') ) .. ' ' .. (args.class or '') )
	if args.type == 'Card' then
        

		container
			:tag('span')
			  :attr('class', 'divicard-wrapper')
			  :tag('span')
				   :attr('class', 'divicard-art')
				   :wikitext( '[[File:' .. args.art .. '|link=|alt=]]' )
				   :done()
			  :tag('span')
				   :attr('class', 'divicard-frame')
				   :wikitext( '[[File:Divination card frame.png|link=|alt=]]' )
				   :done()
			  :tag('span')
				   :attr('class', 'divicard-header')
				   :wikitext(args.name)
				   :done()
			  :tag('span')
				   :attr('class', 'divicard-stack')
				   :wikitext(args.stackSize)
			  :done()
			  :tag('span')
				   :attr('class', 'divicard-reward')
				   :tag('span')
						:wikitext(args.reward)
						:done()
				   :done()
			  :tag('span')
				   :attr('class', 'divicard-flavour text-flavour')
				   :tag('span')
						:wikitext(args.flavourText)
						:done()
				   :done()
		 :wikitext(args.belowStats)
		 :done()
  
	elseif args.type == 'Gem' then
	local div = mw.html.create('div')
		div
			:tag('span')
				:attr( 'class', 'itemboxheader-' .. (args.baseItem and 'double' or 'single') )
				:tag('span')
					:attr('class', 'itemboxheaderleft')
				:done()
				:tag('span')
					:attr('class', 'itemboxheaderright')
				:done()
				:tag('span')
					:attr('class', 'itemboxheadertext')
					:wikitext( args.name .. (args.baseItem and '<br>' .. args.baseItem or '') )
				:done()
			:done()
			if type(args.aboveStats) == 'table' then
				div:node(args.aboveStats)
			elseif type(args.aboveStats) == 'string' then
				div:wikitext(args.aboveStats)
			end
			local stats = mw.html.create('span')
				:attr('class', 'itemboxstats')
			if type(args.stats) == 'table' then
				stats:node(args.stats)
			elseif type(args.stats) == 'string' then
				stats:wikitext(args.stats)
			end
			div:node(stats)
			if type(args.belowStats) == 'table' then
				div:node(args.belowStats)
			elseif type(args.belowStats) == 'string' then
				div:wikitext(args.belowStats)
			end
			if args.view == 'inline' or args.view == 'tablerow' then
				div:wikitext( '[[File:' .. args.gemIcon .. '|' .. '64x64px' .. '|]]' )
				if args.subtype == 'Skill' then
					div:wikitext( '[[File:' .. args.skillIcon .. '|' .. '64x64px' .. '|]]' )
				end
			end
	container:node(div)
    else
        container
		:tag('span')
			:attr( 'class', 'itemboxheader-' .. (args.baseItem and 'double' or 'single') )
			:tag('span')
				:attr('class', 'itemboxheaderleft')
				:done()
			:tag('span')
				:attr('class', 'itemboxheaderright')
				:done()
			:tag('span')
				:attr('class', 'itemboxheadertext')
				:wikitext( args.name .. (args.baseItem and '<br>' .. args.baseItem or '') )
				:done()
			:done()
		if type(args.aboveStats) == 'table' then
			container:node(args.aboveStats)
		elseif type(args.aboveStats) == 'string' then
			container:wikitext(args.aboveStats)
		end
		local stats = mw.html.create('span')
			:attr('class', 'itemboxstats')
		if type(args.stats) == 'table' then
			stats:node(args.stats)
		elseif type(args.stats) == 'string' then
			stats:wikitext(args.stats)
		end
		container:node(stats)
		if type(args.belowStats) == 'table' then
			container:node(args.belowStats)
		elseif type(args.belowStats) == 'string' then
			container:wikitext(args.belowStats)
		end
	end
	return container
end

---------------------------------------------------------------------
-- Implements {{il}}
---------------------------------------------------------------------
function p.itemLink(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		parentOnly = true
	})
	return frame:expandTemplate{
		title = ':' .. args[1],
		args = {
			view = 'inline',
			itemLinkText = args[2],
			itemLinkArt = args.art or args.image,
			itemLinkLarge = args.large,
			itemLinkIconOnly = args.IconOnly or args.iconOnly or args.io
		}
	}
end

---------------------------------------------------------------------
-- Implements {{item table}}
---------------------------------------------------------------------
function p.itemTable(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		parentOnly = true
	})
	args.flags = args.flags or args.format
	local flags = args.flags and mw.text.split(args.flags, ' ', true) or {}
	for i=1, #flags do
		flags[ flags[i] ] = true
	end
	local function newAbbr(text, title)
		return mw.html.create('abbr')
			:attr('class', 'nounderline')
			:attr('title', title)
			:wikitext(text)
	end
	local tbl = mw.html.create('table')
		:attr('class', 'wikitable sortable')
		:attr('style', 'text-align:center; ' .. ( args.width and 'width:' .. args.width or '' ) )
	local hdr = mw.html.create('tr')
		:tag('th')
			:wikitext('Наименование')
			:done()
	if flags.base then
		hdr
			:tag('th')
				:wikitext('База')
				:done()
	end
	if flags.level then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:Level_up_icon_small.png|link=|Lvl.]]', 'Требуемый уровень') )
				:done()
	end
	if flags.str then
		local text = 'Требуется силы'
		if flags.gem then 
			text = 'Также требуется сила'
		end
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:StrengthIcon_small.png|link=|Сил.]]', text) )
				:done()
	end
	if flags.dex then
		local text = 'Требуется ловкости'
		if flags.gem then 
			text = 'Также требуется ловкость'
		end
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:DexterityIcon_small.png|link=|Ловк.]]', text) )
				:done()
	end
	if flags.int then
		local text = 'Требуется интеллекта'
		if flags.gem then 
			text = 'Также требуется интеллект'
		end
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:IntelligenceIcon_small.png|link=|Инт.]]', text) )
				:done()
	end
	if flags.weapon then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Урон')
				:done()
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Шанс на критический удар')
				:done()
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Атак в секунду')
				:done()
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Урон в Секунду')
				:done()
	end
	if flags.block then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Шанс заблокировать удар')
				:done()
	end
	if flags.armour then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Броня')
				:done()
	end
	if flags.evasion then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Уклонение')
				:done()
	end
	if flags.energyshield then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Энергетический щит')
				:done()
	end
	if flags.flask then
		if flags.life or flags.mana then
			if flags.life then
				hdr
					:tag('th')
						:attr('data-sort-type', 'number')
						:node( newAbbr('Здоровье', 'Количество здоровья, восстанавливаемого за один глоток') )
						:done()
			end
			if flags.mana then
				hdr
					:tag('th')
						:attr('data-sort-type', 'number')
						:node( newAbbr('Мана', 'Количество маны, восстанавливаемой за один глоток') )
						:done()
			end
			hdr
				:tag('th')
					:attr('data-sort-type', 'number')
					:node( newAbbr(
						'Время', 
						 'Время восстановления' .. (flags.life and ' здоровья' or '') .. ( (flags.life and flags.mana) and ' and ' or '' ) .. (flags.mana and ' маны' or '')..' в секундах'  
					) )
					:done()
		end
		if flags.effect then
			hdr
				:tag('th')
					:attr('class', 'unsortable')
					:wikitext('Эффект')
					:done()
				:tag('th')
					:attr('data-sort-type', 'number')
					:wikitext('Длительность')
					:done()
		end
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('Вместимость', 'Общее количество зарядов, которое способен вместить флакон') )
				:done()
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('Глоток', 'Количество зарядов, расходуемое за одно использование') )
				:done()
	end
	if flags.map then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Уровень карты')
				:done()
	end
	if flags.jewel then
		hdr
			:tag('th')
				:wikitext('Лимит')
				:done()
		hdr
			:tag('th')
				:wikitext('Радиус')
				:done()
	end
	if flags.currency then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:wikitext('Размер стопки')
				:done()
		if flags.effect then
			hdr
				:tag('th')
					:attr('class', 'unsortable')
					:wikitext('Эффект')
					:done()
		end
	end
	 if flags.card then
        hdr
            :tag('th')
                :attr('data-sort-type', 'number')
                :node( newAbbr('Набор', 'Карточек в наборе') )
                :done()
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Награда')
                :done()
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Условия выпадения')
                :done()
    end
	if flags.mods then
		hdr
			:tag('th')
				:attr('class', 'unsortable')
				:wikitext('Свойства')
				:done()
	end
	if flags.flavour then
		hdr
			:tag('th')
				:attr('class', 'unsortable')
				:wikitext('Художественный текст')
				:done()
	end
	if flags.help then
		hdr
			:tag('th')
				:attr('class', 'unsortable')
				:wikitext('Вспомогательный текст')
				:done()
	end
	tbl:node(hdr)
	local i = 1
	while args[i] do
		tbl
			:node(
				frame:expandTemplate{
					title = ':' .. args[i],
					args = {
						view = 'tablerow',
						flags = 'name ' .. args.flags
					}
				}
			)
		i = i + 1
	end
	return tostring(tbl)
end

---------------------------------------------------------------------
-- Implements {{item range average}}
---------------------------------------------------------------------
function p.itemRangeAverage(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		wrappers = 'Template:Item range average'
	})
	return p._itemRangeAverage(args)
end
function p._itemRangeAverage(args)
	if args[1] == nil then
		return nil
	end
	local s = {}
	s.mod = string.match(args[1], '>([^><]+)</') or args[1]
	s.sign = string.find(s.mod, '&minus;', 0, true) and -1 or 1
	s.min = string.match(s.mod, '%((%S+)%s*to') or s.mod
	s.max = string.match(s.mod, 'to%s*(%S+)%)') or s.min
	s.minLow = tonumber( string.match(s.min, '(%d*%.?%d+)') )
	s.minHigh = tonumber( string.match(s.min, '&ndash;(%d*%.?%d+)') or s.minLow )
	s.maxLow = tonumber( string.match(s.max, '(%d*%.?%d+)') )
	s.maxHigh = tonumber( string.match(s.max, '&ndash;(%d*%.?%d+)') or s.maxLow )
	if #{s.minLow, s.minHigh, s.maxLow, s.maxHigh} == 0 then
		return nil
	end
	return ( ( (s.minLow + s.minHigh) / 2 ) + ( (s.maxLow + s.maxHigh) / 2 ) ) / 2 * s.sign
end

---------------------------------------------------------------------
-- Implements {{itemsize}}
---------------------------------------------------------------------
function p.itemsize(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local args = getArgs(frame, {
		wrappers = 'Template:Itemsize'
	})
	return p._itemsize(args)
end
function p._itemsize(args)
	local size = args[1] or '1x_'
	local grid = args[2] or 78
	local dim = mw.text.split(size, 'x', true)
	if dim[1] == '_' then
		if dim[2] == '_' then
			dim[1] = grid
		else
			dim[1] = ''
		end
	else
		dim[1] = dim[1] * grid
	end
	if dim[2] == '_' then
		dim[2] = ''
	else
		dim[2] = 'x' .. dim[2] * grid
	end
	return dim[1] .. dim[2] .. 'px'
end

---------------------------------------------------------------------
-- Helper functions
---------------------------------------------------------------------
function h.statsBuilder(args)
	local container = mw.html.create('span')
	local group
	if args.type == 'Weapon' then
		group = h.newGroup()
			:wikitext(args.subtype)
			:tag('br'):done()
		if args.physical then
			group
				:wikitext('Физический урон: ')
				:node( h.newColor('value', args.physical) )
				:tag('br'):done()
		end
		if args.fire or args.cold or args.lightning then
			local elementalDamage = {}
			if args.fire then
				table.insert( elementalDamage, tostring( h.newColor('fire', args.fire) ) )
			end
			if args.cold then
				table.insert( elementalDamage, tostring( h.newColor('cold', args.cold) ) )
			end
			if args.lightning then
				table.insert( elementalDamage, tostring( h.newColor('lightning', args.lightning) ) )
			end
			group
				:wikitext('Урон от стихий: ')
				:wikitext( table.concat(elementalDamage, ', ') )
				:tag('br'):done()
		end
		if args.chaos then
			group
				:wikitext('Урон хаосом: ')
				:node( h.newColor('chaos', args.chaos) )
				:tag('br'):done()
		end
		group
			:wikitext('Шанс на критический удар: ')
			:node( h.newColor('value', args.critChance) )
			:tag('br'):done()
			:wikitext('Атак в секунду: ')
			:node( h.newColor('value', args.attacksPerSecond) )
		container:node(group)
	elseif args.type == 'Armour' then
		if args.blockChance or args.armour or args.evasion or args.energyShield then
			group = h.newGroup()
			if args.blockChance then
				group
					:wikitext('Шанс заблокировать удар ')
					:node( h.newColor('value', args.blockChance) )
					:tag('br'):done()
			end
			if args.armour then
				group
					:wikitext('Броня: ')
					:node( h.newColor('value', args.armour) )
					:tag('br'):done()
			end
			if args.evasion then
				group
					:wikitext('Уклонение: ')
					:node( h.newColor('value', args.evasion) )
					:tag('br'):done()
			end
			if args.energyShield then
				group
					:wikitext('Энергетический щит: ')
					:node( h.newColor('value', args.energyShield) )
			end
			container:node(group)
		end
	elseif args.type == 'Map' then
		if args.mapLevel then
            group = h.newGroup()
                if args.mapTier then
                    group
                        :wikitext('Уровень карты: ')
                        :node( h.newColor('value', args.mapTier) )
						:tag('br')
                end
			    group
					:wikitext('Уровень монстров: ')
					:node( h.newColor('value', args.mapLevel) )
					:tag('br'):done()
                        
			if args.itemQuantity then
				group
					:wikitext('Количество предметов: ')
					:node( h.newColor('value', args.itemQuantity) )
			end
			container:node(group)
		end
	elseif args.type == 'Jewel' then
		if args.limit or args.radius then
			group = h.newGroup()
			if args.limit then
				group
					:wikitext('Максимум: ')
					:node( h.newColor('value', args.limit) )
                                        :tag('br'):done()
			end
			if args.radius then
				group
					:wikitext('Радиус: ')
					:node( h.newColor('value', args.radius) )
                                        :tag('br'):done()
			end
			container:node(group)
		end
	elseif args.type == 'Currency' then
		group = h.newGroup()
			:wikitext('Размер стопки: ')
			:node( h.newColor('value', args.stackSize) )
		container:node(group)
		if args.effect then
			group = h.newGroup('textwrap text-mod')
				:wikitext(args.effect)
			container:node(group)
		end
	elseif args.type == 'Trinket' then
        if args.effect then
            group = h.newGroup('textwrap text-mod')
                :wikitext(args.effect)
            container:node(group)
        end
	elseif args.type == 'Flask' then
		group = h.newGroup()
		if args.life then
			group
				:wikitext('Восстанавливает здоровья: ')
				:node( h.newColor('value', args.life) )
                                :wikitext(' за ')
				:node( h.newColor('value', args.duration) )
				:wikitext(' сек.')
				:tag('br'):done()
		end
		if args.mana then
			group
				:wikitext('Восстанавливает маны: ')
				:node( h.newColor('value', args.mana) )
                                :wikitext(' за ')
				:node( h.newColor('value', args.duration) )
				:wikitext(' сек.')
				:tag('br'):done()
		end
		if args.effect then
			group
				:wikitext('Длится ')
				:node( h.newColor('value', args.duration) )
				:wikitext(' сек.')
				:tag('br'):done()
		end
		group
			:wikitext('Расходует ')
			:node( h.newColor('value', args.chargeUse) )
			:wikitext(' из ')
			:node( h.newColor('value', args.chargeCap) )
			:wikitext(' зарядов при использовании')
			:tag('br'):done()
		if args.effect then
			group
				:wikitext(args.effect)
		end
		container:node(group)
	elseif args.type == 'Microtrans' or args.type == 'Decoration' then
		group = h.newGroup()
		if args.subtype or args.stackSize then
			group
				:wikitext(args.subtype)
				:tag('br'):done()
			if args.stackSize then
				group
					:wikitext('Размер стопки: ')
					:node( h.newColor('value', args.stackSize) )
			end
			container:node(group)
		end
		group = h.newGroup('textwrap text-mod')
			:wikitext(args.effect)
		container:node(group)
		
		if args.variations ~= nil then
            local variations_text = nil
            if args.variations == 1 then
                variations_text = '1 Вариант'
            elseif args.variations > 1 then
                variations_text = args.variations .. ' Вариантов'
            end
            group = h.newGroup('textwrap text-mod')
                :wikitext(variations_text)
            container:node(group)
        end
	elseif args.type == 'Gem' then
		group = h.newGroup()
		local symbolColor
		if args.symbolColor == 'Red' then
			symbolColor = 'c51e1e'
		elseif args.symbolColor == 'Blue' then
			symbolColor = '4163c9'
		elseif args.symbolColor == 'Green' then
			symbolColor = '08a842'
		else
			symbolColor = 'c51e1e'
		end
		if args.subtype == 'Support' and args.symbolColor ~= nil then
			group
				:wikitext('Литера: ')
				:tag('span')
					:attr('style', 'width: 1em; color: white !important; background-color:#' .. symbolColor .. '; display: inline-block; text-align: center; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;')
					:wikitext(args.symbol)
					:done()
				:tag('br'):done()
		end
		
		group
			:wikitext(h.getCategoryLinks(args.tags))
			:tag('br'):done()
		if args.radius ~= nil then
			group
				:wikitext('Радиус: ' .. tostring(h.newColor('value', args.radius)))
				:tag('br'):done()
		end
		if args.manaCost ~= nil then
			group
				:wikitext('Расход маны: ' .. tostring(h.newColor('value', args.manaCost)))
				:tag('br'):done()
		end
		if args.soulCost ~= nil then
			group
				:wikitext('Разовый расход душ: ' .. tostring(h.newColor('value', args.soulCost)))
				:tag('br'):done()
		end
		if args.manaReserved ~= nil then
			group
				:wikitext('Удержано маны: ' .. tostring(h.newColor('value', args.manaReserved)) .. '%')
				:tag('br'):done()
		end
		if args.cooldownTime ~= nil then
			group
				:wikitext('Перезарядка: ' .. tostring(h.newColor('value', args.cooldownTime .. ' сек.')))
			if args.canStoreUses ~= nil then
				group
					:wikitext(tostring(h.newColor('value', ' (использует: ' .. args.canStoreUses .. ')')))
			end
			group
				:tag('br'):done()
		elseif args.canStoreUses ~= nil then
			group
				:wikitext('Максимум зарядов: ' .. tostring(h.newColor('value', args.canStoreUses)))
				:tag('br'):done()
		end
		if args.castTime ~= nil then
			group
				:wikitext('Время применения: ' .. tostring(h.newColor('value', args.castTime .. ' сек.')))
				:tag('br'):done()
		end
		if args.critChance ~= nil then
			group
				:wikitext('Шанс на критический удар: ' .. tostring(h.newColor('value', args.critChance .. '%')))
				:tag('br'):done()
		end
		if args.damageEffectiveness ~= nil then
			group
				:wikitext('Эффективность урона: ' .. tostring(h.newColor('value', args.damageEffectiveness .. '%')))
				:tag('br'):done()
		end
		if args.manacostMultiplier ~= nil then
			group
				:wikitext('Множитель маны: ' .. tostring(h.newColor('value', args.manacostMultiplier .. '%')))
				:tag('br'):done()
		end
		container:node(group)
	end
	if args.level or args.strength or args.dexterity or args.intelligence or args.talismanTier then
		local requirements = {}
		local attrLabel
		if args.level then
			table.insert( requirements, 'уровень ' .. tostring( h.newColor('value', args.level) ) )
		end
		if args.strength then
			attrLabel = ' Силы'
			if args.level or args.dexterity or args.intelligence then
				attrLabel = ' Сил'
			end
			table.insert( requirements, tostring( h.newColor('value', args.strength) ) .. attrLabel )
		end
		if args.dexterity then
			attrLabel = ' Ловкости'
			if args.level or args.strength or args.intelligence then
				attrLabel = ' Ловк'
			end
			table.insert( requirements, tostring( h.newColor('value', args.dexterity) ) .. attrLabel )
		end
		if args.intelligence then
			attrLabel = ' Интеллекта'
			if args.level or args.strength or args.dexterity then
				attrLabel = ' Инт'
			end
			table.insert( requirements, tostring( h.newColor('value', args.intelligence) ) .. attrLabel )
		end
		group = h.newGroup()
		if args.level or args.strength or args.dexterity or args.intelligence then
            group
                :wikitext('Требуется ')
                :wikitext( table.concat(requirements, ', ') )
                :tag('br'):done()
        end
        if args.talismanTier then
            group
                :wikitext('Уровень талисмана: ')
                :node( h.newColor('value', args.talismanTier) )
                :tag('br'):done()
        end
        container:node(group)
	end
	if args.qualityEffect then
		group = h.newGroup()
		group:wikitext('За 1% качества: ' .. tostring(h.newColor('mod', args.qualityEffect)))
		container:node(group)
	end
	if args.implicitMods then
		group = h.newGroup('text-mod')
			:wikitext(args.implicitMods)
		container:node(group)
	end
	if args.skillDescriptionText then
		group = h.newGroup('textwrap text-gemdesc')
			:wikitext(args.skillDescriptionText)
		container:node(group)
	end
	if args.randomMods then
		group = h.newGroup('text-mod')
			:wikitext(args.randomMods)
		if args.corrupted then
			group:tag(span)
				:attr('class', 'text-corrupted')
				:wikitext('<br> Осквернено')
				:done()
		end
		container:node(group)
	end
	if args.cosmeticMods then
		group = h.newGroup('text-cosmetic')
			:wikitext(args.cosmeticMods)
		container:node(group)
	end
	if args.flavourText then
		group = h.newGroup('textwrap text-flavour')
			:wikitext(args.flavourText)
		container:node(group)
	end
	if args.type == 'Prophecy' then
        group = h.newGroup('-textwrap text-value')
            :wikitext(args.prophecyText)
        container:node(group)
	end
	if args.helpText then
		group = h.newGroup('textwrap text-help')
			:wikitext(args.helpText)
		container:node(group)
	end
	return container
end

function h.getCategoryLinks(args)
	bufer = string.gsub (args, 'Огонь', '[[:Категория:Умения огня|Огонь]]')
	bufer = string.gsub (bufer, 'Ловушка', '[[:Категория:Умения ловушек|Ловушка]]')
	bufer = string.gsub (bufer, 'Чары', '[[:Категория:Чары|Чары]]')
	bufer = string.gsub (bufer, 'Длится', '[[:Категория:Умения длительности|Длится]]')
	bufer = string.gsub (bufer, 'Область', '[[:Категория:Умения области|Область]]')
	bufer = string.gsub (bufer, 'Молния', '[[:Категория:Умения молнии|Молния]]')
	bufer = string.gsub (bufer, 'Атака', '[[:Категория:Умения атаки|Атака]]')
	bufer = string.gsub (bufer, 'Ближний бой', '[[:Категория:Умения ближнего боя|Ближний бой]]')
	bufer = string.gsub (bufer, 'Хаос', '[[:Категория:Умения хаоса|Хаос]]')
	bufer = string.gsub (bufer, 'Лук', '[[:Категория:Умения лука|Лук]]')
	bufer = string.gsub (bufer, 'Поддержка', '[[:Категория:Камни поддержки|Поддержка]]')
	bufer = string.gsub (bufer, 'Снаряд', '[[:Категория:Умения снарядов|Снаряд]]')
	bufer = string.gsub (bufer, 'Голем', '[[:Категория:Умения големов|Голем]]')
	bufer = string.gsub (bufer, 'Приспешник', '[[:Категория:Умения приспешников|Приспешник]]')
	bufer = string.gsub (bufer, 'Боевой клич', '[[:Категория:Боевые кличи|Боевой клич]]')
	bufer = string.gsub (bufer, 'Движение', '[[:Категория:Умения перемещения|Движение]]')
	bufer = string.gsub (bufer, 'Холод', '[[:Категория:Умения холода|Холод]]')
	bufer = string.gsub (bufer, 'Ваал', '[[:Категория:Умения ваал|Ваал]]')
	bufer = string.gsub (bufer, 'Активатор', '[[:Категория:Умения активаторы|Активатор]]')
	bufer = string.gsub (bufer, 'Тотем', '[[:Категория:Умения тотемов|Тотем]]')
	bufer = string.gsub (bufer, 'Сотворение', '[[:Категория:Умения сотворения|Сотворение]]')
	bufer = string.gsub (bufer, 'Аура', '[[:Категория:Умения аур|Аура]]')
	bufer = string.gsub (bufer, 'Проклятие', '[[:Категория:Умения проклятий|Проклятие]]')
	return bufer
end

function h.newColor(label, text)
	if text == nil or text == '' then
		return nil
	end
	return mw.html.create('span')
		:attr('class', 'text-' .. label)
		:wikitext(text)
end

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

return p