<?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%3AMiscellania_calculator</id>
	<title>Module:Miscellania 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%3AMiscellania_calculator"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Miscellania_calculator&amp;action=history"/>
	<updated>2026-05-05T16:28:06Z</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:Miscellania_calculator&amp;diff=35050&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local p = {}  --Add favour maintaining every other day, every 3 days sorta thing to help see how much it drops off by as times go on  local coins = require(&#039;Module:Coins&#039;)._amount local gePrice = require(&#039;Module:Exchange&#039;)._price local yesNo = require(&#039;module:Yesno&#039;)  local materials = { 	{category = &#039;Wood (Maple)&#039;, inverseCost = 160, icon = &#039;Maple logs.png&#039;}, 	{category = &#039;Mining (Coal)&#039;, inverseCost = 98, icon = &#039;Coal.png&#039;}, 	{category = &#039;Fishing (Raw)&#039;, inverseCost =...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Miscellania_calculator&amp;diff=35050&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  --Add favour maintaining every other day, every 3 days sorta thing to help see how much it drops off by as times go on  local coins = require(&amp;#039;Module:Coins&amp;#039;)._amount local gePrice = require(&amp;#039;Module:Exchange&amp;#039;)._price local yesNo = require(&amp;#039;module:Yesno&amp;#039;)  local materials = { 	{category = &amp;#039;Wood (Maple)&amp;#039;, inverseCost = 160, icon = &amp;#039;Maple logs.png&amp;#039;}, 	{category = &amp;#039;Mining (Coal)&amp;#039;, inverseCost = 98, icon = &amp;#039;Coal.png&amp;#039;}, 	{category = &amp;#039;Fishing (Raw)&amp;#039;, inverseCost =...&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;
--Add favour maintaining every other day, every 3 days sorta thing to help see how much it drops off by as times go on&lt;br /&gt;
&lt;br /&gt;
local coins = require(&amp;#039;Module:Coins&amp;#039;)._amount&lt;br /&gt;
local gePrice = require(&amp;#039;Module:Exchange&amp;#039;)._price&lt;br /&gt;
local yesNo = require(&amp;#039;module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local materials = {&lt;br /&gt;
	{category = &amp;#039;Wood (Maple)&amp;#039;, inverseCost = 160, icon = &amp;#039;Maple logs.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Mining (Coal)&amp;#039;, inverseCost = 98, icon = &amp;#039;Coal.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Fishing (Raw)&amp;#039;, inverseCost = 158, icon = &amp;#039;Raw tuna.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Fishing (Cooked)&amp;#039;, inverseCost = 158, icon = &amp;#039;Tuna.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Herbs&amp;#039;, inverseCost = 11, icon = &amp;#039;Grimy tarromin.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Flax&amp;#039;, inverseCost = 224, icon = &amp;#039;Flax.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Hardwood (Mahogany)&amp;#039;, inverseCost = 40, icon = &amp;#039;Mahogany logs.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Hardwood (Teak)&amp;#039;, inverseCost = 54, icon = &amp;#039;Teak logs.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Hardwood (Both)&amp;#039;, inverseCost = 47, icon = &amp;#039;Mahogany logs.png&amp;#039;},&lt;br /&gt;
	{category = &amp;#039;Farm (Seeds)&amp;#039;, inverseCost = 86, icon = &amp;#039;Potato seed 5.png&amp;#039;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local priceOverrides = {&lt;br /&gt;
	[&amp;#039;Bird nest (ring)&amp;#039;] = gePrice(&amp;#039;Bird nest (empty)&amp;#039;) + 40/100 * gePrice(&amp;#039;Sapphire ring&amp;#039;) + 35/100 * gePrice(&amp;#039;Gold ring&amp;#039;) + 15/100 * gePrice(&amp;#039;Emerald ring&amp;#039;) + 9/100 * gePrice(&amp;#039;Ruby ring&amp;#039;) + 1/100 * gePrice(&amp;#039;Diamond ring&amp;#039;),&lt;br /&gt;
	[&amp;#039;Bird nest (blue egg)&amp;#039;] = gePrice(&amp;#039;Bird nest (empty)&amp;#039;),&lt;br /&gt;
	[&amp;#039;Bird nest (green egg)&amp;#039;] = gePrice(&amp;#039;Bird nest (empty)&amp;#039;),&lt;br /&gt;
	[&amp;#039;Bird nest (red egg)&amp;#039;] = gePrice(&amp;#039;Bird nest (empty)&amp;#039;),&lt;br /&gt;
	[&amp;#039;Bird nest (seed)&amp;#039;] = gePrice(&amp;#039;Bird nest (empty)&amp;#039;) + 214/1011 * gePrice(&amp;#039;Acorn&amp;#039;) + 170/1011 * gePrice(&amp;#039;Apple tree seed&amp;#039;) + 135/1011 * gePrice(&amp;#039;Willow seed&amp;#039;) + 108/1011 * gePrice(&amp;#039;Banana tree seed&amp;#039;) + 85/1011 * gePrice(&amp;#039;Orange tree seed&amp;#039;) + 68/1011 * gePrice(&amp;#039;Curry tree seed&amp;#039;) + 54/1011 * gePrice(&amp;#039;Maple seed&amp;#039;) + 42/1011 * gePrice(&amp;#039;Pineapple seed&amp;#039;) + 34/1011 * gePrice(&amp;#039;Papaya tree seed&amp;#039;) + 27/1011 * gePrice(&amp;#039;Yew seed&amp;#039;) + 22/1011 * gePrice(&amp;#039;Palm tree seed&amp;#039;) + 17/1011 * gePrice(&amp;#039;Calquat tree seed&amp;#039;) + 11/1011 * 0 + 6/1011 * gePrice(&amp;#039;Dragonfruit tree seed&amp;#039;) + 5/1011 * gePrice(&amp;#039;Magic seed&amp;#039;) + 4/1011 * gePrice(&amp;#039;Teak seed&amp;#039;) + 4/1011 * gePrice(&amp;#039;Mahogany seed&amp;#039;) + 3/1011 * gePrice(&amp;#039;Celastrus seed&amp;#039;) + 2/1011 * gePrice(&amp;#039;Redwood tree seed&amp;#039;),&lt;br /&gt;
	[&amp;#039;Clue scroll (easy)&amp;#039;] = 0,&lt;br /&gt;
	[&amp;#039;Spirit seed&amp;#039;] = 0,&lt;br /&gt;
}&lt;br /&gt;
local rateTables = {}&lt;br /&gt;
rateTables[&amp;#039;Nests&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Bird nest (seed)&amp;#039;, rate = 65/100},&lt;br /&gt;
	{item = &amp;#039;Bird nest (ring)&amp;#039;, rate = 32/100},&lt;br /&gt;
	{item = &amp;#039;Bird nest (green egg)&amp;#039;, rate = 1/100},&lt;br /&gt;
	{item = &amp;#039;Bird nest (blue egg)&amp;#039;, rate = 1/100},&lt;br /&gt;
	{item = &amp;#039;Bird nest (red egg)&amp;#039;, rate = 1/100},&lt;br /&gt;
}&lt;br /&gt;
rateTables[&amp;#039;Mining gems&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Uncut sapphire&amp;#039;, rate = 32/58},&lt;br /&gt;
	{item = &amp;#039;Uncut emerald&amp;#039;, rate = 16/58},&lt;br /&gt;
	{item = &amp;#039;Uncut ruby&amp;#039;, rate = 8/58},&lt;br /&gt;
	{item = &amp;#039;Uncut diamond&amp;#039;, rate = 2/58},&lt;br /&gt;
}&lt;br /&gt;
rateTables[&amp;#039;Fishing loot&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Uncut sapphire&amp;#039;, rate = 32/104},&lt;br /&gt;
	{item = &amp;#039;Uncut emerald&amp;#039;, rate = 16/104},&lt;br /&gt;
	{item = &amp;#039;Uncut ruby&amp;#039;, rate = 8/104},&lt;br /&gt;
	{item = &amp;#039;Uncut diamond&amp;#039;, rate = 2/104},&lt;br /&gt;
	{item = &amp;#039;Casket&amp;#039;, rate = 32/104},&lt;br /&gt;
	{item = &amp;#039;Fremennik boots&amp;#039;, rate = 4/104},&lt;br /&gt;
	{item = &amp;#039;Fremennik gloves&amp;#039;, rate = 4/104},&lt;br /&gt;
	{item = &amp;#039;Loop half of key&amp;#039;, rate = 1/104},&lt;br /&gt;
	{item = &amp;#039;Tooth half of key&amp;#039;, rate = 1/104},&lt;br /&gt;
	{item = &amp;#039;Clue scroll (easy)&amp;#039;, rate = 4/104},&lt;br /&gt;
}&lt;br /&gt;
rateTables[&amp;#039;Herbs&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Grimy tarromin&amp;#039;, rate = 10/46},&lt;br /&gt;
	{item = &amp;#039;Grimy harralander&amp;#039;, rate = 9/46},&lt;br /&gt;
	{item = &amp;#039;Grimy irit leaf&amp;#039;, rate = 6/46},&lt;br /&gt;
	{item = &amp;#039;Grimy avantoe&amp;#039;, rate = 6/46},&lt;br /&gt;
	{item = &amp;#039;Grimy ranarr weed&amp;#039;, rate = 3/46},&lt;br /&gt;
	{item = &amp;#039;Grimy kwuarm&amp;#039;, rate = 3/46},&lt;br /&gt;
	{item = &amp;#039;Grimy cadantine&amp;#039;, rate = 3/46},&lt;br /&gt;
	{item = &amp;#039;Grimy dwarf weed&amp;#039;, rate = 3/46},&lt;br /&gt;
	{item = &amp;#039;Grimy lantadyme&amp;#039;, rate = 3/46},&lt;br /&gt;
}&lt;br /&gt;
rateTables[&amp;#039;Herb seeds&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Guam seed&amp;#039;, rate = 320/1000},&lt;br /&gt;
	{item = &amp;#039;Marrentill seed&amp;#039;, rate = 218/1000},&lt;br /&gt;
	{item = &amp;#039;Tarromin seed&amp;#039;, rate = 149/1000},&lt;br /&gt;
	{item = &amp;#039;Harralander seed&amp;#039;, rate = 101/1000},&lt;br /&gt;
	{item = &amp;#039;Ranarr seed&amp;#039;, rate = 69/1000, maximum = 2},&lt;br /&gt;
	{item = &amp;#039;Toadflax seed&amp;#039;, rate = 47/1000},&lt;br /&gt;
	{item = &amp;#039;Irit seed&amp;#039;, rate = 32/1000},&lt;br /&gt;
	{item = &amp;#039;Avantoe seed&amp;#039;, rate = 22/1000},&lt;br /&gt;
	{item = &amp;#039;Kwuarm seed&amp;#039;, rate = 15/1000},&lt;br /&gt;
	{item = &amp;#039;Snapdragon seed&amp;#039;, rate = 10/1000},&lt;br /&gt;
	{item = &amp;#039;Cadantine seed&amp;#039;, rate = 7/1000},&lt;br /&gt;
	{item = &amp;#039;Lantadyme seed&amp;#039;, rate = 5/1000},&lt;br /&gt;
	{item = &amp;#039;Dwarf weed seed&amp;#039;, rate = 3/1000},&lt;br /&gt;
	{item = &amp;#039;Torstol seed&amp;#039;, rate = 2/1000},&lt;br /&gt;
}&lt;br /&gt;
rateTables[&amp;#039;Flax seeds&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Guam seed&amp;#039;, rate = 320/1000},&lt;br /&gt;
	{item = &amp;#039;Marrentill seed&amp;#039;, rate = 218/1000},&lt;br /&gt;
	{item = &amp;#039;Tarromin seed&amp;#039;, rate = 149/1000},&lt;br /&gt;
	{item = &amp;#039;Harralander seed&amp;#039;, rate = 101/1000},&lt;br /&gt;
	{item = &amp;#039;Ranarr seed&amp;#039;, rate = 69/1000},&lt;br /&gt;
	{item = &amp;#039;Toadflax seed&amp;#039;, rate = 47/1000},&lt;br /&gt;
	{item = &amp;#039;Irit seed&amp;#039;, rate = 32/1000},&lt;br /&gt;
	{item = &amp;#039;Avantoe seed&amp;#039;, rate = 22/1000},&lt;br /&gt;
	{item = &amp;#039;Kwuarm seed&amp;#039;, rate = 15/1000},&lt;br /&gt;
	{item = &amp;#039;Snapdragon seed&amp;#039;, rate = 10/1000},&lt;br /&gt;
	{item = &amp;#039;Cadantine seed&amp;#039;, rate = 7/1000},&lt;br /&gt;
	{item = &amp;#039;Lantadyme seed&amp;#039;, rate = 5/1000},&lt;br /&gt;
	{item = &amp;#039;Dwarf weed seed&amp;#039;, rate = 3/1000},&lt;br /&gt;
	{item = &amp;#039;Torstol seed&amp;#039;, rate = 2/1000},&lt;br /&gt;
}&lt;br /&gt;
rateTables[&amp;#039;Tree seeds&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Acorn&amp;#039;, rate = 214/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Apple tree seed&amp;#039;, rate = 170/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Willow seed&amp;#039;, rate = 135/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Banana tree seed&amp;#039;, rate = 108/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Orange tree seed&amp;#039;, rate = 85/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Curry tree seed&amp;#039;, rate = 68/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Maple seed&amp;#039;, rate = 54/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Pineapple seed&amp;#039;, rate = 42/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Papaya tree seed&amp;#039;, rate = 34/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Yew seed&amp;#039;, rate = 27/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Palm tree seed&amp;#039;, rate = 22/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Calquat tree seed&amp;#039;, rate = 17/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Spirit seed&amp;#039;, rate = 11/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Dragonfruit tree seed&amp;#039;, rate = 6/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Magic seed&amp;#039;, rate = 5/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Teak seed&amp;#039;, rate = 4/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Mahogany seed&amp;#039;, rate = 4/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Celastrus seed&amp;#039;, rate = 3/1011, maximum = 4},&lt;br /&gt;
	{item = &amp;#039;Redwood tree seed&amp;#039;, rate = 2/1011, maximum = 4},&lt;br /&gt;
}&lt;br /&gt;
-- we don&amp;#039;t know the actual rates, but these are very close...&lt;br /&gt;
rateTables[&amp;#039;Seeds&amp;#039;] = {&lt;br /&gt;
	{item = &amp;#039;Potato seed&amp;#039;, rate = 1567735/8858315},&lt;br /&gt;
	{item = &amp;#039;Onion seed&amp;#039;, rate = 1180708/8858315},&lt;br /&gt;
	{item = &amp;#039;Cabbage seed&amp;#039;, rate = 619972/8858315},&lt;br /&gt;
	{item = &amp;#039;Tomato seed&amp;#039;, rate = 561932/8858315},&lt;br /&gt;
	{item = &amp;#039;Barley seed&amp;#039;, rate = 497148/8858315},&lt;br /&gt;
	{item = &amp;#039;Hammerstone seed&amp;#039;, rate = 494318/8858315},&lt;br /&gt;
	{item = &amp;#039;Marigold seed&amp;#039;, rate = 409668/8858315},&lt;br /&gt;
	{item = &amp;#039;Asgarnian seed&amp;#039;, rate = 369067/8858315},&lt;br /&gt;
	{item = &amp;#039;Jute seed&amp;#039;, rate = 368455/8858315},&lt;br /&gt;
	{item = &amp;#039;Redberry seed&amp;#039;, rate = 343409/8858315},&lt;br /&gt;
	{item = &amp;#039;Nasturtium seed&amp;#039;, rate = 270351/8858315},&lt;br /&gt;
	{item = &amp;#039;Yanillian seed&amp;#039;, rate = 245383/8858315},&lt;br /&gt;
	{item = &amp;#039;Cadavaberry seed&amp;#039;, rate = 242164/8858315},&lt;br /&gt;
	{item = &amp;#039;Sweetcorn seed&amp;#039;, rate = 197249/8858315},&lt;br /&gt;
	{item = &amp;#039;Rosemary seed&amp;#039;, rate = 173977/8858315},&lt;br /&gt;
	{item = &amp;#039;Dwellberry seed&amp;#039;, rate = 172110/8858315},&lt;br /&gt;
	{item = &amp;#039;Guam seed&amp;#039;, rate = 135320/8858315},&lt;br /&gt;
	{item = &amp;#039;Woad seed&amp;#039;, rate = 129804/8858315},&lt;br /&gt;
	{item = &amp;#039;Krandorian seed&amp;#039;, rate = 122649/8858315},&lt;br /&gt;
	{item = &amp;#039;Limpwurt seed&amp;#039;, rate = 103567/8858315},&lt;br /&gt;
	{item = &amp;#039;Strawberry seed&amp;#039;, rate = 97042/8858315},&lt;br /&gt;
	{item = &amp;#039;Marrentill seed&amp;#039;, rate = 93062/8858315},&lt;br /&gt;
	{item = &amp;#039;Jangerberry seed&amp;#039;, rate = 69567/8858315},&lt;br /&gt;
	{item = &amp;#039;Wildblood seed&amp;#039;, rate = 62976/8858315},&lt;br /&gt;
	{item = &amp;#039;Tarromin seed&amp;#039;, rate = 62551/8858315},&lt;br /&gt;
	{item = &amp;#039;Watermelon seed&amp;#039;, rate = 47071/8858315},&lt;br /&gt;
	{item = &amp;#039;Harralander seed&amp;#039;, rate = 43198/8858315},&lt;br /&gt;
	{item = &amp;#039;Snape grass seed&amp;#039;, rate = 34094/8858315},&lt;br /&gt;
	{item = &amp;#039;Whiteberry seed&amp;#039;, rate = 24586/8858315},&lt;br /&gt;
	{item = &amp;#039;Toadflax seed&amp;#039;, rate = 19990/8858315},&lt;br /&gt;
	{item = &amp;#039;Mushroom spore&amp;#039;, rate = 19266/8858315},&lt;br /&gt;
	{item = &amp;#039;Irit seed&amp;#039;, rate = 14019/8858315},&lt;br /&gt;
	{item = &amp;#039;Belladonna seed&amp;#039;, rate = 11594/8858315},&lt;br /&gt;
	{item = &amp;#039;Avantoe seed&amp;#039;, rate = 9229/8858315},&lt;br /&gt;
	{item = &amp;#039;Poison ivy seed&amp;#039;, rate = 9199/8858315},&lt;br /&gt;
	{item = &amp;#039;Cactus seed&amp;#039;, rate = 7850/8858315},&lt;br /&gt;
	{item = &amp;#039;Kwuarm seed&amp;#039;, rate = 6599/8858315},&lt;br /&gt;
	{item = &amp;#039;Ranarr seed&amp;#039;, rate = 5305/8858315, maximum = 2},&lt;br /&gt;
	{item = &amp;#039;Snapdragon seed&amp;#039;, rate = 3901/8858315},&lt;br /&gt;
	{item = &amp;#039;Potato cactus seed&amp;#039;, rate = 3790/8858315},&lt;br /&gt;
	{item = &amp;#039;Cadantine seed&amp;#039;, rate = 2817/8858315},&lt;br /&gt;
	{item = &amp;#039;Lantadyme seed&amp;#039;, rate = 2097/8858315},&lt;br /&gt;
	{item = &amp;#039;Seaweed spore&amp;#039;, rate = 1508/8858315},&lt;br /&gt;
	{item = &amp;#039;Dwarf weed seed&amp;#039;, rate = 1208/8858315},&lt;br /&gt;
	{item = &amp;#039;Torstol seed&amp;#039;, rate = 810/8858315},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- from WP&lt;br /&gt;
function choose(n,k)&lt;br /&gt;
	if k &amp;lt; 0 or k &amp;gt; n then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	if k == 0 or k == n then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
	k = math.min(k, n-k) -- symmetry&lt;br /&gt;
	c = 1&lt;br /&gt;
	for i=0,k-1 do&lt;br /&gt;
		c = c * (n-i) / (i+1)&lt;br /&gt;
	end&lt;br /&gt;
	return c&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function computeExpectedValueWithMax(n, p, maximum)&lt;br /&gt;
	local ev = 0&lt;br /&gt;
	local p_mass = 0&lt;br /&gt;
	for k = 0, maximum-1 do&lt;br /&gt;
		local prob_k = choose(n, k) * math.pow(p, k) * math.pow(1 - p, n - k)&lt;br /&gt;
		p_mass = p_mass + prob_k&lt;br /&gt;
		ev = ev + k * prob_k&lt;br /&gt;
	end&lt;br /&gt;
	return ev + (1 - p_mass) * maximum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addFromRateTable(outputs, rateTable, amount)&lt;br /&gt;
	for _, row in ipairs(rateTable) do&lt;br /&gt;
		local ev = row.rate * amount&lt;br /&gt;
		if row.maximum ~= nil then&lt;br /&gt;
			ev = computeExpectedValueWithMax(amount, row.rate, row.maximum)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(outputs, {item = row.item, qty = ev})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local days = tonumber(args.days)&lt;br /&gt;
	local workers = tonumber(args.workers)&lt;br /&gt;
	local royalTrouble = yesNo(args.royalTrouble)&lt;br /&gt;
	local startingFavour = tonumber(args.startingFavour)&lt;br /&gt;
	local constantFavour = yesNo(args.constantFavour)&lt;br /&gt;
	local startingCoffer = tonumber(args.startingCoffer)&lt;br /&gt;
&lt;br /&gt;
	return p._main(days, workers, royalTrouble, startingFavour, constantFavour, startingCoffer)&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function p._main(days, workers, royalTrouble, startingFavour, constantFavour, startingCoffer)&lt;br /&gt;
	local resourcePoints = 0&lt;br /&gt;
	local currentFavour = startingFavour&lt;br /&gt;
	local currentCoffer = startingCoffer&lt;br /&gt;
	&lt;br /&gt;
	local favourSubtraction = 160&lt;br /&gt;
	local cofferMax = 50000&lt;br /&gt;
	local maxWorkers = 10&lt;br /&gt;
	if royalTrouble then&lt;br /&gt;
		favourSubtraction = 131&lt;br /&gt;
		cofferMax = 75000&lt;br /&gt;
		maxWorkers = 15&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for day=1,days do&lt;br /&gt;
		local cofferReduction = math.min(5 + math.floor(currentCoffer / 10), cofferMax, currentCoffer)&lt;br /&gt;
		currentCoffer = currentCoffer - cofferReduction&lt;br /&gt;
		local workerEffectiveness = math.floor(cofferReduction * 100 / 8333)&lt;br /&gt;
		-- need to test: is it math.floor(workerEffectiveness / 100) * currentFavour?&lt;br /&gt;
		resourcePoints = resourcePoints + math.floor(workerEffectiveness * currentFavour / 100)&lt;br /&gt;
		if currentFavour &amp;gt; 32 and not constantFavour then&lt;br /&gt;
			-- TODO: this is not precisely correct and is off by one on certain favour amounts&lt;br /&gt;
			currentFavour = math.max(32, currentFavour - math.ceil((favourSubtraction - currentFavour) / 15))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	resourcePoints = math.min(262143, resourcePoints)&lt;br /&gt;
	&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local evs = {}&lt;br /&gt;
	for _, materialInfo in ipairs(materials) do&lt;br /&gt;
		local outputs = {}&lt;br /&gt;
		&lt;br /&gt;
		local baseQty = math.floor(workers * materialInfo.inverseCost * resourcePoints / 2048)&lt;br /&gt;
		if materialInfo.category == &amp;#039;Wood (Maple)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Maple logs&amp;#039;, qty = baseQty}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Nests&amp;#039;], math.min(999, math.floor(baseQty / 100)))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Mining (Coal)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Coal&amp;#039;, qty = baseQty}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Mining gems&amp;#039;], math.floor(baseQty / 200 + 0.5))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Fishing (Raw)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Raw tuna&amp;#039;, qty = math.floor(0.5 * baseQty)},&lt;br /&gt;
				{item = &amp;#039;Raw swordfish&amp;#039;, qty = math.floor(0.15 * baseQty)}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Fishing loot&amp;#039;], math.floor(baseQty / 200))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Fishing (Cooked)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Tuna&amp;#039;, qty = math.floor(0.5 * baseQty)},&lt;br /&gt;
				{item = &amp;#039;Swordfish&amp;#039;, qty = math.floor(0.15 * baseQty)}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Fishing loot&amp;#039;], math.floor(baseQty / 200))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Herbs&amp;#039; then&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Herbs&amp;#039;], baseQty)&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Herb seeds&amp;#039;], math.floor(baseQty / 100))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Flax&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Flax&amp;#039;, qty = baseQty}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Flax seeds&amp;#039;], math.floor(baseQty / 600))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Hardwood (Mahogany)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Mahogany logs&amp;#039;, qty = baseQty}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Nests&amp;#039;], math.floor(baseQty / 350))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Hardwood (Teak)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Teak logs&amp;#039;, qty = baseQty}&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Nests&amp;#039;], math.floor(baseQty / 350))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Hardwood (Both)&amp;#039; then&lt;br /&gt;
			outputs = {&lt;br /&gt;
				{item = &amp;#039;Mahogany logs&amp;#039;, qty = math.floor(0.5 * baseQty)},&lt;br /&gt;
				{item = &amp;#039;Teak logs&amp;#039;, qty = math.floor(0.5 * baseQty)}			&lt;br /&gt;
			}&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Nests&amp;#039;], math.floor(baseQty / 350))&lt;br /&gt;
		elseif materialInfo.category == &amp;#039;Farm (Seeds)&amp;#039; then&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Seeds&amp;#039;], baseQty)&lt;br /&gt;
			addFromRateTable(outputs, rateTables[&amp;#039;Tree seeds&amp;#039;], math.floor(baseQty / 200))&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local materialTable = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
		table.insert(ret, &amp;#039;===&amp;#039; .. materialInfo.category .. &amp;#039;===&amp;#039;)&lt;br /&gt;
		materialTable:addClass(&amp;#039;wikitable align-center-1&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Item&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 2):done()&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Price&amp;#039;):done()&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Expected amount&amp;#039;):done()&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Expected value&amp;#039;):done()&lt;br /&gt;
		&lt;br /&gt;
		local totalExpectation = 0&lt;br /&gt;
		for _, row in ipairs(outputs) do&lt;br /&gt;
			local price = priceOverrides[row.item]&lt;br /&gt;
			if price == nil then&lt;br /&gt;
				price = gePrice(row.item)&lt;br /&gt;
			end&lt;br /&gt;
			totalExpectation = totalExpectation + price * row.qty&lt;br /&gt;
			materialTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[File:&amp;#039; .. row.item .. &amp;#039;.png|link=&amp;#039; .. row.item .. &amp;#039;]]&amp;#039;):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[&amp;#039; .. row.item .. &amp;#039;]]&amp;#039;):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(coins(price)):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(string.format(&amp;#039;%.3f&amp;#039;, row.qty)):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(coins(price * row.qty)):done()&lt;br /&gt;
		end&lt;br /&gt;
		materialTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 4):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(coins(totalExpectation)):done()&lt;br /&gt;
		table.insert(ret, tostring(materialTable))&lt;br /&gt;
		table.insert(evs, {category = materialInfo.category, icon = materialInfo.icon, expectedValue = totalExpectation})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local favourVerb = &amp;#039;never regaining favour, &amp;#039;&lt;br /&gt;
	if constantFavour then&lt;br /&gt;
		favourVerb = &amp;#039;regaining favour every day, &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if days == 1 then&lt;br /&gt;
		favourVerb = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local message = &amp;#039;With [[Royal Trouble]] &amp;#039; ..  (royalTrouble and &amp;#039;done&amp;#039; or &amp;#039;not done&amp;#039;) .. &amp;#039; and a starting coffer of &amp;#039; .. coins(startingCoffer) .. &amp;#039; and going for &amp;#039; ..&lt;br /&gt;
		days .. &amp;#039; &amp;#039; .. (days &amp;gt; 1 and &amp;#039;days&amp;#039; or &amp;#039;day&amp;#039;) .. &amp;#039;, &amp;#039; .. favourVerb .. &amp;#039;you will end up with &amp;#039; ..&lt;br /&gt;
		resourcePoints .. &amp;#039; resource points, costing &amp;#039; .. coins(startingCoffer - currentCoffer) .. &amp;#039;.\n\nWith &amp;#039; .. workers ..&lt;br /&gt;
		&amp;#039; workers, that gives the following expected values:&amp;#039;&lt;br /&gt;
	local evTable = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
	evTable:addClass(&amp;#039;wikitable sortable align-center-1&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Worker Choice&amp;#039;):attr(&amp;#039;colspan&amp;#039;, 2):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Expected value&amp;#039;):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Expected profit&amp;#039;):done()&lt;br /&gt;
	&lt;br /&gt;
	for _, ev in ipairs(evs) do&lt;br /&gt;
		evTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[File:&amp;#039; .. ev.icon .. &amp;#039;|link=#&amp;#039; .. ev.category .. &amp;#039;]]&amp;#039;):done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[#&amp;#039; .. ev.category .. &amp;#039;|&amp;#039; .. ev.category .. &amp;#039;]]&amp;#039;):done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(coins(ev.expectedValue)):done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(coins(ev.expectedValue + (currentCoffer - startingCoffer) * workers / maxWorkers)):done()	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return message .. &amp;#039;\n\n&amp;#039; .. tostring(evTable) .. &amp;#039;\n\n&amp;#039; .. table.concat(ret, &amp;#039;\n\n&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>