<?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%3ATheatre_of_Blood_calculator</id>
	<title>Module:Theatre of Blood calculator - 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%3ATheatre_of_Blood_calculator"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Theatre_of_Blood_calculator&amp;action=history"/>
	<updated>2026-05-14T22:22:29Z</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:Theatre_of_Blood_calculator&amp;diff=35190&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-- &lt;nowiki&gt; local geprice = require(&#039;Module:Exchange&#039;)._price  local p = {}  local uniques = { 	{name = &#039;Avernic defender hilt&#039;, chance = 8}, 	{name = &#039;Ghrazi rapier&#039;, chance = 2}, 	{name = &#039;Sanguinesti staff (uncharged)&#039;, chance = 2}, 	{name = &#039;Justiciar faceguard&#039;, chance = 2}, 	{name = &#039;Justiciar chestguard&#039;, chance = 2}, 	{name = &#039;Justiciar legguards&#039;, chance = 2}, 	{name = &#039;Scythe of vitur (uncharged)&#039;, chance = 1} } local uniquestotal = 19  local normies = { 	{name...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Theatre_of_Blood_calculator&amp;diff=35190&amp;oldid=prev"/>
		<updated>2024-10-16T23:13:16Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local geprice = require(&amp;#039;Module:Exchange&amp;#039;)._price  local p = {}  local uniques = { 	{name = &amp;#039;Avernic defender hilt&amp;#039;, chance = 8}, 	{name = &amp;#039;Ghrazi rapier&amp;#039;, chance = 2}, 	{name = &amp;#039;Sanguinesti staff (uncharged)&amp;#039;, chance = 2}, 	{name = &amp;#039;Justiciar faceguard&amp;#039;, chance = 2}, 	{name = &amp;#039;Justiciar chestguard&amp;#039;, chance = 2}, 	{name = &amp;#039;Justiciar legguards&amp;#039;, chance = 2}, 	{name = &amp;#039;Scythe of vitur (uncharged)&amp;#039;, chance = 1} } local uniquestotal = 19  local normies = { 	{name...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local geprice = require(&amp;#039;Module:Exchange&amp;#039;)._price&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local uniques = {&lt;br /&gt;
	{name = &amp;#039;Avernic defender hilt&amp;#039;, chance = 8},&lt;br /&gt;
	{name = &amp;#039;Ghrazi rapier&amp;#039;, chance = 2},&lt;br /&gt;
	{name = &amp;#039;Sanguinesti staff (uncharged)&amp;#039;, chance = 2},&lt;br /&gt;
	{name = &amp;#039;Justiciar faceguard&amp;#039;, chance = 2},&lt;br /&gt;
	{name = &amp;#039;Justiciar chestguard&amp;#039;, chance = 2},&lt;br /&gt;
	{name = &amp;#039;Justiciar legguards&amp;#039;, chance = 2},&lt;br /&gt;
	{name = &amp;#039;Scythe of vitur (uncharged)&amp;#039;, chance = 1}&lt;br /&gt;
}&lt;br /&gt;
local uniquestotal = 19&lt;br /&gt;
&lt;br /&gt;
local normies = {&lt;br /&gt;
	{name = &amp;#039;Vial of blood&amp;#039;, min = 50, chance = 2},&lt;br /&gt;
	{name = &amp;#039;Death rune&amp;#039;, min = 500, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Blood rune&amp;#039;, min = 500, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Swamp tar&amp;#039;, min = 500, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Coal&amp;#039;, min = 500, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Gold ore&amp;#039;, min = 300, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Molten glass&amp;#039;, min = 200, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Adamantite ore&amp;#039;, min = 130, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Runite ore&amp;#039;, min = 60, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Wine of zamorak&amp;#039;, min = 50, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Potato cactus&amp;#039;, min = 50, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy cadantine&amp;#039;, min = 50, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy avantoe&amp;#039;, min = 40, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy toadflax&amp;#039;, min = 37, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy kwuarm&amp;#039;, min = 36, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy irit leaf&amp;#039;, min = 34, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy ranarr weed&amp;#039;, min = 30, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy snapdragon&amp;#039;, min = 27, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy lantadyme&amp;#039;, min = 26, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy dwarf weed&amp;#039;, min = 24, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Grimy torstol&amp;#039;, min = 20, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Battlestaff&amp;#039;, min = 15, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Mahogany seed&amp;#039;, min = 10, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Rune battleaxe&amp;#039;, min = 4, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Rune platebody&amp;#039;, min = 4, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Rune chainbody&amp;#039;, min = 4, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Palm tree seed&amp;#039;, min = 3, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Yew seed&amp;#039;, min = 3, chance = 1},&lt;br /&gt;
	{name = &amp;#039;Magic seed&amp;#039;, min = 3, chance = 1},&lt;br /&gt;
}&lt;br /&gt;
local normiestotal = 30&lt;br /&gt;
&lt;br /&gt;
local noobies = {&lt;br /&gt;
	{name = &amp;#039;Cabbage&amp;#039;},&lt;br /&gt;
	{name = &amp;#039;Message (Theatre of Blood)&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p.calc(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.calc(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local maxpoints = 18*args.teammates + 14&lt;br /&gt;
	if(args.splitdrops == &amp;#039;true&amp;#039;) then&lt;br /&gt;
		local teampoints = math.max(0,(6*args.teammates - args.weskip)*3 + 14 - args.wedeath*4)&lt;br /&gt;
		local ratio = teampoints/maxpoints&lt;br /&gt;
		local dropchance = 1/9.1*ratio&lt;br /&gt;
		if(teampoints == 0) then&lt;br /&gt;
			local price = geprice(&amp;#039;Cabbage&amp;#039;)&lt;br /&gt;
			local ret = {}&lt;br /&gt;
			ret[#ret+1] = mw.ustring.format(&amp;#039;Team score: %i/%i&amp;lt;br&amp;gt;Score fraction: %.2f%%.&amp;lt;br&amp;gt;Team unique drop chance: %.2f%%&amp;lt;br&amp;gt;&amp;#039;, teampoints, maxpoints, ratio*100, dropchance*100)&lt;br /&gt;
			ret[#ret+1] = &amp;#039;Value per completion: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={price}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
			ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableHead&amp;#039;}&lt;br /&gt;
			for _, item in ipairs(noobies) do&lt;br /&gt;
				ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsLine&amp;#039;, args = {Name=item.name,Quantity=1,Rarity=&amp;#039;Always&amp;#039;,smw=&amp;#039;no&amp;#039;}}&lt;br /&gt;
			end&lt;br /&gt;
			ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableBottom&amp;#039;}&lt;br /&gt;
			return table.concat(ret,&amp;#039;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local uniqueprice = 0&lt;br /&gt;
		local normieprice = 0&lt;br /&gt;
		for _, item in ipairs(uniques) do&lt;br /&gt;
			local baseprice = geprice(item.name)&lt;br /&gt;
			local chance = dropchance*item.chance/uniquestotal/args.teammates&lt;br /&gt;
			local quantity = 1&lt;br /&gt;
			uniqueprice = uniqueprice + baseprice*chance*quantity&lt;br /&gt;
		end&lt;br /&gt;
		for _, item in ipairs(normies) do&lt;br /&gt;
			local baseprice = geprice(item.name)&lt;br /&gt;
			local chance = 3*item.chance/normiestotal*(1-dropchance/args.teammates)&lt;br /&gt;
			local quantity = (math.floor(item.min*ratio)+math.floor(math.floor(item.min*ratio)*1.2))/2&lt;br /&gt;
			normieprice = normieprice + baseprice*chance*quantity&lt;br /&gt;
		end&lt;br /&gt;
		local price = uniqueprice + normieprice&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local ret = {}&lt;br /&gt;
		ret[#ret+1] = mw.ustring.format(&amp;#039;Team score: %i/%i&amp;lt;br&amp;gt;Score fraction: %.2f%%.&amp;lt;br&amp;gt;Team unique drop chance: %.2f%%&amp;lt;br&amp;gt;&amp;#039;, teampoints, maxpoints, ratio*100, dropchance*100)&lt;br /&gt;
		ret[#ret+1] = &amp;#039;Value per completion: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={price}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
		ret[#ret+1] = &amp;#039;Portion from uniques: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={uniqueprice}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
		ret[#ret+1] = &amp;#039;Portion from regular loot: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={normieprice}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
		ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableHead&amp;#039;}&lt;br /&gt;
		for _, item in ipairs(uniques) do&lt;br /&gt;
			ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsLine&amp;#039;, args = {Name=item.name,Quantity=1,Rarity=mw.ustring.format(&amp;#039;1/%.3f&amp;#039;,uniquestotal/item.chance/dropchance),smw=&amp;#039;no&amp;#039;,Rolls=1/args.teammates}}&lt;br /&gt;
		end&lt;br /&gt;
		for _, item in ipairs(normies) do&lt;br /&gt;
			ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsLine&amp;#039;, args = {Name=item.name,Quantity=mw.ustring.format(&amp;#039;%i-%i&amp;#039;,item.min*ratio,math.floor(item.min*ratio)*1.2),Rarity=mw.ustring.format(&amp;#039;%i/%i&amp;#039;,item.chance,normiestotal),smw=&amp;#039;no&amp;#039;,Rolls=3}}&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableBottom&amp;#039;}&lt;br /&gt;
		return table.concat(ret,&amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	local playerpoints = math.max(0,(6-args.iskip)*3 + args.imvp - args.ideath*4)&lt;br /&gt;
	local teampoints = math.max(playerpoints,(6*args.teammates - args.iskip - args.theyskip)*3 + 14 - (args.ideath + args.theydeath)*4)&lt;br /&gt;
	local ratio = teampoints/maxpoints&lt;br /&gt;
	local dropchance = 1/9.1*ratio&lt;br /&gt;
	local dropchancesolo = dropchance*playerpoints/teampoints&lt;br /&gt;
&lt;br /&gt;
	if(playerpoints == 0) then&lt;br /&gt;
		local price = geprice(&amp;#039;Cabbage&amp;#039;)&lt;br /&gt;
		local ret = {}&lt;br /&gt;
		ret[#ret+1] = mw.ustring.format(&amp;#039;Player score: %i/32.&amp;lt;br&amp;gt;Player unique drop chance: %.2f%%.&amp;lt;br&amp;gt;Team score: %i/%i&amp;lt;br&amp;gt;Team score fraction: %.2f%%.&amp;lt;br&amp;gt;Team unique drop chance: %.2f%%&amp;lt;br&amp;gt;&amp;#039;, playerpoints, dropchancesolo*100, teampoints, maxpoints, ratio*100, dropchance*100)&lt;br /&gt;
		ret[#ret+1] = &amp;#039;Value per completion: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={price}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
		ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableHead&amp;#039;}&lt;br /&gt;
		for _, item in ipairs(noobies) do&lt;br /&gt;
			ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsLine&amp;#039;, args = {Name=item.name,Quantity=1,Rarity=&amp;#039;Always&amp;#039;,smw=&amp;#039;no&amp;#039;}}&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableBottom&amp;#039;}&lt;br /&gt;
		return table.concat(ret,&amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local uniqueprice = 0&lt;br /&gt;
	local normieprice = 0&lt;br /&gt;
	for _, item in ipairs(uniques) do&lt;br /&gt;
		local baseprice = geprice(item.name)&lt;br /&gt;
		local chance = dropchancesolo*item.chance/uniquestotal&lt;br /&gt;
		local quantity = 1&lt;br /&gt;
		uniqueprice = uniqueprice + baseprice*chance*quantity&lt;br /&gt;
	end&lt;br /&gt;
	for _, item in ipairs(normies) do&lt;br /&gt;
		local baseprice = geprice(item.name)&lt;br /&gt;
		local chance = 3*item.chance/normiestotal*(1-dropchancesolo)&lt;br /&gt;
		local quantity = (math.floor(item.min*ratio)+math.floor(math.floor(item.min*ratio)*1.2))/2&lt;br /&gt;
		normieprice = normieprice + baseprice*chance*quantity&lt;br /&gt;
	end&lt;br /&gt;
	local price = uniqueprice + normieprice&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	ret[#ret+1] = mw.ustring.format(&amp;#039;Player score: %i/32.&amp;lt;br&amp;gt;Player unique drop chance: %.2f%%.&amp;lt;br&amp;gt;Team score: %i/%i&amp;lt;br&amp;gt;Team score fraction: %.2f%%.&amp;lt;br&amp;gt;Team unique drop chance: %.2f%%&amp;lt;br&amp;gt;&amp;#039;, playerpoints, dropchancesolo*100, teampoints, maxpoints, ratio*100, dropchance*100)&lt;br /&gt;
	ret[#ret+1] = &amp;#039;Value per completion: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={price}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
	ret[#ret+1] = &amp;#039;Portion from uniques: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={uniqueprice}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
	ret[#ret+1] = &amp;#039;Portion from regular loot: &amp;#039; .. frame:expandTemplate{title=&amp;#039;Coins&amp;#039;,args={normieprice}} .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
	ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableHead&amp;#039;}&lt;br /&gt;
	for _, item in ipairs(uniques) do&lt;br /&gt;
		ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsLine&amp;#039;, args = {Name=item.name,Quantity=1,Rarity=mw.ustring.format(&amp;#039;1/%i&amp;#039;,uniquestotal/item.chance/dropchancesolo),smw=&amp;#039;no&amp;#039;}}&lt;br /&gt;
	end&lt;br /&gt;
	for _, item in ipairs(normies) do&lt;br /&gt;
		ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsLine&amp;#039;, args = {Name=item.name,Quantity=mw.ustring.format(&amp;#039;%i-%i&amp;#039;,item.min*ratio,math.floor(item.min*ratio)*1.2),Rarity=mw.ustring.format(&amp;#039;%i/%i&amp;#039;,item.chance,normiestotal),smw=&amp;#039;no&amp;#039;,Rolls=3}}&lt;br /&gt;
	end&lt;br /&gt;
	ret[#ret+1] = frame:expandTemplate{title=&amp;#039;DropsTableBottom&amp;#039;}&lt;br /&gt;
	return table.concat(ret,&amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>