Module:Data

Documentation for this module may be created at Module:Data/doc

local p = {}
local utils = require("Module:Utils")
local constant = mw.loadJsonData("Module:Constant.json")
local data = mw.loadJsonData("Module:Data.json")
local id = mw.loadJsonData("Module:ObjectID.json")
local lootTable = mw.loadJsonData("Module:LootTable.json")

function p.createInfobox(frame)
	local name = frame.args.name
	if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end
	local image = frame.args.image
	local object = data[name]
	
	local str = {
		image = image,
		type = '',
		slot = '',
		rarity = object.rarity,
		level = '',
		melee = '',
		range = '',
		aps = object.equip.aps,
		effects = object.conditionsWhenConsumed and utils.concat(object.conditionsWhenConsumed, "<br>") or utils.concat(object.equip.conditions, "<br>"),
		seteffects = utils.concat(object.set.effects, "<br>"),
		setitems = '',
		secondary = object.equip.secondary,
		mechanic = object.mechanic,
		use = object.use,
		durability = object.equip.durability,
		fullness = object.equip.fullness,
		cookable = object.canBeCooked and 'True',
		paintable = object.canBePainted and 'True',
		description = object.description
	}
	
	-- or object.type == "NonObtainable"
	-- or object.type == "Critter"
	-- or object.type == "Pet"
	-- or object.type == "Creature"
	
	if object.type == "MeleeWeapon"
	or object.type == "RangeWeapon"
	then
		str.type = 'Weapon'
	end
	
	if object.type == "Helm"
	or object.type == "BreastArmor"
	or object.type == "PantsArmor"
	then
		str.type = 'Armor'
		str.slot = object.type
	end
	
	if object.type == "Necklace"
	or object.type == "Ring"
	or object.type == "Offhand"
	or object.type == "Bag"
	or object.type == "Lantern"
	then
		str.type = 'Accessory'
		str.slot = object.type
	end
	
	if object.type == "Shovel"
	or object.type == "Hoe"
	or object.type == "MiningPick"
	or object.type == "PaintTool"
	or object.type == "FishingRod"
	or object.type == "BugNet"
	or object.type == "Sledge"
	or object.type == "RoofingTool"
	or object.type == "DrillTool"
	or object.type == "BeamWeapon"
	or object.type == "WaterCan"
	or object.type == "Bucket"
	or object.type == "Instrument"
	then
		str.type = 'Tool'
	end
	
	if object.type == "NonUsable"
	or object.type == "CastingItem"
	or object.type == "UniqueCraftingComponent"
	or object.type == "KeyItem"
	then
		str.type = 'Resource'
	end
	
	if object.type == "Eatable"
	then
		str.type = 'Consumable'
	end
	
	if object.type == "PlaceablePrefab"
	or object.type == "Valuable"
	then
		str.type = 'Base'
	end
	
	if object.type == "Helm"
	or object.type == "BreastArmor"
	or object.type == "PantsArmor"
	or object.type == "Necklace"
	or object.type == "Ring"
	or object.type == "Offhand"
	or object.type == "Bag"
	or object.type == "Lantern"
	or object.type == "MeleeWeapon"
	or object.type == "RangeWeapon"
	or object.type == "Shovel"
	or object.type == "Hoe"
	or object.type == "MiningPick"
	or object.type == "Sledge"
	or object.type == "DrillTool"
	or object.type == "BeamWeapon"
	then
		str.level = object.level
	end
	
	local damage = object.equip.damage and math.ceil(object.equip.damage * 0.9) .. "-" .. math.floor(object.equip.damage * 1.1)
	str.melee = object.equip.range and '' or damage
	str.range = object.equip.range and damage
	
	if object.set.items then
		for k, v in ipairs(object.set.items) do
			str.setitems = str.setitems .. frame:expandTemplate{title = 'Icon', args = {id[v]}} .. '<br>'
		end
		str.setitems = str.setitems:sub(1, -5)
	end
	
	return frame:expandTemplate{title = 'Object infobox', args = str}
end

