Module:List
Documentation for this module may be created at Module:List/doc
local p = {}
local utils = require("Module:Utils")
local constant = mw.loadJsonData("Module:Constant.json")
local category = mw.loadJsonData("Module:Category.json")
local data = mw.loadJsonData("Module:Data.json")
local objectID = mw.loadJsonData("Module:ObjectID.json")
local lootTable = mw.loadJsonData("Module:LootTable.json")
function p.createIconList(frame)
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
local str = ""
for k, v in ipairs(list) do
if frame.args.match then
if string.find(v, frame.args.match) then
str = str .. frame:expandTemplate{title = 'Icon', args = {v}} .. ' '
end
elseif frame.args.unmatch then
if not string.find(v, frame.args.unmatch) then
str = str .. frame:expandTemplate{title = 'Icon', args = {v}} .. ' '
end
else
str = str .. frame:expandTemplate{title = 'Icon', args = {v}} .. ' '
end
end
str = str:sub(1, -2)
return str
end
function p.createSmallboxList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.smallboxListString(name)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
if frame.args.match then
if string.find(v, frame.args.match) then
str = str .. p.smallboxListString(v)
end
else
str = str .. p.smallboxListString(v)
end
end
end
return str
end
function p.smallboxListString(name)
local str = ""
local rarity = data[name] and data[name].rarity or ''
str = str .. '<div><div class="smallbox-b-image ' .. rarity .. '">[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]</div>'
str = str .. '<div class="smallbox-b-text">[[' .. name .. ']]</div></div>'
return str
end
function p.createWeaponList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.weaponListString(name, frame.args.maxlevel)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
if frame.args.match then
if string.find(v, frame.args.match) then
str = str .. p.weaponListString(v, frame.args.maxlevel)
end
else
str = str .. p.weaponListString(v, frame.args.maxlevel)
end
end
end
return str
end
function p.weaponListString(name, maxlevel)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
local level = obj.level
if maxlevel and obj.level ~= nil then
level = constant.MaxLevel
end
local damage = ''
if obj.equip.damage ~= nil then
damage = math.ceil(obj.equip.damage[level] * 0.9) .. '-' .. math.floor(obj.equip.damage[level] * 1.1)
end
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. level .. '\n'
str = str .. '| ' .. damage .. '\n'
str = str .. '| ' .. (obj.equip.aps and obj.equip.aps or '') .. '\n'
str = str .. '| ' .. (obj.equip.durability and obj.equip.durability or '-') .. '\n'
str = str .. '| ' .. utils.getEffects(obj, level) .. '\n'
return str
end
function p.createMagicWeaponList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.magicWeaponListString(name, frame.args.maxlevel)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
if frame.args.match then
if string.find(v, frame.args.match) then
str = str .. p.magicWeaponListString(v, frame.args.maxlevel)
end
else
str = str .. p.magicWeaponListString(v, frame.args.maxlevel)
end
end
end
return str
end
function p.magicWeaponListString(name, maxlevel)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
local level = obj.level
if maxlevel and obj.level ~= nil then
level = constant.MaxLevel
end
local damage = ''
if obj.equip.damage ~= nil then
damage = math.ceil(obj.equip.damage[level] * 0.9) .. '-' .. math.floor(obj.equip.damage[level] * 1.1)
end
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. level .. '\n'
str = str .. '| ' .. obj.equip.mana[level] .. '\n'
str = str .. '| ' .. damage .. '\n'
str = str .. '| ' .. (obj.equip.aps and obj.equip.aps or '') .. '\n'
str = str .. '| ' .. (obj.equip.durability and obj.equip.durability or '-') .. '\n'
str = str .. '| ' .. utils.getEffects(obj, level) .. '\n'
return str
end
function p.createConsumableList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.consumableListString(name)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
str = str .. p.consumableListString(v)
end
end
return str
end
function p.consumableListString(name)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. utils.getEffects(obj) .. '\n'
str = str .. '| ' .. (obj.canBeCooked and '<span style="color:rgb(183 151 53)">Yes</span>' or 'No') .. '\n'
return str
end
function p.createArmorList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.armorListString(name, frame.args.maxlevel, frame)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
str = str .. p.armorListString(v, frame.args.maxlevel, frame)
end
end
return str
end
function p.armorListString(name, maxlevel, frame)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
local level = obj.level
if maxlevel and obj.level ~= nil then
level = constant.MaxLevel
end
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. (level and level or '') .. '\n'
str = str .. '| ' .. (obj.equip.durability and obj.equip.durability or '-') .. '\n'
str = str .. '| ' .. utils.getEffects(obj, level) .. '\n'
str = str .. '| ' .. utils.getSetEffects(obj, frame) .. '\n'
return str
end
function p.createAccessoryList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.accessoryListString(name, frame.args.maxlevel, frame)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
str = str .. p.accessoryListString(v, frame.args.maxlevel, frame)
end
end
return str
end
function p.accessoryListString(name, maxlevel, frame)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
local level = obj.level
if maxlevel and obj.level ~= nil then
level = constant.MaxLevel
end
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. (level and level or '') .. '\n'
str = str .. '| ' .. utils.getEffects(obj, level) .. '\n'
str = str .. '| ' .. utils.getSetEffects(obj, frame) .. '\n'
return str
end
function p.createBagList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.bagListString(name, frame.args.maxlevel)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
str = str .. p.bagListString(v, frame.args.maxlevel)
end
end
return str
end
function p.bagListString(name, maxlevel, frame)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
local level = obj.level
if maxlevel and obj.level ~= nil then
level = constant.MaxLevel
end
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. (level and level or '') .. '\n'
str = str .. '| ' .. utils.getEffects(obj, level) .. '\n'
return str
end
function p.createBasicList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.basicListString(name)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
if frame.args.match then
if string.find(v, frame.args.match) then
str = str .. p.basicListString(v)
end
else
str = str .. p.basicListString(v)
end
end
end
return str
end
function p.basicListString(name, frame)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. utils.getEffects(obj) .. '\n'
return str
end
function p.createDescriptionList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.descriptionListString(name)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
if frame.args.match then
if string.find(v, frame.args.match) then
str = str .. p.descriptionListString(v)
end
else
str = str .. p.descriptionListString(v)
end
end
end
return str
end
function p.descriptionListString(name, frame)
local str = ""
local obj = data[name]
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. obj.description .. '\n'
return str
end
function p.createPetList(frame)
local str = ""
local list = category['Creature']['Pet']
for k, v in ipairs(list) do
local obj = data[v]
if obj.pet then
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
local crackedEggID = obj.acquisition.container[1]
local crackedEggObj = data[objectID[crackedEggID]]
local egg = objectID[crackedEggObj.materials[1].id]
local type = obj.pet.type == 0 and 'Melee' or (obj.pet.type == 1 and 'Range' or 'Support')
local level = frame.args.maxlevel and 10 or 1
local damage = obj.pet.damage and utils.damageRange(obj.pet.damage[level]) or ''
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. v .. '.png|link=' .. v .. '|' .. v .. ']]\n'
str = str .. '| [[File:' .. egg .. '.png|link=' .. egg .. '|' .. egg .. ']]\n'
str = str .. '| [[' .. v .. ']]\n'
str = str .. '| ' .. type .. '\n'
str = str .. '| ' .. damage .. '\n'
str = str .. '| ' .. utils.getEffects(obj, level) .. '\n'
end
end
return str
end
function p.createCraftingTable(frame)
local name = frame.args.name
local obj = data[name]
local str = ""
str = str .. '\n=== [[File:' .. name .. '.png|32x32px|link=' .. name .. '|' .. name .. ']] [[' .. name .. ']] ==='
str = str .. '\n<div class="darkbox">'
str = str .. '\n{| class="table table-dark"'
str = str .. '\n! width=1% | Result !! Materials'
for k, v in ipairs(obj.usage.crafting.canCraft) do
local name2 = objectID[v.id]
local obj2 = data[name2]
local materials = (obj2.taggedMaterials and obj2.taggedMaterials .. ' ' or '') .. p.icon(obj2.materials, frame)
str = str .. '\n|- '
str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2, (v.amount > 1 and v.amount or '')}}
str = str .. '\n| ' .. materials
end
if utils.length(obj.usage.crafting.includes) > 0 then
str = str .. '\n|- '
str = str .. '\n| colspan=2 | Also includes all crafting recipes from ' .. p.iconIdOnly(obj.usage.crafting.includes, frame)
end
str = str .. '\n|}'
str = str .. '\n</div>'
return str
end
function p.createFishingTable(frame)
local num = tonumber(frame.args.num)
local loot = lootTable[num].loot
local str = ""
str = str .. '{| class="table table-dark"\n'
str = str .. '! Item !! Chance\n'
for k, v in ipairs(loot) do
local name = objectID[v.id]
local icon = v.id == 0 and 'Nothing' or p.singleIcon(name, v.amount, frame)
str = str .. '|-\n'
str = str .. '| ' .. icon .. '\n'
str = str .. '| ' .. v.chance .. '\n'
end
str = str .. '|}'
return str
end
function p.createCookingList(frame)
local str = ""
if frame.args.name then
local name = frame.args.name
str = str .. p.cookingListString(name)
end
if frame.args.category then
str = ""
local cat = utils.split(frame.args.category, ".")
local list = utils.merge(category[cat[1]][cat[2]], constant.SeasonalCategory[frame.args.category])
for k, v in ipairs(list) do
str = str .. p.cookingListString(v)
end
end
return str
end
function p.cookingListString(name, maxlevel)
local str = ""
local obj = data[name]
if obj.canBeCooked then
local rarity = obj.rarity
local rarityNum = p.rarityToNum(rarity)
str = str .. '|-\n'
str = str .. '| align=center data-sort-value="' .. rarityNum .. '" | <div class="table-rarity ' .. rarity .. '"></div>[[File:' .. name .. '.png|link=' .. name .. '|' .. name .. ']]\n'
str = str .. '| [[' .. name .. ']]\n'
str = str .. '| ' .. utils.concat(obj.conditionsWhenCooked.regular, '<br>') .. '\n'
str = str .. '| ' .. utils.concat(obj.conditionsWhenCooked.rare, '<br>') .. '\n'
str = str .. '| ' .. utils.concat(obj.conditionsWhenCooked.epic, '<br>') .. '\n'
end
return str
end
function p.rarityToNum(rarity)
if rarity == "Poor" then
return 1
elseif rarity == "Common" then
return 2
elseif rarity == "Uncommon" then
return 3
elseif rarity == "Rare" then
return 4
elseif rarity == "Epic" then
return 5
elseif rarity == "Legendary" then
return 6
end
end
function p.icon(t, frame)
local str = ""
if t then
for k, v in ipairs(t) do
local name = objectID[v.id]
local amount = v.amount
if type(amount) == 'table' then
amount = amount[1] .. '-' .. amount[2]
else
amount = amount > 1 and amount or ""
end
str = str .. frame:expandTemplate{title = 'Icon', args = {name, amount}} .. ' '
end
str = str:sub(1, -2)
end
return str
end
function p.iconIdOnly(t, frame)
local str = ""
if t then
for k, v in ipairs(t) do
local name = objectID[v]
str = str .. frame:expandTemplate{title = 'Icon', args = {name}} .. ' '
end
str = str:sub(1, -2)
end
return str
end
function p.singleIcon(name, amount, frame)
if type(amount) == 'table' then
amount = amount[1] .. '-' .. amount[2]
else
amount = amount > 1 and amount or ""
end
return frame:expandTemplate{title = 'Icon', args = {name, amount}}
end
return p