Module:Equipment/Recommended

From Melvor Idle
Revision as of 18:34, 26 January 2022 by Auron956 (talk | contribs) (Amend slot links & naming)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

-- Copied from: https://oldschool.runescape.wiki/w/Module:Recommended Equipment
-- Released under: https://creativecommons.org/licenses/by-nc-sa/3.0/ 

local p = {}

local params = require('Module:Shared/Paramtest')
local icons = require("Module:Icons")

local slots = {
	{ placement = 1, name = 'helm', icon = 'Slot_head', txt = 'Helmet', link = 'Equipment#Helmets' },
	{ placement = 2, name = 'body', icon = 'Slot_chest', txt = 'Platebody', link = 'Equipment#Platebodies' },
	{ placement = 3, name = 'legs', icon = 'Slot_legs', txt = 'Platelegs', link = 'Equipment#Platelegs' },
	{ placement = 4, name = 'boots', icon = 'Slot_feet', txt = 'Boots', link = 'Equipment#Boots' },
	{ placement = 5, name = 'gloves', icon = 'Slot_hands', txt = 'Gloves', link = 'Equipment#Gloves' },
	
	{ placement = 6, name = 'cape', icon = 'Slot_back', txt = 'Cape', link = 'Equipment#Capes' },
	{ placement = 7, name = 'neck', icon = 'Slot_neck', txt = 'Amulet', link = 'Equipment#Amulets' },
	{ placement = 8, name = 'ring', icon = 'Slot_ring', txt = 'Ring', link = 'Equipment#Rings' },
	
	{ placement = 9, name = 'weapon', icon = 'Slot_weapon', txt = 'Weapon', link = 'Equipment#Weapons' },
	{ placement = 10, name = 'shield', icon = 'Slot_shield', txt = 'Offhand', link = 'Equipment#Offhand' },
	{ placement = 11, name = 'ammo', icon = 'Slot_ammo', txt = 'Quiver', link = 'Equipment#Ammunition' },
	
	{ placement = 12, name = 'passive', icon = 'Slot_passive', txt = 'Passive', link = 'Combat Passive Slot' },
	{ placement = 13, name = 'familiar1', icon = 'Slot_summon', txt = 'Familiar Left', link = 'Summoning' },
	{ placement = 14, name = 'familiar2', icon = 'Slot_summon', txt = 'Familiar Right', link = 'Summoning' }
	
}

function p.main(frame)
	local args = frame:getParent().args	
	-- Dynamic colspan and N/A generation value
	local greatest_row_size = 0
	-- Number of choices each slot can have
	local number_of_possible_choices = 5
	-- Have to sort this table or else the order is messed up when you use it
	table.sort(slots, function(a, b) return a.placement < b.placement end)
	
	local function make_row(slot, data, compact)
		local tr = mw.html.create('tr')
		local sloticon = tr:tag('td')
		sloticon:wikitext(string.format('[[File:%s.png|%s|link=%s|36px]]', slot.icon, slot.txt, slot.link))
		if compact then
			sloticon:attr('style', 'padding-bottom: 4px;')
		end
		for _, v in ipairs(data) do
			local itemicon = icons.Icon({v, img=v, type='item'})
			local gearname = tr:tag('td'):wikitext(itemicon)
			if compact then
				gearname:attr('style', 'padding-left: 12px;')
			end
		end
		
		-- If the data size is smaller than GRS, then we need to fill up the remaining td's with N/As
		if #data < greatest_row_size then
			local difference = greatest_row_size - #data
			tr:tag('td'):attr('colspan', difference):attr("class", ".dimmed")
		end
		return tr
	end
	
	-- Find the greatest row count
	for _, v in next, slots, nil do
		local grs = 0
		for i = 1, number_of_possible_choices, 1 do
			local check = args[v.name .. i]
			if check and params.has_content(check) then
				grs = grs + 1	
			end
		end
		
		if greatest_row_size < grs then
			greatest_row_size = grs	
		end
	end
	
	local parent = mw.html.create('table')
	-- If setname is passed in, apply it above the table
	if args.setname and params.has_content(args.setname) then
		parent:tag('caption'):wikitext(string.format('Recommended equipment for %s', args.setname))
	end

	local compact = true
	if args.noheader == nil then
		compact = false
		parent:addClass('wikitable')
		parent:tag('tr')
			:tag('th'):wikitext('Slot'):done()
			:tag('th'):attr('colspan', greatest_row_size):wikitext('Item (most effective → least effective)'):done()
	end
		
	for _, v in next, slots, nil do
		local row_data = {}
		for i = 1, number_of_possible_choices, 1 do
			local gear = args[v.name .. i]
			if gear and params.has_content(gear) then
				table.insert(row_data, gear)
			end
		end

		if #row_data > 0 or args.showall then
			parent:node(make_row(v, row_data, compact))
		end
	end
		
	return tostring(parent)
end

return p