function p.createDrops(frame)
	local name = frame.args.name
	if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end
	local object = data[name]
	local str = ""
	
	str = str .. '\n{| class="table table-dark" style="width:auto"'
	str = str .. '\n! Item !! Chance per roll !! Chance for 1 or more'
	if object.loot.chestLoot or object.loot.chestLootAlt then
		str = str .. '\n|- class=subheader'
		str = str .. '\n! colspan=3 | Boss chest '
		if object.loot.chestLoot then
			local name2 = id[object.loot.chestLoot]
			str = str .. '\n|- '
			str = str .. '\n| colspan=3 | ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
		end
		if object.loot.chestLootAlt then
			local name2 = id[object.loot.chestLootAlt]
			str = str .. '\n|- '
			str = str .. '\n| colspan=3 | ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
		end
	end
	if object.loot.otherLoot then
		str = str .. '\n|- class=subheader'
		str = str .. '\n! colspan=3 | 1 roll'
		for k, v in pairs(object.loot.otherLoot) do
			local name2 = id[v.id]
			str = str .. '\n|- '
			str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame)
			str = str .. '\n| colspan=2 | ' .. object.loot.otherLootChance * 100 .. '%'
		end
	end
	if object.loot.lootTable then
		local lootTableObj = lootTable[object.loot.lootTable]
		if utils.length(lootTableObj.guaranteedLoot) > 0 then
			str = str .. '\n|- class=subheader'
			str = str .. '\n! colspan=3 | 1 roll'
			for k, v in pairs(lootTableObj.guaranteedLoot) do
				local name2 = id[v.id]
				str = str .. '\n|- '
				str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame)
				str = str .. '\n| colspan=2 | ' .. v.chance
			end
		end
		local roll = lootTableObj.roll
		local s = 's'
		if utils.length(lootTableObj.guaranteedLoot) > 0 then
			if type(roll) == 'table' then
				roll = roll[1] - 1 .. '-' .. roll[2] - 1
			else
				roll = roll - 1
				if roll < 2 then s = ''	end
			end
		else
			if type(roll) == 'table' then
				roll = roll[1] .. '-' .. roll[2]
			else
				if roll < 2 then s = ''	end
			end
		end
		str = str .. '\n|- class=subheader'
		str = str .. '\n! colspan=3 | ' .. roll .. ' roll' .. s
		for k, v in pairs(lootTableObj.loot) do
			local name2 = id[v.id]
			local icon = v.id == 0 and 'Nothing' or p.singleIcon(name2, v.amount, frame)
			str = str .. '\n|- '
			str = str .. '\n| ' .. icon
			str = str .. '\n| ' .. v.chance
			str = str .. '\n| ' .. v.chanceAtLeastOne
		end
	end
	if object.loot.seasonalLoot then
		for k, v in pairs(object.loot.seasonalLoot) do
			str = str .. '\n|- class=subheader'
			str = str .. '\n! colspan=3 | 1 roll (season ' .. v.season .. ')'
			for k2, v2 in pairs(v.loot) do
				local name2 = id[v2.id]
				str = str .. '\n|- '
				str = str .. '\n| ' .. p.singleIcon(name2, v2.amount, frame)
				str = str .. '\n| colspan=2 | ' .. v2.chance .. '%'
			end
		end
	end
	str = str .. '\n|}'
		
	return str
end

