Path of Exile Wiki

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

ПОДРОБНЕЕ

Path of Exile Wiki
Radonegsky66@legacy41979293 (обсуждение | вклад)
Нет описания правки
Camrygracia@legacy41979289 (обсуждение | вклад)
Нет описания правки
Строка 62: Строка 62:
 
args.helpText = args.helpText or args.HelpText
 
args.helpText = args.helpText or args.HelpText
 
args.flavourText = args.flavourText or args.FlavourText
 
args.flavourText = args.flavourText or args.FlavourText
  +
args.flavourText = args.Reward or args.reward
 
return views[args.view](args)
 
return views[args.view](args)
 
end
 
end

Версия от 02:00, 2 сентября 2015

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.sortKey = args.sortKey or args.SortKey or args.name
	args.pageName = args.pageName or args.PageName or args.name
	args.art = args.art or args.Art or args.pageName .. ' card art.png'
	args.image = args.image or args.Image or args.pageName .. '.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
	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.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.flavourText = args.Reward or args.reward
	return views[args.view](args)
end

---------------------------------------------------------------------
-- Views
---------------------------------------------------------------------
function views.full(args)
	args.stats = h.statsBuilder(args)
	args.class = 'itembox-full'
	args.name = '[[' .. args.pageName .. '|' .. args.name .. ']]'
	args.art = args.art or args.Art or args.pageName .. ' card art.png'
	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'] = 'Карты'
		},
		['Jewel'] = 'Jewels',
		['Currency'] = 'Вещи на обмен',
		['Card'] = 'Гадальные карты',
		['Quest'] = 'Вещи для заданий',
		['Microtrans'] = 'Микротранзакции'
	}
	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 .. ']]'
	else	
		args.belowStats = mw.html.create('div')
			:attr('class', 'itemboximage')
			:wikitext( '[[File:' .. args.image .. '|' .. p._itemsize({args.size}) .. '|]]' )
			:wikitext( '[[Category:' .. category .. ']]' )
	end
	return tostring( p._itembox(args) )
end

function views.standard(args)
	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)
	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 container = mw.html.create('span')
		:tag('span')
			:attr('class', 'itemhover')
			:wikitext(
				args.itemLinkLarge
					and '[[' .. args.pageName .. '|' .. args.itemLinkText .. ']] <br> [[File:' .. args.itemLinkArt .. '|' .. p._itemsize({args.size, '39'}) .. '|link=' .. args.pageName .. '|alt=]]'
					or '[[File:' .. args.itemLinkArt .. '|16x16px|link=|alt=]][[' .. args.pageName .. '|' .. args.itemLinkText .. ']]'
			)
			:done()
		:node( p._itembox(args) )
	if args.type ~= 'Card' 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)
	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
		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
	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 args.type == 'Weapon' or args.type == 'Armour' then
		if flags.str then
			if args.strength then
				row
					:tag('td')
						:wikitext(args.strength)
						:done()
			else
				row
					:node( newNA(0) )
			end
		end
		if flags.dex then
			if args.dexterity then
				row
					:tag('td')
						:wikitext(args.dexterity)
						:done()
			else
				row
					:node( newNA(0) )
			end
		end
		if flags.int then
			if args.intelligence then
				row
					:tag('td')
						:wikitext(args.intelligence)
						:done()
			else
				row
					:node( newNA(0) )
			end
		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
	elseif args.type == 'Armour' then
		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
	elseif args.type == 'Flask' 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 flags.effect then
			if args.effect then
				row
					:tag('td')
						:attr('class', 'text-mod')
						:node(args.effect)
						:done()
			else
				row
					:node( newNA() )
			end
		end
		row
			:tag('td')
				:attr( 'data-sort-value', p._itemRangeAverage({args.duration}) )
				:wikitext(args.duration)
				:done()
			:tag('td')
				:attr( 'data-sort-value', p._itemRangeAverage({args.chargeCap}) )
				:wikitext(args.chargeCap)
				:done()
			:tag('td')
				:attr( 'data-sort-value', p._itemRangeAverage({args.chargeUse}) )
				:wikitext(args.chargeUse)
				:done()
	elseif args.type == 'Map' then
		row
			:tag('td')
				:wikitext(args.mapLevel)
				:done()
		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
	elseif args.type == 'Jewel' then
		if args.limit then
			row
				:tag('td')
					:wikitext(args.limit)
					:done()
		else
			row
				:node( newNA(999) )
		end
		if args.radius then
			row
				:tag('td')
					:wikitext(args.radius)
					:done()
		else
			row
				:node( newNA('zzz') )
		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',
		['Microtrans'] = 'currency',
		['Gem'] = 'gem',
		['Quest'] = 'quest',
		['Card'] = 'divicard'
	}
	local container = mw.html.create(args.isHover and 'span' or 'div')
		: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()
  

    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
	})
	local save = 'itemlink__' .. string.gsub(args[1], '%W+', '') .. '_' .. (args.art or args.image or '1') .. (args.large and '_large' or '')
	if frame:callParserFunction('#varexists', {save}) == '1' then
		return frame:callParserFunction('#var', {save})
	end
	return frame:callParserFunction('#vardefineecho', save, frame:expandTemplate{
		title = ':' .. args[1],
		args = {
			view = 'inline',
			itemLinkText = args[2],
			itemLinkArt = args.art or args.image,
			itemLinkLarge = args.large
		}
	})
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
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:StrengthIcon_small.png|link=|Сил.]]', 'Требуется силы') )
				:done()
	end
	if flags.dex then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:DexterityIcon_small.png|link=|Ловк.]]', 'Требуется ловкости') )
				:done()
	end
	if flags.int then
		hdr
			:tag('th')
				:attr('data-sort-type', 'number')
				:node( newAbbr('[[File:IntelligenceIcon_small.png|link=|Инт.]]', 'Требуется интеллекта') )
				: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()
		if flags.qty then
			hdr
				:tag('th')
					:attr('data-sort-type', 'number')
					:wikitext('Количество предметов')
					:done()
		end
	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('Set', 'Amount needed to complete a set') )
                :done()
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Reward')
                :done()
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Drop Location(s)')
                :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('Chaos Damage: ')
				: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()
				: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('Limited to: ')
					:node( h.newColor('value', args.limit) )
			end
			if args.radius then
				group
					:wikitext('Радиус: ')
					:node( h.newColor('value', args.radius) )
			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 == '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' 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)
	end
	if args.level or args.strength or args.dexterity or args.intelligence then
		local requirements = {}
		local attrLabel
		if args.level then
			table.insert( requirements, 'уровень ' .. tostring( h.newColor('value', args.level) ) )
		end
		if args.strength then
			attrLabel = ' Strength'
			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 = ' Dexterity'
			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 = ' Intelligence'
			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()
			:wikitext('Требуется ')
			:wikitext( table.concat(requirements, ', ') )
		container:node(group)
	end
	if args.implicitMods then
		group = h.newGroup('text-mod')
			:wikitext(args.implicitMods)
		container:node(group)
	end
	if args.randomMods then
		group = h.newGroup('text-mod')
			:wikitext(args.randomMods)
		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.helpText then
		group = h.newGroup('textwrap text-help')
			:wikitext(args.helpText)
		container:node(group)
	end
	return container
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