Подумайте над тем, чтобы помочь в обновлении Wiki.

As part of the Unified Community Platform project, your wiki will be migrated to the new platform in the next few weeks. Read more here.

Permanently protected module

Модуль:Item

Материал из Path of Exile Wiki
Перейти к: навигация, поиск
Документация модуля[просмотр] [править] [история] [очистить]

Модуль 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 getArgs = require('Модуль:Arguments').getArgs
local util = require('Модуль:Util')

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

--[[ test args

    = p.item {
        Name = 'Ледяное копье',
        Original = 'Ice Spear',
        Attributes = 'Интеллект',
        Tags = 'Холод, Чары, Снаряд, Ваал',
        Type = 'Gem',
        Subtype = 'Skill',
        ManaCost = '(от 9 до 27)',
        CastTime = '0.85',
        CritChance = '7.00',
        damageEffectiveness = '80',
        droplevel = '12',
        RequiredLevel = '12',
        RandomMods = 'Наносит (от 17&ndash;548 до 26&ndash;822) урона от холода<br> (от 40 до 78)% увеличение длительности охлаждения врагов <br> 600% повышение шанса критического урона во второй форме',
        SkillDescriptionText = 'Герой бросает осколок льда в указанного врага. Осколок пронзает врагов на близкой дистанции, а на большом расстоянии имеет высокий шанс критического удара.',
        QualityEffect = '+2% повышение скорости снаряда',
    }

--]]

---------------------------------------------------------------------
-- Implements {{item}}
---------------------------------------------------------------------
function p.item(frame)
    local args = getArgs(frame, {parentFirst = true})
    local g_frame = util.misc.get_frame(frame)

    args.view = args.view or args.View or 'full'
    if not views[args.view] then
        error('Запрашиваемый вид "' .. args.view .. '" не существует')
    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.mapDrop = args.mapDrop or args.MapDrop
    args.mapGuild = args.mapGuild or args.MapGuild
    args.itemQuantity = args.itemQuantity or args.ItemQuantity
    args.itemRarity = args.itemRarity or args.ItemRarity
		args.monsterPack = args.monsterPack or args.MonsterPack
    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.statusicon = args.statusicon or args.Statusicon or args.pageName .. ' status icon.png'
    args.symbol = args.symbol or args.Symbol
    args.symbolColor = args.symbolColor or args.SymbolColor
    args.soulCost = args.soulCost or args.SoulCost
    args.noSoul = args.noSoul or args.NoSoul
    args.qualityEffect = args.qualityEffect or args.QualityEffect
    args.prophecyText = args.prophecyText or args.ProphecyText
    args.Seal = args.seal or args.Seal 
    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
    args.Original = args.original or args.Original
    args.EssenceTier = args.EssenceTier or args.Essencetier or args.essenceTier or args.essencetier
    args.DropLevel = args.droplevel or args.droplvl or args.drop_level
    args.ProjectileSpeed = args.projspeed or args.projectilespeed or args.ProjSpeed
    args.PantheonSoul = args.PantheonSoul or args.PantheonSoul
	    args.Leaguestone = args.Leaguestone or args.Leaguestone
		args.NetLevel = args.NetLevel or args.NetLevel
	args.range = args.range or args.range or args.Range
	args.piece = args.piece or args.piece or args.Piece
	args.chest = args.chest or args.chest or args.Chest
	args.accessory = args.accessory or args.accessory or args.Accessory
	args.monsters = args.monsters or args.Monsters
	args.deletedrop = args.deletedrop or args.deletedrop or args.Deletedrop
	
	
    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

    if args.type == 'Currency' then
         if args.essencetier == '1'  then
            args.helpText = args.helpText or 'Щелкните правой кнопкой мыши по этому предмету и затем левой по обычному предмету, чтобы использовать.'
         elseif args.essencetier == '2' or args.essencetier == '3' or args.essencetier == '4'or args.essencetier == '5' then
            args.helpText = args.helpText or 'Щелкните правой кнопкой мыши по этому предмету и затем левой по обычному предмету, чтобы использовать.'
         elseif args.essencetier == '6' or args.essencetier == '7' then
            args.helpText = args.helpText or 'Щелкните правой кнопкой мыши по этому предмету и затем левой по обычному или редкому предмету, чтобы использовать.'
           end
       end

	if args.type == 'Map' then
        args.size = args.size or '1x_'
    end

    return views[args.view](args, g_frame)