function p.createAcquisition(frame)
	local name = frame.args.name
	if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end
	local object = data[name]
	local str = ""
	
	if object.acquisition.crafted then
		local craft = object.acquisition.crafted and object.acquisition.crafted or object.acquisition.refined
		str = str .. '\n=== Craft ==='
		for k, v in pairs(craft) do
			local name2 = id[craft[k]]
			local object2 = data[name2]
			local result = utils.find(object2.usage.crafting.canCraft, "id", object.id)
			str = str .. '\n{| class="table table-dark" style="width:auto"'
			str = str .. '\n| Crafting station'
			str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
			str = str .. '\n|-'
			str = str .. '\n| Result'
			str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame)
			str = str .. '\n|-'
			str = str .. '\n| Materials'
			str = str .. '\n| ' .. p.icon(object.materials, "<br>", frame)
			str = str .. '\n|}'
		end
	end
	if object.acquisition.refined then
		str = str .. '\n=== Refine ==='
		for k, v in pairs(object.acquisition.refined) do
			local name2 = id[object.acquisition.refined[k]]
			local object2 = data[name2]
			local result = utils.find(object2.usage.crafting.canCraft, "id", object.id)
			str = str .. '\n{| class="table table-dark" style="width:auto"'
			str = str .. '\n| Refiner'
			str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
			str = str .. '\n|-'
			str = str .. '\n| Result'
			str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame)
			str = str .. '\n|-'
			str = str .. '\n| Materials'
			str = str .. '\n| ' .. p.icon(object.materials, "<br>", frame)
			str = str .. '\n|}'
		end
	end
	if object.acquisition.produced then
		str = str .. '\n=== Produce ==='
		for k, v in pairs(object.acquisition.produced) do
			local name2 = id[object.acquisition.produced[k]]
			local object2 = data[name2]
			local result = utils.find(object2.usage.crafting.canCraft, "id", object.id)
			str = str .. '\n{| class="table table-dark" style="width:auto"'
			str = str .. '\n| Cattle'
			str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
			str = str .. '\n|-'
			str = str .. '\n| Produce'
			str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame)
			str = str .. '\n|}'
		end
	end
	if object.acquisition.combined then
		str = str .. '\n=== Combine ==='
		for k, v in pairs(object.acquisition.combined) do
			local name2 = id[object.acquisition.combined[k]]
			local object2 = data[name2]
			local result = utils.find(object2.usage.crafting.canCraft, "id", object.id)
			if object2.usage.crafting.requiresNearbyObject > 0 then
				str = str .. '\nNote: Can only be combined near the ' .. id[object2.usage.crafting.requiresNearbyObject] .. '.'
			end
			str = str .. '\n{| class="table table-dark" style="width:auto"'
			str = str .. '\n| Casting item'
			str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
			str = str .. '\n|-'
			str = str .. '\n| Result'
			str = str .. '\n| ' .. p.singleIcon(name, result.amount, frame)
			str = str .. '\n|-'
			str = str .. '\n| Materials'
			str = str .. '\n| ' .. p.icon(object.materials, "<br>", frame)
			str = str .. '\n|}'
		end
	end
	if object.acquisition.fished then
		str = str .. '\n=== Fishing ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Water !! Location !! Type !! Amount !! Chance'
		for k, v in pairs(object.acquisition.fished) do
			local fish = constant.Acquisition.Fishing[v]
			local loot = utils.find(lootTable[v].loot, "id", object.id)
			local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount
			str = str .. '\n|- '
			str = str .. '\n| ' .. fish.water
			str = str .. '\n| ' .. fish.location
			str = str .. '\n| ' .. fish.type
			str = str .. '\n| ' .. amount
			str = str .. '\n| ' .. loot.chance
		end
		str = str .. '\n|}'
	end
	if object.acquisition.container or object.acquisition.containerTable then
		str = str .. '\n=== Container ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Item !! Amount !! Chance'
		if object.acquisition.container then
			for k, v in pairs(object.acquisition.container) do
				local name2 = id[object.acquisition.container[k]]
				local object2 = data[name2]
				local result = utils.find(object2.usage.container, "id", object.id)
				local amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount
				str = str .. '\n|- '
				str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
				str = str .. '\n| ' .. amount
				str = str .. '\n| ' .. result.chance .. '%'
			end
		end
		if object.acquisition.containerTable then
			for k, v in pairs(object.acquisition.containerTable) do
				local name2 = id[object.acquisition.containerTable[k]]
				local object2 = data[name2]
				local loot = utils.find(lootTable[object2.usage.containerTable].loot, "id", object.id)
				local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount
				str = str .. '\n|- '
				str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
				str = str .. '\n| ' .. amount
				str = str .. '\n| ' .. loot.chance
			end
		end
		str = str .. '\n|}'
	end
	if object.acquisition.shop then
		str = str .. '\n=== Shop ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Item !! Available amount !! Cost !! Requirement'
		for k, v in pairs(object.acquisition.shop) do
			local name2 = id[object.acquisition.shop[k]]
			local object2 = data[name2]
			local result = utils.find(object2.shop, "id", object.id)
			str = str .. '\n|- '
			str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
			str = str .. '\n| ' .. result.amount
			str = str .. '\n| '
			str = str .. '\n| ' .. result.requirement
		end
		str = str .. '\n|}'
	end
	if object.acquisition.damage then
		str = str .. '\n=== Boulder ==='
		str = str .. '\nCan be mined with stationary drill from '
		for k, v in pairs(object.acquisition.damage) do
			local name2 = id[object.acquisition.damage[k]]
			local object2 = data[name2]
			str = str .. frame:expandTemplate{title = 'Icon', args = {name2}} .. ', '
		end
		str = str:sub(1, -3) .. '.'
	end
	if object.acquisition.inventory or object.acquisition.inventoryTable then
		str = str .. '\n=== Inventory ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Item !! Amount !! Chance'
		if object.acquisition.inventory then
			for k, v in pairs(object.acquisition.inventory) do
				local name2 = id[object.acquisition.inventory[k]]
				local object2 = data[name2]
				local amount = '?'
				local chance = '?'
				if object2.loot.inventory then
					local result = utils.find(object2.loot.inventory, "id", object.id)
					amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount
					chance = result.chance .. '%'
				end
				str = str .. '\n|- '
				str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
				str = str .. '\n| ' .. amount
				str = str .. '\n| ' .. chance
			end
		end
		if object.acquisition.inventoryTable then
			for k, v in pairs(object.acquisition.inventoryTable) do
				local name2 = id[object.acquisition.inventoryTable[k]]
				local object2 = data[name2]
				local amount = '?'
				local chance = '?'
				if object2.loot.inventoryTable then
					local loot = utils.find(lootTable[object2.loot.inventoryTable].loot, "id", object.id)
					amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount
					chance = loot.chance
				end
				str = str .. '\n|- '
				str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
				str = str .. '\n| ' .. amount
				str = str .. '\n| ' .. chance
			end
		end
		str = str .. '\n|}'
	end
	if object.acquisition.drop then
		str = str .. '\n=== Drop ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Object !! Type !! Amount !! Rolls !! Chance per roll !! Chance for 1 or more'
		for k, v in pairs(object.acquisition.drop) do
			local name2 = id[object.acquisition.drop[k]]
			local object2 = data[name2]
			if object2 then
				if object2.loot.chestLoot == object.id or object2.loot.chestLootAlt == object.id then
					str = str .. '\n|- '
					str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
					str = str .. '\n| Boss chest'
					str = str .. '\n| 1'
					str = str .. '\n| 1'
					str = str .. '\n| 100%'
					str = str .. '\n| 100%'
				end
				if object2.loot.otherLoot then
					local result = utils.find(object2.loot.otherLoot, "id", object.id)
					if result then
						local amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount
						str = str .. '\n|- '
						str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
						str = str .. '\n| Loot'
						str = str .. '\n| ' .. amount
						str = str .. '\n| 1'
						str = str .. '\n| ' .. object2.loot.otherLootChance * 100 .. '%'
						str = str .. '\n| ' .. object2.loot.otherLootChance * 100 .. '%'
					end
				end
				if object2.loot.lootTable then
					local lootTableObj = lootTable[object2.loot.lootTable]
					local loot = utils.find(lootTableObj.guaranteedLoot, "id", object.id)
					if loot then
						local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount
						local chance = loot.chance
						str = str .. '\n|- '
						str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
						str = str .. '\n| Random loot - one guaranteed drop'
						str = str .. '\n| ' .. amount
						str = str .. '\n| 1'
						str = str .. '\n| ' .. chance
						str = str .. '\n| ' .. chance
					end
					loot = utils.find(lootTableObj.loot, "id", object.id)
					if loot then
						local amount = type(loot.amount) == 'table' and loot.amount[1] .. '-' .. loot.amount[2] or loot.amount
						local roll = lootTableObj.roll
						if utils.length(lootTableObj.guaranteedLoot) > 0 then
							if type(roll) == 'table' then
								roll = roll[1] - 1 .. '-' .. roll[2] - 1
							else
								roll = roll - 1
							end
						else
							if type(roll) == 'table' then
								roll = roll[1] .. '-' .. roll[2]
							end
						end
						local chance = loot.chance
						local chanceOne = loot.chanceAtLeastOne
						str = str .. '\n|- '
						str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
						str = str .. '\n| Random loot'
						str = str .. '\n| ' .. amount
						str = str .. '\n| ' .. roll
						str = str .. '\n| ' .. chance
						str = str .. '\n| ' .. chanceOne
					end
				end
				if object2.loot.seasonalLoot then
					for k2, v2 in pairs(object2.loot.seasonalLoot) do
						local result = utils.find(v2.loot, "id", object.id)
						if result then
							local amount = type(result.amount) == 'table' and result.amount[1] .. '-' .. result.amount[2] or result.amount
							local chance = result.chance .. "%"
							str = str .. '\n|- '
							str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
							str = str .. '\n| Seasonal loot - season ' .. v2.season
							str = str .. '\n| ' .. amount
							str = str .. '\n| 1'
							str = str .. '\n| ' .. chance
							str = str .. '\n| ' .. chance
						end
					end
				end
			end
		end
		str = str .. '\n|}'
	end
	
	return str
