Модуль:HeroData
Данная группа модулей хранит информацию обо всех героях из Крушителей подземелий. Перечень модулей:
- Модуль:HeroData - основные функции
- Модуль:HeroData/data - массив данных о героях
- Модуль:HeroData/getter - сборщик данных о героях
- Модуль:HeroData/rarities - массив данных c редкостями героев
- Модуль:HeroData/races - массив данных с расами героев
- Модуль:HeroData/classes - массив данных с классами героев
- Модуль:HeroData/alliances - массив данных с альянсами героев
- Модуль:HeroData/types - массив данных c типами атак героев
- Модуль:HeroData/skills - массив данных с пассивными способностями героев
- Модуль:HeroData/abilities - массив данных с активными способностями героев
- Модуль:HeroData/equip - массив данных с комплектами экипировок героев
- Модуль:HeroData/categories - массив данных с категориями героев
Информация из Модуль:HeroData/doc
local p = {} local lib = require('Module:Feature') local libItem = require('Module:ItemData') local userError = require('Module:User error') function p.get(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local get = require ('Module:HeroData/getter') local hero = args['hero'] or args[1] local datatype = args['datatype'] or args[2] local output = args['output'] or args[3] or nil local result = get[datatype](hero) if output ~= nil and type(result) == "table" then if output == "csv" then return lib.tbl_concat{result} elseif output == "custom" then return frame:preprocess(lib.tbl_concat({result, prepend = args['prepend'], append = args['append'], separator = args['separator'], index = args["index"]})) elseif output == "template" then return frame:preprocess(lib.tbl_concat{result, prepend = "{{" .. args['t_name'] .. "|", append = "}}", separator = args['separator']}) end elseif result == nil then return "" else return result end end function p.heroIcon(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end hero = args["hero"] or args[1] if(not(p.get{args["hero"], "exists"})) then return userError("Указанный герой не найден в [[Модуль:HeroData/data]] (message from [[Модуль:HeroData]])", "LuaError") end local IL = require("Модуль:ImageLink") return IL.hero(args) end function p.getRoster() local heroes = mw.loadData('Module:HeroData/data') local heroesTable = {} local s = "" for k, v in pairs(heroes) do table.insert(heroesTable, k) end table.sort(heroesTable) for i, hero in ipairs(heroesTable) do local icon = p.get{hero, "icon", "csv"} local race = p.get{hero, "race", "csv"} local class = p.get{hero, "class", "csv"} local alliance = p.get{hero, "alliance", "csv"} if (hero) == "ХТ-02/6" then icon = "hero_xt.png" end local listNode = mw.html.create('li') listNode :tag('span') :addClass('hero_roster') :attr('data-hero', hero) :attr('data-search', search) :attr('data-race', race) :attr('data-class', class) :attr('data-alliance', alliance) :wikitext( mw.ustring.format("[[File:%s|48px|alt=%s|link=%s]]", icon, hero, hero) ) :done() :done() listNode:newline() s = s .. tostring(listNode) end return s end function p.getHeroSkill(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local get = require ('Module:HeroData/getter') local hero = args['hero'] or args[1] local skill = "skills" local str = "" local result = get[skill](hero) for k, v in ipairs(result) do if tonumber(args['index']) == k then str = mw.ustring.format('{{hsk|%s|%s|%s|%s|%s|%s}}', v[1], v[2], v[3], v[4], v[5], v[6]) end end return frame:preprocess(tostring(str)) end function p.getHeroAbility(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local get = require ('Module:HeroData/getter') local hero = args['hero'] or args[1] local ability = "abilities" local str = "" local result = get[ability](hero) for k, v in ipairs(result) do if tonumber(args['index']) == k then str = mw.ustring.format('%s/%s/%s/%s', v[1], v[2], v[3], v[4]) end end return str end function p.getHeroTableItems(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local get = require ('Module:HeroData/getter') local hero = args['hero'] or args[1] local equip = "equip" local tableNode = mw.html.create('table') local type local divNode = mw.html.create('div') local result = get[equip](hero) if hero == "Тотем душ" or hero == "Теолдуин" or hero == "Герой игрока" or hero == "Гримбольц" then divNode :cssText('background: #042539; color: #91c5ca; padding: 10px; border: 1px solid #6b879f; border-radius: 10px; width: fit-content; margin: 0 auto;') :wikitext('Данный герой не наносит никакого урона, поэтому у него нет комплектов экипировки для улучшения.') return frame:preprocess(tostring(divNode)) end tableNode :addClass('custom-table active-hover') :cssText('width: fit-content; display: table; overflow-x: auto; margin: 0 auto;') :newline() tableNode :tag('tr') :tag('th') :css('width', '16%') :done() :tag('th') :css('width', '14%') :wikitext('Шлем') :done() :tag('th') :css('width', '14%') :tag('div') :addClass('hidden pc-block') :wikitext('Доспехи') :done() :tag('div') :addClass('mobile-block') :wikitext('Досп') :done() :done() :tag('th') :css('width', '14%') :tag('div') :addClass('hidden pc-block') :wikitext('Оружие') :done() :tag('div') :addClass('mobile-block') :wikitext('Оруж') :done() :done() :tag('th') :css('width', '14%') :tag('div') :addClass('hidden pc-block') :wikitext('Ботинки') :done() :tag('div') :addClass('mobile-block') :wikitext('Боты') :done() :done() :tag('th') :css('width', '14%') :tag('div') :addClass('hidden pc-block') :wikitext('Кольцо') :done() :tag('div') :addClass('mobile-block') :wikitext('Колц') :done() :done() :tag('th') :css('width', '14%') :tag('div') :addClass('hidden pc-block') :wikitext('Ожерелье') :done() :tag('div') :addClass('mobile-block') :wikitext('Ожер') :done() :done() :done() for k, v in lib.pairsByAlphabeticalKeys(result) do if k > 0 and k < 5 then type = 0 elseif k > 4 and k < 9 then type = 1 elseif k > 8 then type = 2 end local rowNode = mw.html.create('tr') rowNode :tag('td') :tag('div') :addClass('hidden pc-block') :wikitext(setStarMultiple(k, type)) :done() :tag('div') :addClass('mobile-block') :wikitext(setStarMultipleMobile(k, type)) :done() :done() :tag('td') :wikitext(mw.ustring.format('%s', libItem.getItemIcon(v[1], "40px"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', libItem.getItemIcon(v[2], "40px"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', libItem.getItemIcon(v[3], "40px"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', libItem.getItemIcon(v[4], "40px"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', libItem.getItemIcon(v[5], "40px"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', libItem.getItemIcon(v[6], "40px"))) :done() :done() tableNode:node(rowNode):newline() end return frame:preprocess(tostring(tableNode)) end function p.getHeroTableInfo(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local get = require ('Module:HeroData/getter') local hero = args['hero'] or args[1] local params = {"base_cost", "base_dps", "icon_shard", "shard_count", "info"} local tableNode = mw.html.create('table') local cost = get[params[1]](hero) local dps = get[params[2]](hero) local shard_count = get[params[4]](hero) local info = get[params[5]](hero) if get[params[3]](hero) ~= nil then local shard = get[params[3]](hero) else local shard = "" end tableNode :addClass('custom-table') :cssText('display: table; width: fit-content; world-wrap: break-word;') :newline() tableNode :tag('tr') :tag('th') :css('width', '15%') :wikitext('Базовая стоимость') :done() :tag('th') :css('width', '15%') :wikitext('Базовый ДПС') :done() :tag('th') :css('width', '15%') :wikitext('Осколки героя') :done() :tag('th') :wikitext('Способ получения') :done() :done() :tag('tr') :tag('td') :css('text-align', 'center') :wikitext(mw.ustring.format('%s{{%s}}', cost, "золото")) :done() :tag('td') :css('text-align', 'center') :wikitext(mw.ustring.format('%s', dps)) :done() :tag('td') :css('text-align', 'center') :wikitext(string.format('%s', lib.ternary(shard ~= "", getHeroShard(hero, shard, shard_count), "-"))) :done() :tag('td') :cssText('text-align:center; white-space: pre-wrap;') :wikitext(mw.ustring.format('%s', info)) :done() :done() return frame:preprocess(tostring(tableNode)) end function p.getHeroesTable(frame) local tableNode = mw.html.create('table') tableNode :addClass('custom-table active-hover sortable') :cssText('width: 80%; text-align: center; display: table;') :newline() tableNode :tag('tr') :css('white-space', 'nowrap') :tag('th') :wikitext('Имя') :done() :tag('th') :attr('class', 'unsortable') :css('width', '60px') :wikitext('Иконка') :done() :tag('th') :css('width', '80px') :wikitext('Раса') :done() :tag('th') :css('width', '80px') :wikitext('Класс') :done() :tag('th') :attr('class', 'unsortable') :css('width', '60px') :wikitext('Альянс') :done() :tag('th') :css('width', '60px') :wikitext('HP') :done() :tag('th') :css('width', '60px') :wikitext('DEF') :done() :tag('th') :css('width', '60px') :wikitext('ATK') :done() :tag('th') :css('width', '60px') :wikitext('WIS') :done() :tag('th') :css('width', '60px') :wikitext('AGI') :done() :done() local heroes = mw.loadData('Module:HeroData/data') local races = mw.loadData('Module:HeroData/races') local classes = mw.loadData('Module:HeroData/classes') local alliances = mw.loadData('Module:HeroData/alliances') local race = "" local class = "" local alliance = "" for k, v in lib.pairsByAlphabeticalKeys(heroes) do if v['race'] ~= nil then race = races[v['race']] else race = "-" end if v['class'] ~= nil then class = classes[v['class']] else class = "-" end if v['alliance'] ~= nil then alliance = alliances[v['alliance']] else alliance = "-" end local rowNode = mw.html.create('tr') rowNode :tag('td') :attr('data-sort-value', k) :wikitext(mw.ustring.format('[[%s]]', v['name'])) :done() :tag('td') :wikitext(mw.ustring.format('%s', p.getHeroIcon(v['name'], "35px"))) :done() :tag('td') :attr('data-sort-value', race) :wikitext(mw.ustring.format('%s', lib.ternary(type(v['race']) ~= "nil", mw.ustring.format('[[:Категория:%s (раса)|%s]]', race, race), "-"))) :done() :tag('td') :attr('data-sort-value', class) :wikitext(mw.ustring.format('%s', lib.ternary(type(v['class']) ~= "nil", mw.ustring.format('[[:Категория:%s (класс)|%s]]', class, class), "-"))) :tag('td') :attr('data-sort-value', alliance) :wikitext(mw.ustring.format('%s', lib.ternary(v['alliance'] ~= nil, AllianceIcon(alliance, "45px"), "-"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', lib.ternary(v['stats']['hp_base'] == nil, "N/A", v['stats']['hp_base']))) :done() :tag('td') :wikitext(mw.ustring.format('%s', lib.ternary(v['stats']['def_base'] == nil, "N/A", v['stats']['def_base']))) :done() :tag('td') :wikitext(string.format('%s', lib.ternary(v['type'] == nil, "N/A", lib.ternary(v['type'] == 1 or v['type'] == 4, setHeroMainStat(v['stats']['atk_base']), v['stats']['atk_base'])))) :done() :tag('td') :wikitext(string.format('%s', lib.ternary(v['type'] == nil, "N/A", lib.ternary(v['type'] == 2 or v['type'] == 4, setHeroMainStat(v['stats']['wis_base']), v['stats']['wis_base'])))) :done() :tag('td') :wikitext(string.format('%s', lib.ternary(v['type'] == nil, "N/A", lib.ternary(v['type'] == 3, setHeroMainStat(v['stats']['agi_base']), v['stats']['agi_base'])))) :done() :done() tableNode:node(rowNode):newline() end return frame:preprocess(tostring(tableNode)) end function p.getHeroCategories(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local hero_data = require ('Module:HeroData/data') local categories_data = require ('Module:HeroData/categories') local hero = args['hero'] or args[1] local categories = {} local str = "" if hero_data[hero]["categories"] ~= nil then for _, v in ipairs(hero_data[hero]["categories"]) do str = str .. mw.ustring.format('[[Категория:%s]]\n', categories_data[v]) end end return frame:preprocess(tostring(str)) end function setHeroMainStat(str) local spanNode = mw.html.create('span') if str == nil then str = "N/A" end spanNode :addClass('rarity-glpar') :wikitext(mw.ustring.format('%s', str)) :done() return tostring(spanNode) end function setStarMultiple(num, type) local divNode = mw.html.create('div') local i = 0; divNode :cssText('text-align: right;') :newline() if num == 1 then divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() elseif num == 2 then while i < 2 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 3 then while i < 3 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 4 then while i < 4 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 5 then divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() elseif num == 6 then while i < 2 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 7 then while i < 3 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 8 then while i < 4 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 9 then divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() elseif num == 10 then while i < 2 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 11 then while i < 3 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end elseif num == 12 then while i < 4 do i = i + 1 divNode :wikitext(mw.ustring.format('{{%s}}', convertStarType(type))) :done() end else return "" end return tostring(divNode) end function setStarMultipleMobile(num, type) local divNode = mw.html.create('div') divNode :cssText('text-align: right;') :newline() if num == 1 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 1)) :done() elseif num == 2 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 2)) :done() elseif num == 3 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 3)) :done() elseif num == 4 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 4)) :done() elseif num == 5 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 1)) :done() elseif num == 6 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 2)) :done() elseif num == 7 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 3)) :done() elseif num == 8 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 4)) :done() elseif num == 9 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 1)) :done() elseif num == 10 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 2)) :done() elseif num == 11 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 3)) :done() elseif num == 12 then divNode :wikitext(mw.ustring.format('{{%s}} x%d', convertStarType(type), 4)) :done() else return "" end return tostring(divNode) end function convertStarType(type) local str = "" if type == 0 then str = "Звезда" elseif type == 1 then str = "Звезда.миф" elseif type == 2 then str = "Звезда.руб" end return str end function getHeroShard(hero, shard, shard_count) local item_data = require ('Module:ItemData/data') if shard == "" or shard_count == nil or item_data["Осколки: " .. hero] == nil then return "N/A" end local str = "Осколки: " .. hero local item = item_data[str]["name"] return tostring(libItem.getItemIcon(item, "40px", shard_count)) end function p.getHeroIcon(hero, size, link) local hero_data = require ('Module:HeroData/data') local rarity_data = require ('Module:HeroData/rarities') if size == nil then size = "30px" end if link == nil then link = "" end local icon = hero_data[hero]["icon"] local rarity = rarity_data[hero_data[hero]["rarity"]] return mw.ustring.format('{{HeroIcon|%s|%s|%s|size=%s|link=%s}}', hero, icon, rarity, size, link) end function p.getIconHero(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local hero_data = require ('Module:HeroData/data') local rarity_data = require ('Module:HeroData/rarities') if args['size'] == nil then size = "30px" else size = args['size'] end if args['link'] == nil then link = "" else link = args['link'] end if args['caption'] == nil then caption = "" else caption = args['caption'] end if lib.lookup(hero_data, args['hero']) then icon = hero_data[args['hero']]["icon"] else return args['hero'] end local rarity = rarity_data[hero_data[args['hero']]["rarity"]] return frame:preprocess(mw.ustring.format('{{HeroIcon|%s|%s|%s|size=%s|link=%s|caption=%s}}', args['hero'], icon, rarity, size, link, caption)) end function AllianceIcon(alliance, size) local icons_data = require ('Module:IconData/alliances') local icon = "" local str = "" if icons_data[alliance] ~= nil then icon = icons_data[alliance] else return "-" end str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance) return tostring(str) end function p.getHeroCategoriesTable(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local hero_data = require ('Module:HeroData/data') local categories_data = require ('Module:HeroData/categories') local races = require ('Module:HeroData/races') local classes = require ('Module:HeroData/classes') local alliances = require ('Module:HeroData/alliances') local category = args['category'] or args[1] local heroes = {} local race = "" local class = "" local alliance = "" local tableNode = mw.html.create('table') for k, v in lib.pairsByAlphabeticalKeys(hero_data) do if hero_data[k]['categories'] ~= nil then for k1, v1 in ipairs(hero_data[k]['categories']) do if category == categories_data[hero_data[k]['categories'][k1]] then table.insert(heroes, k) end end end end tableNode :addClass('custom-table active-hover sortable') :cssText('width: 100%; text-align: center; display: table;') :newline() tableNode :tag('tr') :css('white-space', 'nowrap') :tag('th') :wikitext('Имя') :done() :tag('th') :attr('class', 'unsortable') :css('width', '60px') :wikitext('Иконка') :done() :tag('th') :css('width', '80px') :wikitext('Раса') :done() :tag('th') :css('width', '80px') :wikitext('Класс') :done() :tag('th') :css('width', '60px') :wikitext('Альянс') :done() :tag('th') :css('width', '60px') :wikitext('HP') :done() :tag('th') :css('width', '60px') :wikitext('DEF') :done() :tag('th') :css('width', '60px') :wikitext('ATK') :done() :tag('th') :css('width', '60px') :wikitext('WIS') :done() :tag('th') :css('width', '60px') :wikitext('AGI') :done() :done() for k1, v1 in lib.pairsByAlphabeticalKeys(heroes) do if hero_data[v1]['race'] ~= nil then race = races[hero_data[v1]['race']] else race = "-" end if hero_data[v1]['class'] ~= nil then class = classes[hero_data[v1]['class']] else class = "-" end if hero_data[v1]['alliance'] ~= nil then alliance = alliances[hero_data[v1]['alliance']] else alliance = "-" end local rowNode = mw.html.create('tr') rowNode :tag('td') :attr('data-sort-value', v1) :wikitext(mw.ustring.format('[[%s]]', hero_data[v1]['name'])) :done() :tag('td') :wikitext(mw.ustring.format('%s', p.getHeroIcon(v1, "35px"))) :done() :tag('td') :attr('data-sort-value', race) :wikitext(mw.ustring.format('%s', lib.ternary(type(hero_data[v1]['race']) ~= "nil", mw.ustring.format('[[:Категория:%s (раса)|%s]]', race, race), "-"))) :done() :tag('td') :attr('data-sort-value', class) :wikitext(mw.ustring.format('%s', lib.ternary(hero_data[v1]['class'] ~= nil, mw.ustring.format('[[:Категория:%s (класс)|%s]]', class, class), "-"))) :done() :tag('td') :attr('data-sort-value', alliance) :wikitext(mw.ustring.format('%s', lib.ternary(hero_data[v1]['alliance'] ~= nil, AllianceIcon(alliance, "45px"), "-"))) :done() :tag('td') :wikitext(mw.ustring.format('%s', lib.ternary(hero_data[v1]['stats']['hp_base'] == nil, "N/A", hero_data[v1]['stats']['hp_base']))) :done() :tag('td') :wikitext(mw.ustring.format('%s', lib.ternary(hero_data[v1]['stats']['def_base'] == nil, "N/A", hero_data[v1]['stats']['def_base']))) :done() :tag('td') :wikitext(string.format('%s', lib.ternary(hero_data[v1]['type'] == nil, "N/A", lib.ternary(hero_data[v1]['type'] == 1 or hero_data[v1]['type'] == 4, setHeroMainStat(hero_data[v1]['stats']['atk_base']), hero_data[v1]['stats']['atk_base'])))) :done() :tag('td') :wikitext(string.format('%s', lib.ternary(hero_data[v1]['type'] == nil, "N/A", lib.ternary(hero_data[v1]['type'] == 2 or hero_data[v1]['type'] == 4 or hero_data[v1]['type'] == 5, setHeroMainStat(hero_data[v1]['stats']['wis_base']), hero_data[v1]['stats']['wis_base'])))) :done() :tag('td') :wikitext(string.format('%s', lib.ternary(hero_data[v1]['type'] == nil, "N/A", lib.ternary(hero_data[v1]['type'] == 3 or hero_data[v1]['type'] == 5, setHeroMainStat(hero_data[v1]['stats']['agi_base']), hero_data[v1]['stats']['agi_base'])))) :done() :done() tableNode:node(rowNode):newline() end return frame:preprocess(tostring(tableNode)) end function p.getAllianceIcon(frame) local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end local icons_data = require ('Module:IconData/alliances') local alliance = args['alliance'] or args[1] local size = args['size'] or args[2] local icon = "" local str = "" if icons_data[alliance] ~= nil then icon = icons_data[alliance] else return "-" end str = mw.ustring.format('[[Файл:%s|%s|link=:Категория:%s (альянс)]]', icon, size, alliance) return frame:preprocess(tostring(str)) end return p