end

---------------------------------------------------------------------
-- Views
---------------------------------------------------------------------
function views.full(args, g_frame)
    args.stats = h.statsBuilder(args)
    args.class = '-floatright'
    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'] = 'Кольца (устаревший шаблон)',
            ['Амулет'] = 'Амулеты (устаревший шаблон)',
            ['Пояс'] = 'Пояса (устаревший шаблон)',
            ['Колчан'] = 'Колчаны (устаревший шаблон)',
            ['Кольцо'] = 'Кольца (устаревший шаблон)',
            ['Chest'] = 'ларцы (устаревший шаблон)'
        },
        ['Flask'] = {
            ['Life'] = 'Флаконы жизни (устаревший шаблон)',
            ['Mana'] = 'Флаконы маны (устаревший шаблон)',
            ['Hybrid'] = 'Флаконы равновесия (устаревший шаблон)',
            ['Utility'] = 'Особые флаконы (устаревший шаблон)'
        },
        ['Map'] = {
            ['Fragment'] = 'Обрывки карт (устаревший шаблон)',
            ['_default'] = 'Карты (устаревший шаблон)'
        },
        ['Gem'] = {
            ['Skill'] = 'Камни умения (устаревший шаблон)',
            ['Support'] = 'Камни поддержки (устаревший шаблон)'
        },
		['Strongbox'] = {
            ['Chest'] = 'Ларцы (устаревший шаблон)'
        },
        ['Jewel'] = 'Самоцветы (устаревший шаблон)',
        ['Currency'] = 'Валюта (устаревший шаблон)',
        ['Card'] = 'Гадальные карты (устаревший шаблон)',
        ['Trinket'] = 'Брелоки (устаревший шаблон)',
        ['Quest'] = 'Предметы заданий (устаревший шаблон)',
        ['Prophecy'] = 'Пророчества (устаревший шаблон)',
        ['Microtrans'] = 'Микротранзакции (устаревший шаблон)',
        ['Самоцвет'] = 'Самоцветы (устаревший шаблон)',
		['Самоцвет Бездны'] = 'Самоцвет Бездны (устаревший шаблон)',
        ['Decoration'] = 'Декорации (устаревший шаблон)',
			['Душа Пантеона'] = 'Душа Пантеона (устаревший шаблон)',
			['PantheonSoul'] = 'Душа Пантеона (устаревший шаблон)',
			['Piece'] = 'Части предметов Предвестников (устаревший шаблон)',
			['Leaguestone'] = 'Камень лиги (устаревший шаблон)',
			['Камни лиг'] = 'Камень лиги (устаревший шаблон)'
			}
    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

    args.belowStats = ''
    if args.type == 'Card' then
        args.belowStats = '[[Категория:' .. category .. ']]'
    elseif args.type == 'Gem' then
        args.belowStats = string.format('[[Файл:%s|78x78px|]]', args.gemIcon)
        if args.subtype == 'Skill' then
            args.belowStats = args.belowStats .. string.format('[[Файл:%s|64x64px|]]', args.skillIcon)
        end
    else
        args.belowStats = string.format('[[Файл:%s|%s|]][[Категория:%s]]', args.image, p._itemsize{args.size}, category)
    end

    local result = tostring(p._itembox(args))
    if args.screenshot then
        result = result .. '[[Файл:' .. args.screenshot .. '|300x300px|thumb|right]]'
    end
    if args.animation then
        result = result .. '[[Файл:' .. args.animation .. '|300x300px|thumb|right]]'
    end
    return result
end