end

function p.createUsage(frame)
	local name = frame.args.name
	if name == nil or name == "" then name = mw.title.getCurrentTitle().subpageText end
	local object = data[name]
	local str = ""
	
	if object.use then
		if object.use ~= 'Combine the materials' and object.use ~= 'Hatch egg' and object.use ~= 'Open container' then
			str = str .. '\n=== Other ==='
			str = str .. '\n' .. object.use
		end
	end
	if object.usage.crafting then
		str = str .. '\n=== ' .. object.usage.crafting.type .. ' ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Result !! Materials'
		for k, v in pairs(object.usage.crafting.canCraft) do
			local name2 = id[v.id]
			local object2 = data[name2]
			str = str .. '\n|- '
			str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame)
			str = str .. '\n| ' .. p.icon(object2.materials, " " , frame)
		end
		if utils.length(object.usage.crafting.includes) > 0 then
			str = str .. '\n|- '
			str = str .. '\n| colspan=2 | Also includes all crafting recipes from ' .. p.iconIdOnly(object.usage.crafting.includes, ", " , frame) .. '.'
		end
		str = str .. '\n|}'
	end
	if object.usage.craftingMaterial then
		str = str .. '\n=== Crafting material ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Crafting station !! Result !! Materials'
		for k, v in pairs(object.usage.craftingMaterial) do
			local name2 = id[v]
			local object2 = data[name2]
			for k2, v2 in pairs(object2.usage.crafting.canCraft) do
				local name3 = id[v2.id]
				local object3 = data[name3]
				local find = utils.find(object3.materials, "id", object.id)
				if find then
					str = str .. '\n|- '
					str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
					str = str .. '\n| ' .. p.singleIcon(name3, v2.amount, frame)
					str = str .. '\n| ' .. p.icon(object3.materials, " " , frame)
				end
			end
		end
		str = str .. '\n|}'
	end
	if object.usage.refining then
		str = str .. '\n=== Refining material ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Refiner !! Result !! Materials'
		for k, v in pairs(object.usage.refining) do
			local name2 = id[v]
			local object2 = data[name2]
			for k2, v2 in pairs(object2.usage.crafting.canCraft) do
				local name3 = id[v2.id]
				local object3 = data[name3]
				local find = utils.find(object3.materials, "id", object.id)
				if find then
					str = str .. '\n|- '
					str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
					str = str .. '\n| ' .. p.singleIcon(name3, v2.amount, frame)
					str = str .. '\n| ' .. p.icon(object3.materials, " " , frame)
				end
			end
		end
		str = str .. '\n|}'
	end
	if object.usage.combining then
		str = str .. '\n=== Combining material ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Combiner !! Result !! Materials'
		for k, v in pairs(object.usage.combining) do
			local name2 = id[v]
			local object2 = data[name2]
			for k2, v2 in pairs(object2.usage.crafting.canCraft) do
				local name3 = id[v2.id]
				local object3 = data[name3]
				local find = utils.find(object3.materials, "id", object.id)
				if find then
					str = str .. '\n|- '
					str = str .. '\n| ' .. frame:expandTemplate{title = 'Icon', args = {name2}}
					str = str .. '\n| ' .. p.singleIcon(name3, v2.amount, frame)
					str = str .. '\n| ' .. p.icon(object3.materials, " " , frame)
				end
			end
		end
		str = str .. '\n|}'
	end
	if object.usage.container then
		str = str .. '\n=== ' .. object.use .. ' ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Result !! Chance'
		for k, v in pairs(object.usage.container) do
			local name2 = id[v.id]
			str = str .. '\n|- '
			str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame)
			str = str .. '\n| ' .. v.chance .. '%'
		end
		str = str .. '\n|}'
	end
	if object.usage.containerTable then
		str = str .. '\n=== ' .. object.use .. ' ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Item !! Chance per roll !! Chance for 1 or more'
		local lootTableObj = lootTable[object.usage.containerTable]
		if utils.length(lootTableObj.guaranteedLoot) > 0 then
			str = str .. '\n|- class=subheader'
			str = str .. '\n! colspan=3 | 1 roll '
			for k, v in pairs(lootTableObj.guaranteedLoot) do
				local name2 = id[v.id]
				str = str .. '\n|- '
				str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame)
				str = str .. '\n| colspan=2 | ' .. v.chance
			end
		end
		local roll = lootTableObj.roll
		local s = 's'
		if utils.length(lootTableObj.guaranteedLoot) > 0 then
			if type(roll) == 'table' then
				roll = roll[1] - 1 .. '-' .. roll[2] - 1
			else
				roll = roll - 1
				if roll < 2 then s = ''	end
			end
		else
			if type(roll) == 'table' then
				roll = roll[1] .. '-' .. roll[2]
			else
				if roll < 2 then s = ''	end
			end
		end
		str = str .. '\n|- class=subheader'
		str = str .. '\n! colspan=3 | ' .. roll .. ' roll' .. s
		for k, v in pairs(lootTableObj.loot) do
			local name2 = id[v.id]
			str = str .. '\n|- '
			str = str .. '\n| ' .. p.singleIcon(name2, v.amount, frame)
			str = str .. '\n| ' .. v.chance
			str = str .. '\n| ' .. v.chanceAtLeastOne
		end
		str = str .. '\n|}'
	end
	if object.usage.upgrade then
		str = str .. '\n=== Upgrade material ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! Level !! Materials'
		for k, v in pairs(object.usage.upgrade) do
			local upgrade = constant.UpgradeCost[v]
			str = str .. '\n|- '
			str = str .. '\n| ' .. v
			str = str .. '\n| ' .. p.icon(upgrade, " " , frame)
		end
		str = str .. '\n|}'
	end
	if object.conditionsWhenCooked then
		str = str .. '\n=== Cooking ingredient ==='
		str = str .. '\n{| class="table table-dark" style="width:auto"'
		str = str .. '\n! colspan=3 | Effects when cooked'
		str = str .. '\n|-'
		str = str .. '\n! Regular !! Rare !! Epic'
		str = str .. '\n|-'
		str = str .. '\n| ' .. utils.concat(object.conditionsWhenCooked.regular, '<br>')
		str = str .. '\n| ' .. utils.concat(object.conditionsWhenCooked.rare, '<br>')
		str = str .. '\n| ' .. utils.concat(object.conditionsWhenCooked.epic, '<br>')
		str = str .. '\n|}'
	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

function p.icon(t, separator, frame)
	local str = ""
	separator = separator and separator or " "
	local length = -1 - #separator
	
	if t ~= nil then
		for k, v in ipairs(t) do
			local name = id[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}} .. separator
		end
		str = str:sub(1, length)
	end
	
	return str
end

function p.iconIdOnly(t, separator, frame)
	local str = ""
	separator = separator and separator or " "
	local length = -1 - #separator
	
	if t ~= nil then
		for k, v in ipairs(t) do
			local name = id[v]
			str = str .. frame:expandTemplate{title = 'Icon', args = {name}} .. separator
		end
		str = str:sub(1, length)
	end
	
	return str
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.