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
Cookies help us deliver our services. By using our services, you agree to our use of cookies.