<?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_Bonuses</id>
	<title>Module:Infobox Bonuses - 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_Bonuses"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Bonuses&amp;action=history"/>
	<updated>2026-04-30T06:37:27Z</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_Bonuses&amp;diff=339&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-------------------------- -- Module for Template:Infobox Bonuses ------------------------ local p = {}  local onmain = require(&#039;Module:Mainonly&#039;).on_main local infobox = require(&#039;Module:Infobox&#039;) local signed = require(&#039;Module:Format eq stat&#039;).signed local clean = require(&#039;Module:Clean image2&#039;).clean  local slots = { 	head = &#039;Head slot items&#039;, 	weapon = &#039;Weapon slot items&#039;, 	body = &#039;Body slot items&#039;, 	legs = &#039;Legs slot items&#039;, 	shield = &#039;Shield slot items&#039;, 	cape =...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Bonuses&amp;diff=339&amp;oldid=prev"/>
		<updated>2024-10-11T20:53:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-------------------------- -- Module for &lt;a href=&quot;/w/Template:Infobox_Bonuses&quot; title=&quot;Template:Infobox Bonuses&quot;&gt;Template:Infobox Bonuses&lt;/a&gt; ------------------------ local p = {}  local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main local infobox = require(&amp;#039;Module:Infobox&amp;#039;) local signed = require(&amp;#039;Module:Format eq stat&amp;#039;).signed local clean = require(&amp;#039;Module:Clean image2&amp;#039;).clean  local slots = { 	head = &amp;#039;Head slot items&amp;#039;, 	weapon = &amp;#039;Weapon slot items&amp;#039;, 	body = &amp;#039;Body slot items&amp;#039;, 	legs = &amp;#039;Legs slot items&amp;#039;, 	shield = &amp;#039;Shield slot items&amp;#039;, 	cape =...&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 Bonuses]]&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 infobox = require(&amp;#039;Module:Infobox&amp;#039;)&lt;br /&gt;
local signed = require(&amp;#039;Module:Format eq stat&amp;#039;).signed&lt;br /&gt;
local clean = require(&amp;#039;Module:Clean image2&amp;#039;).clean&lt;br /&gt;
&lt;br /&gt;
local slots = {&lt;br /&gt;
	head = &amp;#039;Head slot items&amp;#039;,&lt;br /&gt;
	weapon = &amp;#039;Weapon slot items&amp;#039;,&lt;br /&gt;
	body = &amp;#039;Body slot items&amp;#039;,&lt;br /&gt;
	legs = &amp;#039;Legs slot items&amp;#039;,&lt;br /&gt;
	shield = &amp;#039;Shield slot items&amp;#039;,&lt;br /&gt;
	cape = &amp;#039;Cape slot items&amp;#039;,&lt;br /&gt;
	[&amp;#039;2h&amp;#039;] = &amp;#039;Two-handed slot items&amp;#039;,&lt;br /&gt;
	hands = &amp;#039;Hands slot items&amp;#039;,&lt;br /&gt;
	feet = &amp;#039;Feet slot items&amp;#039;,&lt;br /&gt;
	neck = &amp;#039;Neck slot items&amp;#039;,&lt;br /&gt;
	ammo = &amp;#039;Ammunition slot items&amp;#039;,&lt;br /&gt;
	ring = &amp;#039;Ring slot items&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local ret = infobox.new(args)&lt;br /&gt;
&lt;br /&gt;
	local signed_numeric_args = {&lt;br /&gt;
		&amp;#039;astab&amp;#039;, &amp;#039;aslash&amp;#039;, &amp;#039;acrush&amp;#039;, &amp;#039;amagic&amp;#039;, &amp;#039;arange&amp;#039;,&lt;br /&gt;
		&amp;#039;dstab&amp;#039;, &amp;#039;dslash&amp;#039;, &amp;#039;dcrush&amp;#039;, &amp;#039;dmagic&amp;#039;, &amp;#039;drange&amp;#039;,&lt;br /&gt;
		&amp;#039;str&amp;#039;, &amp;#039;rstr&amp;#039;, &amp;#039;prayer&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for _, v in ipairs(signed_numeric_args) do&lt;br /&gt;
		ret:defineParams{&lt;br /&gt;
			{ name = v, func = { name = signednumericarg, 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 = numericarg_smw, params = { v } } },&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:defineParams{&lt;br /&gt;
		{ name = &amp;#039;mdmg&amp;#039;, func = { name = signedpercentnumericarg, params = { &amp;#039;mdmg&amp;#039;, &amp;#039;mdmg&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;mdmg_smw&amp;#039;, func = { name = numericarg_smw, params = { &amp;#039;mdmg&amp;#039; }, flag = { &amp;#039;p&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;slot&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;slot_image&amp;#039;, func = { name = slotarg, params = { &amp;#039;slot&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;slot_link&amp;#039;, func = { name = slot_link_arg, params = { &amp;#039;slot&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;speed_smw&amp;#039;, func = { name = speedargsmw, params = { &amp;#039;speed&amp;#039; }, flag = { &amp;#039;p&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;attackrange_smw&amp;#039;, func = { name = attackrangeargsmw, params = { &amp;#039;attackrange&amp;#039; }, flag = { &amp;#039;p&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;combatstyle&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;image&amp;#039;, func = { name = imagearg, params = { &amp;#039;image&amp;#039;, &amp;#039;caption&amp;#039;, &amp;#039;image&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;image_width&amp;#039;, func = { name = image_width_arg, params = { &amp;#039;image&amp;#039;, &amp;#039;image&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;altimage&amp;#039;, func = { name = imagearg, params = { &amp;#039;altimage&amp;#039;, &amp;#039;altcaption&amp;#039;, &amp;#039;altimage&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;altimage_width&amp;#039;, func = { name = image_width_arg, params = { &amp;#039;altimage&amp;#039;, &amp;#039;altimage&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039; } } },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ret:defineLinks({ hide = true })&lt;br /&gt;
&lt;br /&gt;
	local smw_mapping = {&lt;br /&gt;
		astab_smw = &amp;#039;Stab attack bonus&amp;#039;,&lt;br /&gt;
		aslash_smw = &amp;#039;Slash attack bonus&amp;#039;,&lt;br /&gt;
		acrush_smw = &amp;#039;Crush attack bonus&amp;#039;,&lt;br /&gt;
		arange_smw = &amp;#039;Range attack bonus&amp;#039;,&lt;br /&gt;
		amagic_smw = &amp;#039;Magic attack bonus&amp;#039;,&lt;br /&gt;
		dstab_smw = &amp;#039;Stab defence bonus&amp;#039;,&lt;br /&gt;
		dslash_smw = &amp;#039;Slash defence bonus&amp;#039;,&lt;br /&gt;
		dcrush_smw = &amp;#039;Crush defence bonus&amp;#039;,&lt;br /&gt;
		drange_smw = &amp;#039;Range defence bonus&amp;#039;,&lt;br /&gt;
		dmagic_smw = &amp;#039;Magic defence bonus&amp;#039;,&lt;br /&gt;
		str_smw = &amp;#039;Strength bonus&amp;#039;,&lt;br /&gt;
		rstr_smw = &amp;#039;Ranged Strength bonus&amp;#039;,&lt;br /&gt;
		prayer_smw = &amp;#039;Prayer bonus&amp;#039;,&lt;br /&gt;
		mdmg_smw = &amp;#039;Magic Damage bonus&amp;#039;,&lt;br /&gt;
		slot = &amp;#039;Equipment slot&amp;#039;,&lt;br /&gt;
		speed_smw = &amp;#039;Weapon attack speed&amp;#039;,&lt;br /&gt;
		attackrange_smw = &amp;#039;Weapon attack range&amp;#039;,&lt;br /&gt;
		combatstyle = &amp;#039;Combat style&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local smw_all_mapping = {}&lt;br /&gt;
	for param, smw_name in pairs(smw_mapping) do&lt;br /&gt;
		smw_all_mapping[param] = &amp;#039;All &amp;#039;..smw_name&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:useSMWSubobject(smw_mapping)&lt;br /&gt;
	ret:useSMWOne(smw_all_mapping)&lt;br /&gt;
&lt;br /&gt;
	ret:setMaxButtons(10)&lt;br /&gt;
	&lt;br /&gt;
	ret:create()&lt;br /&gt;
	ret:cleanParams()&lt;br /&gt;
&lt;br /&gt;
	local any_is_weapon = ret:paramGrep(&amp;#039;slot&amp;#039;, function(x) return infobox.isDefined(x) and (string.lower(x) == &amp;#039;weapon&amp;#039; or string.lower(x) == &amp;#039;2h&amp;#039;) end)&lt;br /&gt;
&lt;br /&gt;
	ret:customButtonPlacement(true)&lt;br /&gt;
	ret:addButtonsCaption()&lt;br /&gt;
&lt;br /&gt;
	ret:defineName(&amp;#039;Infobox Bonuses&amp;#039;)&lt;br /&gt;
	ret:addClass(&amp;#039;infobox-bonuses&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local image_rowspan = 15&lt;br /&gt;
&lt;br /&gt;
	local first_row = {&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Attack icon.png|alt=|link=Equipment Stats#Attack bonuses]]&amp;amp;nbsp;[[Equipment Stats#Attack bonuses|Attack bonuses]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local image_defined = ret:paramGrep(&amp;#039;image&amp;#039;, function(x) return (infobox.isDefined(x) and x or &amp;#039;N/A&amp;#039;) ~= &amp;#039;N/A&amp;#039; end)&lt;br /&gt;
	if image_defined then&lt;br /&gt;
		local all_widths = ret:param(&amp;#039;image_width&amp;#039;, &amp;#039;f&amp;#039;)&lt;br /&gt;
		local max_width = max_width(all_widths)&lt;br /&gt;
		local image_td = { tag = &amp;#039;argd&amp;#039;, content = &amp;#039;image&amp;#039;, class = &amp;#039;infobox-bonuses-image&amp;#039;, css = {width = max_width..&amp;#039;px&amp;#039;}, rowspan = image_rowspan }&lt;br /&gt;
		table.insert(first_row, image_td)&lt;br /&gt;
	end&lt;br /&gt;
	local altimage_defined = ret:paramGrep(&amp;#039;altimage&amp;#039;, function(x) return (infobox.isDefined(x) and x or &amp;#039;N/A&amp;#039;) ~= &amp;#039;N/A&amp;#039; end)&lt;br /&gt;
	if altimage_defined then&lt;br /&gt;
		local altall_widths = ret:param(&amp;#039;altimage_width&amp;#039;, &amp;#039;f&amp;#039;)&lt;br /&gt;
		local altmax_width = max_width(altall_widths)&lt;br /&gt;
		local altimage_td = { tag = &amp;#039;argd&amp;#039;, content = &amp;#039;altimage&amp;#039;, class = &amp;#039;infobox-bonuses-image&amp;#039;, css = {width = altmax_width..&amp;#039;px&amp;#039;}, rowspan = image_rowspan }&lt;br /&gt;
		table.insert(first_row, altimage_td)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not (image_defined or altimage_define) then&lt;br /&gt;
		ret:addClass(&amp;#039;infobox-bonuses-noimage&amp;#039;) -- for mobile skin purposes&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	ret:addRow(first_row)&lt;br /&gt;
	:pad(5)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:White dagger.png|alt=Stab|link=Stab]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:White scimitar.png|alt=Slash|link=Slash]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:White warhammer.png|alt=Crush|link=Crush]]&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|alt=Magic|link=Magic]]&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|alt=Ranged|link=Ranged]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;astab&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;aslash&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;acrush&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;amagic&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;arange&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(5)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Defence icon.png|alt=|link=Equipment Stats#Defence bonuses]]&amp;amp;nbsp;[[Equipment Stats#Defence bonuses|Defence bonuses]]&amp;#039;, colspan = &amp;#039;5&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(5)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:White dagger.png|alt=Stab|link=Stab]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:White scimitar.png|alt=Slash|link=Slash]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:White warhammer.png|alt=Crush|link=Crush]]&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|alt=Magic|link=Magic]]&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|alt=Ranged|link=Ranged]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;dstab&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;dslash&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;dcrush&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;dmagic&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;drange&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(5)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Melee.png|alt=|link=Equipment Stats#Other bonuses]]&amp;amp;nbsp;[[Equipment Stats#Other bonuses|Other bonuses]]&amp;#039;, colspan = &amp;#039;4&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Slot&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(5)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Strength icon.png|alt=Strength|link=Strength bonus]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Ranged Strength icon.png|alt=Ranged|link=Ranged Strength]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[File:Magic Damage icon.png|alt=Magic damage|link=Magic damage]]&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|alt=Prayer|link=Prayer]]&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argh&amp;#039;, content = &amp;#039;slot_image&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;str&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;rstr&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;mdmg&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;prayer&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;slot_link&amp;#039;, class = &amp;#039;infobox-nested&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(5)&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;
function numericarg_smw(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif tonumber(arg) ~= nil then&lt;br /&gt;
		return arg&lt;br /&gt;
	end&lt;br /&gt;
	return nil&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;
-- If the arg is numeric, return the signed version (starts with + or -)&lt;br /&gt;
function signednumericarg(arg, arg_name)&lt;br /&gt;
	local _arg = numericarg(arg, arg_name)&lt;br /&gt;
	if tonumber(_arg) ~= nil then&lt;br /&gt;
		return signed(_arg)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sign the arg and append a percent sign&lt;br /&gt;
function signedpercentnumericarg(arg, arg_name)&lt;br /&gt;
	local _arg = signednumericarg(arg, arg_name)&lt;br /&gt;
	if _arg ~= nil then&lt;br /&gt;
		return _arg..&amp;#039;%&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return attack speed for smw, this should either be a positive integer, &lt;br /&gt;
-- or in the case of a special value a negative number like:&lt;br /&gt;
-- -1 for &amp;#039;No&amp;#039; or &amp;#039;N/A&amp;#039; values&lt;br /&gt;
-- -2 for &amp;#039;Random&amp;#039; and &amp;#039;Varies&amp;#039; values.&lt;br /&gt;
function speedargsmw(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local numarg = tonumber(arg)&lt;br /&gt;
    local lowarg = string.lower(arg)&lt;br /&gt;
&lt;br /&gt;
    if numarg ~= nil then&lt;br /&gt;
        return numarg&lt;br /&gt;
    elseif lowarg == &amp;#039;n/a&amp;#039; or lowarg == &amp;#039;no&amp;#039; then&lt;br /&gt;
        return -1&lt;br /&gt;
    elseif lowarg == &amp;#039;random&amp;#039; or lowarg == &amp;#039;varies&amp;#039; then&lt;br /&gt;
        return -2&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return the appropriate slot image&lt;br /&gt;
function slotarg(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local _arg = string.lower(arg)&lt;br /&gt;
	if slots[_arg] ~= nil then&lt;br /&gt;
		return string.format(&amp;#039;[[File:%s slot.png|alt=%s slot table|link=%s slot table]]&amp;#039;, _arg, mw.language.getContentLanguage():ucfirst(_arg), _arg)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;&amp;lt;strong &amp;#039; ..&lt;br /&gt;
			&amp;#039;title=&amp;quot;The &amp;amp;quot;slot&amp;amp;quot; parameter should be a valid slot name.&amp;quot; &amp;#039; ..&lt;br /&gt;
			&amp;#039;class=&amp;quot;error&amp;quot;&amp;#039; ..&lt;br /&gt;
			&amp;#039;style=&amp;quot;cursor:help; border-bottom:1px dotted;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			&amp;#039;ERR&amp;lt;/strong&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function slot_link_arg(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;[[&amp;#039;..arg..&amp;#039; slot table|List]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return attack range for smw, this should either be a positive integer,&lt;br /&gt;
-- or in the case of a special value a negative number like:&lt;br /&gt;
-- -1 for &amp;#039;No&amp;#039; or &amp;#039;N/A&amp;#039; values&lt;br /&gt;
function attackrangeargsmw(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lowarg = string.lower(arg)&lt;br /&gt;
	if lowarg == &amp;#039;staff&amp;#039; then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    local numarg = tonumber(arg)&lt;br /&gt;
	if numarg ~= nil then&lt;br /&gt;
		return numarg&lt;br /&gt;
	elseif lowarg == &amp;#039;no&amp;#039; or lowarg == &amp;#039;n/a&amp;#039; then&lt;br /&gt;
		return -1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function imagearg(image, caption, argname)&lt;br /&gt;
	if not infobox.isDefined(image) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if string.lower(image) == &amp;#039;no&amp;#039; then&lt;br /&gt;
		return &amp;#039;N/A&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local clean_result = clean({file=image, maxW = 300, maxH = 350})&lt;br /&gt;
	if clean_result == nil then&lt;br /&gt;
		return image..&amp;#039;[[Category:Needs equipment image]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local image_string, width, height = unpack(clean_result)&lt;br /&gt;
	local caption_string = &amp;#039;&amp;#039;&lt;br /&gt;
	if infobox.isDefined(caption) and string.lower(caption) ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
		caption_string = &amp;#039;&amp;lt;br /&amp;gt;&amp;lt;span class=&amp;quot;infobox-bonuses-image-caption&amp;quot;&amp;gt;&amp;#039; .. caption .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return image_string..caption_string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function image_width_arg(image, argname)&lt;br /&gt;
	if not infobox.isDefined(image) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local clean_result = clean({file=image, maxW = 300, maxH = 350})&lt;br /&gt;
	if clean_result == nil then&lt;br /&gt;
		return image..&amp;#039;[[Category:Needs equipment image]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local image_string, width, height = unpack(clean_result)&lt;br /&gt;
	return width&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get the max width from all versions, minimum 100&lt;br /&gt;
function max_width(all_widths)&lt;br /&gt;
	local res = tonumber(all_widths.d) or 100&lt;br /&gt;
	for i, width in ipairs(all_widths.switches or {100}) do&lt;br /&gt;
		res = math.max(res, tonumber(width) or 100)&lt;br /&gt;
	end&lt;br /&gt;
	return math.max(res, 100)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addcategories(args, catargs)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;#039;slot&amp;#039;] then&lt;br /&gt;
		local slot_d = args[&amp;#039;slot&amp;#039;].d&lt;br /&gt;
		if slots[slot_d] then&lt;br /&gt;
			table.insert(ret, slots[slot_d])&lt;br /&gt;
		end&lt;br /&gt;
		if args[&amp;#039;slot&amp;#039;].switches then&lt;br /&gt;
			for _, slot_i in ipairs(args[&amp;#039;slot&amp;#039;].switches) do&lt;br /&gt;
				if slots[slot_i] then&lt;br /&gt;
					table.insert(ret, slots[slot_i])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&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;
--[=[ DEBUG COPYPASTA&lt;br /&gt;
= p._main({astab = 7, aslash = 45, acrush = -2, amagic = 0, arange = 0, dstab = 0, dslash = 1, dcrush = 0, dmagic = 0, drange = 0, str = 44, rstr = 0, mdmg = 0, prayer = 0, slot = &amp;#039;weapon&amp;#039;, speed = 4, attackrange = 1, combatstyle = &amp;#039;hacksword&amp;#039;, image = &amp;#039;[[File:Rune scimitar equipped.png|100px]]&amp;#039;, caption = &amp;#039;A total chad wielding a ROOONE SKIMMAY.&amp;#039;})&lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>