<?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%3ARuneReq</id>
	<title>Module:RuneReq - 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%3ARuneReq"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:RuneReq&amp;action=history"/>
	<updated>2026-05-05T16:27:53Z</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:RuneReq&amp;diff=35103&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local p = {}  local paramTest = require(&#039;Module:Paramtest&#039;) local onMain = require(&#039;Module:Mainonly&#039;).on_main local yesNo = require(&#039;Module:Yesno&#039;)  local trim = mw.text.trim local jsonDecode = mw.text.jsonDecode  -- Get Spell JSON from specific spell page function p.loadData(spell) 	local query = { 		&#039;&#039; .. spell .. &#039;&#039;, 		&#039;Spell JSON::+&#039;, 		&#039;?=#-&#039;, 		&#039;?Spell JSON = json&#039;, 		offset = 0, 		limit = 500, 	} 	local t1 = os.clock() 	local smwData = mw.smw.ask(query) 	l...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:RuneReq&amp;diff=35103&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:58Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local paramTest = require(&amp;#039;Module:Paramtest&amp;#039;) local onMain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main local yesNo = require(&amp;#039;Module:Yesno&amp;#039;)  local trim = mw.text.trim local jsonDecode = mw.text.jsonDecode  -- Get Spell JSON from specific spell page function p.loadData(spell) 	local query = { 		&amp;#039;&lt;a href=&quot;/index.php?title=%27_.._spell_.._%27&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;&amp;#039; .. spell .. &amp;#039; (page does not exist)&quot;&gt;&amp;#039; .. spell .. &amp;#039;&lt;/a&gt;&amp;#039;, 		&amp;#039;&lt;a href=&quot;/index.php?title=Spell_JSON::%2B&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Spell JSON::+ (page does not exist)&quot;&gt;Spell JSON::+&lt;/a&gt;&amp;#039;, 		&amp;#039;?=#-&amp;#039;, 		&amp;#039;?Spell JSON = json&amp;#039;, 		offset = 0, 		limit = 500, 	} 	local t1 = os.clock() 	local smwData = mw.smw.ask(query) 	l...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local paramTest = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
local onMain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main&lt;br /&gt;
local yesNo = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local trim = mw.text.trim&lt;br /&gt;
local jsonDecode = mw.text.jsonDecode&lt;br /&gt;
&lt;br /&gt;
-- Get Spell JSON from specific spell page&lt;br /&gt;
function p.loadData(spell)&lt;br /&gt;
	local query = {&lt;br /&gt;
		&amp;#039;[[&amp;#039; .. spell .. &amp;#039;]]&amp;#039;,&lt;br /&gt;
		&amp;#039;[[Spell JSON::+]]&amp;#039;,&lt;br /&gt;
		&amp;#039;?=#-&amp;#039;,&lt;br /&gt;
		&amp;#039;?Spell JSON = json&amp;#039;,&lt;br /&gt;
		offset = 0,&lt;br /&gt;
		limit = 500,&lt;br /&gt;
	}&lt;br /&gt;
	local t1 = os.clock()&lt;br /&gt;
	local smwData = mw.smw.ask(query)&lt;br /&gt;
	local t2 = os.clock()&lt;br /&gt;
	if((not smwData) or (#smwData == 0)) then&lt;br /&gt;
		error(&amp;#039;Failed to find spell: &amp;#039; .. spell ..&amp;#039; - ensure it is spelled correctly. No results from SMW.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	mw.log(string.format(&amp;#039;SMW: Found %i, offset %i, limit %i, time elapsed %.3f ms&amp;#039;, #smwData, query.offset, query.limit, (t2 - t1) * 1000))&lt;br /&gt;
	&lt;br /&gt;
	smwData = mw.text.jsonDecode(smwData[1].json)&lt;br /&gt;
	&lt;br /&gt;
	-- Format rune quantities identically to buildOutput input parameters&lt;br /&gt;
	local itemCount = {}&lt;br /&gt;
	for _, runeData in ipairs(smwData.runes) do&lt;br /&gt;
		table.insert(itemCount, { runeData.rune, runeData.quantity } )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return itemCount, smwData.bolts, smwData.staff, smwData.prayer&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.setSMW(itemCount, bolts, staff, prayer)&lt;br /&gt;
	local jsonObject = { staff = staff, bolts = bolts, prayer = prayer, runes = {} }&lt;br /&gt;
	local materialNames = {}&lt;br /&gt;
	for _, rune in ipairs(itemCount) do&lt;br /&gt;
		if(rune[2] &amp;gt; 0) then&lt;br /&gt;
			table.insert(jsonObject.runes, {rune = rune[1], quantity = rune[2]})&lt;br /&gt;
			table.insert(materialNames, rune[1])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if(bolts ~= nil) then&lt;br /&gt;
		table.insert(materialNames, bolts)&lt;br /&gt;
	end&lt;br /&gt;
	local smwMap = {&lt;br /&gt;
		[&amp;#039;Uses material&amp;#039;] = materialNames,&lt;br /&gt;
		[&amp;#039;Spell JSON&amp;#039;] = mw.text.jsonEncode(jsonObject),&lt;br /&gt;
	}&lt;br /&gt;
	for _, v in pairs(smwMap) do&lt;br /&gt;
		-- Trim {{!}}foo&lt;br /&gt;
		if(type(v) == &amp;#039;table&amp;#039;) then&lt;br /&gt;
			for j, w in ipairs(v) do&lt;br /&gt;
				v[j] = mw.text.split(w, &amp;#039;|&amp;#039;)[1]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mw.smw.set(smwMap)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.buildOutput(itemCount, bolts, staff, prayer)&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	if(staff ~= nil) then&lt;br /&gt;
		if(not staff:match(&amp;#039;staff&amp;#039;)) then&lt;br /&gt;
			staff = trim(staff) .. &amp;#039; staff&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. &amp;#039;[[File:&amp;#039; .. staff .. &amp;#039;.png|20px|&amp;#039; .. staff .. &amp;#039;|link=&amp;#039; .. staff .. &amp;#039;]] &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	for _, rune in ipairs(itemCount) do&lt;br /&gt;
		if(rune[2] &amp;gt; 0) then&lt;br /&gt;
			local hoverText = rune[1]&lt;br /&gt;
			if(rune[1]:match(&amp;#039;rune&amp;#039;)) then&lt;br /&gt;
				hoverText = rune[1]:sub(1, rune[1]:find(&amp;#039; &amp;#039;) - 1)&lt;br /&gt;
			end&lt;br /&gt;
			ret = ret .. &amp;#039;&amp;lt;sup&amp;gt;&amp;#039; .. rune[2] .. &amp;#039;&amp;lt;/sup&amp;gt;[[File:&amp;#039; .. rune[1] .. &amp;#039;.png|20px|&amp;#039; .. hoverText .. &amp;#039;|link=&amp;#039; .. rune[1] .. &amp;#039;]] &amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if(bolts ~= nil) then&lt;br /&gt;
		if(not bolts:match(&amp;#039;bolts&amp;#039;)) then&lt;br /&gt;
			bolts = trim(bolts) .. &amp;#039; bolts&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. &amp;#039;&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;[[File:&amp;#039; .. bolts .. &amp;#039; 5.png|20px|&amp;#039; .. bolts .. &amp;#039;|link=&amp;#039; .. bolts .. &amp;#039;]] &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if(prayer) then&lt;br /&gt;
		ret = ret .. &amp;#039;&amp;lt;sup&amp;gt;&amp;#039; .. prayer .. &amp;#039;&amp;lt;/sup&amp;gt;[[File:Prayer icon.png|20px|Prayer points|link=Prayer]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if(ret == &amp;#039;&amp;#039;) then&lt;br /&gt;
		ret = &amp;#039;None&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;lt;span style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local smw = yesNo(paramTest.default_to(args.smw, false))&lt;br /&gt;
	&lt;br /&gt;
	-- Ouput everything based on a spell using smw&lt;br /&gt;
	local spell = paramTest.default_to(args.spell, nil)&lt;br /&gt;
	local data = {}&lt;br /&gt;
	if(spell ~= nil) then&lt;br /&gt;
		return p.buildOutput(p.loadData(spell))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- To reserve input order, the only option is unanmed args with |air\3&lt;br /&gt;
	local itemCount = { { &amp;#039;Law rune&amp;#039;, paramTest.default_to(tonumber(args.law), 0) },&lt;br /&gt;
						{ &amp;#039;Soul rune&amp;#039;, paramTest.default_to(tonumber(args.soul), 0) },&lt;br /&gt;
						{ &amp;#039;Astral rune&amp;#039;, paramTest.default_to(tonumber(args.astral), 0) },&lt;br /&gt;
						{ &amp;#039;Cosmic rune&amp;#039;, paramTest.default_to(tonumber(args.cosmic), 0) },&lt;br /&gt;
						{ &amp;#039;Body rune&amp;#039;, paramTest.default_to(tonumber(args.body), 0) },&lt;br /&gt;
						{ &amp;#039;Nature rune&amp;#039;, paramTest.default_to(tonumber(args.nature), 0) },&lt;br /&gt;
						{ &amp;#039;Death rune&amp;#039;, paramTest.default_to(tonumber(args.death), 0) },&lt;br /&gt;
						{ &amp;#039;Chaos rune&amp;#039;, paramTest.default_to(tonumber(args.chaos), 0) },&lt;br /&gt;
						{ &amp;#039;Mind rune&amp;#039;, paramTest.default_to(tonumber(args.mind), 0) },&lt;br /&gt;
						{ &amp;#039;Blood rune&amp;#039;, paramTest.default_to(tonumber(args.blood), 0) },&lt;br /&gt;
						{ &amp;#039;Wrath rune&amp;#039;, paramTest.default_to(tonumber(args.wrath), 0) },&lt;br /&gt;
						{ &amp;#039;Water rune&amp;#039;, paramTest.default_to(tonumber(args.water), 0) },&lt;br /&gt;
						{ &amp;#039;Earth rune&amp;#039;, paramTest.default_to(tonumber(args.earth), 0) },&lt;br /&gt;
						{ &amp;#039;Air rune&amp;#039; , paramTest.default_to(tonumber(args.air), 0) },&lt;br /&gt;
						{ &amp;#039;Fire rune&amp;#039;, paramTest.default_to(tonumber(args.fire), 0) },&lt;br /&gt;
						{ &amp;#039;Banana&amp;#039;, paramTest.default_to(tonumber(args.banana), 0) },&lt;br /&gt;
						{ &amp;#039;Unpowered orb&amp;#039;, paramTest.default_to(tonumber(args.orb), 0) },&lt;br /&gt;
						{ &amp;#039;Basalt&amp;#039;, paramTest.default_to(tonumber(args.basalt), 0) },&lt;br /&gt;
						{ &amp;#039;Efh salt&amp;#039;, paramTest.default_to(tonumber(args[&amp;#039;efh salt&amp;#039;]), 0) },&lt;br /&gt;
						{ &amp;#039;Te salt&amp;#039;, paramTest.default_to(tonumber(args[&amp;#039;te salt&amp;#039;]), 0) },&lt;br /&gt;
						{ &amp;#039;Urt salt&amp;#039;, paramTest.default_to(tonumber(args[&amp;#039;urt salt&amp;#039;]), 0) },&lt;br /&gt;
					}&lt;br /&gt;
	&lt;br /&gt;
	local bolts = paramTest.default_to(args.bolts, nil)&lt;br /&gt;
	local staff = paramTest.default_to(args.staff, nil)&lt;br /&gt;
	local prayer = paramTest.default_to(args.prayer, nil)&lt;br /&gt;
	&lt;br /&gt;
	if(smw and onMain()) then&lt;br /&gt;
		p.setSMW(itemCount, bolts, staff, prayer)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.buildOutput(itemCount, bolts, staff, prayer)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	--mw.logObject(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>