Trympyrym633@legacy41979389 (обсуждение | вклад) Нет описания правки |
Trympyrym633@legacy41979389 (обсуждение | вклад) Нет описания правки |
||
Строка 221: | Строка 221: | ||
args.belowStats:node(icons) |
args.belowStats:node(icons) |
||
end |
end |
||
+ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
else |
else |
||
args.belowStats = mw.html.create('div') |
args.belowStats = mw.html.create('div') |
||
Строка 233: | Строка 228: | ||
:wikitext( '[[Category:' .. category .. ']]' ) |
:wikitext( '[[Category:' .. category .. ']]' ) |
||
end |
end |
||
− | + | local result = p._itembox(args) |
|
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | return tostring(result) |
||
end |
end |
||
Версия от 10:00, 7 июня 2016
Этот модуль зависит от следующих других модулей: |
Модуль 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 p = {}
local h = {}
local views = {}
local getArgs, roundAndPad
---------------------------------------------------------------------
-- Implements {{item}}
---------------------------------------------------------------------
function p.item(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
parentFirst = true
})
args.view = args.view or args.View or 'full'
if not views[args.view] then
error('The requested view "' .. args.view .. '" does not exist')
end
args.format = args.format or args.Format
args.name = args.name or args.Name
args.pageName = args.pageName or args.PageName or args.pagename or args.Pagename or args.name
args.art = args.art or args.Art or args.pageName .. ' card art.png'
args.size = args.size or args.Size or '2x_'
args.rarity = args.rarity or args.Rarity or 'Normal'
args.type = args.type or args.Type
args.subtype = args.subtype or args.Subtype
args.baseItem = args.baseItem or args.BaseItem
args.baseItemPage = args.baseItemPage or args.BaseItemPage or args.baseItem
args.level = args.level or args.RequiredLevel
args.strength = args.strength or args.RequiredStrength
args.dexterity = args.dexterity or args.RequiredDexterity
args.intelligence = args.intelligence or args.RequiredIntelligence
args.physical = args.physicalDamage or args.PhysicalDamage
args.fire = args.fire or args.FireDamage
args.cold = args.cold or args.ColdDamage
args.lightning = args.lightning or args.LightningDamage
args.chaos = args.chaos or args.ChaosDamage
args.averageDamage = args.averageDamage or args.AverageDamage
args.critChance = args.critChance or args.CriticalStrikeChance or args.CritChance
args.attacksPerSecond = args.attacksPerSecond or args.AttacksPerSecond
args.blockChance = args.blockChance or args.Block
args.armour = args.armour or args.Armour
args.evasion = args.evasion or args.Evasion
args.energyShield = args.energyShield or args.EnergyShield
args.mapLevel = args.mapLevel or args.MapLevel
args.mapTier = args.mapTier or args.MapTier
args.itemQuantity = args.itemQuantity or args.itemQuantity
args.radius = args.radius or args.Radius
args.limit = args.limit or args.Limit
args.stackSize = args.stackSize or args.StackSize
args.effect = args.effect or args.Effect
args.life = args.life or args.FlaskLife
args.mana = args.mana or args.FlaskMana
args.duration = args.duration or args.FlaskDuration
args.chargeCap = args.chargeCap or args.FlaskCharges
args.chargeUse = args.chargeUse or args.FlaskChargesUsed
args.implicitMods = args.implicitMods or args.ImplicitMods
args.randomMods = args.randomMods or args.RandomMods
args.cosmeticMods = args.cosmeticMods or args.CosmeticMods
args.helpText = args.helpText or args.HelpText
args.flavourText = args.flavourText or args.FlavourText
args.reward = args.Reward or args.reward
args.drop = args.drop or args.Drop
args.variations = args.variations or args.Variations
args.variations = tonumber(args.variations)
args.talismanTier = args.talismanTier or args.TalismanTier
args.tags = args.tags or args.Tags
args.manaCost = args.manaCost or args.ManaCost
args.canStoreUses = args.canStoreUses or args.CanStoreUses
args.cooldownTime = args.cooldownTime or args.CooldownTime or args.Cooldown
args.castTime = args.castTime or args.CastTime
args.damageEffectiveness = args.damageEffectiveness or args.DamageEffectiveness
args.manacostMultiplier = args.manacostMultiplier or args.ManacostMultiplier
args.skillDescriptionText = args.skillDescriptionText or args.SkillDescriptionText
args.gemIcon = args.gemIcon or args.GemIcon or args.name .. ' gem icon.png'
args.skillIcon = args.skillIcon or args.SkillIcon or args.pageName .. ' skill icon.png'
args.symbol = args.symbol or args.Symbol
args.symbolColor = args.symbolColor or args.SymbolColor
args.soulCost = args.soulCost or args.SoulCost
args.qualityEffect = args.qualityEffect or args.QualityEffect
args.prophecyText = args.prophecyText or args.ProphecyText
args.manaReserved = args.manaReserved or args.ManaReserved
args.attributes = args.attributes or args.Attributes
args.corrupted = args.corrupted or args.Corrupted
args.radius = args.radius or args.Radius
args.screenshot= args.screenshot or args.Screenshot
args.animation= args.animation or args.Animation
if args.type == 'Gem' then
args.image = args.gemIcon
end
if args.type == 'Decoration' then
args.image = args.image or args.Image or args.pageName .. ' Decoration.png'
args.effect = args.effect or 'Создаёт объект в вашем убежище'
args.helpText = args.helpText or 'Щелкните правой кнопкой мыши по предмету и затем левой по области на земле, чтобы создать объект'
else
args.image = args.image or args.Image or args.pageName .. '.png'
end
if args.view == 'full' and args.type == 'Gem' then
if args.subtype == 'Support' then
args.helpText = args.helpText or 'Это камень поддержки. Он дает преимущества не герою, а камню умения в связанных гнездах. Вставьте камень поддержки в гнездо, соединенное с гнездом усиливаемого камня активного умения. Щелкните ПКМ, чтобы вынуть камень из гнезда.'
elseif args.subtype == 'Skill' then
args.helpText = args.helpText or 'Для получения умения выберите предмет и поместите камень в гнездо соответствующего цвета. Щелкните ПКМ, чтобы вынуть камень из гнезда.'
end
end
return views[args.view](args, frame)
end
---------------------------------------------------------------------
-- Views
---------------------------------------------------------------------
function views.full(args, frame)
args.stats = h.statsBuilder(args)
args.class = 'itembox-full'
args.name = '[[' .. args.pageName .. '|' .. args.name .. ']]'
args.baseItem = args.baseItem and ('[[' .. args.baseItemPage .. '|' .. args.baseItem .. ']]') or nil
local types = {
['Weapon'] = {
['Bow'] = 'Луки',
['Claw'] = 'Когти',
['Dagger'] = 'Кинжалы',
['Wand'] = 'Жезлы',
['Fishing Rod'] = 'Удочки',
['Staff'] = 'Посохи',
['One Handed Axe'] = 'Одноручные топоры',
['Two Handed Axe'] = 'Двуручные топоры',
['One Handed Mace'] = 'Одноручные булавы',
['Two Handed Mace'] = 'Двуручные булавы',
['One Handed Sword'] = 'Одноручные мечи',
['Two Handed Sword'] = 'Двуручные мечи',
['Лук'] = 'Луки',
['Когти'] = 'Когти',
['Кинжал'] = 'Кинжалы',
['Жезл'] = 'Жезлы',
['Удочка'] = 'Удочки',
['Посох'] = 'Посохи',
['Одноручный топор'] = 'Одноручные топоры',
['Двуручный топор'] = 'Двуручные топоры',
['Одноручная булава'] = 'Одноручные булавы',
['Двуручная булава'] = 'Двуручные булавы',
['Одноручный меч'] = 'Одноручные мечи',
['Двуручный меч'] = 'Двуручные мечи'
},
['Armour'] = {
['Body Armour'] = 'Нагрудная броня',
['Helmet'] = 'Шлемы',
['Shield'] = 'Щиты',
['Boots'] = 'Обувь',
['Gloves'] = 'Перчатки',
['Нагрудная броня'] = 'Нагрудная броня',
['Шлем'] = 'Шлемы',
['Щит'] = 'Щиты',
['Обувь'] = 'Обувь',
['Перчатки'] = 'Перчатки'
},
['Accessory'] = {
['Amulet'] = 'Амулеты',
['Belt'] = 'Пояса',
['Quiver'] = 'Колчаны',
['Ring'] = 'Кольца',
['Амулет'] = 'Амулеты',
['Пояс'] = 'Пояса',
['Колчан'] = 'Колчаны',
['Кольцо'] = 'Кольца'
},
['Flask'] = {
['Life'] = 'Флаконы жизни',
['Mana'] = 'Флаконы маны',
['Hybrid'] = 'Флаконы равновесия',
['Utility'] = 'Особые флаконы'
},
['Map'] = {
['Fragment'] = 'Обрывки карт',
['_default'] = 'Карты'
},
['Gem'] = {
['Skill'] = 'Камни умения',
['Support'] = 'Камни поддержки'
},
['Jewel'] = 'Самоцветы',
['Currency'] = 'Валюта',
['Card'] = 'Гадальные карты',
['Trinket'] = 'Брелоки',
['Quest'] = 'Вещи для заданий',
['Prophecy'] = 'Пророчества',
['Microtrans'] = 'Микротранзакции',
['Самоцвет'] = 'Самоцветы',
['Decoration'] = 'Декорации'
}
local category = types[args.type]
if type(category) == 'table' then
category = types[args.type][args.subtype or '_default']
end
if category then
if args.rarity == 'Unique' then
category = 'Уникальные ' .. string.lower(category)
end
else
category = 'Предметы с неверными типами'
end
if args.type == 'Card' then
args.belowStats = '[[Category:' .. category .. ']]'
elseif args.type == 'Gem' then
args.belowStats = mw.html.create('div')
if args.subtype == 'Skill' then
icons = mw.html.create('div')
:attr('class', 'itemboximage')
:wikitext( '[[File:' .. args.gemIcon .. '|' .. '64x64px' .. '|]]' )
:wikitext( '[[File:' .. args.skillIcon .. '|' .. '64x64px' .. '|]]' )
:done()
args.belowStats:node(icons)
elseif args.subtype == 'Support' then
icons = mw.html.create('div')
:attr('class', 'itemboximage')
:wikitext( '[[File:' .. args.gemIcon .. '|' .. '64x64px' .. '|]]' )
:done()
args.belowStats:node(icons)
end
else
args.belowStats = mw.html.create('div')
:attr('class', 'itemboximage')
:wikitext( '[[File:' .. args.image .. '|' .. p._itemsize({args.size}) .. '|]]' )
:wikitext( '[[Category:' .. category .. ']]' )
end
local result = p._itembox(args)
if args.screenshot ~= nil then
result = result .. '[[File:' .. args.screenshot .. '|' .. '300x300px' .. '|thumb|right]]'
end
if args.animation ~= nil then
result = result .. '[[File:' .. args.animation .. '|' .. '300x300px' .. '|thumb|right]]'
end
return tostring(result)
end
function views.standard(args, frame)
args.stats = h.statsBuilder(args)
args.name = '[[' .. args.pageName .. '|' .. args.name .. ']]'
args.baseItem = args.baseItem and ('[[' .. args.baseItemPage .. '|' .. args.baseItem .. ']]') or nil
return tostring( p._itembox(args) )
end
function views.inline(args, frame)
if args.type == 'Gem' then
args.image = args.gemIcon
end
args.stats = h.statsBuilder(args)
args.class = 'itemboxhover itemboxhoverhide itemboxhovernojs'
args.isHover = true
args.itemLinkText = args.itemLinkText or args.name
args.itemLinkArt = args.itemLinkArt and string.gsub(args.image, '%.(%a+)$', ' ' .. args.itemLinkArt .. '.%1') or args.image
local text = ""
if args.itemLinkLarge then
text = '[[' .. args.pageName .. '|' .. args.itemLinkText .. ']] <br> [[File:' .. args.itemLinkArt .. '|' .. p._itemsize({args.size, '39'}) .. '|link=' .. args.pageName .. '|alt=]]'
elseif args.itemLinkIconOnly then
text = '[[File:' .. args.itemLinkArt .. '|38x38px|link=' .. args.pageName .. '|alt=]]'
else
text = '[[File:' .. args.itemLinkArt .. '|16x16px|link=|alt=]][[' .. args.pageName .. '|' .. args.itemLinkText .. ']]'
end
local container = mw.html.create('span')
:tag('span')
:attr('class', 'itemhover')
:attr('style', 'white-space: normal;text-align:left;')
:wikitext(text)
:done()
:node( p._itembox(args) )
if args.type ~= 'Card' and args.type ~= 'Gem' then
container
:tag('span')
:attr('class', 'itemboxhovericon itemboxhoverhide itemboxhovernojs')
:wikitext( '[[File:' .. args.itemLinkArt .. '|' .. p._itemsize({args.size}) .. '|link=|alt=]]' )
:done()
end
return tostring(container)
end
function views.tablerow(args, frame)
if not roundAndPad then
roundAndPad = require('Module:Decimals')._main
end
local otherPage = mw.title.getCurrentTitle().fullText ~= args.pageName
local flags = args.flags and mw.text.split(args.flags, ' ', true) or {}
for i=1, #flags do
flags[ flags[i] ] = true
end
local function newNA(val)
local cell = mw.html.create('td')
:attr('class', 'table-na')
:wikitext('<small>N/A</small>')
if val ~= nil then
cell
:attr('data-sort-value', val)
end
return cell
end
local row = mw.html.create('tr')
if otherPage then
row
:attr('id', args.name)
end
if flags.name then
if args.type == 'Gem' then
row
:tag('td')
:attr('data-sort-value', args.sortKey)
:attr('align', 'left')
:wikitext(views.inline(args, frame))
:done()
else
row
:tag('td')
:attr('data-sort-value', args.sortKey)
:wikitext( (otherPage and '[[' .. args.pageName .. '|' .. args.name .. ']]' or args.name) .. ' <br> [[File:' .. args.image .. '|' .. p._itemsize({args.size, '39'}) .. '|link=' .. (otherPage and args.pageName or '') .. '|alt=]]' )
:done()
end
end
if flags.base then
row
:tag('td')
:attr('data-sort-value', args.baseItemPage)
:wikitext( '[[' .. args.baseItemPage .. '|' .. args.baseItem .. ']]' )
:done()
end
if flags.level then
if args.level then
row
:tag('td')
:wikitext(args.level)
:done()
else
row
:node( newNA(0) )
end
end
if flags.str then
if args.type == 'Gem' then
if string.find(args.attributes, 'Сила') ~= nil then
row
:tag('td')
:wikitext(frame:expandTemplate{ title = 'yes' })
:done()
else
row
:node( newNA(0) )
end
elseif args.strength then
row
:tag('td')
:wikitext(args.strength)
:done()
else
row
:node( newNA(0) )
end
end
if flags.dex then
if args.type == 'Gem' then
if string.find(args.attributes, 'Ловкость') ~= nil then
row
:tag('td')
:wikitext(frame:expandTemplate{ title = 'yes' })
:done()
else
row
:node( newNA(0) )
end
elseif args.dexterity then
row
:tag('td')
:wikitext(args.dexterity)
:done()
else
row
:node( newNA(0) )
end
end
if flags.int then
if args.type == 'Gem' then
if string.find(args.attributes, 'Интеллект') ~= nil then
row
:tag('td')
:wikitext(frame:expandTemplate{ title = 'yes' })
:done()
else
row
:node( newNA(0) )
end
elseif args.intelligence then
row
:tag('td')
:wikitext(args.intelligence)
:done()
else
row
:node( newNA(0) )
end
end
if args.type == 'Weapon' then
if flags.weapon then
local avgDmg = tonumber(args.averageDamage) or ( (args.physical and p._itemRangeAverage({args.physical}) or 0) + (args.fire and p._itemRangeAverage({args.fire}) or 0) + (args.cold and p._itemRangeAverage({args.cold}) or 0) + (args.lightning and p._itemRangeAverage({args.lightning}) or 0) + (args.chaos and p._itemRangeAverage({args.chaos}) or 0) )
local avgCrt = args.critChance and p._itemRangeAverage({args.critChance}) or 0
local avgAps = args.attacksPerSecond and p._itemRangeAverage({args.attacksPerSecond}) or 0
local damage = mw.html.create('td')
:attr('data-sort-value', avgDmg)
if avgDmg == 0 then
damage
:wikitext('0')
else
if args.physical then
damage
:node( h.newColor('physical', args.physical) )
:tag('br'):done()
end
if args.fire then
damage
:node( h.newColor('fire', args.fire) )
:tag('br'):done()
end
if args.cold then
damage
:node( h.newColor('cold', args.cold) )
:tag('br'):done()
end
if args.lightning then
damage
:node( h.newColor('lightning', args.lightning) )
:tag('br'):done()
end
if args.chaos then
damage
:node( h.newColor('chaos', args.chaos) )
end
end
row
:node(damage)
:tag('td')
:attr('data-sort-value', avgCrt)
:wikitext(args.critChance)
:done()
:tag('td')
:attr('data-sort-value', avgAps)
:wikitext(args.attacksPerSecond)
:done()
:tag('td')
:wikitext( roundAndPad( avgDmg * avgAps * (1 - avgCrt / 100) + avgDmg * avgAps * avgCrt / 100 * 1.5, 2 ) )
:done()
end
end
if flags.block then
if args.blockChance then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.blockChance}) )
:wikitext(args.blockChance)
:done()
else
row
:node( newNA(0) )
end
end
if flags.armour then
if args.armour then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.armour}) )
:wikitext(args.armour)
:done()
else
row
:node( newNA(0) )
end
end
if flags.evasion then
if args.evasion then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.evasion}) )
:wikitext(args.evasion)
:done()
else
row
:node( newNA(0) )
end
end
if flags.energyshield then
if args.energyShield then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.energyShield}) )
:wikitext(args.energyShield)
:done()
else
row
:node( newNA(0) )
end
end
if flags.flask then
if flags.life or flags.mana then
if flags.life then
if args.life then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.life}) )
:wikitext(args.life)
:done()
else
row
:node( newNA(0) )
end
end
if flags.mana then
if args.mana then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.mana}) )
:wikitext(args.mana)
:done()
else
row
:node( newNA(0) )
end
end
if args.duration then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.duration}) )
:wikitext(args.duration)
:done()
else
row
:node( newNA(0) )
end
end
if flags.effect then
if args.effect then
row
:tag('td')
:attr('class', 'text-mod')
:node(args.effect)
:done()
else
row
:node( newNA() )
end
if args.duration then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.duration}) )
:wikitext(args.duration)
:done()
else
row
:node( newNA(0) )
end
end
if args.chargeCap then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.chargeCap}) )
:wikitext(args.chargeCap)
:done()
else
row
:node( newNA(0) )
end
if args.chargeUse then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.chargeUse}) )
:wikitext(args.chargeUse)
:done()
else
row
:node( newNA(0) )
end
elseif args.type == 'Map' then
if flags.mapLevel then
row
:tag('td')
:wikitext(args.mapLevel)
:done()
if flags.mapTier then
row
:tag('td')
:wikitext(args.mapTier)
:done()
else
row
:node( newNA(0) )
end
end
if flags.qty then
if args.itemQuantity then
row
:tag('td')
:attr( 'data-sort-value', p._itemRangeAverage({args.itemQuantity}) )
:wikitext(args.itemQuantity)
:done()
else
row
:node( newNA(0) )
end
end
if flags.map then
row
:tag('td')
:wikitext(args.mapLevel)
:done()
end
elseif args.type == 'Jewel' then
if flags.limit then
if args.limit then
row
:tag('td')
:wikitext(args.limit)
:done()
else
row
:node( newNA(999) )
end
end
if flags.jewel then
if args.limit then
row
:tag('td')
:wikitext(args.limit)
:done()
else
row
:node( newNA(999) )
end
end
if flags.radius then
if args.radius then
row
:tag('td')
:wikitext(args.radius)
:done()
else
row
:node( newNA('zzz') )
end
end
if flags.jewel then
if args.radius then
row
:tag('td')
:wikitext(args.radius)
:done()
else
row
:node( newNA('zzz') )
end
end
elseif args.type == 'Currency' then
row
:tag('td')
:wikitext(args.stackSize)
:done()
if flags.effect then
if args.effect then
row
:tag('td')
:attr('class', 'text-mod')
:wikitext(args.effect)
:done()
else
row
:node( newNA() )
end
end
elseif args.type == 'Card' then
row
:tag('td')
:wikitext(args.stackSize)
:done()
:tag('td')
:tag('div')
:attr('class', 'itemboxstats')
:wikitext(args.reward)
:done()
:done()
:tag('td')
:wikitext(args.drop)
:done()
end
if flags.mods then
if args.implicitMods or args.randomMods or args.cosmeticMods then
local stats = mw.html.create('div')
:attr('class', 'itemboxstats')
if args.implicitMods then
stats
:node(
h.newGroup('text-mod')
:wikitext(args.implicitMods)
)
end
if args.randomMods then
stats
:node(
h.newGroup('text-mod')
:wikitext(args.randomMods)
)
end
if args.cosmeticMods then
stats
:node(
h.newGroup('text-mod')
:wikitext(args.cosmeticMods)
)
end
row
:tag('td')
:node(stats)
:done()
else
row
:node( newNA() )
end
end
if flags.flavour then
if args.flavourText then
row
:tag('td')
:attr('class', 'text-flavour')
:wikitext(args.flavourText)
:done()
else
row
:node( newNA() )
end
end
if flags.help then
if args.helpText then
row
:tag('td')
:attr('class', 'text-help')
:wikitext(args.helpText)
:done()
else
row
:node( newNA() )
end
end
return row
end
---------------------------------------------------------------------
-- Implements {{itembox}}
---------------------------------------------------------------------
function p.itembox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
wrappers = 'Template:Itembox'
})
return p._itembox(args)
end
function p._itembox(args)
local frames = {
['Currency'] = 'currency',
['Trinket'] = 'currency',
['Microtrans'] = 'currency',
['Gem'] = 'gem',
['Quest'] = 'quest',
['Prophecy'] = 'prophecy',
['Card'] = 'divicard'
}
local container = mw.html.create(args.isHover and 'span' or 'div')
container:attr( 'class', 'itembox-' .. ( string.lower(args.frame or frames[args.type] or args.rarity or 'normal') ) .. ' ' .. (args.class or '') )
if args.type == 'Card' then
container
:tag('span')
:attr('class', 'divicard-wrapper')
:tag('span')
:attr('class', 'divicard-art')
:wikitext( '[[File:' .. args.art .. '|link=|alt=]]' )
:done()
:tag('span')
:attr('class', 'divicard-frame')
:wikitext( '[[File:Divination card frame.png|link=|alt=]]' )
:done()
:tag('span')
:attr('class', 'divicard-header')
:wikitext(args.name)
:done()
:tag('span')
:attr('class', 'divicard-stack')
:wikitext(args.stackSize)
:done()
:tag('span')
:attr('class', 'divicard-reward')
:tag('span')
:wikitext(args.reward)
:done()
:done()
:tag('span')
:attr('class', 'divicard-flavour text-flavour')
:tag('span')
:wikitext(args.flavourText)
:done()
:done()
:wikitext(args.belowStats)
:done()
elseif args.type == 'Gem' then
local div = mw.html.create('div')
div
:tag('span')
:attr( 'class', 'itemboxheader-' .. (args.baseItem and 'double' or 'single') )
:tag('span')
:attr('class', 'itemboxheaderleft')
:done()
:tag('span')
:attr('class', 'itemboxheaderright')
:done()
:tag('span')
:attr('class', 'itemboxheadertext')
:wikitext( args.name .. (args.baseItem and '<br>' .. args.baseItem or '') )
:done()
:done()
if type(args.aboveStats) == 'table' then
div:node(args.aboveStats)
elseif type(args.aboveStats) == 'string' then
div:wikitext(args.aboveStats)
end
local stats = mw.html.create('span')
:attr('class', 'itemboxstats')
if type(args.stats) == 'table' then
stats:node(args.stats)
elseif type(args.stats) == 'string' then
stats:wikitext(args.stats)
end
div:node(stats)
if type(args.belowStats) == 'table' then
div:node(args.belowStats)
elseif type(args.belowStats) == 'string' then
div:wikitext(args.belowStats)
end
if args.view == 'inline' or args.view == 'tablerow' then
div:wikitext( '[[File:' .. args.gemIcon .. '|' .. '64x64px' .. '|]]' )
if args.subtype == 'Skill' then
div:wikitext( '[[File:' .. args.skillIcon .. '|' .. '64x64px' .. '|]]' )
end
end
container:node(div)
else
container
:tag('span')
:attr( 'class', 'itemboxheader-' .. (args.baseItem and 'double' or 'single') )
:tag('span')
:attr('class', 'itemboxheaderleft')
:done()
:tag('span')
:attr('class', 'itemboxheaderright')
:done()
:tag('span')
:attr('class', 'itemboxheadertext')
:wikitext( args.name .. (args.baseItem and '<br>' .. args.baseItem or '') )
:done()
:done()
if type(args.aboveStats) == 'table' then
container:node(args.aboveStats)
elseif type(args.aboveStats) == 'string' then
container:wikitext(args.aboveStats)
end
local stats = mw.html.create('span')
:attr('class', 'itemboxstats')
if type(args.stats) == 'table' then
stats:node(args.stats)
elseif type(args.stats) == 'string' then
stats:wikitext(args.stats)
end
container:node(stats)
if type(args.belowStats) == 'table' then
container:node(args.belowStats)
elseif type(args.belowStats) == 'string' then
container:wikitext(args.belowStats)
end
end
return container
end
---------------------------------------------------------------------
-- Implements {{il}}
---------------------------------------------------------------------
function p.itemLink(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
parentOnly = true
})
return frame:expandTemplate{
title = ':' .. args[1],
args = {
view = 'inline',
itemLinkText = args[2],
itemLinkArt = args.art or args.image,
itemLinkLarge = args.large,
itemLinkIconOnly = args.IconOnly or args.iconOnly or args.io
}
}
end
---------------------------------------------------------------------
-- Implements {{item table}}
---------------------------------------------------------------------
function p.itemTable(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
parentOnly = true
})
args.flags = args.flags or args.format
local flags = args.flags and mw.text.split(args.flags, ' ', true) or {}
for i=1, #flags do
flags[ flags[i] ] = true
end
local function newAbbr(text, title)
return mw.html.create('abbr')
:attr('class', 'nounderline')
:attr('title', title)
:wikitext(text)
end
local tbl = mw.html.create('table')
:attr('class', 'wikitable sortable')
:attr('style', 'text-align:center; ' .. ( args.width and 'width:' .. args.width or '' ) )
local hdr = mw.html.create('tr')
:tag('th')
:wikitext('Наименование')
:done()
if flags.base then
hdr
:tag('th')
:wikitext('База')
:done()
end
if flags.level then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('[[File:Level_up_icon_small.png|link=|Lvl.]]', 'Требуемый уровень') )
:done()
end
if flags.str then
local text = 'Требуется силы'
if flags.gem then
text = 'Также требуется сила'
end
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('[[File:StrengthIcon_small.png|link=|Сил.]]', text) )
:done()
end
if flags.dex then
local text = 'Требуется ловкости'
if flags.gem then
text = 'Также требуется ловкость'
end
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('[[File:DexterityIcon_small.png|link=|Ловк.]]', text) )
:done()
end
if flags.int then
local text = 'Требуется интеллекта'
if flags.gem then
text = 'Также требуется интеллект'
end
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('[[File:IntelligenceIcon_small.png|link=|Инт.]]', text) )
:done()
end
if flags.weapon then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Урон')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Шанс на критический удар')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Атак в секунду')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Урон в Секунду')
:done()
end
if flags.block then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Шанс заблокировать удар')
:done()
end
if flags.armour then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Броня')
:done()
end
if flags.evasion then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Уклонение')
:done()
end
if flags.energyshield then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Энергетический щит')
:done()
end
if flags.flask then
if flags.life or flags.mana then
if flags.life then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('Здоровье', 'Количество здоровья, восстанавливаемого за один глоток') )
:done()
end
if flags.mana then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('Мана', 'Количество маны, восстанавливаемой за один глоток') )
:done()
end
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr(
'Время',
'Время восстановления' .. (flags.life and ' здоровья' or '') .. ( (flags.life and flags.mana) and ' and ' or '' ) .. (flags.mana and ' маны' or '')..' в секундах'
) )
:done()
end
if flags.effect then
hdr
:tag('th')
:attr('class', 'unsortable')
:wikitext('Эффект')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Длительность')
:done()
end
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('Вместимость', 'Общее количество зарядов, которое способен вместить флакон') )
:done()
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('Глоток', 'Количество зарядов, расходуемое за одно использование') )
:done()
end
if flags.map then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Уровень карты')
:done()
end
if flags.jewel then
hdr
:tag('th')
:wikitext('Лимит')
:done()
hdr
:tag('th')
:wikitext('Радиус')
:done()
end
if flags.currency then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Размер стопки')
:done()
if flags.effect then
hdr
:tag('th')
:attr('class', 'unsortable')
:wikitext('Эффект')
:done()
end
end
if flags.card then
hdr
:tag('th')
:attr('data-sort-type', 'number')
:node( newAbbr('Набор', 'Карточек в наборе') )
:done()
:tag('th')
:attr('class', 'unsortable')
:wikitext('Награда')
:done()
:tag('th')
:attr('class', 'unsortable')
:wikitext('Условия выпадения')
:done()
end
if flags.mods then
hdr
:tag('th')
:attr('class', 'unsortable')
:wikitext('Свойства')
:done()
end
if flags.flavour then
hdr
:tag('th')
:attr('class', 'unsortable')
:wikitext('Художественный текст')
:done()
end
if flags.help then
hdr
:tag('th')
:attr('class', 'unsortable')
:wikitext('Вспомогательный текст')
:done()
end
tbl:node(hdr)
local i = 1
while args[i] do
tbl
:node(
frame:expandTemplate{
title = ':' .. args[i],
args = {
view = 'tablerow',
flags = 'name ' .. args.flags
}
}
)
i = i + 1
end
return tostring(tbl)
end
---------------------------------------------------------------------
-- Implements {{item range average}}
---------------------------------------------------------------------
function p.itemRangeAverage(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
wrappers = 'Template:Item range average'
})
return p._itemRangeAverage(args)
end
function p._itemRangeAverage(args)
if args[1] == nil then
return nil
end
local s = {}
s.mod = string.match(args[1], '>([^><]+)</') or args[1]
s.sign = string.find(s.mod, '−', 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)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
wrappers = 'Template:Itemsize'
})
return p._itemsize(args)
end
function p._itemsize(args)
local size = args[1] or '1x_'
local grid = args[2] or 78
local dim = mw.text.split(size, 'x', true)
if dim[1] == '_' then
if dim[2] == '_' then
dim[1] = grid
else
dim[1] = ''
end
else
dim[1] = dim[1] * grid
end
if dim[2] == '_' then
dim[2] = ''
else
dim[2] = 'x' .. dim[2] * grid
end
return dim[1] .. dim[2] .. 'px'
end
---------------------------------------------------------------------
-- Helper functions
---------------------------------------------------------------------
function h.statsBuilder(args)
local container = mw.html.create('span')
local group
if args.type == 'Weapon' then
group = h.newGroup()
:wikitext(args.subtype)
:tag('br'):done()
if args.physical then
group
:wikitext('Физический урон: ')
:node( h.newColor('value', args.physical) )
:tag('br'):done()
end
if args.fire or args.cold or args.lightning then
local elementalDamage = {}
if args.fire then
table.insert( elementalDamage, tostring( h.newColor('fire', args.fire) ) )
end
if args.cold then
table.insert( elementalDamage, tostring( h.newColor('cold', args.cold) ) )
end
if args.lightning then
table.insert( elementalDamage, tostring( h.newColor('lightning', args.lightning) ) )
end
group
:wikitext('Урон от стихий: ')
:wikitext( table.concat(elementalDamage, ', ') )
:tag('br'):done()
end
if args.chaos then
group
:wikitext('Урон хаосом: ')
:node( h.newColor('chaos', args.chaos) )
:tag('br'):done()
end
group
:wikitext('Шанс на критический удар: ')
:node( h.newColor('value', args.critChance) )
:tag('br'):done()
:wikitext('Атак в секунду: ')
:node( h.newColor('value', args.attacksPerSecond) )
container:node(group)
elseif args.type == 'Armour' then
if args.blockChance or args.armour or args.evasion or args.energyShield then
group = h.newGroup()
if args.blockChance then
group
:wikitext('Шанс заблокировать удар ')
:node( h.newColor('value', args.blockChance) )
:tag('br'):done()
end
if args.armour then
group
:wikitext('Броня: ')
:node( h.newColor('value', args.armour) )
:tag('br'):done()
end
if args.evasion then
group
:wikitext('Уклонение: ')
:node( h.newColor('value', args.evasion) )
:tag('br'):done()
end
if args.energyShield then
group
:wikitext('Энергетический щит: ')
:node( h.newColor('value', args.energyShield) )
end
container:node(group)
end
elseif args.type == 'Map' then
if args.mapLevel then
group = h.newGroup()
if args.mapTier then
group
:wikitext('Уровень карты: ')
:node( h.newColor('value', args.mapTier) )
:tag('br')
end
group
:wikitext('Уровень монстров: ')
:node( h.newColor('value', args.mapLevel) )
:tag('br'):done()
if args.itemQuantity then
group
:wikitext('Количество предметов: ')
:node( h.newColor('value', args.itemQuantity) )
end
container:node(group)
end
elseif args.type == 'Jewel' then
if args.limit or args.radius then
group = h.newGroup()
if args.limit then
group
:wikitext('Максимум: ')
:node( h.newColor('value', args.limit) )
:tag('br'):done()
end
if args.radius then
group
:wikitext('Радиус: ')
:node( h.newColor('value', args.radius) )
:tag('br'):done()
end
container:node(group)
end
elseif args.type == 'Currency' then
group = h.newGroup()
:wikitext('Размер стопки: ')
:node( h.newColor('value', args.stackSize) )
container:node(group)
if args.effect then
group = h.newGroup('textwrap text-mod')
:wikitext(args.effect)
container:node(group)
end
elseif args.type == 'Trinket' then
if args.effect then
group = h.newGroup('textwrap text-mod')
:wikitext(args.effect)
container:node(group)
end
elseif args.type == 'Flask' then
group = h.newGroup()
if args.life then
group
:wikitext('Восстанавливает здоровья: ')
:node( h.newColor('value', args.life) )
:wikitext(' за ')
:node( h.newColor('value', args.duration) )
:wikitext(' сек.')
:tag('br'):done()
end
if args.mana then
group
:wikitext('Восстанавливает маны: ')
:node( h.newColor('value', args.mana) )
:wikitext(' за ')
:node( h.newColor('value', args.duration) )
:wikitext(' сек.')
:tag('br'):done()
end
if args.effect then
group
:wikitext('Длится ')
:node( h.newColor('value', args.duration) )
:wikitext(' сек.')
:tag('br'):done()
end
group
:wikitext('Расходует ')
:node( h.newColor('value', args.chargeUse) )
:wikitext(' из ')
:node( h.newColor('value', args.chargeCap) )
:wikitext(' зарядов при использовании')
:tag('br'):done()
if args.effect then
group
:wikitext(args.effect)
end
container:node(group)
elseif args.type == 'Microtrans' or args.type == 'Decoration' then
group = h.newGroup()
if args.subtype or args.stackSize then
group
:wikitext(args.subtype)
:tag('br'):done()
if args.stackSize then
group
:wikitext('Размер стопки: ')
:node( h.newColor('value', args.stackSize) )
end
container:node(group)
end
group = h.newGroup('textwrap text-mod')
:wikitext(args.effect)
container:node(group)
if args.variations ~= nil then
local variations_text = nil
if args.variations == 1 then
variations_text = '1 Вариант'
elseif args.variations > 1 then
variations_text = args.variations .. ' Вариантов'
end
group = h.newGroup('textwrap text-mod')
:wikitext(variations_text)
container:node(group)
end
elseif args.type == 'Gem' then
group = h.newGroup()
local symbolColor
if args.symbolColor == 'Red' then
symbolColor = 'c51e1e'
elseif args.symbolColor == 'Blue' then
symbolColor = '4163c9'
elseif args.symbolColor == 'Green' then
symbolColor = '08a842'
else
symbolColor = 'c51e1e'
end
if args.subtype == 'Support' and args.symbolColor ~= nil then
group
:wikitext('Литера: ')
:tag('span')
:attr('style', 'width: 1em; color: white !important; background-color:#' .. symbolColor .. '; display: inline-block; text-align: center; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;')
:wikitext(args.symbol)
:done()
:tag('br'):done()
end
group
:wikitext(h.getCategoryLinks(args.tags))
:tag('br'):done()
if args.radius ~= nil then
group
:wikitext('Радиус: ' .. tostring(h.newColor('value', args.radius)))
:tag('br'):done()
end
if args.manaCost ~= nil then
group
:wikitext('Расход маны: ' .. tostring(h.newColor('value', args.manaCost)))
:tag('br'):done()
end
if args.soulCost ~= nil then
group
:wikitext('Разовый расход душ: ' .. tostring(h.newColor('value', args.soulCost)))
:tag('br'):done()
end
if args.manaReserved ~= nil then
group
:wikitext('Удержано маны: ' .. tostring(h.newColor('value', args.manaReserved)) .. '%')
:tag('br'):done()
end
if args.cooldownTime ~= nil then
group
:wikitext('Перезарядка: ' .. tostring(h.newColor('value', args.cooldownTime .. ' сек.')))
if args.canStoreUses ~= nil then
group
:wikitext(tostring(h.newColor('value', ' (использует: ' .. args.canStoreUses .. ')')))
end
group
:tag('br'):done()
elseif args.canStoreUses ~= nil then
group
:wikitext('Максимум зарядов: ' .. tostring(h.newColor('value', args.canStoreUses)))
:tag('br'):done()
end
if args.castTime ~= nil then
group
:wikitext('Время применения: ' .. tostring(h.newColor('value', args.castTime .. ' сек.')))
:tag('br'):done()
end
if args.critChance ~= nil then
group
:wikitext('Шанс на критический удар: ' .. tostring(h.newColor('value', args.critChance .. '%')))
:tag('br'):done()
end
if args.damageEffectiveness ~= nil then
group
:wikitext('Эффективность урона: ' .. tostring(h.newColor('value', args.damageEffectiveness .. '%')))
:tag('br'):done()
end
if args.manacostMultiplier ~= nil then
group
:wikitext('Множитель маны: ' .. tostring(h.newColor('value', args.manacostMultiplier .. '%')))
:tag('br'):done()
end
container:node(group)
end
if args.level or args.strength or args.dexterity or args.intelligence or args.talismanTier then
local requirements = {}
local attrLabel
if args.level then
table.insert( requirements, 'уровень ' .. tostring( h.newColor('value', args.level) ) )
end
if args.strength then
attrLabel = ' Силы'
if args.level or args.dexterity or args.intelligence then
attrLabel = ' Сил'
end
table.insert( requirements, tostring( h.newColor('value', args.strength) ) .. attrLabel )
end
if args.dexterity then
attrLabel = ' Ловкости'
if args.level or args.strength or args.intelligence then
attrLabel = ' Ловк'
end
table.insert( requirements, tostring( h.newColor('value', args.dexterity) ) .. attrLabel )
end
if args.intelligence then
attrLabel = ' Интеллекта'
if args.level or args.strength or args.dexterity then
attrLabel = ' Инт'
end
table.insert( requirements, tostring( h.newColor('value', args.intelligence) ) .. attrLabel )
end
group = h.newGroup()
if args.level or args.strength or args.dexterity or args.intelligence then
group
:wikitext('Требуется ')
:wikitext( table.concat(requirements, ', ') )
:tag('br'):done()
end
if args.talismanTier then
group
:wikitext('Уровень талисмана: ')
:node( h.newColor('value', args.talismanTier) )
:tag('br'):done()
end
container:node(group)
end
if args.qualityEffect then
group = h.newGroup()
group:wikitext('За 1% качества: ' .. tostring(h.newColor('mod', args.qualityEffect)))
container:node(group)
end
if args.implicitMods then
group = h.newGroup('text-mod')
:wikitext(args.implicitMods)
container:node(group)
end
if args.skillDescriptionText then
group = h.newGroup('textwrap text-gemdesc')
:wikitext(args.skillDescriptionText)
container:node(group)
end
if args.randomMods then
group = h.newGroup('text-mod')
:wikitext(args.randomMods)
if args.corrupted then
group:tag(span)
:attr('class', 'text-corrupted')
:wikitext('<br> Осквернено')
:done()
end
container:node(group)
end
if args.cosmeticMods then
group = h.newGroup('text-cosmetic')
:wikitext(args.cosmeticMods)
container:node(group)
end
if args.flavourText then
group = h.newGroup('textwrap text-flavour')
:wikitext(args.flavourText)
container:node(group)
end
if args.type == 'Prophecy' then
group = h.newGroup('-textwrap text-value')
:wikitext(args.prophecyText)
container:node(group)
end
if args.helpText then
group = h.newGroup('textwrap text-help')
:wikitext(args.helpText)
container:node(group)
end
return container
end
function h.getCategoryLinks(args)
bufer = string.gsub (args, 'Огонь', '[[:Категория:Умения огня|Огонь]]')
bufer = string.gsub (bufer, 'Ловушка', '[[:Категория:Умения ловушек|Ловушка]]')
bufer = string.gsub (bufer, 'Чары', '[[:Категория:Чары|Чары]]')
bufer = string.gsub (bufer, 'Длится', '[[:Категория:Умения длительности|Длится]]')
bufer = string.gsub (bufer, 'Область', '[[:Категория:Умения области|Область]]')
bufer = string.gsub (bufer, 'Молния', '[[:Категория:Умения молнии|Молния]]')
bufer = string.gsub (bufer, 'Атака', '[[:Категория:Умения атаки|Атака]]')
bufer = string.gsub (bufer, 'Ближний бой', '[[:Категория:Умения ближнего боя|Ближний бой]]')
bufer = string.gsub (bufer, 'Хаос', '[[:Категория:Умения хаоса|Хаос]]')
bufer = string.gsub (bufer, 'Лук', '[[:Категория:Умения лука|Лук]]')
bufer = string.gsub (bufer, 'Поддержка', '[[:Категория:Камни поддержки|Поддержка]]')
bufer = string.gsub (bufer, 'Снаряд', '[[:Категория:Умения снарядов|Снаряд]]')
bufer = string.gsub (bufer, 'Голем', '[[:Категория:Умения големов|Голем]]')
bufer = string.gsub (bufer, 'Приспешник', '[[:Категория:Умения приспешников|Приспешник]]')
bufer = string.gsub (bufer, 'Боевой клич', '[[:Категория:Боевые кличи|Боевой клич]]')
bufer = string.gsub (bufer, 'Движение', '[[:Категория:Умения перемещения|Движение]]')
bufer = string.gsub (bufer, 'Холод', '[[:Категория:Умения холода|Холод]]')
bufer = string.gsub (bufer, 'Ваал', '[[:Категория:Умения ваал|Ваал]]')
bufer = string.gsub (bufer, 'Активатор', '[[:Категория:Умения активаторы|Активатор]]')
bufer = string.gsub (bufer, 'Тотем', '[[:Категория:Умения тотемов|Тотем]]')
bufer = string.gsub (bufer, 'Сотворение', '[[:Категория:Умения сотворения|Сотворение]]')
bufer = string.gsub (bufer, 'Аура', '[[:Категория:Умения аур|Аура]]')
bufer = string.gsub (bufer, 'Проклятие', '[[:Категория:Умения проклятий|Проклятие]]')
return bufer
end
function h.newColor(label, text)
if text == nil or text == '' then
return nil
end
return mw.html.create('span')
:attr('class', 'text-' .. label)
:wikitext(text)
end
function h.newGroup(class)
return mw.html.create('span')
:attr( 'class', 'itemboxstatsgroup ' .. (class or '') )
end
return p