Module:Infobox Item

From Discord Dungeons Wiki
Revision as of 11:21, 6 April 2022 by Mackan (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

--------------------------
-- Module for [[Template:Infobox Item]]
--
-- Todo:
-- * Text on drop
-- * Equipable
-- * Tool info (skill levels etc)
--
------------------------
local p = {}

local infobox = require('Module:Experimental/Infobox')
local onmain = require('Module:Mainonly').on_main
local commas = require('Module:Addcommas')._add
VariablesLua = mw.ext.VariablesLua

function p.main(frame)
	local args = frame:getParent().args
	local ret = infobox.new(args)

	ret:defineParams{
		--- General --
		{ name = 'name', func = 'name' },
		{ name = 'image', func = 'image' },
		{ name = 'release', func = 'release' },
		{ name = 'id', func = 'number' },
		{ name = 'description', func = 'has_content' },
		{ name = 'members', func = 'yes_no' },
		{ name = 'donator', func = 'yes_no' },
		{ name = 'level', func = 'number' },
		{ name = 'cost', func = 'has_content' }, -- Todo: Unbuyable
		{ name = 'sell', func = 'has_content' }, -- Todo: Unsellable

		-- Properties --
		
		{ name = 'tradeable', func = 'yes_no' },
		{ name = 'craftable', func = 'yes_no' },
		{ name = 'brewable', func = 'yes_no' },
		{ name = 'quest', func = 'has_content' },

		-- Market values --

		{ name = 'market_sp_limit', func = 'has_content' }, -- sell price
		{ name = 'market_bp_limit', func = 'has_content' }, -- buy price
		
		-- Item type Properties --

		{ name = 'type', func = 'has_content' }, -- Item type

		-- Potion Params --

		{ name = 'potion_type', func = 'has_content' },
		{ name = 'potion_effect', func = 'has_content' },

		-- Book Params --

		{ name = 'book_author', func = 'has_content' },

		-- Armor Params --

		{ name = 'damage_blocked', func = 'has_content' },

		-- Rune Params --

		{ name = 'rune_tp', func = 'has_content' },
		-- Weapon Params --

		{ name = 'damage', func = 'has_content' },
		{ name = 'weapon_effect', func = 'has_content' },
		
		-- Tool Params --
		
		{ name = 'tool_type', func = 'has_content' },
		{ name = 'skill_level', func = 'has_content' },
		{ name = 'tool_effect', func = 'has_content' },

		-- Side item --

		{ name = 'forage_level', func = 'has_content' },
		{ name = 'mine_level', func = 'has_content' },
		{ name = 'fish_level', func = 'has_content' },
		{ name = 'chop_level', func = 'has_content' },

		{ name = 'ring_effect', func = 'has_content' },
		{ name = 'necklace_effect', func = 'has_content' },

	}

	ret:setMaxButtons(7)
	ret:create()
	
	ret:cleanParams()
	ret:customButtonPlacement(true)
	ret:setDefaultVersionSMW(true)


	ret:defineLinks({ hide = true })

	ret:useSMWOne({
		members = 'All Is members only',
		id_smw = 'All Item id',
		image_smw = 'All Image',
	})

	ret:useSMWSubobject({
		image = 'Image',
		release = 'Release date',
		id = 'Item ID',
		description = 'Description',
		members = 'Is members only',
		donator = 'Is donator item',
		level = 'Item Level',
		cost = 'Buyable for',
		sell = 'Sellable for',
		
		tradeable = 'Tradeable',
		craftable = 'Craftable',
		brewable = 'Brewabel',
		
		market_sp_limit = 'Market sell limits',
		market_bp_limit = 'Market buy limits',
		type = 'Item Type',
	
		potion_type = 'Potion type',
		potion_effect = 'Potion effect',

		book_author = 'Book author',
		rune_tp = 'Rune teleport',
		damage = 'Damage',
		weapon_effect = 'Weapon effect',
		tool_type = 'Tool type',
		skill_level = 'Tool skill level',
		tool_effect = 'Tool effect',

		forage_level = 'Forage level',
		mine_level = 'Mine level',
		fish_level = 'Fish level',
		chop_level = 'Chop level',

		ring_effect = 'Ring effect',
		necklace_effect = 'Necklace effect',
	})

	ret:addButtonsCaption()

	ret:defineName('Infobox Item')
	ret:addClass('infobox-item')
	
	ret:addRow{
		{ tag = 'argh', content = 'name', class = 'infobox-header', colspan = '20' }
	}
	:pad(20)
	:addRow{
		{ tag = 'argd', content = 'image', class = 'infobox-image infobox-full-width-content', colspan = '20' }
	}
	:addRow{
		{ tag = 'argd', content = 'description', class = 'infobox-desription infobox-full-width-content', colspan = '20' }
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'ID', colspan = '7' },
		{ tag = 'argd', content = 'id', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Type', colspan = '7' },
		{ tag = 'argd', content = 'type', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Released', colspan = '7' },
		{ tag = 'argd', content = 'release', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = '[[Members]]', colspan = '7' },
		{ tag = 'argd', content = 'members', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Donator item', colspan = '7' },
		{ tag = 'argd', content = 'donator', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Level', colspan = '7' },
		{ tag = 'argd', content = 'level', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Buy Price', colspan = '7' },
		{ tag = 'argd', content = 'cost', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Sell Price', colspan = '7' },
		{ tag = 'argd', content = 'sell', colspan = '13' },
	}
	
	--[[
		Add rows for properties
	]]
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Properties', class = 'infobox-subheader', colspan = '20' },
	}

	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Tradeable', colspan = '7' },
		{ tag = 'argd', content = 'tradeable', colspan = '13' },
	}
	
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Craftable', colspan = '7' },
		{ tag = 'argd', content = 'craftable', colspan = '13' },
	}

	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Brewable', colspan = '7' },
		{ tag = 'argd', content = 'brewable', colspan = '13' },
	}

	:pad(20)
	:addRow{
		{ tag = 'th', content = '[[Quests|Quest]]', colspan = '7' },
		{ tag = 'argd', content = 'quest', colspan = '13' },
	}

	--[[
		Add rows for Market stuff
	]]

	local hasMarketSPLimit = ret:paramDefined('market_sp_limit')
	local hasMarketBPLimit = ret:paramDefined('market_bp_limit')

	if hasMarketSPLimit or hasMarketBPLimit then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Market Limits', class = 'infobox-subheader', colspan = '20' },
		}

		if hasMarketSPLimit then
			ret:pad(20)
			:addRow{
				{ tag = 'th', content = 'Sell Price', colspan = '7' },
				{ tag = 'argd', content = 'market_sp_limit', colspan = '13' },
			}
		end

		if hasMarketBPLimit then
			ret:pad(20)
			:addRow{
				{ tag = 'th', content = 'Buy Price', colspan = '7' },
				{ tag = 'argd', content = 'market_bp_limit', colspan = '13' },
			}
		end
	end

	--[[
		Add rows for potion stuff
	]]

	local hasPotionType = ret:paramDefined('potion_type')
	local hasPotionEffect = ret:paramDefined('potion_effect')

	if hasPotionType or hasPotionEffect then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Potion Info', class = 'infobox-subheader', colspan = '20' },
		}

		if hasPotionType then
			ret:pad(20)
			:addRow{
				{ tag = 'th', content = 'Type', colspan = '7' },
				{ tag = 'argd', content = 'potion_type', colspan = '13' },
			}
		end

		if hasPotionEffect then
			ret:pad(20)
			:addRow{
				{ tag = 'th', content = 'Effect', colspan = '7' },
				{ tag = 'argd', content = 'potion_effect', colspan = '13' },
			}
		end
	end

	--[[
		Add rows for armor stuff
	]]

	if ret:paramDefined('damage_blocked') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Armor', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Damage blocked', colspan = '7' },
			{ tag = 'argd', content = 'damage_blocked', colspan = '13' },
		}
	end

	--[[
		Add rows for book stuff
	]]

	if ret:paramDefined('book_author') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Book', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Author', colspan = '7' },
			{ tag = 'argd', content = 'book_author', colspan = '13' },
		}
	end

	--[[
		Add rows for rune stuff
	]]

	if ret:paramDefined('rune_tp') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Rune', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Teleports to', colspan = '7' },
			{ tag = 'argd', content = 'rune_tp', colspan = '13' },
		}
	end

	--[[
		Add rows for weapon stuff
	]]

	if ret:paramDefined('damage') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Weapon', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Damage', colspan = '7' },
			{ tag = 'argd', content = 'damage', colspan = '13' },
		}

		if ret:paramDefined('weapon_effect') then
			ret:pad(20)
			:addRow{
				{ tag = 'th', content = 'Effect', colspan = '7' },
				{ tag = 'argd', content = 'weapon_effect', colspan = '13' },
			}
		end
	end
	
	--[[
		Add rows for tool stuff
	]]

	if ret:paramDefined('tool_type') and string.lower(ret:param('tool_type', 'd')) == "fishing rod" then
		addToolRows(ret, 'Fishing Rod')
	end

	if ret:paramDefined('tool_type') and string.lower(ret:param('tool_type', 'd')) == "pickaxe" then
		addToolRows(ret, 'Pickaxe')
	end

	if ret:paramDefined('tool_type') and string.lower(ret:param('tool_type', 'd')) == "axe" then
		addToolRows(ret, 'Axe')
	end

	if ret:paramDefined('tool_type') and string.lower(ret:param('tool_type', 'd')) == "shears" then
		addToolRows(ret, 'Shears')
	end
	


	--[[
		Add rows for ring stuff
	]]

	if ret:paramDefined('ring_effect') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Ring', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Effect', colspan = '7' },
			{ tag = 'argd', content = 'ring_effect', colspan = '13' },
		}
	end

	--[[
		Add rows for necklace stuff
	]]

	if ret:paramDefined('necklace_effect') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Necklace', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Effect', colspan = '7' },
			{ tag = 'argd', content = 'necklace_effect', colspan = '13' },
		}
	end



	--[[
		Add rows for sides
	]]

	if ret:paramDefined('forage_level') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Forage', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Level', colspan = '7' },
			{ tag = 'argd', content = 'forage_level', colspan = '13' },
		}
	end

	if ret:paramDefined('mine_level') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Mine', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Level', colspan = '7' },
			{ tag = 'argd', content = 'mine_level', colspan = '13' },
		}
	end

	if ret:paramDefined('fish_level') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Fish', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Level', colspan = '7' },
			{ tag = 'argd', content = 'fish_level', colspan = '13' },
		}
	end

	if ret:paramDefined('chop_level') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Chop', class = 'infobox-subheader', colspan = '20' },
		}
		:pad(20)
		:addRow{
			{ tag = 'th', content = 'Level', colspan = '7' },
			{ tag = 'argd', content = 'chop_level', colspan = '13' },
		}
	end
	

	if onmain() then
		local a1 = ret:param('all')
		local a2 = ret:categoryData()
		ret:wikitext(addcategories(a1, a2))
	end

	ret:finish()

	return ret:tostring()
