Этот модуль зависит от следующих других модулей: |
Модуль 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) (–
), указывающие границы возможного урона для вычислительных нужд.Такой метод отображения очень похож на игровой:
- Физический урон: 15–23
- Добавляет 48–72 урона от огня
Случайное значение - это два числа разделенных словом "to" и заключенные в скобки. Таким образом показывается возможное значение для показателя при нахождении предмета.В игре вы этого не увидите, но здесь они приведены для справки.
- Уклонение: (от 80 до 91)
- +(от 60 до 80) к максимуму здоровья
- (от 10 до 20)% повышение скорости атаки
- Добавляет (от 15–25 до 24–35) урона хаосом
Редакторы могут экспериментировать в sandbox этого модуля и в testcases страницах.
Подстраницы этого модуля.
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–548 до 26–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, '−', 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, '–(%d*%.?%d+)') or s.minLow )
s.maxLow = tonumber( string.match(s.max, '(%d*%.?%d+)') )
s.maxHigh = tonumber( string.match(s.max, '–(%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