<?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%3AAverage_drop_value%2FSandbox</id>
	<title>Module:Average drop value/Sandbox - 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%3AAverage_drop_value%2FSandbox"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;action=history"/>
	<updated>2026-05-05T13:56:51Z</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:Average_drop_value/Sandbox&amp;diff=38373&amp;oldid=prev</id>
		<title>Alex at 10:22, 17 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;diff=38373&amp;oldid=prev"/>
		<updated>2024-10-17T10:22:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;amp;diff=38373&amp;amp;oldid=35104&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;diff=35104&amp;oldid=prev</id>
		<title>Alex at 23:12, 16 October 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;diff=35104&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;amp;diff=35104&amp;amp;oldid=34417&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;diff=34417&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local curr = require(&#039;Module:Currency&#039;)._amount local dpl = require(&#039;Module:DPLlua&#039;) local geprices = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;)  local p = {}  -- TODO move to helper function local a_an_arr = { 	a = true, 	e = true, 	i = true, 	o = true, 	u = true } function a_an(x) 	local _x = mw.text.truncate(string.lower(x), 1, &#039;&#039;) 	if a_an_arr[_x] then 		return &#039;an&#039; 	end 	return &#039;a&#039; end  function calcValue(item, lowqty, highqty, rarity, rolls, alchprice, options)...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Average_drop_value/Sandbox&amp;diff=34417&amp;oldid=prev"/>
		<updated>2024-10-16T23:00:36Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local curr = require(&amp;#039;Module:Currency&amp;#039;)._amount local dpl = require(&amp;#039;Module:DPLlua&amp;#039;) local geprices = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;)  local p = {}  -- TODO move to helper function local a_an_arr = { 	a = true, 	e = true, 	i = true, 	o = true, 	u = true } function a_an(x) 	local _x = mw.text.truncate(string.lower(x), 1, &amp;#039;&amp;#039;) 	if a_an_arr[_x] then 		return &amp;#039;an&amp;#039; 	end 	return &amp;#039;a&amp;#039; end  function calcValue(item, lowqty, highqty, rarity, rolls, alchprice, options)...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local curr = require(&amp;#039;Module:Currency&amp;#039;)._amount&lt;br /&gt;
local dpl = require(&amp;#039;Module:DPLlua&amp;#039;)&lt;br /&gt;
local geprices = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- TODO move to helper function&lt;br /&gt;
local a_an_arr = {&lt;br /&gt;
	a = true,&lt;br /&gt;
	e = true,&lt;br /&gt;
	i = true,&lt;br /&gt;
	o = true,&lt;br /&gt;
	u = true&lt;br /&gt;
}&lt;br /&gt;
function a_an(x)&lt;br /&gt;
	local _x = mw.text.truncate(string.lower(x), 1, &amp;#039;&amp;#039;)&lt;br /&gt;
	if a_an_arr[_x] then&lt;br /&gt;
		return &amp;#039;an&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;a&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function calcValue(item, lowqty, highqty, rarity, rolls, alchprice, options)&lt;br /&gt;
	local avgqty = (tonumber(lowqty) + tonumber(highqty)) / 2&lt;br /&gt;
	local rar_good, price&lt;br /&gt;
	-- parse price&lt;br /&gt;
	local i_lo = item:lower()&lt;br /&gt;
	if i_lo == &amp;#039;brimstone key&amp;#039; and options.brimstone ~= nil then&lt;br /&gt;
		price = tonumber(mw.getCurrentFrame():preprocess(&amp;#039;{{KDTValue}}&amp;#039;))&lt;br /&gt;
	elseif i_lo == &amp;#039;ecumenical key&amp;#039; then&lt;br /&gt;
		if options.ecumenical ~= nil then&lt;br /&gt;
			price = 61500&lt;br /&gt;
		else&lt;br /&gt;
			price = 0&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		price = geprices[item] or alchprice or 0&lt;br /&gt;
	end&lt;br /&gt;
	if not price then&lt;br /&gt;
		mw.log(&amp;#039;0 price for &amp;#039;..item)&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	-- parse rarity&lt;br /&gt;
	if rarity:lower() == &amp;#039;always&amp;#039; then&lt;br /&gt;
		rarity = 1&lt;br /&gt;
	else&lt;br /&gt;
		rarity = rarity:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		rar_good, rarity= pcall(mw.ext.ParserFunctions.expr, rarity)&lt;br /&gt;
		if not rar_good then&lt;br /&gt;
		mw.log(&amp;#039;0 rarity for &amp;#039;..item)&lt;br /&gt;
			return 0&lt;br /&gt;
		end&lt;br /&gt;
		rarity = tonumber(rarity)&lt;br /&gt;
		if not rarity then&lt;br /&gt;
		mw.log(&amp;#039;0 rarity for &amp;#039;..item)&lt;br /&gt;
			return 0&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local val = price * avgqty * rarity * rolls&lt;br /&gt;
	mw.log(string.format(&amp;#039;item %s: %s * %s * %s * %s = %s&amp;#039;, item, price, lowqty, rarity, rolls, val))&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _DPLcontains(arr,s)&lt;br /&gt;
	for k, v in ipairs(arr) do&lt;br /&gt;
		if v == s then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getDropData(mobs)&lt;br /&gt;
	--used in [[Module:Bestiary]] too&lt;br /&gt;
	local query = {}&lt;br /&gt;
	local smw = {}&lt;br /&gt;
	for i,v in ipairs(mobs) do&lt;br /&gt;
		mw.log(&amp;quot;dropData&amp;quot;, v)&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;[[Dropped from::&amp;#039;..v..&amp;#039;]]&amp;#039;,&lt;br /&gt;
			&amp;#039;?Drop JSON&amp;#039;,&lt;br /&gt;
			limit = 500&lt;br /&gt;
		}&lt;br /&gt;
		smw = mw.smw.ask(query)&lt;br /&gt;
		mw.logObject(smw)&lt;br /&gt;
		if smw and smw ~= {} and smw ~=&amp;#039;&amp;#039; then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return smw&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.totalvalfromdata(data,itemOptions,category, categoryFilter, exclude, excludeFilter)&lt;br /&gt;
	--used in [[Module:Bestiary]] too&lt;br /&gt;
	if (not data) or data == {} or data ==&amp;#039;&amp;#039; then &lt;br /&gt;
		return &amp;#039;?&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local totalval = 0&lt;br /&gt;
	local options = itemOptions or {}&lt;br /&gt;
	for i,v in ipairs(data) do&lt;br /&gt;
		local j = mw.text.jsonDecode(v[&amp;#039;Drop JSON&amp;#039;] or &amp;#039;{}&amp;#039;)&lt;br /&gt;
		if (not category) or _DPLcontains(categoryFilter,j[&amp;#039;Dropped item&amp;#039;]) then&lt;br /&gt;
			if (not exclude) or (not _DPLcontains(excludeFilter,j[&amp;#039;Dropped item&amp;#039;])) then&lt;br /&gt;
				totalval = totalval + calcValue(j[&amp;#039;Dropped item&amp;#039;], j[&amp;#039;Quantity Low&amp;#039;], j[&amp;#039;Quantity High&amp;#039;], j[&amp;#039;Rarity&amp;#039;], j[&amp;#039;Rolls&amp;#039;], j[&amp;#039;Drop Value&amp;#039;], options)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return totalval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.totalval(mobs, itemOptions, category, categoryFilter, exclude, excludeFilter)&lt;br /&gt;
	local data = p.getDropData(mobs)&lt;br /&gt;
	return p.totalvalfromdata(data,itemOptions,category, categoryFilter, exclude, excludeFilter)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p._main(frame, frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(frame, args)&lt;br /&gt;
	local pageName = mw.title.getCurrentTitle().text&lt;br /&gt;
	local mobroot = &amp;#039;&amp;#039;&lt;br /&gt;
	local moblevel = &amp;#039;&amp;#039;&lt;br /&gt;
	local mob = &amp;#039;&amp;#039;&lt;br /&gt;
	local mobs = {}&lt;br /&gt;
	--mobs serves as a list of fallbacks to get drop data, e.g. maybe smw does not find data for barbarian#level 8 because they are the generic barbarian drop, but will display the data from just barbarian if mobs is {&amp;#039;Barbarian#level 8&amp;#039;, &amp;#039;Barbarian&amp;#039;}&lt;br /&gt;
	if args.mob or args[1] then &lt;br /&gt;
		mob = args.mob or args[1]&lt;br /&gt;
		mobroot, moblevel = mob:match(&amp;#039;([^#]*)#?(.*)&amp;#039;)&lt;br /&gt;
		table.insert(mobs, mob)&lt;br /&gt;
		table.insert(mobs, mobroot)&lt;br /&gt;
	else&lt;br /&gt;
		mob = pageName&lt;br /&gt;
		mobroot = pageName&lt;br /&gt;
		table.insert(mobs, pageName)&lt;br /&gt;
	end&lt;br /&gt;
	local mobname = mob&lt;br /&gt;
	&lt;br /&gt;
	if args.mobname then&lt;br /&gt;
		mobname = args.mobname&lt;br /&gt;
	elseif moblevel ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		mobname = string.format(&amp;#039;%s (%s)&amp;#039;,mobroot, moblevel)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if mobroot ~= pageName then &lt;br /&gt;
		mobname = string.format(&amp;#039;[[%s|%s]]&amp;#039;,mobroot,mobname) &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local killname = args.killname or &amp;#039;kill&amp;#039;&lt;br /&gt;
	local itemOptions = {&lt;br /&gt;
		brimstone = args.brimstone,&lt;br /&gt;
		ecumenical = args.ecumenical&lt;br /&gt;
	}&lt;br /&gt;
	local categoryFilter = {}&lt;br /&gt;
	local excludeFilter = {}&lt;br /&gt;
	local catReportString = &amp;quot;&amp;quot;&lt;br /&gt;
	if args.category then&lt;br /&gt;
		categoryFilter = dpl.ask({&lt;br /&gt;
			namespace = &amp;#039;&amp;#039;,&lt;br /&gt;
			ignorecase = &amp;#039;true&amp;#039;,&lt;br /&gt;
			category = args.category,&lt;br /&gt;
			allowcachedresults = &amp;#039;true&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
		catReportString = &amp;#039;counting only &amp;#039;..(args.category:lower())..&amp;#039; &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if args.exclude then&lt;br /&gt;
		excludeFilter = dpl.ask({&lt;br /&gt;
			namespace = &amp;#039;&amp;#039;,&lt;br /&gt;
			ignorecase = &amp;#039;true&amp;#039;,&lt;br /&gt;
			category = args.exclude,&lt;br /&gt;
			allowcachedresults = &amp;#039;true&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
		catReportString = catReportString..&amp;#039;excluding all &amp;#039;..(args.exclude:lower())..&amp;#039; &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local totalval = p.totalval(mobs, itemOptions, args.category, categoryFilter, args.exclude, excludeFilter)&lt;br /&gt;
	if args.round and totalval ~= &amp;#039;?&amp;#039; then&lt;br /&gt;
		totalval = math.floor(totalval)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if totalval == &amp;#039;?&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if args.raw then&lt;br /&gt;
		return totalval&lt;br /&gt;
	elseif args.brimstone ~= nil then&lt;br /&gt;
		return string.format(&amp;#039;The average %s %s while on a [[Konar]] task %sis worth %s.&amp;#039;, mobname, killname, catReportString, curr(totalval, &amp;#039;coins&amp;#039;))&lt;br /&gt;
	elseif args.ecumenical ~= nil then&lt;br /&gt;
		return string.format(&amp;#039;The average %s %s while in the [[Wilderness God Wars Dungeon]] %sis worth %s.&amp;#039;, mobname, killname, catReportString, curr(totalval, &amp;#039;coins&amp;#039;))&lt;br /&gt;
	else&lt;br /&gt;
		return string.format(&amp;#039;The average %s %s %sis worth %s.&amp;#039;, mobname, killname, catReportString, curr(totalval, &amp;#039;coins&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>