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].rare 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.rare
local rarityNum = p.rarityToNum(rarity)
local level = obj.lv
local arrValue = 1
if maxlevel and obj.lv ~= nil then
level = constant.MaxLevel
arrValue = constant.MaxLevel - obj.lv + 1
end
local damage = ''
if obj.eq.dmg ~= nil then
damage = math.ceil(obj.eq.dmg[arrValue] * 0.9) .. '-' .. math.floor(obj.eq.dmg[arrValue] * 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.eq.aps and obj.eq.aps or '') .. '\n'
str = str .. '| ' .. (obj.eq.dur and obj.eq.dur 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.rare
local rarityNum = p.rarityToNum(rarity)
local level = obj.lv
local arrValue = 1
if maxlevel and obj.lv ~= nil then
level = constant.MaxLevel
arrValue = constant.MaxLevel - obj.lv + 1
end
local damage = ''
if obj.eq.dmg ~= nil then
damage = math.ceil(obj.eq.dmg[arrValue] * 0.9) .. '-' .. math.floor(obj.eq.dmg[arrValue] * 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.eq.mp[arrValue] .. '\n'
str = str .. '| ' .. damage .. '\n'
str = str .. '| ' .. (obj.eq.aps and obj.eq.aps or '') .. '\n'
str = str .. '| ' .. (obj.eq.dur and obj.eq.dur 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.rare
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.cook 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.rare
local rarityNum = p.rarityToNum(rarity)
local level = obj.lv
if maxlevel and obj.lv ~= 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.eq.dur and obj.eq.dur 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.rare
local rarityNum = p.rarityToNum(rarity)
local level = obj.lv
if maxlevel and obj.lv ~= 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.rare
local rarityNum = p.rarityToNum(rarity)
local level = obj.lv
if maxlevel and obj.lv ~= 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.rare
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.rare
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.desc and obj.desc or '') .. '\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.rare
local rarityNum = p.rarityToNum(rarity)
local crackedEggID = obj.acq.cont[1]
local crackedEggObj = data[objectID[crackedEggID]]
local egg = objectID[crackedEggObj.mat[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.dmg and utils.damageRange(obj.pet.dmg[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.usg.craf.can) do
local name2 = objectID[v.id]
local obj2 = data[name2]
local materials = (obj2.tag and obj2.tag .. ' ' or '') .. p.icon(obj2.mat, frame)
str = str .. '\n|- '
str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2, (v.amt > 1 and v.amt or '')}}
str = str .. '\n| ' .. materials
end
if utils.length(obj.usg.craf.inc) > 0 then
str = str .. '\n|- '
str = str .. '\n| colspan=2 | Also includes all crafting recipes from ' .. p.iconIdOnly(obj.usg.craf.inc, 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.amt, frame)
str = str .. '|-\n'
str = str .. '| ' .. icon .. '\n'
str = str .. '| ' .. v.ch .. '\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.cook then
local rarity = obj.rare
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.cooked.reg, '<br>') .. '\n'
str = str .. '| ' .. utils.concat(obj.cooked.rare, '<br>') .. '\n'
str = str .. '| ' .. utils.concat(obj.cooked.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 amt = v.amt
if type(amt) == 'table' then
amt = amt[1] .. '-' .. amt[2]
else
amt = amt > 1 and amt or ""
end
str = str .. frame:expandTemplate{title = 'Icon', args = {name, amt}} .. ' '
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, amt, frame)
if type(amt) == 'table' then
amt = amt[1] .. '-' .. amt[2]
else
amt = amt > 1 and amt or ""
end
return frame:expandTemplate{title = 'Icon', args = {name, amt}}
end
return p