function views.standard(args, g_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, g_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 = string.format('[[%s|%s]]<br>[[Файл:%s|%s|link=%s|alt=]]', args.pageName, args.itemLinkText, args.itemLinkArt, p._itemsize{args.size, '39'}, args.pageName)
    elseif args.itemLinkIconOnly then
        text = string.format('[[Файл:%s|38x38px|link=%s|alt=]]', args.itemLinkArt, args.pageName)
    else
        text = string.format('[[Файл:%s|16x16px|link=|alt=]][[%s|%s]]', args.itemLinkArt, 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(string.format('[[Файл:%s|%s|link=|alt=]]', args.itemLinkArt, p._itemsize{args.size}))
    end
    return tostring(container)
end

function views.tablerow(args, g_frame)
    if not roundAndPad then
        roundAndPad = require('Module:Decimals')._main
    end
    local otherPage = mw.title.getCurrentTitle().fullText ~= args.pageName
    local flags = args.flags and util.string.split(args.flags, ' ') 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, g_frame))
                    :done()
        else
            row
                :tag('td')
                    :attr('data-sort-value', args.sortKey)
                    :wikitext( (otherPage and '[[' .. args.pageName .. '|' .. args.name .. ']]' or args.name))
                    :wikitext(' <br> [[Файл:' .. 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(g_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.range then
        if args.range then
            row
                :tag('td')
                    :attr( 'data-sort-value', p._itemRangeAverage({args.range}) )
                    :wikitext(args.range)
                    :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 args.duration then
                row
                    :tag('td')
                        :attr( 'data-sort-value', p._itemRangeAverage({args.duration}) )
                        :wikitext(args.duration)
                        :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
        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
    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.essencetier then
            if args.essencetier then
                row
                    :tag('td')
                        :wikitext(args.essencetier)
                        :done()
                else
                row
                    :node( newNA() )
            end
        end
        if flags.droplevel then
            if args.droplevel then
                row
                    :tag('td')
                        :wikitext(args.droplevel)
                        :done()
            else
                row
                    :node( newNA() )
            end
        end
     elseif args.type == 'Card' then
        if flags.card then
        row
			:tag('td')
                :wikitext(args.stackSize)
                :done()
            :tag('td')
                :tag('div')
                    :attr('class', 'item-stats')
                    :wikitext(args.reward)
                    :done()
                :done()
        end
    end

        if flags.drop then
            if args.drop then
                row
                    :tag('td')
                        :wikitext(args.drop)
                        :done()
            else
                row
                    :node( newNA() )
            end
        end

        if flags.monsters then
            if args.monsters then
                row
                    :tag('td')
                        :wikitext(args.monsters)
                        :done()
            else
                row
                    :node( newNA() )
            end
        end
    if flags.effect then
        if args.effect then
            row
                :tag('td')
                    :attr('class', 'text-color -mod')
                    :wikitext(args.effect)
                    :done()
        else
            row
                :node( newNA() )
        end
    end
    if flags.mods then
        if args.implicitMods or args.randomMods or args.cosmeticMods then
            local stats = mw.html.create('div')
                :attr('class', 'item-stats')
            if args.implicitMods then
                stats
                    :node(
                        h.newGroup('text-color -mod')
                            :wikitext(args.implicitMods)
                    )
            end
            if args.randomMods then
                stats
                    :node(
                        h.newGroup('text-color -mod')
                            :wikitext(args.randomMods)
                    )
            end
            if args.cosmeticMods then
                stats
                    :node(
                        h.newGroup('text-color -mod')
                            :wikitext(args.cosmeticMods)
                    )
            end
            row
                :tag('td')
                    :node(stats)
                    :done()
        else
            row
                :node( newNA() )
        end
    end
    if flags.statusicon then
        if args.statusicon then
            row
                :tag('td')
                    :wikitext(string.format('[[Файл:%s]]', args.statusicon))
                    :done()
        else
            row
                :node( newNA() )
        end
    end
    if flags.flavour then
        if args.flavourText then
            row
                :tag('td')
                    :attr('class', 'text-color -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-color -help')
                    :wikitext(args.helpText)
                    :done()
        else
            row
                :node( newNA() )
        end
    end
        if flags.original then
        if args.original then
            row
                :tag('td')
                    :attr('class', 'text-color -notes')
                    :wikitext(args.helpText)
                    :done()
        else
            row
                :node( newNA() )

           end
        end
    return row
end

---------------------------------------------------------------------
-- Implements {{itembox}}
---------------------------------------------------------------------
function p.itembox(frame)
    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',
        ['PantheonSoul'] = 'currency',
        ['Card'] = 'divicard'
    }
    local container = mw.html.create(args.isHover and 'span' or 'div')
    container
        :attr('class', 'item-box -' .. (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( '[[Файл:' .. args.art .. '|link=|alt=]]' )
                    :done()
                :tag('span')
                    :attr('class', 'divicard-frame')
                    :wikitext( '[[Файл: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-color -flavour')
                    :tag('span')
                        :wikitext(args.flavourText)
                        :done()
                    :done()
            :wikitext(args.belowStats)

    elseif args.type == 'Gem' then
        container
            :tag('span')
                :attr('class', 'header -' .. (args.baseItem and 'double' or 'single'))
                :wikitext(args.name .. (args.baseItem and ' <br> ' .. args.baseItem or ''))

            if args.stats then
                container:wikitext(tostring(args.stats))
            end
            if args.belowStats then
                container:wikitext(tostring(args.belowStats))
            end

            if args.view == 'inline' or args.view == 'tablerow' then
                container:wikitext(string.format('[[Файл:%s|78x78px|]]', args.gemIcon))
                if args.subtype == 'Skill' then
                    container:wikitext(string.format('[[Файл:%s|64x64px|]]', args.skillIcon))
                end
            end

    else
        container
            :tag('span')
                :attr('class', 'header -' .. (args.baseItem and 'double' or 'single'))
                :wikitext(args.name .. (args.baseItem and ' <br> ' .. args.baseItem or ''))

        if args.stats then
            container:wikitext(tostring(args.stats))
        end
        if args.belowStats then
            container:wikitext(tostring(args.belowStats))
        end

    end

    return container
end

---------------------------------------------------------------------
-- Implements {{il}}
---------------------------------------------------------------------
function p.itemLink(frame)
    local args = getArgs(frame, {parentOnly = true})
    local g_frame = util.misc.get_frame(frame)
    return g_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)
    local args = getArgs(frame, {parentOnly = true})
    args.flags = args.flags or args.format
    local flags = args.flags and util.string.split(args.flags, ' ') 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('[[Файл: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('[[Файл: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('[[Файл: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('[[Файл:IntelligenceIcon_small.png|link=|Инт.]]', text) )
                :done()
    end
    if flags.weapon then
        hdr
            :tag('th')
                :attr('data-sort-type', 'number')
                :wikitext('Урон')
                :done()
                :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.range 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
        hdr
            :tag('th')
                :attr('data-sort-type', 'number')
                :wikitext('Длительность')
                :done()
            :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.mapGuild then
        hdr
            :tag('th')
                :attr('data-sort-type', 'number')
                :wikitext('Тег <br> гильдии')
                :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('Размер <br> стопки')
                :done()
    if flags.NetLevel then
        hdr
            :tag('th')
                :attr('data-sort-type', 'number')
                :wikitext('Уроввень сети')
                :done()
		end
     if flags.essencetier then
            hdr
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('Уровень <br> сущности')
                    :done()
        end
     if flags.droplevel then
            hdr
                :tag('th')
                    :attr('data-sort-type', 'number')
                    :wikitext('Выпадает <br>с уровня')
                    :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()
    end
    if flags.drop then
        hdr
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Место выпадения')
                :done()
	end
    if flags.monsters then
        hdr
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Выпадает с монстра(-ов)')
                :done()
	end
    if flags.effect then
        hdr
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Эффект')
                :done()
    end
    if flags.mods then
        hdr
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Свойства')
                :done()
    end
    if flags.statusicon then
        hdr
            :tag('th')
                :attr('class', 'unsortable')
                :wikitext('Изображение<br>эффекта')
                :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)
    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)
    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 = util.string.split(size, 'x')
    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')
        :attr('class', 'item-stats')

    -- добавление названия на англ.
    if args.Original then
        container
            :tag('span')
            :addClass('text-color -original')
            :wikitext('англ. [[en:' .. args.Original .. ']]', args.Original)
    end
    if args.deletedrop then
        group = h.newGroup('-textwrap text-color -red')
            :wikitext('Больше не выпадает')
        container:node(group)
    end
    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)
		    :done()
		end
        if args.range then
            group
				:tag('br'):done()
                :wikitext('Дальность оружия: ')
                :node( h.newColor('value', args.range) )
                :tag('br'):done()
			
    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) )
					:tag('br')
				end
			if args.itemRarity then
                group
                    :wikitext('Качество предметов: ')
                    :node( h.newColor('value', args.itemRarity) )
					:tag('br')
				end
			if args.monsterPack then
                group
                    :wikitext('Размер группы монстров: ')
                    :node( h.newColor('value', args.monsterPack) )
					:tag('br')
            end
			if args.mapGuild then
                group
                    :wikitext('Тег гильдии: ')
                    :node( h.newColor('value', args.mapGuild) )
					:tag('br')
            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) )
            :tag('br'):done()
        container:node(group)
		if args.NetLevel then
            group
                :wikitext('Уроввень сети: ')
                :node( h.newColor('value', args.NetLevel) )
                :tag('br'):done()
            end
        if args.EssenceTier then
            group
                :wikitext('Уровень сущности: ')
                :node( h.newColor('value', args.EssenceTier) )
                :tag('br'):done()
            end
        if args.droplevel then
            group = h.newGroup()
                :wikitext('Выпадает с уровня: ')
                :node( h.newColor('value', args.droplevel) )
                :tag('br'):done()
            container:node(group)
            end
        if args.effect then
            group = h.newGroup('-textwrap text-color -mod')
                :wikitext(args.effect)
            container:node(group)
            end
    elseif args.type == 'Trinket' then
        if args.effect then
            group = h.newGroup('-textwrap text-color -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(tostring(h.newColor('mod', 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-color -mod')
            :wikitext(args.effect)
        container:node(group)

        if args.variations ~= nil then
            local variations_text
            if args.variations == 1 then
                variations_text = '1 Вариант'
            elseif args.variations > 1 then
                variations_text = args.variations .. ' Вариантов'
            end
            group = h.newGroup('-textwrap text-color -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.noSoul ~= nil then
            group
                :wikitext('Нельзя получать души: ' .. tostring(h.newColor('value', args.noSoul .. ' сек.')))
                :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
        if args.ProjectileSpeed ~= nil then
            group
                :wikitext('Скорость снаряда: ' .. tostring(h.newColor('value', args.ProjectileSpeed)))
                :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('-textwrap')
        group:wikitext('За 1% качества: <br> ' .. tostring(h.newColor('mod', args.qualityEffect)))
        container:node(group)
    end
    if args.implicitMods then
        group = h.newGroup('-textwrap text-color -mod')
            :wikitext(args.implicitMods)
        container:node(group)
    end
    if args.skillDescriptionText then
        group = h.newGroup('-textwrap text-color -gemdesc')
            :wikitext(args.skillDescriptionText)
        container:node(group)
    end
    if args.randomMods then
        group = h.newGroup('-textwrap text-color -mod')
            :wikitext(args.randomMods)
        if args.corrupted then
            group:tag('span')
                :attr('class', 'text-color -corrupted')
                :wikitext('<br> [[Осквернено]]')
                :done()
        end
        container:node(group)
    end
    if args.cosmeticMods then
        group = h.newGroup('-textwrap text-color -cosmetic')
            :wikitext(args.cosmeticMods)
        container:node(group)
    end
    if args.flavourText then
        group = h.newGroup('-textwrap text-color -flavour')
            :wikitext(args.flavourText)
        container:node(group)
    end
        if args.type == 'Prophecy' then
        group = h.newGroup('-textwrap text-color -value')
            :wikitext(args.prophecyText)
        container:node(group)
   end
     if args.Seal then
        group = h.newGroup()
            :wikitext('Стоимость печати: <br>' .. tostring(h.newColor('currency', args.Seal .. 'х  [[Файл:Серебряная монета.png| |25px|link=Серебряная монета|alt=]][[Серебряная монета]]' )))
        container:node(group)
            end
    if args.helpText then
        group = h.newGroup('-textwrap text-color -help')
            :wikitext(args.helpText)
        container:node(group)
    end
    return container
end

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

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

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

return p