end

function addToolRows(ret, title)
	ret:pad(20)
	:addRow{
		{ tag = 'th', content = title, class = 'infobox-subheader', colspan = '20' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Type', colspan = '7' },
		{ tag = 'argd', content = 'tool_type', colspan = '13' },
	}
	:pad(20)
	:addRow{
		{ tag = 'th', content = 'Skill Level', colspan = '7' },
		{ tag = 'argd', content = 'skill_level', colspan = '13' },
	}

	if ret:paramDefined('tool_effect') then
		ret:pad(20)
		:addRow{
			{ tag = 'th', content = 'Tool Effect', colspan = '7' },
			{ tag = 'argd', content = 'tool_effect', colspan = '13' },
		}
	end
end

function addcategories(args, catargs)
	local ret = { 'Items' }
	local cat_map = {
		-- Added if the parameter has content
		defined = {
			aka = 'Pages with AKA',
			forage_level = 'Forageable Items',
			mine_level = 'Mineable Items',
			fish_level = 'Fishable Items',
			chop_level = 'Choppable Items',
		},
		-- Added if the parameter has no content
		notdefined = {
			image = 'Needs image',
			release = 'Needs release date',
			id = 'Needs ID',
			description = 'Needs description',
			members = 'Needs members status',
			level = 'Needs level',
			cost = 'Items missing cost',
			sell = 'Items missing sell',

			value = 'Items missing value',
			quest = 'Items missing quest',
			craftable = 'Needs craftable status',
			brewable = 'Needs brewable status',
			type = 'Needs Type',
		},
		-- Parameters that have text
		-- map a category to a value
		matches = {
			members = { yes = 'Members\' items', no = 'Free-to-play items' },
			donator = { yes = 'Donator items' },
			rune_tp = { yes = 'Runes'},
			tradeable = { yes = 'Tradeable items', no = 'Untradeable items' },
			craftable = { yes = 'Craftable items', no = 'Uncraftable items' },
			brewable = { yes = 'Brewable items' },
			type = {
				['book'] = 'Books',

				['boots'] = {'Armor', 'Boots'},
				['chest'] = {'Armor', 'Chestplates'},
				['chestplate'] = {'Armor', 'Chestplates'},

				['dummy'] = 'Dummy Items',
				
				['fish'] = 'Fishes',
				
				['gem'] = 'Gems',
				['gemstone'] = 'Gems',
				
				['helm'] = {'Armor', 'Helmets'},
				['helmet'] = {'Armor', 'Helmets'},
				
				['log'] = 'Logs',
				['necklace'] = 'Necklaces',
				['ore'] = 'Ores',
				['potion'] = 'Potions',
				['ring'] = 'Rings',
				['rune'] = 'Runes',
				['sapling'] = 'Saplings',
				['seed'] = 'Saplings',

				['tool'] = 'Tools',
				['trap'] = 'Traps',

				['weapon'] = 'Weapons',
			},
			tool_type = {
				['fishing_rod'] = 'Fishing Rods',
				['fishing rod'] = 'Fishing Rods',
				['rod'] = 'Fishing Rods',
				['fishingRod'] = 'Fishing Rods',
				['axe'] = 'Axes',
				['pickaxe'] = 'Pickaxes',
				['shears'] = 'Shears',
			},
			potion_type = {
				['healing'] = {'Healing Potions', 'Healing Items'},
				['effect'] = {'Effect Potions'},
			}
		}
	}

	-- defined categories
	for n, v in pairs(cat_map.defined) do
		if catargs[n] and catargs[n].one_defined then
			table.insert(ret, v)
		end
	end

	-- undefined categories
	for n, v in pairs(cat_map.notdefined) do
		if catargs[n] and catargs[n].all_defined == false then
			table.insert(ret, v)
		end
	end

	-- searches
	for n, v in pairs(cat_map.matches) do
		for m, w in pairs(v) do
			if args[n] then
				if string.lower(tostring(args[n].d) or '') == m then
					table.insert(ret, w)
				end
				if args[n].switches then
					for _, x in ipairs(args[n].switches) do
						if string.lower(tostring(x)) == m then
							table.insert(ret, w)
						end
					end
				end
			end
		end
	end

	-- quest items
	-- just look for a link
	if args.quest.d:find('%[%[') then
		table.insert(ret, 'Quest items')
	elseif args.quest.switches then
		for _, v in ipairs(args.quest.switches) do
			if v:find('%[%[') then
				table.insert(ret, 'Quest items')
				break
			end
		end
	end

	-- ids
	if not catargs.id.all_defined then
		table.insert(ret, 'Needs ID')
	end

	-- combine table and format category wikicode
	for i, v in ipairs(ret) do
		if type(v) == 'string' then
			ret[i] = string.format('[[Category:%s]]', v)
		else
			local catString = ''

			for i2, v2 in ipairs(v) do
				catString = catString .. string.format('[[Category:%s]]', v2)
			end

			ret[i] = catString
		end
	end

	return table.concat(ret, '')
end


return p