Для документации этого модуля может быть создана страница Модуль:Item/doc
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
-- Модуль Item используется для отображения информации об игровых предметах в Neverwinter Wiki. --
-- Author: Oleksii (Shaleych) --------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
local get_args = require('Модуль:Arguments').getArgs
local error_list = mw.loadData( "Модуль:Item/error" ) -- переменная error_list содержит список ошибок, которые могут возникнуть при использовании модуля
local attributes = mw.loadData('Модуль:Item/Attributes') -- Параметры предметов
local armor_set_powers_data = mw.loadData('Модуль:Item/ArmorSetPowersData') -- переменная armor_set_powers_data содержит информацию об умениях комплектов экипировки
local weapon_set_powers_data = mw.loadData('Модуль:Item/WeaponSetPowersData') -- переменная weapon_set_powers_data содержит информацию об умениях комплектов оружия
local companion_powers_data = mw.loadData('Module:Companion/Powers') -- переменная companion_powers_data содержит информацию об умениях компаньонов
local list_of_modules = mw.loadData( "Модуль:Item/list_of_modules" ) -- переменная list_of_modules содержит список вышедших дополнений для игры
local item_icon = require('Модуль:Item_icon') -- переменная item_icon содержит модуль для отображения иконок предметов
local p = {}
local h = {}
local cargo = mw.ext.cargo
local gsub = mw.ustring.gsub
local find = mw.ustring.find
local sub = mw.ustring.sub
-- Переменная fields_cargo используется для создания таблицы, которая будет заполнена данными и сохранена в базе данных Cargo. Каждый элемент таблицы представляет собой одно поле, которое будет сохранено в базе данных.
local fields_cargo = {}
--Функция для подсветки параметров предметов
function p.attribHighlight(frame)
local description = frame.args[1]
for _, attrib in ipairs(attributes) do
for _, name in ipairs(attrib.name) do
description = string.gsub(description, name, '[[' .. attrib.name[1] .. '|<span class="slate">' .. name .. '</span>]]')
end
end
return description
end
-- Функция для проверки, загружен ли модуль данных
function checkDataLoaded(data)
if (data == nil) then
error("Error: "..data.." is not loaded!") -- Выводит ошибку, если данные не загружены.
return false
end
return true -- Если данные загружены, продолжить выполнение модуля.
end
-- Функция для поиска совпадений в массиве (используется в основном для args.item_categories (категории предмета))
function table.find(t, values)
if not t or type(t) ~= "table" or not values then
return false
end
-- Если передана строка, преобразовываем её в одноэлементный массив
if type(values) == "string" then
values = {values}
end
for i, v in ipairs(t) do
for j, val in ipairs(values) do
if mw.ustring.lower(v) == mw.ustring.lower(val) then
return true
end
end
end
return false
end
-- Функция для разделения чисел запятой
function commaValue(amount)
local formatted = amount
while true do
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
if (k==0) then
break
end
end
return formatted
end
-- Функция для округления чисел
function round(val, decimal)
if (decimal) then
return math.floor((val * 10^decimal) + 0.5) / (10^decimal)
else
return math.floor(val+0.5)
end
end
-- Основная функция, используется для отображения информации о предмете на странице.
function p.item(frame)
local args = get_args(frame, {parentFirst = true})
-- Добавляет метку вверху страницы, в каком обновлении добавлен предмет
if args["модуль"] then
fields_cargo["module"] = args["модуль"]
local content_indicator = 'Добавлено в модуле ' .. args["модуль"] .. ': ' .. (list_of_modules[args["модуль"]] or '')
mw.getCurrentFrame():extensionTag {
name = "indicator",
content = content_indicator,
args = {
name = "module"
}
}
end
-- Таблица для хранения категорий предметов.
local item_categories = {}
-- Получаем уровень предмета и преобразуем его в число
local item_level = args["уровень предмета"] and tonumber(string.gsub(args["уровень предмета"], "%,", ""), 10) or ''
-- Если задана категория, разбиваем ее на отдельные категории, приводим к нижнему регистру и добавляем в таблицу item_categories.
if args["категория"] then
for i in mw.text.gsplit(args["категория"], ",%s*") do
table.insert(item_categories, mw.ustring.lower(i))
end
-- Если задан тип, то он используется вместо категории. Аналогично добавляем в таблицу item_categories.
elseif args["тип"] then
for i in mw.text.gsplit(args["тип"], ",%s*") do
table.insert(item_categories, mw.ustring.lower(i))
end
end
local container = mw.html.create('div')
container:addClass('tooltip-content tooltip tooltipright')
:tag('div'):addClass('top')
:tag('div'):addClass('tlcorner'):done()
:tag('div'):addClass('trcorner'):done()
:tag('div'):addClass('tedge'):done()
local content = h.divContent()
local group = h.Group()
-- Качество предмета
local item_quality = {
["задача"] = 'quest',
["обычный"] = 'common',
["необычный"] = 'uncommon',
["редкий"] = 'rare',
["эпический"] = 'epic',
["легендарный"] = 'legendary',
["мифический"] = 'mythic',
}
-- Название предмета
fields_cargo["name"] = mw.title.getCurrentTitle().fullText
-- Качество предмета
local quality = args["качество"]
local quality = quality and item_quality[mw.ustring.lower(quality)] or 'common'
fields_cargo["quality"] = quality
content
:tag('span')
:attr('class', quality)
:attr('style', 'font-size: 18px;')
:wikitext(mw.title.getCurrentTitle().fullText)
:tag('br')
:done()
-- Уровень предмета
if args["уровень предмета"] then
fields_cargo["item_level"] = item_level
content
:tag('div')
:attr('class', 'white itemlevel')
:wikitext('Уровень предмета: ' .. commaValue(item_level))
:tag('br')
:done()
end
local function dindingItem(fieldKey, argsKey)
if args[argsKey] then
fields_cargo[fieldKey] = args[argsKey]
local text = args[argsKey]:gsub("при%s", 'при<br>')
group
:tag('div')
:attr('class', 'right binding')
:wikitext('[[Файл:Icons_Inventory_Binds.png|baseline|ссылка=]] <span class=common>' .. mw.getContentLanguage():ucfirst(text) .. '</span>')
end
end
dindingItem("bind", "привязка")
dindingItem("bind2", "привязка2")
content:node(group):tag('br'):done()
-- Вспомогательный текст
if args.item_categories then
if mw.ustring.find( args.item_categories, "[тТ]олько для спутников" ) then
content
:tag('div')
:attr('class', 'right gold')
:wikitext('Только для спутников')
:tag('br')
:done()
elseif table.find(item_categories, "купон") then
content
:tag('div')
:attr('class', 'right green')
:wikitext('Дважды щелкните,<br>чтобы использовать купон')
:tag('br')
:done()
elseif table.find(item_categories, {"набор", "полезные наборы"}) then
content
:tag('div')
:attr('class', 'right green')
:wikitext('Дважды щелкните,<br>чтобы<br>взять/использовать')
:done()
:tag('br')
elseif table.find(item_categories, "набор усиления доспехов") then
content
:tag('div')
:attr('class', 'right green')
:wikitext('Дважды щелкните,<br>чтобы применить')
:done()
:tag('br')
elseif mw.ustring.find( args.item_categories, "[бБ]есплатное изменение внешнего вида" ) then
content
:tag('div')
:wikitext('Это предмет <b>первого уровня</b>, который обычно используют для превращения.')
:done()
elseif mw.ustring.find( args.item_categories, "[мМ]атериал" ) then
if mw.ustring.lower(args['качество']) == 'редкий' then
content:tag('div'):wikitext('Ресурс для ремесленных работ.'):done():tag('br')
elseif mw.ustring.lower(args['качество']) == 'эпический' or mw.ustring.lower(args['качество']) == 'легендарный' then
content:tag('div'):wikitext('Ресурс для мастерских ремесленных заданий.'):done():tag('br')
end
elseif table.find(item_categories, {"шляпа (стиль)", "тело (стиль)", "штаны (стиль)", "ноги (стиль)"}) then
content
:tag('div')
:attr('class', 'right green')
:wikitext('Щелкните дважды для<br>преобразования')
:done()
:tag('br')
end
end
if args.item_categories and mw.ustring.lower(args.item_categories) == "артефакт" then
-- Время восстановления артефактов в секундах.
local rank = {
["необычный"] = '180',
["редкий"] = '160',
["эпический"] = '140',
["легендарный"] = '120',
["мифический"] = '60',
}
content
:wikitext('<span class="beige" style="display: block;">Время восстановления: ' .. rank[mw.ustring.lower(args["качество"])] .. 'с</span>')
:tag('br')
:done()
end
-- Проверяем наличие аргумента "умение усиления"
if args["умение усиления"] then
-- Присваиваем значение аргумента полю "enhancement_power" в таблице "Items"
fields_cargo["enhancement_power"] = args["умение усиления"]
group = h.Group()
local tables = 'Powers'
local fields = 'name, item_ui_equip_power'
local powers_args = { where = 'name = "' .. args["умение усиления"] .. '"' }
local result = cargo.query( tables, fields, powers_args )
local r = result[1]
group:wikitext('<span class="green">Умение усиления: </span> ' .. r['item_ui_equip_power']):tag('br'):done()
content:node(group):tag('br'):done()
end
-- Если есть бонусное умение игрока, добавляем его в поле "player_bonus_power" таблицы "fields_cargo"
if args["бонусное умение игрока"] then
local player_bonus_power = args["бонусное умение игрока"]
fields_cargo["player_bonus_power"] = player_bonus_power
-- Создаем группу элементов
local group = h.Group()
-- Если значение бонусного умения игрока не найдено в таблице "companion_powers_data", добавляем значение которое указано в args["бонусное умение игрока"].
if companion_powers_data[player_bonus_power] == nil then
local description = player_bonus_power
for _, attrib in ipairs(attributes) do
for _, name in ipairs(attrib.name) do
description = string.gsub(description, name, '[[' .. attrib.name[1] .. '|<span class="slate">' .. name .. '</span>]]')
end
end
group:wikitext('<span class="green">Бонусное умение игрока: </span> '.. description):tag('br'):done()
-- Если значение найдено в таблице, но не содержит поля "quality", выводим его обычную версию.
elseif companion_powers_data[player_bonus_power].quality == nil then
local power_data = companion_powers_data[player_bonus_power]
group:wikitext('<span class="green">Бонусное умение игрока: </span> '.. power_data):tag('br'):done()
-- Если значение найдено в таблице и содержит поле "quality", выводим его в зависимости от аргумента "качество".
else
local power_data = companion_powers_data[player_bonus_power]
local quality_key = mw.ustring.lower(args["качество"])
local quality_value = power_data.quality[item_quality[quality_key]]
group:wikitext('<span class="green">Бонусное умение игрока: </span> '.. quality_value):tag('br'):done()
end
-- Добавляем группу элементов в переменную "content"
content:node(group):done()
end
-- Проверяем, что тип указан и категория предмета равна "скакун"
if (args["тип"] and table.find(item_categories, "скакун")) then
fields_cargo["equip_power_name"] = args["умение экипировки"]
fields_cargo["combat_power_name"] = args["боевое умение"]
local function queryPower(power_type)
local tables = 'Powers'
local fields = 'name, type, power_use, item_ui_equip_power, hit_points, power, accuracy, combat_advantage, critical_strike, critical_severity, critical_avoidance, forte, stamina_regen, deflect, awareness, movement_speed, defense, stat_universal'
local args_power = {
where = 'type = "' .. power_type .. '" AND name = "' .. args[power_type] .. '"'
}
return cargo.query(tables, fields, args_power)[1]
end
-- Боевое умение
local r_combat_power = queryPower("боевое умение")
-- Умение экипировки
local r_equip_power = queryPower("умение экипировки")
group = h.Group():wikitext('<span class="green">Боевое умение: </span> '.. r_combat_power["power_use"]):tag('br'):done():tag('br'):done()
local wikitext = {}
for _, stat in ipairs(attributes) do
if r_equip_power[stat.fields_cargo] then
local value = commaValue(r_equip_power[stat.fields_cargo])
table.insert(wikitext, '+' .. value .. ' [[' .. stat.name[1] .. '|<span class="slate">' .. stat.name[1] .. '</span>]]')
end
end
group:wikitext('<span class="green">Умение экипировки: </span> '.. (#wikitext == 0 and (r_equip_power['power_use'] ~= '' and r_equip_power['power_use'] or r_equip_power['item_ui_equip_power']) or table.concat(wikitext, '<br>')) .. '<br>+' .. commaValue(r_equip_power['stat_universal']) .. ' <span class="slate">Общий рейтинг</span>'):done()
content:node(group):tag('br'):done()
end
if args.item_categories and table.find(item_categories, {"только для спутников", "спутник", "скакун", "клинок", "оружие", "левая рука", "голова", "доспехи", "руки", "ноги", "кольцо", "рубаха", "штаны", "артефакт", "шея", "пояс", "волшебный камень", "набор усиления доспехов"}) then
group = h.Group('item_stats')
-- Значения характеристик экипировки
for _, attrib in ipairs({
{"сила", "Strength", "СИЛ"},
{"выносливость", "Constitution", "ВЫН"},
{"ловкость", "Dexterity", "ЛОВ"},
{"интеллект", "Intelligence", "ИНТ"},
{"мудрость", "Wisdom", "МДР"},
{"обаяние", "Charisma", "ОБА"}
}) do
if args[attrib[1]] then
fields_cargo[mw.ustring.lower(attrib[2])] = args[attrib[1]]
end
end
if args["урон"] then
--fields_cargo["damage"] = args["урон"]
group:tag('span'):wikitext("+" .. args["урон"] .. ' <span class="slate">Урон</span>'):tag('br'):done()
end
if args["параметры"] then
-- Функция для проверки наличия подстроки "_1", "_2" или "_3" в строке
local function containsSpecialValues(str)
-- Проверяем наличие подстрок в строке и возвращаем true, если хотя бы одна из них найдена
return str:find("_1") or str:find("_2") or str:find("_3")
end
if containsSpecialValues(args["параметры"]) then
-- Данный код автоматически рассчитывает параметры предмета на основе его уровня.
-- На каждый один уровень добавляется 0.75/0.90 к параметру/общему рейтингу.
-- Например: 0.75 * уровень предмета (1200) = +900 к критическому урону.
-- Пустой массив для хранения параметров предмета.
local item_stats = {}
for i in mw.text.gsplit(args["параметры"], ",%s*") do
table.insert(item_stats, mw.ustring.lower(i))
end
-- Вычисляем количество параметров в таблице item_stats.
local number_of_stats = #item_stats
if args["уровень предмета"] then
if tonumber(item_level) then
item_level = tonumber(item_level)
else
error("Ошибка: Невозможно преобразовать уровень предмета в число.")
end
else
error("Ошибка: Аргумент 'уровень предмета' отсутствует.")
end
local has_1 = false
local has_2 = {has = false, count = 0}
local has_3 = false
-- Проверяем наличие параметров _1, _2 и _3
for i = 1, #item_stats do
local stat = item_stats[i]
if stat:find('_1') then
has_1 = true
elseif stat:find('_2') then
has_2.has = true
has_2.count = has_2.count + 1
elseif stat:find('_3') then
has_3 = true
end
end
-- Применяем коэффициенты умножения в зависимости от условий
for i = 1, #item_stats do
local stat = item_stats[i]
local multiplier = 1.0
if stat:find('_1') then
if has_2.has and not has_3 and has_2.count == 1 then
-- Кольцо
if mw.ustring.find(args.item_categories, "[кК]ольцо") then
multiplier = 2.25
else
multiplier = 1.125
end
else
-- Кольцо
if mw.ustring.find(args.item_categories, "[кК]ольцо") and not mw.ustring.find(args.item_categories, "[тТ]олько для спутников") then
multiplier = 3
-- Кольцо, Сфера, Шея, Талисман, Икона, Священный символ, Клинок, Дальний бой, Щит, Гримуар, Темляк, Рубаха, Штаны
elseif table.find(item_categories, {"кольцо", "сфера", "шея", "талисман", "икона", "священный символ", "клинок", "дальний бой", "щит", "гримуар", "темляк", "рубаха", "штаны"}) then
if (table.find(item_categories, {"только для спутников", "рубаха", "штаны"}) and number_of_stats == 1) then
multiplier = 1.5
else
multiplier = 0.75
end
else
if has_2.count > 1 then
multiplier = 0.60
else
multiplier = 0.75
end
end
end
elseif stat:find('_2') then
if number_of_stats == 2 then
-- Кольцо
if mw.ustring.find(args.item_categories, "[кК]ольцо") then
multiplier = 0.75
else
multiplier = 0.375
end
elseif has_2.count > 1 then
-- multiplier = 0.375 OLD MODS
multiplier = (mw.ustring.find(args.item_categories, "[тТ]олько для спутников") and 0.375 or 0.45) -- MOD 27
else
multiplier = 0.45
end
elseif stat:find('_3') then
multiplier = 0.3
end
-- Создаем имя атрибута без индекса (_1, _2, _3)
local attribute_name = string.gsub(stat, "_%d", "")
local attribute_value = round(item_level * multiplier)
for _, attrib in ipairs(attributes) do
if attribute_name == attrib.name[2] then
fields_cargo[attrib.fields_cargo] = attribute_value
group:tag('span'):wikitext("+".. commaValue(attribute_value) .. ' [[' .. attrib.name[1] .. '|<span class="slate">' .. attrib.name[1] .. '</span>]]'):tag('br'):done()
break -- Найдено соответствие, выходим из внутреннего цикла
end
end
end
else
--------------------------------------------------------------------------------------------------------------
-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----СТАРЫЙ КОД-----
--------------------------------------------------------------------------------------------------------------
-- Данный код автоматически рассчитывает параметры предмета на основе его уровня.
-- На каждый один уровень добавляется 0.75/0.90 к параметру/общему рейтингу.
-- Например: 0.75 * уровень предмета (1200) = +900 к критическому урону.
-- Пустой массив для хранения параметров предмета.
local item_stats = {}
for i in mw.text.gsplit(args["параметры"], ",%s*") do
table.insert(item_stats, mw.ustring.lower(i))
end
local has_stats = {}
for _, stat_pair in ipairs(attributes) do
local stat_name, basic_stat_name = stat_pair.name[2], stat_pair.name[2] .. ' basic'
has_stats[stat_name] = table.find(item_stats, stat_name)
has_stats[basic_stat_name] = table.find(item_stats, basic_stat_name)
end
-- Вычисляем количество параметров в таблице item_stats.
local number_of_stats = #item_stats
-- Проверяем, что значение параметра "уровень предмета" может быть преобразовано в числовой формат.
if not item_level then
error("Неверный уровень предмета: " .. args["уровень предмета"])
end
local has_power, has_basic_bower = table.find(item_stats, "могущество"), table.find(item_stats, "могущество basic")
-- Значение основного параметра
local basic_value_stat
-- Голова, Руки, Доспехи, Ноги
if args.item_categories:match("[гГ]олова") or args.item_categories:match("[рР]уки") or args.item_categories:match("[дД]оспехи") or args.item_categories:match("[нН]оги") then
if item_level < 1600 then
basic_value_stat = round(0.45 * item_level)
else
basic_value_stat = round(0.6 * item_level)
end
-- Рубаха, Штаны
elseif mw.ustring.find(args.item_categories, "[рР]убаха") or mw.ustring.find(args.item_categories, "[шШ]таны") then
if item_level <= 1200 then
basic_value_stat = round(1.0 * item_level)
elseif item_level > 1200 then
basic_value_stat = round(1.5 * item_level)
end
-- Артефакт, Пояс, Шея
elseif mw.ustring.find(args.item_categories, "[аА]ртефакт") or mw.ustring.find(args.item_categories, "[пП]ояс") or mw.ustring.find(args.item_categories, "[шШ]ея")then
basic_value_stat = round(item_level)
-- Сфера, Талисман, Икона, Священный символ, Клинок, Дальний бой, Щит, Гримуар, Темляк
elseif mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк") then
basic_value_stat = round(0.75 * item_level)
-- Кольцо
elseif mw.ustring.find(args.item_categories, "[кК]ольцо") then
basic_value_stat = round(item_level * 2.25)
end
-- Значение дополнительного параметра
local value_stat
-- Голова, Руки, Доспехи, Ноги
if mw.ustring.find(args.item_categories, "[гГ]олова") or mw.ustring.find(args.item_categories, "[рР]уки") or mw.ustring.find(args.item_categories, "[дД]оспехи") or mw.ustring.find(args.item_categories, "[нН]оги") then
if number_of_stats == 1 then
value_stat = round(0.75 * item_level)
elseif number_of_stats == 2 then
value_stat = round(0.75 * item_level)
elseif item_level < 1600 then
value_stat = round(0.3 * item_level)
else
value_stat = round(0.45 * item_level)
end
-- Кольцо
elseif mw.ustring.find(args.item_categories, "[кК]ольцо") then
if (table.find(item_categories, "только для спутников") and number_of_stats == 1) then
value_stat = round(0.75 * item_level * 2)
elseif number_of_stats == 1 then
value_stat = round(item_level * 3)
else
value_stat = round(item_level * 0.75)
end
-- Шея, Пояс
elseif mw.ustring.find(args.item_categories, "[шШ]ея") or mw.ustring.find(args.item_categories, "[пП]ояс") then
local isWordFound = false
for _, word in ipairs(item_stats) do
if string.find(word, "basic") then
isWordFound = true
break
end
end
if number_of_stats == 3 then
value_stat = round(0.75 * item_level / 1.5)
elseif number_of_stats == 1 then
value_stat = round(0.75 * item_level * 2)
elseif isWordFound then
value_stat = round(0.5 * item_level)
else
value_stat = round(0.75 * item_level)
end
-- Рубаха, Штаны
elseif mw.ustring.find(args.item_categories, "[рР]убаха") or mw.ustring.find(args.item_categories, "[шШ]таны") then
if number_of_stats == 1 then
value_stat = round(1.5 * item_level)
else
value_stat = round(0.75 * item_level)
end
-- Артефакт
elseif mw.ustring.find(args.item_categories, "[аА]ртефакт") then
if number_of_stats == 2 then
value_stat = round(1.125 * item_level)
else
value_stat = round(0.75 * item_level)
end
-- Сфера, Талисман, Икона, Священный символ, Клинок, Дальний бой, Щит, Гримуар, Темляк
elseif mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк") then
if (table.find(item_categories, "только для спутников") and number_of_stats == 1) then
value_stat = round(0.75 * item_level * 2)
else
value_stat = round(0.75 * item_level)
end
-- Значение по умолчанию
else
value_stat = round(0.75 * item_level)
end
-- Проверяем наличие параметра "Точность" в списке параметров.
if has_stats["точность"] or has_stats["точность basic"] then
if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
fields_cargo["accuracy"] = value_stat / 2
group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Точность</span>'):tag('br'):done()
elseif has_stats["точность basic"] then
fields_cargo["accuracy"] = basic_value_stat
group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Точность</span>'):tag('br'):done()
else
fields_cargo["accuracy"] = value_stat
group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Точность</span>'):tag('br'):done()
end
end
-- Проверяем наличие параметра "Могущество" в списке параметров.
if has_stats["могущество"] or has_stats["могущество basic"] then
local power_value = has_stats["могущество basic"] and basic_value_stat or value_stat
fields_cargo["power"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Могущество</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Боевое преимущество" в списке параметров.
if has_stats["боевое преимущество"] or has_stats["боевое преимущество basic"] then
local power_value = has_stats["боевое преимущество basic"] and basic_value_stat or value_stat
fields_cargo["combat_advantage"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Боевое преимущество</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Вероятность критического удара" в списке параметров.
if has_stats["вероятность критического удара"] or has_stats["вероятность критического удара basic"] then
if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
fields_cargo["critical_strike"] = value_stat / 2
group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Вероятность критического удара</span>'):tag('br'):done()
elseif has_stats["вероятность критического удара basic"] then
fields_cargo["critical_strike"] = basic_value_stat
group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Вероятность критического удара</span>'):tag('br'):done()
else
fields_cargo["critical_strike"] = value_stat
group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Вероятность критического удара</span>'):tag('br'):done()
end
end
-- Проверяем наличие параметра "Парирование" в списке параметров.
if has_stats["парирование"] or has_stats["парирование basic"] then
local power_value = has_stats["парирование basic"] and basic_value_stat or value_stat
fields_cargo["deflect"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Парирование</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Сила парирования" в списке параметров.
if has_stats["сила парирования"] or has_stats["сила парирования basic"] then
local power_value = has_stats["сила парирования basic"] and basic_value_stat or value_stat
fields_cargo["deflect_severity"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Сила парирования</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Бонус к контролю" в списке параметров.
if has_stats["бонус к контролю"] or has_stats["бонус к контролю basic"] then
local power_value = has_stats["бонус к контролю basic"] and basic_value_stat or value_stat
fields_cargo["control_bonus"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Бонус к контролю</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Сильная сторона" в списке параметров.
if has_stats["сильная сторона"] or has_stats["сильная сторона basic"] then
local power_value = has_stats["сильная сторона basic"] and basic_value_stat or value_stat
fields_cargo["forte"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Сильная сторона</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Критическое уклонение" в списке параметров.
if has_stats["критическое уклонение"] or has_stats["критическое уклонение basic"] then
if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
fields_cargo["critical_avoidance"] = value_stat / 2
group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Критическое уклонение</span>'):tag('br'):done()
elseif has_stats["критическое уклонение basic"] then
fields_cargo["critical_avoidance"] = basic_value_stat
group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Критическое уклонение</span>'):tag('br'):done()
else
fields_cargo["critical_avoidance"] = value_stat
group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Критическое уклонение</span>'):tag('br'):done()
end
end
-- Проверяем наличие параметра "Критический урон" в списке параметров.
if has_stats["критический урон"] or has_stats["критический урон basic"] then
if has_stats["боевое преимущество"] and tonumber(item_level) < 1000 and (mw.ustring.find(args.item_categories, "[сС]фера") or mw.ustring.find(args.item_categories, "[тТ]алисман") or mw.ustring.find(args.item_categories, "[иИ]кона") or mw.ustring.find(args.item_categories, "[сС]вященный символ") or mw.ustring.find(args.item_categories, "[кК]линок") or mw.ustring.find(args.item_categories, "[дД]альний бой") or mw.ustring.find(args.item_categories, "[щЩ]ит") or mw.ustring.find(args.item_categories, "[гГ]римуар") or mw.ustring.find(args.item_categories, "[тТ]емляк")) then
fields_cargo["critical_severity"] = value_stat / 2
group:tag('span'):wikitext("+".. value_stat / 2 ..' <span class="slate">Критический урон</span>'):tag('br'):done()
elseif has_stats["критический урон basic"] then
fields_cargo["critical_severity"] = basic_value_stat
group:tag('span'):wikitext("+" .. commaValue(basic_value_stat) ..' <span class="slate">Критический урон</span>'):tag('br'):done()
else
fields_cargo["critical_severity"] = value_stat
group:tag('span'):wikitext("+" .. commaValue(value_stat) .. ' <span class="slate">Критический урон</span>'):tag('br'):done()
end
end
-- Проверяем наличие параметра "Осведомленность" в списке параметров.
if has_stats["осведомленность"] or has_stats["осведомленность basic"] then
local power_value = has_stats["осведомленность basic"] and basic_value_stat or value_stat
fields_cargo["awareness"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Осведомленность</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Исходящее лечение" в списке параметров.
if has_stats["исходящее лечение"] or has_stats["исходящее лечение basic"] then
local power_value = has_stats["исходящее лечение basic"] and basic_value_stat or value_stat
fields_cargo["outgoing_healing"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Исходящее лечение</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Сопротивляемость контролю" в списке параметров.
if has_stats["сопротивляемость контролю"] or has_stats["сопротивляемость контролю basic"] then
local power_value = has_stats["сопротивляемость контролю basic"] and basic_value_stat or value_stat
fields_cargo["control_resist"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Сопротивляемость контролю</span>'):tag('br'):done()
end
-- Проверяем наличие параметра "Принимаемое лечение" в списке параметров.
if has_stats["принимаемое лечение"] or has_stats["принимаемое лечение basic"] then
local power_value = has_stats["принимаемое лечение basic"] and basic_value_stat or value_stat
fields_cargo["incoming_healing"] = power_value
group:tag('span'):wikitext("+" .. commaValue(power_value) .. ' <span class="slate">Принимаемое лечение</span>'):tag('br'):done()
end
if mw.ustring.find(args["параметры"], "[вВ]осстановления здоровья") then
if number_of_stats == 2 or number_of_stats == 3 then
-- fields_cargo[""] = '1.5%'
group
:tag('span')
:wikitext('+1.5% <span class="slate">Восстановления здоровья</span>')
:tag('br')
:done()
elseif number_of_stats == 4 then
-- fields_cargo[""] = '0.75%'
group
:tag('span')
:wikitext('+0.75% <span class="slate">Восстановления здоровья</span>')
:tag('br')
:done()
end
end
if mw.ustring.find(args["параметры"], "[вВ]осстановление бодрости") then
if number_of_stats == 3 then
-- fields_cargo["stat_movement"] = '1.5%'
group
:tag('span')
:wikitext('+1.5% <span class="slate">Восстановление бодрости</span>')
:tag('br')
:done()
elseif number_of_stats == 4 then
-- fields_cargo["stat_movement"] = '0.75%'
group
:tag('span')
:wikitext('+0.75% <span class="slate">Восстановление бодрости</span>')
:tag('br')
:done()
end
end
if mw.ustring.find(args["параметры"], "[пП]олучение очков действия") then
if number_of_stats == 2 or number_of_stats == 3 then
fields_cargo["utility_action_point_gain"] = '1.5%'
group
:tag('span')
:wikitext('+1.5% <span class="slate">Получение очков действия</span>')
:tag('br')
:done()
elseif number_of_stats == 4 then
fields_cargo["utility_action_point_gain"] = '0.75%'
group
:tag('span')
:wikitext('+0.75% <span class="slate">Получение очков действия</span>')
:tag('br')
:done()
end
end
if mw.ustring.find(args["параметры"], "[сС]корость движения") then
if number_of_stats == 3 then
fields_cargo["movement_speed"] = '1.5%'
group
:tag('span')
:wikitext('+1.5% <span class="slate">Скорость движения</span>')
:tag('br')
:done()
elseif number_of_stats == 4 then
fields_cargo["movement_speed"] = '0.75%'
group
:tag('span')
:wikitext('+0.75% <span class="slate">Скорость движения</span>')
:tag('br')
:done()
end
end
if mw.ustring.find(args["параметры"], "[сС]корость восстановления") then
if number_of_stats == 3 then
-- fields_cargo["movement_speed"] = '1.5%'
group
:tag('span')
:wikitext('+1.5% <span class="slate">Скорость восстановления</span>')
:tag('br')
:done()
elseif number_of_stats == 4 then
-- fields_cargo["movement_speed"] = '0.75%'
group
:tag('span')
:wikitext('+0.75% <span class="slate">Скорость восстановления</span>')
:tag('br')
:done()
end
end
if mw.ustring.find(args["параметры"], "[вВ]осстановление здоровья") then
if number_of_stats == 3 then
fields_cargo["stat_regeneration"] = '1.5%'
group
:tag('span')
:wikitext('+1.5% <span class="slate">Восстановление здоровья</span>')
:tag('br')
:done()
elseif number_of_stats == 4 then
fields_cargo["stat_regeneration"] = '0.75%'
group
:tag('span')
:wikitext('+0.75% <span class="slate">Восстановление здоровья</span>')
:tag('br')
:done()
end
end
end
end
-- Проверяем, находится ли предмет в категории "атака/оборона/полезное"
if table.find(item_categories, "атака/оборона/полезное") then
-- Определяем, сколько параметров содержит предмет (1 или 2)
local number_of_stats = #mw.text.split(args['атака'], ",%s*")
if number_of_stats == 1 then
-- Умножаем уровень предмета на 1.5, если предмет содержит только один параметр
item_level = round(item_level * 1.5)
elseif number_of_stats == 2 then
-- Умножаем уровень предмета на 0.825, если предмет содержит два параметра
item_level = round(item_level * 0.825)
end
-- Определяем порядок категорий
local category_order = { "атака", "оборона", "полезное" }
-- Создаем новую таблицу для хранения префиксов
local prefixes = {}
-- Обходим каждую категорию в заданном порядке
for _, category in ipairs(category_order) do
-- Проверяем наличие аргумента с текущей категорией
if args[category] then
-- Обходим каждое значение в текущей категории
for value in mw.text.gsplit(args[category], ",%s*") do
-- Обходим каждое поле в Attributes
for _, attrib in ipairs(attributes) do
if mw.ustring.lower(value) == attrib.name[2] then
fields_cargo[attrib.fields_cargo] = commaValue(item_level)
-- Форматируем префикс для вывода
local prefix = '<span class="green">' .. attrib.slot .. ':</span> +' .. commaValue(item_level) .. ' [[' .. attrib.name[1] .. '|<span class="slate">' .. attrib.name[1] .. '</span>]]'
-- Добавляем префикс в таблицу
table.insert(prefixes, prefix)
break
end
end
end
end
end
-- Объединяем префиксы в одну строку, разделяя их <br> (переносом строки)
group:tag("span"):wikitext(table.concat(prefixes, '<br>')):tag("br"):done()
end
content:node(group):tag('br'):done()
end
for _, field in pairs(attributes) do
local first_name = field.name[2]
if args[first_name] and tonumber(args[first_name]) then
local value = args[first_name]
fields_cargo[field.fields_cargo] = value
if table.find(item_categories, "набор усиления доспехов") then
prefix = string.format('<span class="green">На себе: </span><span class="slate">%s</span>: +%s', field.name[1], value )
elseif table.find(item_categories, "знаки") then
prefix = string.format('<span class="gold">(максимум)</span><br>Когда применяется к скакуну:<br><span class="green">Ячейка знаков:</span> +%s <span class="slate">%s</span>', value, field.name[1])
elseif table.find(item_categories, "только для спутников") then
local level = args["уровень предмета"]:gsub(",", "")
prefix = string.format('+%d <span class="slate">%s</span>', commaValue(string.format("%.0f", 0.75 * tonumber(level))), field.name[1])
else
if not table.find(item_categories, "атака/оборона/полезное") then
prefix = string.format('+%s <span class="slate">%s</span>', value, field.name[1])
end
end
group:tag("span"):wikitext(prefix):tag("br"):done()
end
end
-- Вычисление значения общего рейтинга на основе уровня предмета
if args["уровень предмета"] and not (table.find(item_categories, "набор усиления доспехов") or table.find(item_categories, "дополнение") or table.find(item_categories, "инструмент") or table.find(item_categories, "бой")) then
if args["тип"] then
local stat_universal = nil
fields_cargo["stat_universal"] = stat_universal
if not mw.ustring.find(args.item_categories, "[кК]ольцо") and not mw.ustring.find(args.item_categories, "[оО]шейники скакунов") then
stat_universal = commaValue(math.ceil(0.9 * string.gsub(args["уровень предмета"], ",", "")))
elseif args["модуль"] == '8' and mw.ustring.find(args.item_categories, "[кК]ольцо") then
stat_universal = commaValue(math.ceil(0.8 * string.gsub(args["уровень предмета"], ",", "")/ 2))
elseif mw.ustring.find(args.item_categories, "[кК]ольцо") then
stat_universal = commaValue(math.ceil(0.8 * string.gsub(args["уровень предмета"], ",", "")))
elseif mw.ustring.find(args.item_categories, "[оО]шейники скакунов") then
stat_universal = commaValue(math.ceil(string.gsub(args["уровень предмета"], ",", "")/ 2))
end
if args.item_categories and mw.ustring.find(args.item_categories, "[оО]шейники скакунов") then
group:tag('span'):wikitext('<span style="color:#50CC3D">На себе: </span><span class="slate">Общий рейтинг</span>: +' .. stat_universal):tag('br'):done()
elseif args.item_categories and mw.ustring.find(args.item_categories, "[зЗ]наки") then
group:tag('span'):wikitext('<span class="green">Ячейка знаков:</span> +' .. stat_universal.. ' <span class="slate">Общий рейтинг</span>'):tag('br'):done()
else
group:tag('span'):wikitext("+".. stat_universal ..' <span class="slate">Общий рейтинг</span>'):tag('br'):done()
end
end
end
if args["время восстановления"] then
group:wikitext('<br><span class="beige" style="display: block;">Время восстановления: ' .. args["время восстановления"] .. 'с</span><br>'):done()
end
if args["использовать"] then
local description = args["использовать"]
for _, attrib in ipairs(attributes) do
for _, name in ipairs(attrib.name) do
description = string.gsub(description, name, '[[' .. attrib.name[1] .. '|<span class="slate">' .. name .. '</span>]]')
end
end
fields_cargo["item_use"] = description
group:wikitext('<span class="green">Использовать: </span>' .. description):tag('br'):done()
end
local function equip(field_name)
local equip = args[field_name]
if equip then
local power_name, power_description = equip:match("(.+);(.+)")
for _, info in ipairs(attributes) do
for _, name in ipairs(info.name) do
power_description = string.gsub(power_description or equip, name, '[['..info.name[1]..'|<span class="slate">' .. name .. '</span>]]')
end
end
-- Выделяем жирным все цифры в power_description, с учетом знака %
power_description = string.gsub(power_description, '(%d+)%%', '<span style="font-weight:bold;">%1%%</span>')
power_description = string.gsub(power_description, '(%d+)', '<span style="font-weight:bold;">%1</span>')
fields_cargo['equip_power'] = (string.find(equip, ";") and power_name .. '; ' .. power_description:gsub('<br><br>', '<br>') or power_description:gsub('<br><br>', '<br>'))
group:tag('span')
:wikitext('<span style="color:#50CC3D">На себе: </span>' .. (string.find(equip, ";") and '<span class="green">' .. power_name .. '</span><br> ' .. power_description or power_description))
:tag('br')
:done()
end
end
equip("на себе")
equip("на себе2")
if args["осталось времени боя"] then
group = h.Group()
:tag('span')
:wikitext('Осталось времени боя: ' .. args["осталось времени боя"])
:tag('br')
:done()
content:node(group):tag('br'):done()
end
if args["ячейка усиления"] then
local overload_slot = args["ячейка усиления"]
group = h.Group()
for _, info in ipairs(attributes) do
for _, name in ipairs(info.name) do
overload_slot = string.gsub(overload_slot, name, '[['..name..'|<span class="slate">' .. name .. '</span>]]')
end
end
fields_cargo["overload_slot"] = mw.ustring.gsub(overload_slot, '<br><br>', '<br>')
group:tag('span')
:wikitext('<span class="green">Ячейка усиления: </span> ' .. overload_slot)
:tag('br')
:done()
content:node(group):tag('br'):done()
end
--Описание бонуса и особого таланта для профессии
if args["специализация"] then
group = h.Group()
:tag('span')
:wikitext('<span class="green">Профессия:</span> +' .. args["специализация"] .. ' <span class="slate">Cпециализация</span>')
:done()
content:node(group):tag('br'):done()
end
if args["фокус"] then
group = h.Group()
:tag('span')
:wikitext('<span class="green">Профессия:</span> +' .. args["фокус"] .. ' <span class="slate">Фокус</span>')
:tag('br')
:done()
content:node(group):tag('br'):done()
end
if args["коэффициент скорости"] then
group = h.Group()
:tag('span')
:wikitext('<span class="green">Профессия:</span> +' .. args["коэффициент скорости"] .. '% <span class="slate">Коэффициент скорости</span>')
:tag('br')
:done()
content:node(group):tag('br'):done()
end
if args["особый талант"] then
local power_name, power_description = args["особый талант"]:match("(.+);(.+)")
group = h.Group()
:tag('span')
:wikitext('<span class="green">Особый талант: </span><span class="gold">' .. power_name .. '</span><br> ' .. power_description)
:tag('br')
:done()
content:node(group):tag('br'):done()
end
-- Вспомогательный текст
if args.item_categories then
if mw.ustring.find( args.item_categories, "[иИ]кона" ) and not mw.ustring.find( args.item_categories, "[тТ]олько для спутников" ) then
group
:tag('div')
:wikitext('<span class="green">Модификация: </span>В этой ячейке будет содержаться бонусный параметр, который выбирается из нескольких особых параметров, предоставляемых эпическими и легендарными артефактами. Выберите «Управление артефактными умениями» в меню предмета, чтобы определиться, какой параметр вставить в ячейку.')
:done()
:tag('div')
:wikitext('<span class="green">Модификация: </span>В этой ячейке будет содержаться усиление к одной из 10 классовых особенностей, относящихся к вашему классу. Выберите «Управление артефактными умениями» в меню предмета, чтобы определиться, какое усиление вставить в ячейку.')
:done()
elseif mw.ustring.find( args.item_categories, "[еЕ]да" ) then
group = h.Group()
:tag('div')
:wikitext('Одновременно можно получить только один бонус от пищи.')
:done()
content:node(group):tag('br'):done()
end
end
-- Ячейка усиления
if (args.item_categories and table.find(item_categories, {"голова", "доспехи", "руки", "ноги", "шея", "кольцо", "пояс", "рубаха", "штаны"}) and not (table.find(item_categories, "бесплатное изменение внешнего вида") or table.find(item_categories, "только для спутников"))) then
group = h.Group('slots')
:tag('span')
:attr('class', 'irslot')
:wikitext('Усиленный: <span class="gray">Пусто</span>')
:tag('br')
:done()
content:node(group):tag('br'):done()
end
-- Комлект предметов
if args["комплект"] then
local set_name = args["комплект"]
fields_cargo["item_set"] = set_name
group = h.Group()
local tables = 'Items'
local fields = 'Items.name, Items.item_set, Items.item_type, Items.requires_class'
local args_items_table = {
where = 'Items.item_set = "'.. args["комплект"] .. '"',
orderBy = 'Items._pageName',
}
if args["требуется класс"] then
args_items_table.where = args_items_table.where .. ' AND Items.requires_class HOLDS LIKE "%' .. args["требуется класс"] .. '%"'
end
local result = cargo.query( tables, fields, args_items_table )
local armor_set_data = armor_set_powers_data[set_name]
local weapon_set_data = weapon_set_powers_data[set_name]
-- Список предметов комплекта
local set_items = {} -- Переменная для хранения названий требуемых предметов для комплекта
local num_set_items = 0 -- Переменная для хранения количества требуемых предметов для комплекта
if armor_set_data and armor_set_data.set_items then
for _, item in ipairs(armor_set_data.set_items) do
table.insert(set_items, '<div><span class="gray" style="margin-left: 1.25em;">'.. item ..'</span></div>')
end
num_set_items = #set_items
else
local unique_item_types = {}
for _, item in ipairs(result) do
local name = item['Items.name']
local categorie = item['Items.item_type']
-- Добавление нового предмета в таблицу set_items
table.insert(set_items, { name = name, categorie = categorie })
-- Подсчет уникальных типов предметов
if not unique_item_types[categorie] then
unique_item_types[categorie] = true
num_set_items = num_set_items + 1
end
end
end
local tbl = mw.html.create('table')
local tr = tbl:tag("tr")
tr:tag("td"):attr("colspan", "2"):wikitext('Комплект «' .. set_name .. '» (0/'.. num_set_items ..')'):done()
if armor_set_data and armor_set_data.set_items then
for index, set_item in ipairs(armor_set_data.set_items) do
tr = tbl:tag("tr")
tr:tag("td"):wikitext('<div><span class="gray" style="margin-left: 1.25em;">'.. set_item ..'</span></div>')
end
else
local grouped = {}
local unique_types = {}
-- Группировка предметов по типам
for _, item in ipairs(set_items) do
grouped[item.categorie] = grouped[item.categorie] or {}
table.insert(grouped[item.categorie], item.name)
end
for _, names in pairs(grouped) do
if #names > 1 then
tr = tbl:tag("tr")
tr:tag("td"):attr("colspan", "2"):wikitext('<span class="gray" style="margin-left: 1.25em;">Одно из перечисленного:</span>'):done()
tr = tbl:tag("tr")
for _, name in ipairs(names) do
tr = tbl:tag("tr")
tr:tag("td"):wikitext('<div><span class="gray" style="margin-left: 2.50em;">' .. name .. '</span></div>'):done()
end
else
table.insert(unique_types, names[1])
end
end
for _, name in ipairs(unique_types) do
tr = tbl:tag("tr")
tr:tag("td"):wikitext('<div><span class="gray" style="margin-left: 1.25em;>' .. name .. '</span></div>'):done()
end
end
group:tag('span'):wikitext(tostring(tbl)):done()
-- Описание бонуса комплекта
tbl = mw.html.create('table')
tr = tbl:tag("tr"):attr('style', 'vertical-align: top;')
tr:tag("td"):wikitext('<span class="gray"> ' .. num_set_items ..' из комплекта:</span>'):done()
if table.find(item_categories, {"голова", "доспехи", "руки", "ноги", "шея", "кольцо", "пояс", "рубаха", "штаны", "артефакт"}) then
local description = (armor_set_data and armor_set_data.description) or string.format(error_list.no_found_set_in_data, set_name)
for _, info in ipairs(attributes) do
for _, name in ipairs(info.name) do
description = string.gsub(description, name, '<span class="slate">' .. name .. '</span>')
end
end
tr:tag("td"):wikitext('<span class="gray"> ' .. description .. '</span>'):done()
elseif table.find(item_categories, {"оружие", "клинок", "темляк", "икона", "талисман", "щит", "гримуар"}) then
tr:tag("td"):wikitext('<span class="gray"> ' .. weapon_set_data .. '</span>'):done()
end
group:tag('span'):wikitext(tostring(tbl)):tag('br'):done()
content:node(group):done()
end
-- Проверка наличия категории у предмета и ее сравнение с "скакун"
if args.item_categories and mw.ustring.lower(args.item_categories) == "скакун" then
-- Создание объекта группы 'slots'
local group = h.Group('slots')
-- Цикл по четырем ячейкам
for i = 1, 4 do
-- Получение текущей ячейки
local current_slot = args["ячейка" .. i]
-- Проверка, что ячейка не пуста
if current_slot then
-- Добавление информации о ячейке в таблицу Cargo
fields_cargo["slot" .. i] = current_slot
-- Определение стиля ячейки в зависимости от ее содержимого
local slot_style = mw.ustring.lower(current_slot) == "универсальная ячейка" and 'muslot' or 'slot'
-- Вывод информации о ячейке
group:tag('span'):addClass(slot_style):wikitext(mw.getContentLanguage():ucfirst(current_slot) .. ': <span class="gray">Нет знаков</span>'):tag('br'):done()
end
end
content:node(group):tag('br'):done()
end
-- Вспомогательный текст для сундука
if args.item_categories and mw.ustring.find(args.item_categories, "[сC]ундук") then
if args["описание"] then
group = h.Group()
:tag('div')
:wikitext('Тармалунские обменные слитки в количестве от 10 до 18 шт.<br>Чтобы открыть этот сундук, нужен <span class="epic">зачарованный ключ</span>.')
:done()
content:node(group):tag('br'):done()
end
end
-- Содержимое сундуков/наборов
if args["содержимое"] then
group = h.Group()
:tag('div')
:attr('class', '')
:wikitext(args["содержимое"])
:done()
content:node(group):tag('br'):done()
end
-- Вспомогательный текст для сундука
if args.item_categories and mw.ustring.find(args.item_categories, "[сC]ундук") then
if args["описание"] == nil then
group = h.Group()
:tag('div')
:wikitext('Тармалунские обменные слитки в количестве от 10 до 18 шт.<br>Чтобы открыть этот сундук, нужен <span class="epic">зачарованный ключ</span>.')
:done()
content:node(group):tag('br'):done()
end
end
if args["усиленный"] then
--fields_cargo["item_use"] = args["усиленный"]
group = h.Group()
:wikitext('<span class="green"">Усиленный: </span>' .. args["усиленный"])
:tag('br')
:done()
content:node(group):tag('br'):done()
end
-- Описание предмета
if args["описание"] then
fields_cargo["description"] = args["описание"]
group = h.Group()
:tag('span')
:attr("class", "slate")
:wikitext(args["описание"])
:tag('br'):done()
content:node(group):tag('br'):done()
end
if args["осталось времени"] then
content
:tag('div')
:attr('class', 'left')
:wikitext('Осталось времени: ' .. args["осталось времени"])
end
-- Вспомогательный текст для знаков скакунов
if args.item_categories and table.find(item_categories, "знаки") then
group = h.Group()
:tag('div') :attr('class', 'slate'):wikitext('Знаки дают бонусы и повышают параметры, если их вставить в ячейки скакуна в конюшне.'):tag('br'):done()
content:node(group):tag('br'):done()
end
-- Вспомогательный текст для волшебных камней
if args.item_categories and table.find(item_categories, "бонус") then
group = h.Group()
:tag('div') :attr('class', 'slate'):wikitext('Этот волшебный камень можно вставлять в бонусные ячейки.'):tag('br'):done()
content:node(group):tag('br'):done()
end
-- Максимальное количество и недельный лимит валюты
if args["maximumQuantity"] or args["weeklyLimit"] then
group = h.Group()
if args["maximumQuantity"] then
group
:tag('span')
:wikitext('Максимальное количество: ' .. args["maximumQuantity"])
:tag('br')
:done()
end
if args["weeklyLimit"] then
group
:tag('span')
:wikitext('Недельный лимит: ' .. args["weeklyLimit"])
:tag('br')
:done()
end
content:node(group):tag('br'):done()
end
-- Item coupon message
if args.item_categories and table.find(item_categories, "купон") then
group = h.Group()
:tag('p'):wikitext('Вы можете использовать этот купон на рынке ZEN.'):done()
:tag('p'):wikitext('При покупке вы можете использовать только один купон.'):done()
:tag('p'):wikitext('Действие купона не суммируется со специальными скидками. Применяется та скидка, которая дает больший эффект.'):done()
content:node(group):done()
end
-- Флаги предмета
if args.item_categories then
local item_types = {}
for i in mw.text.gsplit(args.item_categories, ",%s*") do
table.insert(item_types, mw.getContentLanguage():ucfirst(i))
end
fields_cargo["categories"] = args.item_categories
content:tag('div') :attr('class', 'left'):wikitext(table.concat(item_types, ", ")):done()
end
-- Ранг удивительного предмета
if args.item_categories and table.find(item_categories, "удивительный предмет") then
local rank = tonumber(args["ранг"])
if rank == 7 then
content:tag('span')
:addClass('left')
:wikitext("Ранг: 7 (максимум)")
elseif rank and rank > 7 then
error("Не существует удивительного предмета с таким рангом!")
elseif rank and rank >= 1 and rank <= 6 then
local nextRank = {1, 3, 10, 25, 100, 500}
content:tag('span')
:addClass('left')
:wikitext("Ранг: " .. rank .. " (0/" .. nextRank[rank] .. " до следующего ранга)")
end
end
-- Требуемый класс
if args["требуется класс"] then
local requires_class = {}
for i in mw.text.gsplit(args["требуется класс"], ",%s*") do
table.insert(requires_class, mw.getContentLanguage():ucfirst(i))
end
fields_cargo["requires_class"] = table.concat(requires_class, ", ")
content:tag('div'):attr('class', 'left'):wikitext('Требуется класс: ' .. table.concat(requires_class, ", ")):done()
end
-- Требуемый минимальный уровень для экипировки предмета
if args.item_categories and not (mw.ustring.find(args.item_categories, "[сС]путник") or mw.ustring.find(args.item_categories, "[сС]какун") or args["требуется уровень профессии"]) then
local item_min_level = args["минимальный уровень"] or "Нет требования к уровню"
fields_cargo["item_min_level"] = item_min_level
content:tag('div'):attr('class', 'left'):wikitext(args["минимальный уровень"] and 'Минимальный уровень: ' .. args["минимальный уровень"] or 'Нет требования к уровню')
end
-- Требуемый уровень професии
if args.item_categories and args["требуется уровень профессии"] then
local prof_min_level = args["требуется уровень профессии"]
fields_cargo[""] = prof_min_level
content:tag('div'):attr('class', 'left'):wikitext('Требуется уровень профессии: ' .. args["требуется уровень профессии"])
end
-- Вспомогательный текст для артефактов
if args.item_categories and (table.find(item_categories, "артефакт") or table.find(item_categories, "волшебный камень")) and mw.ustring.lower(args["качество"]) == 'мифический' then
content:tag('div'):attr('class', 'left gold'):wikitext('Максимальное качество'):tag('br'):done()
end
-- Стоимость продажи предмета
if args["цена продажи"] then
if mw.ustring.lower(args["цена продажи"]) == 'нпнв' then
content:tag('div'):addClass('right'):wikitext("Невозможно продать<br>Нельзя выбросить")
elseif mw.ustring.lower(args["цена продажи"]) == 'невозможно продать' then
content:tag('div'):addClass('right'):wikitext(mw.getContentLanguage():ucfirst(args["цена продажи"]))
elseif args["цена продажи"] ~= "" then
content:tag('div'):addClass('right'):wikitext(frame:expandTemplate{title = 'Валюта',args = {args["цена продажи"]}})
end
elseif args.item_categories and (mw.ustring.find( args.item_categories, "[сС]какун" ) or mw.ustring.find( args.item_categories, "[сС]путник" ) or mw.ustring.find( args.item_categories, "[вВ]алюты событий" ) or mw.ustring.find( args.item_categories, "[вВ]алюты кампаний" )) then
content:tag('div'):addClass('right'):wikitext('Невозможно продать')
elseif args.item_categories and args["качество"] then
local sell_price = {
['необычный'] = '1013',
['редкий'] = '3418',
['эпический'] = table.find(item_categories, {"шляпа (стиль)", "тело (стиль)", "ноги (стиль)"}) and '442' or '16043',
['легендарный'] = '32086',
['мифический'] = '48129'
}
content:tag('div') :addClass('right'):wikitext(frame:expandTemplate{title = 'Валюта',args = {sell_price[mw.ustring.lower(args["качество"])]}})
else
content:tag('div') :attr('class', 'right'):wikitext('Невозможно продать')
end
if args["очки обработки"] then
content:tag('div'):addClass('right'):wikitext('[[Файл:Currency_Icon_Refinementpoints.png|x14px|ссылка=]] ' .. args["очки обработки"])
elseif args.item_categories and table.find(item_categories, {"голова", "руки", "доспехи", "ноги", "кольцо"}) then
local refinement_points = {
["необычный"] = '50',
["редкий"] = '150',
["эпический"] = '300',
["легендарный"] = '330',
["мифический"] = '365',
}
local quality = mw.ustring.lower(args["качество"] or '')
local points = refinement_points[quality] or '0'
content:tag('div'):attr('class', 'right'):wikitext('[[Файл:Currency_Icon_Refinementpoints.png|x14px|ссылка=]] ' .. points)
end
--Добавляет иконку предмета в нижней части подсказки
if args["иконка"] then
fields_cargo["icon"] = args["иконка"]
content:tag('div') :attr('style', 'text-align: center'):wikitext('[[Файл:' .. args["иконка"] .. '|64px|ссылка=]]')
end
-- Функция сравнения ячеек скакуна и бонуса
-- horse_cells: таблица с ячейками скакуна
-- bonus_cells: таблица с ячейками бонуса
-- Возвращает true, если ячейки скакуна совпадают с ячейками бонуса
if args.item_categories and table.find(item_categories, "скакун") then
local function checkHorseBonusMatch(horse_cells, bonus_cells)
local match = true -- Переменная, обозначающая, совпадают ли ячейки
local used_cells = {} -- Таблица, содержащая индексы использованных ячеек
-- Проверяем, что количество ячеек в скакуне и бонусе совпадает, если нет, то проверяем частичное совпадение для определенных случаев
if #horse_cells ~= #bonus_cells then
if (#horse_cells == 3 and #bonus_cells == 4) then
match = false -- Если нет частичного совпадения, возвращаем false
end
end
-- Перебираем ячейки скакуна
for i, horse_cell in pairs(horse_cells) do
local found_match = false -- Переменная, обозначающая, найдено ли совпадение
-- Перебираем ячейки бонуса
for j, bonus_cell in pairs(bonus_cells) do
if horse_cell == bonus_cell and not used_cells[j] then
-- Если ячейки совпадают и ячейка не использована ранее
used_cells[j] = true -- Отмечаем ячейку, как использованную
found_match = true -- Обозначаем, что найдено совпадение
break -- Прерываем цикл по ячейкам бонуса
end
end
-- Если совпадение не найдено, то проверяем, есть ли у скакуна универсальная ячейка
if not found_match and horse_cell ~= "Универсальная ячейка" then
match = false -- Иначе, ячейки не совпадают
break -- Прерываем цикл по ячейкам скакуна
else
found_match = true -- Помечаем, что найдено совпадение
end
end
return match -- Возвращаем результат сравнения
end
local tables = 'Insignia_bonuses'
local fields = 'name, slot1, slot2, slot3, slot4'
local args_insignia_bonuses = {orderBy = 'name'}
local result = cargo.query(tables, fields, args_insignia_bonuses)
local insignia_bonuses = {}
for _, item in pairs(result) do
local horse_insignias = {}
local bonus_insignias = {}
for i = 1, 4 do
local bonus_insignia = item["slot"..i]
if bonus_insignia ~= '' then
table.insert(bonus_insignias, bonus_insignia)
end
local horse_insignia = args["ячейка"..i]
if horse_insignia ~= '' then
table.insert(horse_insignias, horse_insignia)
end
end
if checkHorseBonusMatch(horse_insignias, bonus_insignias) then
table.insert(insignia_bonuses, item.name)
end
end
-- Добавляет результат в поле "insignia_bonuses" таблицы "fields_cargo".
fields_cargo["insignia_bonuses"] = table.concat(insignia_bonuses, ', ')
end
if args["коллекция"] then
fields_cargo["collection"] = args["коллекция"]
end
if args["удален"] then
fields_cargo["removed"] = args["удален"]
end
-- Показ мест, где можно найти предмет.
-- Если предмет продается у торговцев, то отображается их список.
-- Если предмет можно получить из сундуков, то перечисляются сундуки, в которых можно его найти.
-- Если для создания предмета необходим рецепт, то отображается список профессий и уровней, которые позволяют его создать.
-- Если у предмета есть пользовательские местонахождения, они также будут перечислены.
-- Получаем название текущей страницы в качестве аргумента для поиска информации
local item_title = mw.title.getCurrentTitle().fullText
--Поиск торговцев, у которых можно купить предмет.
local vendorTables = 'Cost, NPCs'
local vendorFields = 'Cost.merchant, Cost.item, NPCs._pageName, NPCs.zone'
local vendorArgs = {
join = 'Cost.merchant = NPCs._pageName',
where = 'Cost.item="' .. item_title .. '"',
}
local vendor_result = cargo.query( vendorTables, vendorFields, vendorArgs )
--Поиск сундуков/наборов, в которых может содержатся предмет.
local containsTables = 'Contains'
local containsFields = '_pageName, name, contains_item, quantity'
local containsArgs = {
where = 'contains_item = "' .. item_title .. '"',
orderBy = '_pageName',
}
local contains_result = cargo.query( containsTables, containsFields, containsArgs )
--Поиск предмета в профессиях, если предмет создается в мастерской
local recipesTables = 'Recipes'
local recipesFields = 'name, professions, source, level'
local recipesArgs = {
where = 'name = "' .. item_title .. '"',
orderBy = '_pageName',
}
local recipes_result = cargo.query( recipesTables, recipesFields, recipesArgs )
-- Создаем массив для местоположений и добавляем местоположения, где можно найти предмет
local locations = {}
--Показ торговцев, где продается предмет
if #vendor_result > 1 then
table.insert(locations, '* Торговцы расходуемыми предметами <span style="font-size: 13px">(см. подробнее на странице предмета)</span>')
else
-- Если предмет продается у торговцев, добавляем их в переменную "locations"
for _, row in ipairs(vendor_result) do
if row['Cost.merchant'] ~= nil and row['NPCs.zone'] ~= nil then
table.insert(locations, string.format('* [[%s]] <span style="font-size: 13px">(торговец в [[%s]])</span>', row['Cost.merchant'], row['NPCs.zone']))
else
-- Если предмет продается в магазине кампании
local merchant = row['Cost.merchant']
--[[if string.find(merchant, "Кампания") ~= nil then
zone = "Магазин кампании" or ''
end]]--
table.insert(locations, string.format('* [[%s]] <span style="font-size: 13px">(Магазин кампании)</span>', merchant))
end
end
end
--Показ сундуков, где выпадет предмет
if #contains_result > 1 then
table.insert(locations, '* Сундуки <span style="font-size: 13px">(см. подробнее на странице предмета)</span>')
else
for _,row in ipairs(contains_result) do
table.insert(locations, '* ' .. item_icon.Main({args={row._pageName,""}}))
end
end
--Показ рецептов, где создается предмет
for _, profession in ipairs(recipes_result) do
local count = 0 -- переменная для подсчета количества профессий
for _ in string.gmatch(profession.professions, "[^,]+") do
count = count + 1
end
-- Если предмет создается через мастерские рецепты
if profession.source ~= nil then
table.insert(locations, '* ' .. item_icon.Main({args={profession.source,""}}))
else -- Если предмет создается через стандартные рецепты
table.insert(locations, '* Професс' .. (count > 1 and 'ии: ' or 'ия: ') .. profession.professions .. ' (уровень ' .. profession.level ..')')
end
end
--Добавление пользовательских местонахождении предмета (если они есть).
if args["locations"] then
fields_cargo["locations"] = args["locations"]
for location in mw.text.gsplit(args["locations"], ";%s*") do
table.insert(locations, '* ' .. location)
end
end
content
:tag('div')
:attr('class', 'gold locations')
:wikitext('<hr>\nЭто можно найти здесь:<br>' .. table.concat(locations, '<br>'))
--Конец кода (Показ торговцев/сундуков/рецептов, где продается/выпадет/создается предмет)
container:node(content)
-- Cargo tables
local APPEARANCES_TABLE = "Items"
--Добавляет значение аргумента "умения" в поле "powers" таблицы "fields_cargo".
fields_cargo["powers"] = args["умения"]
--Добавляет значение аргумента "умение спутника" в поле "pet_power" таблицы "fields_cargo".
for i = 1, 6 do
if args["умение спутника"..i] then
fields_cargo["pet_power"..i] = args["умение спутника"..i]
end
end
--Добавляет значение аргумента "тип" в поле "item_type" таблицы "fields_cargo".
fields_cargo["item_type"] = args["тип"]
--Добавляет значение аргумента "очки коллекции" в поле "collection_score" таблицы "fields_cargo".
fields_cargo["collection_score"] = args["очки коллекции"]
if args["удален"] == nil then
frame:callParserFunction("#cargo_store:_table=" .. APPEARANCES_TABLE, fields_cargo)
end
container
:tag('div'):addClass('bottom')
:tag('div'):addClass('blcorner'):done()
:tag('div'):addClass('brcorner'):done()
:tag('div'):addClass('bedge'):done()
return container
end
function h.Group(class)
return mw.html.create('span')
:attr( 'class', 'group ' .. (class or '') )
end
function h.divContent(class)
return mw.html.create('div')
:attr( 'class', 'content ' .. (class or '') )
end
return p