<?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%3ATombs_of_Amascut_loot</id>
	<title>Module:Tombs of Amascut loot - 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%3ATombs_of_Amascut_loot"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Tombs_of_Amascut_loot&amp;action=history"/>
	<updated>2026-05-03T03:29:47Z</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:Tombs_of_Amascut_loot&amp;diff=34352&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local gePrice = require(&#039;Module:Exchange&#039;)._price local coins = require(&#039;Module:Less Stupid Coins&#039;)._amount local tables = require(&#039;Module:Tables&#039;) local lang = mw.language.getContentLanguage()  local p = {}  local PATH_INVOCATIONS = {None = 0, Pathseeker = 1, Pathfinder = 2, Pathmaster = 3} local NORMAL_LOOT = { 	{item = &quot;Coins&quot;, divisor = 1}, 	{item = &quot;Death rune&quot;, divisor = 20}, 	{item = &quot;Soul rune&quot;, divisor = 40}, 	{item = &quot;Gold ore&quot;, divisor = 90}, 	{item = &quot;Dragon...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Tombs_of_Amascut_loot&amp;diff=34352&amp;oldid=prev"/>
		<updated>2024-10-16T13:35:32Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local gePrice = require(&amp;#039;Module:Exchange&amp;#039;)._price local coins = require(&amp;#039;Module:Less Stupid Coins&amp;#039;)._amount local tables = require(&amp;#039;Module:Tables&amp;#039;) local lang = mw.language.getContentLanguage()  local p = {}  local PATH_INVOCATIONS = {None = 0, Pathseeker = 1, Pathfinder = 2, Pathmaster = 3} local NORMAL_LOOT = { 	{item = &amp;quot;Coins&amp;quot;, divisor = 1}, 	{item = &amp;quot;Death rune&amp;quot;, divisor = 20}, 	{item = &amp;quot;Soul rune&amp;quot;, divisor = 40}, 	{item = &amp;quot;Gold ore&amp;quot;, divisor = 90}, 	{item = &amp;quot;Dragon...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local gePrice = require(&amp;#039;Module:Exchange&amp;#039;)._price&lt;br /&gt;
local coins = require(&amp;#039;Module:Less Stupid Coins&amp;#039;)._amount&lt;br /&gt;
local tables = require(&amp;#039;Module:Tables&amp;#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local PATH_INVOCATIONS = {None = 0, Pathseeker = 1, Pathfinder = 2, Pathmaster = 3}&lt;br /&gt;
local NORMAL_LOOT = {&lt;br /&gt;
	{item = &amp;quot;Coins&amp;quot;, divisor = 1},&lt;br /&gt;
	{item = &amp;quot;Death rune&amp;quot;, divisor = 20},&lt;br /&gt;
	{item = &amp;quot;Soul rune&amp;quot;, divisor = 40},&lt;br /&gt;
	{item = &amp;quot;Gold ore&amp;quot;, divisor = 90},&lt;br /&gt;
	{item = &amp;quot;Dragon dart tip&amp;quot;, divisor = 100},&lt;br /&gt;
	{item = &amp;quot;Mahogany logs&amp;quot;, divisor = 180},&lt;br /&gt;
	{item = &amp;quot;Sapphire&amp;quot;, divisor = 200},&lt;br /&gt;
	{item = &amp;quot;Emerald&amp;quot;, divisor = 250},&lt;br /&gt;
	{item = &amp;quot;Gold bar&amp;quot;, divisor = 250},&lt;br /&gt;
	{item = &amp;quot;Potato cactus&amp;quot;, divisor = 250},&lt;br /&gt;
	{item = &amp;quot;Raw shark&amp;quot;, divisor = 250},&lt;br /&gt;
	{item = &amp;quot;Ruby&amp;quot;, divisor = 300},&lt;br /&gt;
	{item = &amp;quot;Diamond&amp;quot;, divisor = 400},&lt;br /&gt;
	{item = &amp;quot;Raw manta ray&amp;quot;, divisor = 450},&lt;br /&gt;
	{item = &amp;quot;Cactus spine&amp;quot;, divisor = 600},&lt;br /&gt;
	{item = &amp;quot;Dragonstone&amp;quot;, divisor = 600},&lt;br /&gt;
	{item = &amp;quot;Battlestaff&amp;quot;, divisor = 1100},&lt;br /&gt;
	{item = &amp;quot;Coconut milk&amp;quot;, divisor = 1100},&lt;br /&gt;
	{item = &amp;quot;Lily of the sands&amp;quot;, divisor = 1100},&lt;br /&gt;
	{item = &amp;quot;Toadflax seed&amp;quot;, divisor = 1400},&lt;br /&gt;
	{item = &amp;quot;Ranarr seed&amp;quot;, divisor = 1800},&lt;br /&gt;
	{item = &amp;quot;Torstol seed&amp;quot;, divisor = 2200},&lt;br /&gt;
	{item = &amp;quot;Snapdragon seed&amp;quot;, divisor = 2200},&lt;br /&gt;
	{item = &amp;quot;Dragon med helm&amp;quot;, divisor = 4000},&lt;br /&gt;
	{item = &amp;quot;Magic seed&amp;quot;, divisor = 6500},&lt;br /&gt;
	{item = &amp;quot;Blood essence&amp;quot;, divisor = 7500},&lt;br /&gt;
	{item = &amp;quot;Cache of runes&amp;quot;, divisor = 999999}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local PURPLES = {&lt;br /&gt;
	{item = &amp;quot;Tumeken&amp;#039;s shadow (uncharged)&amp;quot;, weight = 1, level = 150},&lt;br /&gt;
	{item = &amp;quot;Masori mask&amp;quot;, weight = 2, level = 150},&lt;br /&gt;
	{item = &amp;quot;Masori body&amp;quot;, weight = 2, level = 150},&lt;br /&gt;
	{item = &amp;quot;Masori chaps&amp;quot;, weight = 2, level = 150},&lt;br /&gt;
	{item = &amp;quot;Elidinis&amp;#039; ward&amp;quot;, weight = 3, level = 150},&lt;br /&gt;
	{item = &amp;quot;Osmumten&amp;#039;s fang&amp;quot;, weight = 7, level = 50},&lt;br /&gt;
	{item = &amp;quot;Lightbearer&amp;quot;, weight = 7, level = 50}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local TEAM_SIZE_SCALE = {&lt;br /&gt;
	[1] = 1.0,&lt;br /&gt;
	[2] = 1.9,&lt;br /&gt;
	[3] = 2.8,&lt;br /&gt;
	[4] = 3.4,&lt;br /&gt;
	[5] = 4.0,&lt;br /&gt;
	[6] = 4.6,&lt;br /&gt;
	[7] = 5.2,&lt;br /&gt;
	[8] = 5.8&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local frame = frame or {}&lt;br /&gt;
	local args = frame.args or {}&lt;br /&gt;
	&lt;br /&gt;
	local raid_level = tonumber(args.raid_level) or 550&lt;br /&gt;
	local team_size = tonumber(args.team_size) or 8&lt;br /&gt;
	local path_invocation = PATH_INVOCATIONS[args.path_invocation or &amp;#039;None&amp;#039;] or 0&lt;br /&gt;
	local walk_the_path = args.walk_the_path == &amp;#039;yes&amp;#039;&lt;br /&gt;
	local leagues_harder_mode = args.leagues_harder_mode == &amp;#039;yes&amp;#039; &lt;br /&gt;
	&lt;br /&gt;
	out = p.calculator(raid_level, team_size, path_invocation, walk_the_path, leagues_harder_mode) &lt;br /&gt;
	mw.log(out)&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function scale_hp(base, raid_level, team_size, path_level)&lt;br /&gt;
&lt;br /&gt;
	local path_multiplier = 1.0&lt;br /&gt;
	if path_level &amp;gt; 0 then&lt;br /&gt;
		-- this isn&amp;#039;t perfectly accurate because 0, 8, 13, 18... isn&amp;#039;t linear, but it&amp;#039;s close enough&lt;br /&gt;
		path_multiplier = 1.03 + path_level * 0.05&lt;br /&gt;
	end&lt;br /&gt;
	-- this seems to round to the nearest 5 or 10, but the exact rounding semantics aren&amp;#039;t clear (and we&amp;#039;re already doing some averaging with WTP)&lt;br /&gt;
	return math.floor(base * (1 + raid_level / 250) * TEAM_SIZE_SCALE[team_size] * path_multiplier)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.estimate_points(raid_level, team_size, path_invocation, walk_the_path)&lt;br /&gt;
	-- to keep inputs simple, for WTP we assume the order is Ba-Ba, Kephri, Zebak, Akkha&lt;br /&gt;
	-- it doesn&amp;#039;t make a significant difference if the order is shuffled, as the bosses&lt;br /&gt;
	-- generally have similar total point contributions&lt;br /&gt;
	local AVERAGE_WTP_LEVEL = {[0] = 0, [1] = 0, [2] = 0, [3] = 0}&lt;br /&gt;
	if walk_the_path then&lt;br /&gt;
		AVERAGE_WTP_LEVEL = {[0] = 0, [1] = 4/6, [2] = 7/6, [3] = 13/6}&lt;br /&gt;
	end&lt;br /&gt;
	local points_table = {&lt;br /&gt;
		{name = &amp;quot;Akkha&amp;quot;, hp = scale_hp(480, raid_level, team_size, path_invocation + AVERAGE_WTP_LEVEL[3]), mult = 1.0, approx = walk_the_path},&lt;br /&gt;
		{name = &amp;quot;Akkha&amp;#039;s Shadow&amp;quot;, hp = scale_hp(70, raid_level, team_size, path_invocation + AVERAGE_WTP_LEVEL[3]), mult = 1.0, count = 4}, -- path levels affect hp&lt;br /&gt;
		{name = &amp;quot;Baboons&amp;quot;, hp = scale_hp(300, raid_level, team_size, 0), mult = 1.2, approx = true},&lt;br /&gt;
		{name = &amp;quot;Ba-Ba&amp;quot;, hp = scale_hp(380, raid_level, team_size, path_invocation + AVERAGE_WTP_LEVEL[0]), mult = 2.0, approx = walk_the_path},&lt;br /&gt;
		{name = &amp;quot;Zebak&amp;quot;, hp = scale_hp(580, raid_level, team_size, path_invocation + AVERAGE_WTP_LEVEL[2]), mult = 1.5, approx = walk_the_path},&lt;br /&gt;
		{name = &amp;quot;Scarab Swarms&amp;quot;, hp = 200, mult = 1.0, approx = true},&lt;br /&gt;
		{name = &amp;quot;Scarabs&amp;quot;, hp = 200, mult = 0.5, approx = true},&lt;br /&gt;
		{name = &amp;quot;Kephri&amp;#039;s Shield&amp;quot;, hp = scale_hp(375, raid_level, team_size, path_invocation + AVERAGE_WTP_LEVEL[1]), mult = 1.0, approx = true}, -- assuming the shield regenerates a total of 150% across two regen cycles - probably less in good groups&lt;br /&gt;
		{name = &amp;quot;Kephri&amp;quot;, hp = scale_hp(130, raid_level, team_size, path_invocation + AVERAGE_WTP_LEVEL[1]), mult = 1.0, approx = walk_the_path},&lt;br /&gt;
		{name = &amp;quot;P1 Obelisk&amp;quot;, hp = scale_hp(260, raid_level, team_size, 0), mult = 1.5},&lt;br /&gt;
		{name = &amp;quot;P2 Warden&amp;quot;, hp = scale_hp(140, raid_level, team_size, 0), mult = 2.0, count = 2},&lt;br /&gt;
		{name = &amp;quot;P3 Warden&amp;quot;, hp = scale_hp(880, raid_level, team_size, 0), mult = 2.5},&lt;br /&gt;
		{name = &amp;quot;Misc. damage&amp;quot;, hp = 80 * team_size, mult = 1.0, approx = true},&lt;br /&gt;
		{name = &amp;quot;Het - seal mining&amp;quot;, hp = 130 + math.floor(95.81 * (team_size - 1)), mult = 2.5}, -- not sure why this is the scaling, but it matches at 1, 2, 3, 4, 7&lt;br /&gt;
		{name = &amp;quot;Scabaras - puzzles&amp;quot;, points = 300 * team_size, approx = true}, -- assuming 3 puzzles per person&lt;br /&gt;
		{name = &amp;quot;Apmeken - traps&amp;quot;, points = 450 * team_size, approx = true}, -- assuming 6 fix-trap cycles, 75 points each&lt;br /&gt;
		{name = &amp;quot;Crondis - palm watering&amp;quot;, points = 400 * team_size}, -- 2 points per health, 200 health per person&lt;br /&gt;
		{name = &amp;quot;MVP&amp;quot;, points = 2700 * team_size}, -- 9 rooms, 300 per person&lt;br /&gt;
	}&lt;br /&gt;
	local total_points = 0&lt;br /&gt;
	for _, v in ipairs(points_table) do&lt;br /&gt;
		if v.points then&lt;br /&gt;
			total_points = total_points + v.points&lt;br /&gt;
		else&lt;br /&gt;
			total_points = total_points + math.floor(v.hp * v.mult * (v.count or 1))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return {total = total_points, points_table = points_table}	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.get_rewards(points, raid_level, team_size, leagues_harder_mode)&lt;br /&gt;
	local adjusted_raid_level = raid_level&lt;br /&gt;
	if raid_level &amp;gt; 400 then&lt;br /&gt;
		adjusted_raid_level = 400 + math.floor((raid_level - 400) / 3)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local purple_denominator = 100 * (10500 - 20 * adjusted_raid_level)&lt;br /&gt;
	local pet_denominator&lt;br /&gt;
	&lt;br /&gt;
	if leagues_harder_mode then -- leagues none sense&lt;br /&gt;
		purple_denominator = math.max(purple_denominator, points) -- no cap fr fr&lt;br /&gt;
		pet_denominator = 100 * (350000 - 700 * math.min(adjusted_raid_level, 466)) -- we dont know if this is correct&lt;br /&gt;
	else&lt;br /&gt;
		purple_denominator = math.max(purple_denominator, 150000) -- caps at 1500&lt;br /&gt;
		pet_denominator = 100 * (350000 - 700 * adjusted_raid_level)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local elite_clue_denominator = 200000&lt;br /&gt;
	&lt;br /&gt;
	local scale = 1&lt;br /&gt;
	local description = &amp;quot;&amp;quot;&lt;br /&gt;
	if raid_level &amp;lt; 150 then&lt;br /&gt;
		scale = 0.75&lt;br /&gt;
		description = &amp;quot;decreased by &amp;#039;&amp;#039;&amp;#039;25%&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	elseif raid_level &amp;gt;= 300 then&lt;br /&gt;
		local percent = math.floor((raid_level - 300) / 5) + 15&lt;br /&gt;
		scale = 1 + percent / 100&lt;br /&gt;
		description = string.format(&amp;quot;increased by &amp;#039;&amp;#039;&amp;#039;%d%%&amp;#039;&amp;#039;&amp;#039;&amp;quot;, percent)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		description = string.format(&amp;quot;With a raid level of &amp;#039;&amp;#039;&amp;#039;%d&amp;#039;&amp;#039;&amp;#039;, normal loot is %s from the baseline.&amp;quot;, raid_level, description)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	description = &amp;quot;Normal loot always gives 3 rolls, and each of the 27 items is equally likely. &amp;quot; .. description&lt;br /&gt;
	&lt;br /&gt;
	normal_loot = {}&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(NORMAL_LOOT) do&lt;br /&gt;
		local quantity = math.floor(points / team_size / v.divisor)&lt;br /&gt;
		quantity = math.floor(quantity * scale)&lt;br /&gt;
		quantity = math.max(quantity, 1)&lt;br /&gt;
		local price = 0&lt;br /&gt;
		if v.item == &amp;quot;Cache of runes&amp;quot; then&lt;br /&gt;
			price = 1700 / 3 * (gePrice(&amp;quot;Blood rune&amp;quot;) + gePrice(&amp;quot;Soul rune&amp;quot;) + gePrice(&amp;quot;Death rune&amp;quot;))&lt;br /&gt;
		elseif v.item == &amp;quot;Coins&amp;quot; then&lt;br /&gt;
			price = 1&lt;br /&gt;
		else&lt;br /&gt;
			price = gePrice(v.item)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(normal_loot, {item = v.item, quantity = quantity, price = price})	&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local base_purple_rate = math.min(points / purple_denominator, 0.55)&lt;br /&gt;
	&lt;br /&gt;
	local unique_loot = {}&lt;br /&gt;
	local true_purple_rate = 0.0&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(PURPLES) do&lt;br /&gt;
		local true_rate = base_purple_rate * v.weight / 24&lt;br /&gt;
		if raid_level &amp;lt; v.level then&lt;br /&gt;
			true_rate = true_rate / 50&lt;br /&gt;
		end&lt;br /&gt;
		true_purple_rate = true_purple_rate + true_rate&lt;br /&gt;
		table.insert(unique_loot, {item = v.item, chance = true_rate / team_size, price = gePrice(v.item)})&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(unique_loot, {item = &amp;quot;Tumeken&amp;#039;s guardian&amp;quot;, chance = points / pet_denominator / team_size, price = nil})&lt;br /&gt;
	table.insert(unique_loot, {item = &amp;quot;Clue scroll (elite)&amp;quot;, chance = points / elite_clue_denominator / team_size, price = nil})&lt;br /&gt;
	&lt;br /&gt;
	return {&lt;br /&gt;
		purple = true_purple_rate,&lt;br /&gt;
		pet = points / pet_denominator,&lt;br /&gt;
		unique_loot = unique_loot,&lt;br /&gt;
		normal_loot = normal_loot,&lt;br /&gt;
		normal_loot_description = description&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.calculator(raid_level, team_size, path_invocation, walk_the_path, leagues_harder_mode) &lt;br /&gt;
	if raid_level &amp;gt; 600 and not leagues_harder_mode then&lt;br /&gt;
		return &amp;quot;What? How are you doing a level &amp;quot; .. tostring(raid_level) ..&amp;quot; raid?\n\nHow is that possible? Is this bug abuse?&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local points_breakdown = p.estimate_points(raid_level, team_size, path_invocation, walk_the_path)&lt;br /&gt;
	local rewards_breakdown = p.get_rewards(points_breakdown.total, raid_level, team_size, leagues_harder_mode)&lt;br /&gt;
	preamble = string.format(&lt;br /&gt;
[[With no deaths, this raid will give approximately &amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; contribution points%s. With a raid level of &amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;, this equates to a &amp;#039;&amp;#039;&amp;#039;%.4f%%&amp;#039;&amp;#039;&amp;#039; chance of receiving a purple drop%s, and a &amp;#039;&amp;#039;&amp;#039;%.4f%%&amp;#039;&amp;#039;&amp;#039; chance of receiving the pet%s.&lt;br /&gt;
&lt;br /&gt;
This estimate is not exact, and may not match your true point total for various reasons, including:&lt;br /&gt;
* Deaths (the penalty for deaths cannot feasibly be estimated because it depends on how far you&amp;#039;ve gotten in the raid)&lt;br /&gt;
* Walk the Path levelling order (this assumes the order is Ba-Ba, Kephri, Zebak, Akkha – different orders may result in very marginally different average points)&lt;br /&gt;
* Higher or lower healing from Kephri&amp;#039;s shields than estimated (this assumes that the shields mostly regenerate both times, but in good teams they may not, resulting in faster kills but ~2%% fewer total points)&lt;br /&gt;
* Additional P2 Warden cycles (this assumes &amp;quot;2-down&amp;quot;, but &amp;quot;3-down&amp;quot; results in about 3%% more total points)&lt;br /&gt;
* Challenge room trap failures&lt;br /&gt;
* Precision loss due to integer truncation in RuneScript (estimated 0.5-1%% point loss)&lt;br /&gt;
%s&lt;br /&gt;
If you are doing this type of raid repeatedly, try comparing the estimated normal loot to the amount you actually tend to receive. For example, if you are consistently getting 10%% fewer coins than predicted here, your purple chance and pet chance will also be 10%% lower than predicted.]],&lt;br /&gt;
		lang:formatNum(points_breakdown.total),&lt;br /&gt;
		(team_size &amp;gt; 1) and &amp;quot; for the entire team&amp;quot; or &amp;quot;&amp;quot;,&lt;br /&gt;
		raid_level,&lt;br /&gt;
		 100 * rewards_breakdown.purple,&lt;br /&gt;
		(team_size &amp;gt; 1) and &amp;quot; across the entire team&amp;quot; or &amp;quot;&amp;quot;,&lt;br /&gt;
		100 * rewards_breakdown.pet,&lt;br /&gt;
		(team_size &amp;gt; 1) and &amp;quot; across the entire team&amp;quot; or &amp;quot;&amp;quot;,&lt;br /&gt;
		(team_size &amp;gt; 1) and  &amp;quot;\nFor computing average loot in the sections, group raids assume that all contribution is split evenly among the team, and chances are shown &amp;#039;&amp;#039;&amp;#039;per person&amp;#039;&amp;#039;&amp;#039;.\n&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	local reward_table = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
	local reward_table_data = {}&lt;br /&gt;
	local total_value = 0&lt;br /&gt;
	table.insert(reward_table_data, {{tag=&amp;#039;th&amp;#039;, text=&amp;quot;Item&amp;quot;, attr={colspan=2}}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Chance&amp;quot;}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Value&amp;quot;}})&lt;br /&gt;
	for _, v in ipairs(rewards_breakdown.unique_loot) do&lt;br /&gt;
		total_value = total_value + v.chance * (v.price or 0)&lt;br /&gt;
		table.insert(reward_table_data, {&lt;br /&gt;
			{text = string.format(&amp;quot;[[File:%s.png|center|link=%s]]&amp;quot;, v.item, v.item)},&lt;br /&gt;
			{text = string.format(&amp;quot;[[%s]]&amp;quot;, v.item)},&lt;br /&gt;
			{text = string.format(&amp;quot;%.4f%%&amp;quot;, 100 * v.chance)},&lt;br /&gt;
			{text = v.price and coins(v.price) or &amp;quot;N/A&amp;quot;, class=v.price and &amp;quot;&amp;quot; or &amp;quot;table-na&amp;quot;, css={[&amp;quot;text-align&amp;quot;] = &amp;quot;center&amp;quot;}}&lt;br /&gt;
		})	&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(reward_table_data, {{attr={colspan=3}, text=&amp;quot;Expected value&amp;quot;, tag=&amp;#039;th&amp;#039;}, {text=coins(math.floor(total_value)), tag=&amp;#039;th&amp;#039;}})&lt;br /&gt;
	&lt;br /&gt;
	tables._table(reward_table, reward_table_data)&lt;br /&gt;
	&lt;br /&gt;
	local normal_loot_table = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
	local normal_loot_table_data = {}&lt;br /&gt;
	total_value = 0&lt;br /&gt;
	table.insert(normal_loot_table_data, {{tag=&amp;#039;th&amp;#039;, text=&amp;quot;Item&amp;quot;, attr={colspan=2}}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Quantity&amp;quot;}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Value&amp;quot;}})&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(rewards_breakdown.normal_loot) do&lt;br /&gt;
		total_value = total_value + v.price * v.quantity * 3/27&lt;br /&gt;
		table.insert(normal_loot_table_data, {&lt;br /&gt;
			{text = string.format(&amp;quot;[[File:%s.png|center|link=%s]]&amp;quot;, v.item, v.item)},&lt;br /&gt;
			{text = string.format(&amp;quot;[[%s]]&amp;quot;, v.item)},&lt;br /&gt;
			{text = lang:formatNum(v.quantity)},&lt;br /&gt;
			{text = coins(math.floor(v.quantity * v.price))}	&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(normal_loot_table_data, {{attr={colspan=3}, text=&amp;quot;Expected value (3 rolls)&amp;quot;, tag=&amp;#039;th&amp;#039;}, {text=coins(math.floor(total_value)), tag=&amp;#039;th&amp;#039;}})&lt;br /&gt;
	tables._table(normal_loot_table, normal_loot_table_data)&lt;br /&gt;
	&lt;br /&gt;
	local points_table = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
	local points_table_data = {}&lt;br /&gt;
	table.insert(points_table_data, {{tag=&amp;#039;th&amp;#039;, text=&amp;quot;Type&amp;quot;}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Est. damage&amp;quot;}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Multiplier&amp;quot;}, {tag = &amp;#039;th&amp;#039;, text = &amp;quot;Est. points&amp;quot;}})&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(points_breakdown.points_table) do&lt;br /&gt;
		local name = v.name&lt;br /&gt;
		if v.count then&lt;br /&gt;
			name = string.format(&amp;quot;%s (%sx)&amp;quot;, name, v.count)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local row = {{text = name}}&lt;br /&gt;
		if v.hp then&lt;br /&gt;
			local damage = lang:formatNum(v.hp)&lt;br /&gt;
			if v.approx then&lt;br /&gt;
				damage = string.format(&amp;quot;~%s&amp;quot;, damage)	&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(row, {text = damage})&lt;br /&gt;
			table.insert(row, {text = v.mult})&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(row, {text = &amp;quot;N/A&amp;quot;, attr={colspan=2}, class=&amp;quot;table-na&amp;quot;, css={[&amp;quot;text-align&amp;quot;] = &amp;quot;center&amp;quot;}})&lt;br /&gt;
		end&lt;br /&gt;
		local points = 0&lt;br /&gt;
		if v.points then&lt;br /&gt;
			points = v.points&lt;br /&gt;
		else&lt;br /&gt;
			points = math.floor(v.hp * v.mult * (v.count or 1))&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(row, {text = lang:formatNum(points)})&lt;br /&gt;
		table.insert(points_table_data, row)&lt;br /&gt;
	end&lt;br /&gt;
	local label = &amp;quot;Est. total points&amp;quot;&lt;br /&gt;
	if team_size &amp;gt; 1 then&lt;br /&gt;
		label = &amp;quot;Est. total points (entire team)&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(points_table_data, {{attr={colspan=3}, text=label, tag=&amp;#039;th&amp;#039;}, {text=lang:formatNum(points_breakdown.total), tag=&amp;#039;th&amp;#039;}})&lt;br /&gt;
	tables._table(points_table, points_table_data)	&lt;br /&gt;
	return preamble &lt;br /&gt;
		.. &amp;quot;\n==Average rewards per person==\n&amp;quot; .. tostring(reward_table) &lt;br /&gt;
		.. &amp;quot;\n===Normal loot===\n&amp;quot; .. rewards_breakdown.normal_loot_description .. &amp;quot;\n&amp;quot; .. tostring(normal_loot_table)&lt;br /&gt;
		.. &amp;quot;\n==Point estimation==\n&amp;quot; .. tostring(points_table)&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>