<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_Pure</id>
	<title>Module:Infobox Pure - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_Pure"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Pure&amp;action=history"/>
	<updated>2026-04-30T11:39:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Infobox_Pure&amp;diff=34102&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-------------------------- -- Module for Template:Infobox Pure -------------------------- local p = {}  local onmain = require(&#039;Module:Mainonly&#039;).on_main local paramtest = require(&#039;Module:Paramtest&#039;) local empty = paramtest.is_empty local infobox = require(&#039;Module:Infobox&#039;) local yesno = require(&#039;Module:Yesno&#039;) local cb_calc = require(&#039;Module:Combat level&#039;)._calc local lang = mw.language.getContentLanguage()  local build_types = { 	[&#039;1v1&#039;] = &#039;1-vs-1&#039;...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Pure&amp;diff=34102&amp;oldid=prev"/>
		<updated>2024-10-15T21:52:04Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-------------------------- -- Module for &lt;a href=&quot;/w/Template:Infobox_Pure&quot; title=&quot;Template:Infobox Pure&quot;&gt;Template:Infobox Pure&lt;/a&gt; -------------------------- local p = {}  local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main local paramtest = require(&amp;#039;Module:Paramtest&amp;#039;) local empty = paramtest.is_empty local infobox = require(&amp;#039;Module:Infobox&amp;#039;) local yesno = require(&amp;#039;Module:Yesno&amp;#039;) local cb_calc = require(&amp;#039;Module:Combat level&amp;#039;)._calc local lang = mw.language.getContentLanguage()  local build_types = { 	[&amp;#039;1v1&amp;#039;] = &amp;#039;&lt;a href=&quot;/index.php?title=1-vs-1_build&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;1-vs-1 build (page does not exist)&quot;&gt;1-vs-1&lt;/a&gt;&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------&lt;br /&gt;
-- Module for [[Template:Infobox Pure]]&lt;br /&gt;
--------------------------&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main&lt;br /&gt;
local paramtest = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
local empty = paramtest.is_empty&lt;br /&gt;
local infobox = require(&amp;#039;Module:Infobox&amp;#039;)&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local cb_calc = require(&amp;#039;Module:Combat level&amp;#039;)._calc&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
local build_types = {&lt;br /&gt;
	[&amp;#039;1v1&amp;#039;] = &amp;#039;[[1-vs-1 build|1-vs-1]]&amp;#039;,&lt;br /&gt;
	tank = &amp;#039;[[tank build|Tank]]&amp;#039;,&lt;br /&gt;
	support = &amp;#039;[[support build|Support]]&amp;#039;,&lt;br /&gt;
	multi = &amp;#039;[[multicombat build|Multicombat]]&amp;#039;,&lt;br /&gt;
	[&amp;#039;no-honour&amp;#039;] = &amp;#039;[[no-honour build|No honour]]&amp;#039;,&lt;br /&gt;
	skiller = &amp;quot;Skiller&amp;quot;,&lt;br /&gt;
	other = &amp;quot;Trophy/Other&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local ret = infobox.new(args)&lt;br /&gt;
&lt;br /&gt;
	ret:defineParams{&lt;br /&gt;
		{ name = &amp;#039;name&amp;#039;, func = &amp;#039;name&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;image&amp;#039;, func = &amp;#039;hasContent&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;image_smw&amp;#039;, func = { name = image_smw, params = { &amp;#039;image&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;aka&amp;#039;, func = &amp;#039;hasContent&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;members&amp;#039;, func = &amp;#039;hasContent&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;type&amp;#039;, func = { name = typearg, params = { &amp;#039;type&amp;#039;, &amp;#039;members&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;type_smw&amp;#039;, func = { name = csv_to_multi, params = { &amp;#039;type&amp;#039;, true }, flag = { &amp;#039;p&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;ironman&amp;#039;, func = &amp;#039;hasContent&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;combat&amp;#039;, func = cbarg },&lt;br /&gt;
        { name = &amp;#039;combat_smw&amp;#039;, func = { name = csv_to_multi, params = { &amp;#039;combat&amp;#039;, true }, flag = { &amp;#039;p&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
        { name = &amp;#039;combat_example&amp;#039;, func = { name = cblvlarg, params = { &amp;#039;att&amp;#039;, &amp;#039;str&amp;#039;, &amp;#039;def&amp;#039;, &amp;#039;range&amp;#039;, &amp;#039;mage&amp;#039;, &amp;#039;hitpoints&amp;#039;, &amp;#039;pray&amp;#039; }, flag = &amp;#039;d&amp;#039; } },&lt;br /&gt;
        &lt;br /&gt;
		{ name = &amp;#039;attack_style&amp;#039;, func = { name = attstylearg, params = { &amp;#039;attack style&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
        { name = &amp;#039;attack_style_smw&amp;#039;, func = { name = &amp;#039;hasContent&amp;#039;, params = { &amp;#039;attack style&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;uses_style&amp;#039;, func = { name = usesarg, params = { &amp;#039;uses melee&amp;#039;, &amp;#039;uses ranged&amp;#039;, &amp;#039;uses magic&amp;#039;, &amp;#039;attack style&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;uses_style_smw&amp;#039;, func = { name = usesarg_smw, params = { &amp;#039;uses_style&amp;#039; }, flag = &amp;#039;d&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;stylecount&amp;#039;, func = { name = usesarg, params = { &amp;#039;uses melee&amp;#039;, &amp;#039;uses ranged&amp;#039;, &amp;#039;uses magic&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		&lt;br /&gt;
		{ name = &amp;#039;max_hit&amp;#039;, func = { name = maxhitarg, params = { &amp;#039;weapons&amp;#039;, &amp;#039;max hit&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
        { name = &amp;#039;max_hit_smw&amp;#039;, func = { name = csv_to_multi, params = { &amp;#039;max hit&amp;#039;, true }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
        &lt;br /&gt;
        { name = &amp;#039;usesinfobox&amp;#039;, func = { name = tostring, params = { &amp;#039;Pure&amp;#039; }, flag = &amp;#039;r&amp;#039; } },&lt;br /&gt;
	}&lt;br /&gt;
	local numeric_args = {&lt;br /&gt;
		&amp;#039;hitpoints&amp;#039;, &amp;#039;att&amp;#039;, &amp;#039;str&amp;#039;, &amp;#039;def&amp;#039;, &amp;#039;range&amp;#039;, &amp;#039;mage&amp;#039;, &amp;#039;pray&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
	for _, v in ipairs(numeric_args) do&lt;br /&gt;
		ret:defineParams{&lt;br /&gt;
			{ name = v, func = { name = numericarg, params = { v, v }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
			{ name = v..&amp;#039;_smw&amp;#039;, func = { name = tonumber, params = { v }, flag = { &amp;#039;d&amp;#039; } } },&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:create()&lt;br /&gt;
	ret:cleanParams()&lt;br /&gt;
&lt;br /&gt;
	ret:customButtonPlacement(true)&lt;br /&gt;
	ret:setDefaultVersionSMW(true)&lt;br /&gt;
	ret:addButtonsCaption()&lt;br /&gt;
&lt;br /&gt;
	ret:defineLinks({ hide = true })&lt;br /&gt;
	local smw_mapping = {&lt;br /&gt;
		name = &amp;#039;Name&amp;#039;,&lt;br /&gt;
		image_smw = &amp;#039;Image&amp;#039;,&lt;br /&gt;
		members = &amp;#039;Is members only&amp;#039;,&lt;br /&gt;
		type_smw = &amp;#039;Build type&amp;#039;,&lt;br /&gt;
		max_hit_smw = &amp;#039;Max hit&amp;#039;,&lt;br /&gt;
		combat_smw = &amp;#039;Combat level&amp;#039;,&lt;br /&gt;
		hitpoints_smw = &amp;#039;Hitpoints&amp;#039;,&lt;br /&gt;
		att_smw = &amp;#039;Attack level&amp;#039;,&lt;br /&gt;
		str_smw = &amp;#039;Strength level&amp;#039;,&lt;br /&gt;
		def_smw = &amp;#039;Defence level&amp;#039;,&lt;br /&gt;
		range_smw = &amp;#039;Ranged level&amp;#039;,&lt;br /&gt;
		mage_smw = &amp;#039;Magic level&amp;#039;,&lt;br /&gt;
		pray_smw = &amp;#039;Prayer level&amp;#039;,&lt;br /&gt;
		attack_style = &amp;#039;Attack style&amp;#039;,&lt;br /&gt;
		uses_style_smw = &amp;#039;All Attack style&amp;#039;,&lt;br /&gt;
		usesinfobox = &amp;#039;Uses infobox&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
	local smw_all_mapping = {}&lt;br /&gt;
	for param, property_name in pairs(smw_mapping) do&lt;br /&gt;
		smw_all_mapping[param] = &amp;#039;All &amp;#039;..property_name&lt;br /&gt;
	end&lt;br /&gt;
	ret:useSMWSubobject(smw_mapping)&lt;br /&gt;
	--primary attack style is &amp;#039;Attack style&amp;#039;, list of styles is &amp;#039;All Attack style&amp;#039;&lt;br /&gt;
	smw_all_mapping[&amp;#039;attack_style&amp;#039;] = &amp;#039;Attack style&amp;#039;&lt;br /&gt;
	smw_all_mapping[&amp;#039;uses_style_smw&amp;#039;] = &amp;#039;All Attack style&amp;#039;&lt;br /&gt;
	ret:useSMWOne(smw_all_mapping)&lt;br /&gt;
&lt;br /&gt;
	ret:defineName(&amp;#039;Infobox Pure&amp;#039;)&lt;br /&gt;
	ret:addClass(&amp;#039;infobox-pure&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local tblwidth = 40&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argh&amp;#039;, content = &amp;#039;name&amp;#039;, class=&amp;#039;infobox-header&amp;#039;, colspan = tblwidth }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;image&amp;#039;, colspan = tblwidth, class = &amp;#039;infobox-full-width-content infobox-image&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	:pad(tblwidth)&lt;br /&gt;
&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Members]]&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;members&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ret:paramDefined(&amp;#039;aka&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Also called&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;aka&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Build type&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;type&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;ironman&amp;#039;) and yesno(ret:param(&amp;#039;ironman&amp;#039;), true) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Ironman Mode|Ironman build]]&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;ironman&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Combat level]]&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;combat&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local stylecount = tonumber(ret:param(&amp;#039;stylecount&amp;#039;))&lt;br /&gt;
	local maxstyles = stylecount&lt;br /&gt;
	local hasPrimary = ret:paramDefined(&amp;#039;attack_style&amp;#039;)&lt;br /&gt;
	local stylecounts = ret:param(&amp;#039;stylecount&amp;#039;, &amp;#039;s&amp;#039;)&lt;br /&gt;
	if stylecounts then&lt;br /&gt;
		for _, sc in ipairs(stylecounts) do&lt;br /&gt;
			if stylecount &amp;lt; tonumber(sc) then&lt;br /&gt;
				maxstyles = tonumber(sc)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mw.log(&amp;quot;Attack styles set:&amp;quot;,stylecount, maxstyles, &amp;quot;\nPrimary style set:&amp;quot;, hasPrimary)&lt;br /&gt;
	if not hasPrimary and stylecount == 1 then&lt;br /&gt;
		-- primary style not defined, but only one attack style is specified&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Primary [[Combat triangle|attack style]]&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;uses_style&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		if hasPrimary then&lt;br /&gt;
			-- primary style is defined, show which style this is.&lt;br /&gt;
			ret:addRow{&lt;br /&gt;
				{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Primary [[Combat triangle|attack style]]&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
				{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;attack_style&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		if maxstyles &amp;gt; 1 then&lt;br /&gt;
			-- if stylecount == 1 then it&amp;#039;s listed as primary style; if stylecount == 0 then no attack styles are given&lt;br /&gt;
			-- so only show if there is extra information to be given with secondary attack styles other than the primary one.&lt;br /&gt;
			ret:addRow{&lt;br /&gt;
				{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Uses [[Combat triangle|attack styles]]&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
				{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;uses_style&amp;#039;, colspan = math.floor(tblwidth/2) }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	mw.log(&amp;#039;Max Hit defined:&amp;#039;)&lt;br /&gt;
	mw.log(ret:paramDefined(&amp;#039;max_hit&amp;#039;))&lt;br /&gt;
	mw.log(ret:paramDefined(&amp;#039;max_hit&amp;#039;, &amp;#039;all&amp;#039;))&lt;br /&gt;
	if ret:paramDefined(&amp;#039;max_hit&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Maximum hit|Max hit]] with boosts&amp;#039;, colspan = math.ceil(tblwidth/2) },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;max_hit&amp;#039;, colspan = math.floor(tblwidth/2), class = &amp;#039;plainlist&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	ret:pad(tblwidth)&lt;br /&gt;
	&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Combat icon.png|link=Combat]] Example [[Combat|combat stats]]&amp;#039;, colspan = tblwidth, class = &amp;#039;infobox-subheader&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(tblwidth)&lt;br /&gt;
&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Hitpoints icon.png|link=Hitpoints]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Attack icon.png|link=Attack]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Strength icon.png|link=Strength]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Defence icon.png|link=Defence]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Magic icon.png|link=Magic]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Ranged icon.png|link=Ranged]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Prayer icon.png|link=Prayer]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Attack style icon.png|link=Combat level]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;hitpoints&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;att&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;str&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;def&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;mage&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;range&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;pray&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;combat_example&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	:pad(tblwidth)&lt;br /&gt;
&lt;br /&gt;
	if onmain() then&lt;br /&gt;
		local a1 = ret:param(&amp;#039;all&amp;#039;)&lt;br /&gt;
		local a2 = ret:categoryData()&lt;br /&gt;
		ret:wikitext(addcategories(a1, a2))&lt;br /&gt;
	end&lt;br /&gt;
	return ret:tostring()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- split builds with multiple images for smw&lt;br /&gt;
function image_smw(arg)&lt;br /&gt;
	local _img = {}&lt;br /&gt;
	for i in string.gmatch(arg, &amp;quot;[Ff]ile:.-%.png&amp;quot;) do&lt;br /&gt;
		table.insert(_img, i)&lt;br /&gt;
	end&lt;br /&gt;
	if #_img == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(_img, &amp;#039;&amp;amp;&amp;amp;SPLITPOINT&amp;amp;&amp;amp;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns nil if the amount of hits does not correspond with the amount of weapons.&lt;br /&gt;
function maxhitarg(weapons, hits)&lt;br /&gt;
	if empty(weapons) or empty(hits) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	weapons, hits = mw.text.split(weapons, &amp;quot;%s*,%s*&amp;quot;), mw.text.split(hits, &amp;quot;%s*,%s*&amp;quot;)&lt;br /&gt;
	if #weapons ~= #hits then&lt;br /&gt;
		return &amp;#039;Error: amount of specified &amp;lt;code&amp;gt;weapons&amp;lt;/code&amp;gt; must equal amount of &amp;lt;code&amp;gt;max hit&amp;lt;/code&amp;gt;s.&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local list = mw.html.create(&amp;#039;ul&amp;#039;):addClass(&amp;#039;max-hit-list&amp;#039;)&lt;br /&gt;
	for i, wep in ipairs(weapons) do&lt;br /&gt;
		list:tag(&amp;#039;li&amp;#039;):wikitext(&amp;#039;[[File:&amp;#039;..wep..&amp;#039;.png|link=&amp;#039;..wep..&amp;#039;]] &amp;amp;mdash; &amp;#039; .. hits[i]):done()&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(list)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function typearg(arg, members)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local str = &amp;#039;&amp;#039;&lt;br /&gt;
	local lcarg = string.lower(arg) -- lowercase arg&lt;br /&gt;
	&lt;br /&gt;
	if lcarg == &amp;#039;no&amp;#039; then&lt;br /&gt;
		return &amp;#039;N/A&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    for i, v in pairs(build_types) do&lt;br /&gt;
		for _, t in ipairs(mw.text.split(lcarg, &amp;quot;%s*,%s*&amp;quot;)) do&lt;br /&gt;
	        if t == i then&lt;br /&gt;
	        	if not yesno(members) then&lt;br /&gt;
	        		-- add f2p in front of pagename for link&lt;br /&gt;
	        		v = string.gsub(v, &amp;#039;%[%[&amp;#039;, &amp;#039;[[Free-to-play &amp;#039;)&lt;br /&gt;
	        	end&lt;br /&gt;
            	if str == &amp;#039;&amp;#039; then&lt;br /&gt;
            		str = v&lt;br /&gt;
            	else&lt;br /&gt;
            		str = str .. &amp;#039;, &amp;#039; .. v&lt;br /&gt;
            	end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cbarg(combat)&lt;br /&gt;
	if not infobox.isDefined(combat) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	assert(string.match(combat, &amp;quot;^%s*%d+%s*$&amp;quot;) or string.match(combat, &amp;quot;^%s*%d+%s*,%s*%d+%s*$&amp;quot;), &amp;quot;Invalid combat format. Provide two comma-separated values, or one value.&amp;quot;)&lt;br /&gt;
	local combats = mw.text.split(combat, &amp;quot;%s*,%s*&amp;quot;)&lt;br /&gt;
	if #combats == 1 then&lt;br /&gt;
		return combats[1]&lt;br /&gt;
	end&lt;br /&gt;
	local mincb, maxcb = combats[1], combats[2]&lt;br /&gt;
	if mincb == maxcb then&lt;br /&gt;
		return combats[1]&lt;br /&gt;
	end&lt;br /&gt;
	return mincb .. &amp;#039; &amp;amp;mdash; &amp;#039; .. maxcb&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attstylearg(arg)&lt;br /&gt;
	if arg == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local attstyles = {melee = &amp;#039;Melee&amp;#039;, ranged = &amp;#039;Ranged icon&amp;#039;, magic = &amp;#039;Magic icon&amp;#039;, hybrid = &amp;#039;Hybrid&amp;#039;}&lt;br /&gt;
	local arglc = string.lower(arg)&lt;br /&gt;
	mw.log(&amp;quot;primary style:&amp;quot;, attstyles[arglc])&lt;br /&gt;
	if arglc == &amp;#039;no&amp;#039; then&lt;br /&gt;
		return &amp;#039;N/A&amp;#039;&lt;br /&gt;
	elseif attstyles[arglc] then&lt;br /&gt;
		return string.format(&amp;quot;[[File:%s.png|link=%s]]&amp;quot;, attstyles[arglc], lang:ucfirst(arg))&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function usesarg(melee, range, mage, style)&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	local attstyles = {melee = &amp;#039;Melee&amp;#039;, ranged = &amp;#039;Ranged icon&amp;#039;, magic = &amp;#039;Magic icon&amp;#039;}&lt;br /&gt;
	local count = 0&lt;br /&gt;
	if yesno(melee) then&lt;br /&gt;
		ret = ret .. &amp;#039;[[File:Melee.png|link=Melee]] &amp;#039;&lt;br /&gt;
		count = count + 1&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(range) then&lt;br /&gt;
		ret = ret .. &amp;#039;[[File:Ranged icon.png|link=Ranged]] &amp;#039;&lt;br /&gt;
		count = count + 1&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(mage) then&lt;br /&gt;
		ret = ret .. &amp;#039;[[File:Magic icon.png|link=Magic]] &amp;#039;&lt;br /&gt;
		count = count + 1&lt;br /&gt;
	end&lt;br /&gt;
	if style == nil then&lt;br /&gt;
		-- this function was called for the internal parameter &amp;#039;stylecount&amp;#039;.&lt;br /&gt;
		return count&lt;br /&gt;
	end&lt;br /&gt;
	if count == 0 then&lt;br /&gt;
		local lcstyle = string.lower(style)&lt;br /&gt;
		if attstyles[lcstyle] then&lt;br /&gt;
			ret = string.format(&amp;#039;[[File:%s.png|link=%s]]&amp;#039;, attstyles[lcstyle], lang:ucfirst(lcstyle))&lt;br /&gt;
		else&lt;br /&gt;
			ret = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function usesarg_smw(imgs)&lt;br /&gt;
	styles = string.gsub(imgs, &amp;quot;%[%[File:[%a ]*.png|link=(%a*)]]&amp;quot;, &amp;quot;%1, &amp;quot;)&lt;br /&gt;
	styles = string.gsub(styles, &amp;quot;,%s*$&amp;quot;, &amp;quot;, &amp;quot;)&lt;br /&gt;
	return csv_to_multi(styles, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cblvlarg(att, str, def, range, mage, hp, pray)&lt;br /&gt;
	args = { att, str, def, range, mage, hp, pray }&lt;br /&gt;
	for i, lvl in ipairs(args) do&lt;br /&gt;
		if not infobox.isDefined(lvl) then&lt;br /&gt;
			if i == 6 then&lt;br /&gt;
				-- hitpoints = 10 default&lt;br /&gt;
				args[i] = 10&lt;br /&gt;
			else&lt;br /&gt;
				args[i] = 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return cb_calc(unpack(args))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function numericarg(arg, arg_name)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function striplinks(str)&lt;br /&gt;
	if type(str) ~= &amp;#039;string&amp;#039; then return str end&lt;br /&gt;
	-- remove piped wikilinks&lt;br /&gt;
	str = string.gsub(str, &amp;#039;%[%[[^%]|]*|([^%]|]+)]]&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
	-- remove all other wikilinks&lt;br /&gt;
    str = string.gsub(str,&amp;#039;%[%[[^%]]*?&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
    return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function csv_to_multi(raw, strip)&lt;br /&gt;
    assert(type(strip) == &amp;#039;boolean&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    local r = string.gsub(raw, &amp;quot;&amp;#039;\&amp;quot;`UNIQ[^`]*QINU`\&amp;quot;&amp;#039;&amp;quot;, &amp;#039;&amp;#039;) -- UNIQ QINU typically means unparsed content, such as &amp;lt;ref&amp;gt;&amp;lt;/ref&amp;gt;. Remove this from SMW&lt;br /&gt;
	if infobox.isDefined(raw) then&lt;br /&gt;
		if strip then&lt;br /&gt;
			r = striplinks(r)&lt;br /&gt;
		end&lt;br /&gt;
		r = string.gsub(r, &amp;#039;%s*,%s*&amp;#039;, &amp;#039;&amp;amp;&amp;amp;SPLITPOINT&amp;amp;&amp;amp;&amp;#039;)&lt;br /&gt;
		return r&lt;br /&gt;
    end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addcategories(args, catargs)&lt;br /&gt;
	local ret = { &amp;#039;Account builds&amp;#039; }&lt;br /&gt;
&lt;br /&gt;
	local cat_map = {&lt;br /&gt;
		-- Added if the parameter has content&lt;br /&gt;
		defined = {&lt;br /&gt;
			aka = &amp;#039;Pages with AKA&amp;#039;&lt;br /&gt;
		},&lt;br /&gt;
		-- Added if the parameter has no content&lt;br /&gt;
		notdefined = {&lt;br /&gt;
			image = &amp;#039;Needs image&amp;#039;,&lt;br /&gt;
			members = &amp;#039;Needs members status&amp;#039;,&lt;br /&gt;
			combat = &amp;#039;Needs combat level&amp;#039;,&lt;br /&gt;
		},&lt;br /&gt;
		-- Parameters that have text&lt;br /&gt;
		-- map a category to a value&lt;br /&gt;
		matches = {&lt;br /&gt;
			members = { yes = &amp;#039;Members\&amp;#039; account builds&amp;#039;, no = &amp;#039;Free-to-play account builds&amp;#039; },&lt;br /&gt;
			combat = { [&amp;#039;3&amp;#039;] = &amp;#039;Combat pures&amp;#039; },&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- defined categories&lt;br /&gt;
	for n, v in pairs(cat_map.defined) do&lt;br /&gt;
		if catargs[n] and catargs[n].one_defined then&lt;br /&gt;
			table.insert(ret, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- undefined categories&lt;br /&gt;
	for n, v in pairs(cat_map.notdefined) do&lt;br /&gt;
		if catargs[n] and catargs[n].all_defined == false then&lt;br /&gt;
			table.insert(ret, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- searches&lt;br /&gt;
	for n, v in pairs(cat_map.matches) do&lt;br /&gt;
		for m, w in pairs(v) do&lt;br /&gt;
			if args[n] then&lt;br /&gt;
				if string.lower(tostring(args[n].d) or &amp;#039;&amp;#039;) == m then&lt;br /&gt;
					table.insert(ret, w)&lt;br /&gt;
				end&lt;br /&gt;
				if args[n].switches then&lt;br /&gt;
					for _, x in ipairs(args[n].switches) do&lt;br /&gt;
						if string.lower(tostring(x)) == m then&lt;br /&gt;
							table.insert(ret, w)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- assume all skiller pures are level 3 combat&lt;br /&gt;
	if args[&amp;#039;combat&amp;#039;].d ~= &amp;#039;3&amp;#039; then&lt;br /&gt;
		table.insert(ret, &amp;#039;Combat pures&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- combine table and format category wikicode&lt;br /&gt;
	for i, v in ipairs(ret) do&lt;br /&gt;
		if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			ret[i] = string.format(&amp;#039;[[Category:%s]]&amp;#039;, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ret, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>