<?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%3AUser_hiscores</id>
	<title>Module:User hiscores - 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%3AUser_hiscores"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:User_hiscores&amp;action=history"/>
	<updated>2026-06-15T14:28:08Z</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:User_hiscores&amp;diff=35213&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;require(&quot;strict&quot;) local virtual_level = require(&#039;Module:Experience&#039;)._level_at_xp_unr local hiscore = require(&#039;Module:Hiscores&#039;).get_stats local yesno = require(&#039;Module:Yesno&#039;) local lang = mw.getContentLanguage() require(&#039;Module:Mw.html extension&#039;)  local p = {}  -- Format numbers (add thousands separator, etc.) local function fnum(x) 	x = tonumber(x) 	if x then 		return lang:formatNum(x) 	end 	return &#039;&#039; end  -- Calculate xp milestones and format to a labelled string lo...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:User_hiscores&amp;diff=35213&amp;oldid=prev"/>
		<updated>2024-10-16T23:13:22Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;require(&amp;quot;strict&amp;quot;) local virtual_level = require(&amp;#039;Module:Experience&amp;#039;)._level_at_xp_unr local hiscore = require(&amp;#039;Module:Hiscores&amp;#039;).get_stats local yesno = require(&amp;#039;Module:Yesno&amp;#039;) local lang = mw.getContentLanguage() require(&amp;#039;Module:Mw.html extension&amp;#039;)  local p = {}  -- Format numbers (add thousands separator, etc.) local function fnum(x) 	x = tonumber(x) 	if x then 		return lang:formatNum(x) 	end 	return &amp;#039;&amp;#039; end  -- Calculate xp milestones and format to a labelled string lo...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
local virtual_level = require(&amp;#039;Module:Experience&amp;#039;)._level_at_xp_unr&lt;br /&gt;
local hiscore = require(&amp;#039;Module:Hiscores&amp;#039;).get_stats&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
require(&amp;#039;Module:Mw.html extension&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Format numbers (add thousands separator, etc.)&lt;br /&gt;
local function fnum(x)&lt;br /&gt;
	x = tonumber(x)&lt;br /&gt;
	if x then&lt;br /&gt;
		return lang:formatNum(x)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Calculate xp milestones and format to a labelled string&lt;br /&gt;
local function mils(xp)&lt;br /&gt;
	xp = math.floor(xp / 1e6) -- Divide by 1 million&lt;br /&gt;
	return tostring(xp) .. &amp;quot;M&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Calculate combat level&lt;br /&gt;
local function combat_level(att, str, def, ran, mag, con, pra)&lt;br /&gt;
	return math.floor((math.max(att + str, 2 * mag, 2 * ran) * 1.3 + def + con + math.floor(pra / 2)) / 4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Normalise arguments made by the user (lowercase, etc.)&lt;br /&gt;
local function normalise_args(args)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local key = string.lower(k)&lt;br /&gt;
		local add_key = true&lt;br /&gt;
		if key ~= k then&lt;br /&gt;
			if args[key] then&lt;br /&gt;
				add_key = false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if add_key then&lt;br /&gt;
			out[key] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Capitalise the first character of each word in a string. Not quite title case, because it does not ignore and/of, so those titles need to be forced.&lt;br /&gt;
local function titlecase(str)&lt;br /&gt;
    return str:gsub(&amp;quot;%f[%a].&amp;quot;, string.upper)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Table of API endpoint aliases&lt;br /&gt;
local aliases = {&lt;br /&gt;
	[&amp;#039;main&amp;#039;] = &amp;#039;osrs&amp;#039;,&lt;br /&gt;
	[&amp;#039;default&amp;#039;] = &amp;#039;osrs&amp;#039;,&lt;br /&gt;
	[&amp;#039;iron&amp;#039;] = &amp;#039;osrs-ironman&amp;#039;,&lt;br /&gt;
	[&amp;#039;ironman&amp;#039;] = &amp;#039;osrs-ironman&amp;#039;,&lt;br /&gt;
	[&amp;#039;hardcore&amp;#039;] = &amp;#039;osrs-hardcore&amp;#039;,&lt;br /&gt;
	[&amp;#039;hardcore ironman&amp;#039;] = &amp;#039;osrs-hardcore&amp;#039;,&lt;br /&gt;
	[&amp;#039;ultimate&amp;#039;] = &amp;#039;osrs-ultimate&amp;#039;,&lt;br /&gt;
	[&amp;#039;ultimate ironman&amp;#039;] = &amp;#039;osrs-ultimate&amp;#039;,&lt;br /&gt;
	[&amp;#039;skiller&amp;#039;] = &amp;#039;osrs-skiller&amp;#039;,&lt;br /&gt;
	[&amp;#039;pure&amp;#039;] = &amp;#039;osrs-pure&amp;#039;,&lt;br /&gt;
	[&amp;#039;1-def&amp;#039;] = &amp;#039;osrs-pure&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Table of account type chathead files&lt;br /&gt;
local chatheads = {&lt;br /&gt;
	[&amp;#039;osrs-ironman&amp;#039;] = &amp;#039;Ironman chat badge large&amp;#039;,&lt;br /&gt;
	[&amp;#039;osrs-hardcore&amp;#039;] = &amp;#039;Hardcore ironman chat badge large&amp;#039;,&lt;br /&gt;
	[&amp;#039;osrs-ultimate&amp;#039;] = &amp;#039;Ultimate ironman chat badge large&amp;#039;,&lt;br /&gt;
	[&amp;#039;osrs-skiller&amp;#039;] = &amp;#039;Skiller hiscore icon&amp;#039;,&lt;br /&gt;
	[&amp;#039;osrs-pure&amp;#039;] = &amp;#039;One-defence pure hiscore icon&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- MAIN FUNCTIONS --&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p._main(frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(raw_args)&lt;br /&gt;
	local args = normalise_args(raw_args)&lt;br /&gt;
	local name = args.name&lt;br /&gt;
	local api = args.api and aliases[args.api] or &amp;#039;osrs&amp;#039;&lt;br /&gt;
	local virtual = yesno(args.virtual, false)&lt;br /&gt;
	local minxp = tonumber(args.minxp) and tonumber(args.minxp) * 1e6 or 2e8 --Multiply by 1 million or set 200 million as default&lt;br /&gt;
	local style = args.style or &amp;#039;round&amp;#039; --Set round as default style&lt;br /&gt;
	local spacing = style == &amp;#039;sleek&amp;#039; and &amp;#039;2px&amp;#039; or &amp;#039;6px&amp;#039; --Size of gap between subtables&lt;br /&gt;
	&lt;br /&gt;
	-- Fetch hiscore data&lt;br /&gt;
	local data = hiscore(name, api)&lt;br /&gt;
	&lt;br /&gt;
	local function make_cell(td, skill, image, link, title)&lt;br /&gt;
		link = link or titlecase(skill) --Use the skill for the link if not specified&lt;br /&gt;
		title = title or link --Use the link for the title if not specified&lt;br /&gt;
		td:cssText(&amp;#039;border:none; padding:12px; line-height:2&amp;#039;)&lt;br /&gt;
		td:wikitext(string.format(&amp;#039;[[File:%s.png|24x24px|link=%s]]&amp;#039;, image, link), &amp;#039;&amp;amp;nbsp;&amp;#039;)&lt;br /&gt;
		if skill == &amp;#039;combat&amp;#039; then&lt;br /&gt;
			local att = data[&amp;#039;attack&amp;#039;].level&lt;br /&gt;
			local str = data[&amp;#039;strength&amp;#039;].level&lt;br /&gt;
			local def = data[&amp;#039;defence&amp;#039;].level&lt;br /&gt;
			local ran = data[&amp;#039;ranged&amp;#039;].level&lt;br /&gt;
			local mag = data[&amp;#039;magic&amp;#039;].level&lt;br /&gt;
			local con = data[&amp;#039;constitution&amp;#039;].level&lt;br /&gt;
			local pra = data[&amp;#039;prayer&amp;#039;].level&lt;br /&gt;
			local cmb = combat_level(att, str, def, ran, mag, con, pra)&lt;br /&gt;
			local ret = fnum(cmb)&lt;br /&gt;
			td:wikitext(ret)&lt;br /&gt;
			td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;Combat level: %s&amp;#039;, ret))&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		local vals = data[skill]&lt;br /&gt;
		if not vals then --If values for the hiscore can&amp;#039;t be found&lt;br /&gt;
			td:wikitext(&amp;#039;??&amp;#039;)&lt;br /&gt;
			td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;%s@NL@Rank: N/A&amp;#039;, title))&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if skill == &amp;#039;overall&amp;#039; then --If the request is for the player&amp;#039;s total level&lt;br /&gt;
			td:wikitext(fnum(vals.level) or &amp;#039;--&amp;#039;)&lt;br /&gt;
			if vals.rank then --Add hiscore rank on hover&lt;br /&gt;
				td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;Total XP: %s@NL@Rank: %s&amp;#039;, fnum(vals.xp), fnum(vals.rank)))&lt;br /&gt;
			end&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if vals.score == -1 then --If the request is successful but returns &amp;#039;-1&amp;#039; meaning the player is not on the hiscore table (kc or level is too low to register)&lt;br /&gt;
			td:wikitext(&amp;#039;--&amp;#039;)&lt;br /&gt;
			td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;%s@NL@Rank: N/A&amp;#039;, title))&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if not vals.xp then --If the request does not include xp it must not be a skill and must therefore be boss/minigame kc&lt;br /&gt;
			td:wikitext(fnum(vals.score) or &amp;#039;--&amp;#039;)&lt;br /&gt;
			if vals.rank then --Add hiscore rank on hover for bosses/minigames&lt;br /&gt;
				td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;%s@NL@Rank: %s&amp;#039;, title, fnum(vals.rank)))&lt;br /&gt;
			end&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if vals.rank then --Add hiscore rank and XP on hover for skills&lt;br /&gt;
			td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;%s@NL@XP: %s@NL@Rank: %s&amp;#039;, title, fnum(vals.xp), fnum(vals.rank)))&lt;br /&gt;
		else&lt;br /&gt;
			td:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;%s@NL@XP: %s@NL@Rank: N/A&amp;#039;, title, fnum(vals.xp)))&lt;br /&gt;
		end&lt;br /&gt;
		if vals.xp &amp;gt;= minxp then --If a skill&amp;#039;s xp meets user-defined minimum threshold, return the xp as a formatted string, rounded to nearest million&lt;br /&gt;
			td:wikitext(mils(vals.xp) or &amp;#039;--&amp;#039;)&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if vals.level &amp;lt; 99 or not virtual then --If the requested skill is not maxed or the virtual parameter is false, return the level (caps at 99)&lt;br /&gt;
			td:wikitext(fnum(vals.level) or &amp;#039;--&amp;#039;)&lt;br /&gt;
			return&lt;br /&gt;
		else&lt;br /&gt;
			local ret = virtual_level(vals.xp) or &amp;#039;--&amp;#039; --Calculate the virtual level based on xp&lt;br /&gt;
			td:wikitext(fnum(ret))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function make_spacer(tr, colspan, rowspan)&lt;br /&gt;
		colspan = colspan or 1&lt;br /&gt;
		rowspan = rowspan or 1&lt;br /&gt;
		local td = tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:cssText(&amp;#039;padding:0; background:var(--body-main);&amp;#039;)&lt;br /&gt;
			:cssText(string.format(&amp;#039;min-height:%s; height:%s; min-width:%s; width:%s;&amp;#039;, spacing, spacing, spacing, spacing))&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, colspan)&lt;br /&gt;
			:attr(&amp;#039;rowspan&amp;#039;, rowspan)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function make_frame(tr, span)&lt;br /&gt;
		span = span or 1&lt;br /&gt;
		local td = tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:cssText(&amp;#039;padding:0; border-spacing:0;&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, span)&lt;br /&gt;
		local ret_table = td:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
			:cssText(&amp;#039;border-spacing:0; width:100%; margin:0; display:table;&amp;#039;)&lt;br /&gt;
		return ret_table&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Main table&lt;br /&gt;
	local ret = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:cssText(&amp;#039;text-align:center; background:var(--body-light); border-spacing:0; white-space:nowrap; line-height:normal; margin:0; display:table;&amp;#039;)&lt;br /&gt;
	if style == &amp;#039;sleek&amp;#039; then&lt;br /&gt;
		ret:cssText(&amp;#039;border:var(--body-border) 1px solid;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if style == &amp;#039;round&amp;#039; then&lt;br /&gt;
		ret:cssText(&amp;#039;border:none; border-radius:10px;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	ret:cssText(args[&amp;#039;extra-css&amp;#039;]) --Add CSS defined by the user&lt;br /&gt;
	local main_tr = ret:tr()&lt;br /&gt;
	&lt;br /&gt;
	-- Stats table&lt;br /&gt;
	local stats_table = make_frame(main_tr)&lt;br /&gt;
		local tr = stats_table:tr()&lt;br /&gt;
			:th()&lt;br /&gt;
				:cssText(&amp;#039;border:none; padding:14px; text-align:center; font-size:32px; font-family:RuneScape;&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, 3)&lt;br /&gt;
				:wikitext(chatheads[api] and &amp;#039;[[File:&amp;#039; .. chatheads[api] .. &amp;#039;.png|link=]]&amp;amp;nbsp;&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
				:wikitext(name)&lt;br /&gt;
		make_spacer(stats_table:tr(), 3)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;attack&amp;#039;, &amp;#039;Attack icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;hitpoints&amp;#039;, &amp;#039;Hitpoints icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;mining&amp;#039;, &amp;#039;Mining icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;strength&amp;#039;, &amp;#039;Strength icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;agility&amp;#039;, &amp;#039;Agility icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;smithing&amp;#039;, &amp;#039;Smithing icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;defence&amp;#039;, &amp;#039;Defence icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;herblore&amp;#039;, &amp;#039;Herblore icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;fishing&amp;#039;, &amp;#039;Fishing icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;ranged&amp;#039;, &amp;#039;Ranged icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;thieving&amp;#039;, &amp;#039;Thieving icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;cooking&amp;#039;, &amp;#039;Cooking icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;prayer&amp;#039;, &amp;#039;Prayer icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;crafting&amp;#039;, &amp;#039;Crafting icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;firemaking&amp;#039;, &amp;#039;Firemaking icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;magic&amp;#039;, &amp;#039;Magic icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;fletching&amp;#039;, &amp;#039;Fletching icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;woodcutting&amp;#039;, &amp;#039;Woodcutting icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;runecraft&amp;#039;, &amp;#039;Runecraft icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;slayer&amp;#039;, &amp;#039;Slayer icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;farming&amp;#039;, &amp;#039;Farming icon (detail)&amp;#039;)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;construction&amp;#039;, &amp;#039;Construction icon (detail)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;hunter&amp;#039;, &amp;#039;Hunter icon (detail)&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		-- Total stats table&lt;br /&gt;
		make_spacer(stats_table:tr(), 3)&lt;br /&gt;
			tr = stats_table:tr()&lt;br /&gt;
			local total_stats_table = make_frame(tr, 3)&lt;br /&gt;
			tr = total_stats_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;combat&amp;#039;, &amp;#039;Combat icon&amp;#039;, &amp;#039;Combat level&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;overall&amp;#039;, &amp;#039;Skills icon&amp;#039;, &amp;#039;Skills&amp;#039;)&lt;br /&gt;
		tr:done()&lt;br /&gt;
	stats_table:done()&lt;br /&gt;
		&lt;br /&gt;
	-- Right side&lt;br /&gt;
	make_spacer(main_tr, 1, 3)&lt;br /&gt;
	local right_side_table = make_frame(main_tr)&lt;br /&gt;
		tr = right_side_table:tr()&lt;br /&gt;
		&lt;br /&gt;
	-- Clues and PvP table&lt;br /&gt;
	local clues_table = make_frame(tr, 3)&lt;br /&gt;
		tr = clues_table:tr()&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls all&amp;#039;, &amp;#039;Clue scroll&amp;#039;, &amp;#039;Treasure Trails&amp;#039;)&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls beginner&amp;#039;, &amp;#039;Clue scroll (beginner)&amp;#039;, &amp;#039;Clue scroll (beginner)&amp;#039;)&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls easy&amp;#039;, &amp;#039;Clue scroll (easy)&amp;#039;, &amp;#039;Clue scroll (easy)&amp;#039;)&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls medium&amp;#039;, &amp;#039;Clue scroll (medium)&amp;#039;, &amp;#039;Clue scroll (medium)&amp;#039;)&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls hard&amp;#039;, &amp;#039;Clue scroll (hard)&amp;#039;, &amp;#039;Clue scroll (hard)&amp;#039;)&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls elite&amp;#039;, &amp;#039;Clue scroll (elite)&amp;#039;, &amp;#039;Clue scroll (elite)&amp;#039;)&lt;br /&gt;
			make_cell(tr:td(), &amp;#039;clue scrolls master&amp;#039;, &amp;#039;Clue scroll (master)&amp;#039;, &amp;#039;Clue scroll (master)&amp;#039;)&lt;br /&gt;
		tr:done()&lt;br /&gt;
	make_spacer(clues_table:tr(), 7)&lt;br /&gt;
		tr = clues_table:tr()&lt;br /&gt;
			local pvp_table = make_frame(tr, 7)&lt;br /&gt;
			tr = pvp_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;emir\&amp;#039;s arena&amp;#039;, &amp;#039;Scroll of imbuing&amp;#039;, &amp;#039;Emir\&amp;#039;s Arena&amp;#039;, &amp;#039;Emir\&amp;#039;s Arena Rank points&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;last man standing&amp;#039;, &amp;#039;Deadman\&amp;#039;s chest (cosmetic)&amp;#039;, &amp;#039;Last Man Standing&amp;#039;, &amp;#039;Last Man Standing Ranking&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;soul wars zeal&amp;#039;, &amp;#039;Lil\&amp;#039; creator&amp;#039;, &amp;#039;Soul Wars&amp;#039;, &amp;#039;Soul Wars Zeal&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;bounty hunter&amp;#039;, &amp;#039;Hunter\&amp;#039;s honour&amp;#039;, &amp;#039;Bounty Hunter&amp;#039;, &amp;#039;Bounty Hunter target kills&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;bounty hunter rogue&amp;#039;, &amp;#039;Rogue\&amp;#039;s revenge&amp;#039;, &amp;#039;Bounty Hunter&amp;#039;, &amp;#039;Bounty Hunter rogue kills&amp;#039;)&lt;br /&gt;
			tr:done()&lt;br /&gt;
		pvp_table:done()&lt;br /&gt;
	clues_table:done()&lt;br /&gt;
	&lt;br /&gt;
	-- Bosses table&lt;br /&gt;
	make_spacer(right_side_table:tr(), 3)&lt;br /&gt;
		local bosses_tr = right_side_table:tr()&lt;br /&gt;
			local left_bosses_table = make_frame(bosses_tr)&lt;br /&gt;
			tr = left_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;obor&amp;#039;, &amp;#039;Hill giant club&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;bryophyta&amp;#039;, &amp;#039;Bryophyta\&amp;#039;s essence&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;hespori&amp;#039;, &amp;#039;Bottomless compost bucket&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;the mimic&amp;#039;, &amp;#039;Mimic&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;skotizo&amp;#039;, &amp;#039;Skotos&amp;#039;)&lt;br /&gt;
			tr = left_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;scurrius&amp;#039;, &amp;#039;Scurry&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;giant mole&amp;#039;, &amp;#039;Baby mole&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;deranged archaeologist&amp;#039;, &amp;#039;Wintertodt parable&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;king black dragon&amp;#039;, &amp;#039;Kbd heads&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;kalphite queen&amp;#039;, &amp;#039;Kq head&amp;#039;)&lt;br /&gt;
			tr = make_frame(left_bosses_table:tr(), 5)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;dagannoth prime&amp;#039;, &amp;#039;Pet dagannoth prime&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;dagannoth rex&amp;#039;, &amp;#039;Pet dagannoth rex&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;dagannoth supreme&amp;#039;, &amp;#039;Pet dagannoth supreme&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;sarachnis&amp;#039;, &amp;#039;Sraracha&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;amoxliatl&amp;#039;, &amp;#039;Moxi&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;the hueycoatl&amp;#039;, &amp;#039;Huberte&amp;#039;)&lt;br /&gt;
			tr = left_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;zulrah&amp;#039;, &amp;#039;Pet snakeling&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;vorkath&amp;#039;, &amp;#039;Vorkath\&amp;#039;s head&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;the nightmare&amp;#039;, &amp;#039;Little nightmare&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;phosani\&amp;#039;s nightmare&amp;#039;, &amp;#039;Little parasite&amp;#039;, &amp;#039;Phosani\&amp;#039;s Nightmare&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;corporeal beast&amp;#039;, &amp;#039;Pet corporeal critter&amp;#039;)&lt;br /&gt;
			tr = left_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;kree\&amp;#039;arra&amp;#039;, &amp;#039;Pet kree\&amp;#039;arra&amp;#039;, &amp;#039;Kree\&amp;#039;arra&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;commander zilyana&amp;#039;, &amp;#039;Pet zilyana&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;general graardor&amp;#039;, &amp;#039;Pet general graardor&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;k\&amp;#039;ril tsutsaroth&amp;#039;, &amp;#039;Pet k\&amp;#039;ril tsutsaroth&amp;#039;, &amp;#039;K\&amp;#039;ril Tsutsaroth&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;nex&amp;#039;, &amp;#039;Nexling&amp;#039;)&lt;br /&gt;
			tr = left_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;phantom muspah&amp;#039;, &amp;#039;Muphin (ranged)&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;duke sucellus&amp;#039;, &amp;#039;Baron&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;the leviathan&amp;#039;, &amp;#039;Lil\&amp;#039;viathan&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;vardorvis&amp;#039;, &amp;#039;Butch&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;the whisperer&amp;#039;, &amp;#039;wisp&amp;#039;)&lt;br /&gt;
			left_bosses_table:done()&lt;br /&gt;
		make_spacer(bosses_tr)&lt;br /&gt;
		&lt;br /&gt;
		--Skilling, Wilderness, and Slayer bosses&lt;br /&gt;
		local right_bosses_table = make_frame(bosses_tr)&lt;br /&gt;
			tr = right_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;guardians of the rift&amp;#039;, &amp;#039;Abyssal protector&amp;#039;, &amp;#039;Guardians of the Rift&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;tempoross&amp;#039;, &amp;#039;Tiny tempor&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;wintertodt&amp;#039;, &amp;#039;Phoenix&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;zalcano&amp;#039;, &amp;#039;Smolcano&amp;#039;)&lt;br /&gt;
		make_spacer(right_bosses_table, 4)&lt;br /&gt;
			tr = right_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;crazy archaeologist&amp;#039;, &amp;#039;Fedora&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;chaos fanatic&amp;#039;, &amp;#039;Ancient staff&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;scorpia&amp;#039;, &amp;#039;Scorpia\&amp;#039;s offspring&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;chaos elemental&amp;#039;, &amp;#039;Pet chaos elemental&amp;#039;)&lt;br /&gt;
			tr = make_frame(right_bosses_table:tr(), 4)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;calvar\&amp;#039;ion&amp;#039;, &amp;#039;Skull of vet\&amp;#039;ion&amp;#039;, &amp;#039;Calvar\&amp;#039;ion&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;spindel&amp;#039;, &amp;#039;Fangs of venenatis&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;artio&amp;#039;, &amp;#039;Claws of callisto&amp;#039;)&lt;br /&gt;
			tr = make_frame(right_bosses_table:tr(), 4)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;vet\&amp;#039;ion&amp;#039;, &amp;#039;Vet\&amp;#039;ion jr.&amp;#039;, &amp;#039;Vet\&amp;#039;ion&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;venenatis&amp;#039;, &amp;#039;Venenatis spiderling&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;callisto&amp;#039;, &amp;#039;Callisto cub&amp;#039;)&lt;br /&gt;
		make_spacer(right_bosses_table, 4)&lt;br /&gt;
			tr = make_frame(right_bosses_table:tr(), 4)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;grotesque guardians&amp;#039;, &amp;#039;Noon&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;abyssal sire&amp;#039;, &amp;#039;Abyssal orphan&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;kraken&amp;#039;, &amp;#039;Pet kraken&amp;#039;)&lt;br /&gt;
			tr = right_bosses_table:tr()&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;cerberus&amp;#039;, &amp;#039;Hellpuppy&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;araxxor&amp;#039;, &amp;#039;Nid&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;thermonuclear smoke devil&amp;#039;, &amp;#039;Pet smoke devil&amp;#039;)&lt;br /&gt;
				make_cell(tr:td(), &amp;#039;alchemical hydra&amp;#039;, &amp;#039;Alchemical hydra heads&amp;#039;)&lt;br /&gt;
			tr:done()&lt;br /&gt;
		right_bosses_table:done()&lt;br /&gt;
	&lt;br /&gt;
	-- Minigames and Raids table&lt;br /&gt;
	make_spacer(right_side_table:tr(), 3)&lt;br /&gt;
		local bottom_tr = right_side_table:tr()&lt;br /&gt;
			local bottom_table = make_frame(bottom_tr, 3)&lt;br /&gt;
				local minigames_table = make_frame(bottom_table)&lt;br /&gt;
					tr = minigames_table:tr()&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;barrows chests&amp;#039;, &amp;#039;Dharok\&amp;#039;s helm&amp;#039;, &amp;#039;Barrows&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;the gauntlet&amp;#039;, &amp;#039;Youngllef&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;tztok-jad&amp;#039;, &amp;#039;Tzrek-jad&amp;#039;, &amp;#039;TzHaar Fight Cave&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;colosseum glory&amp;#039;, &amp;#039;Sunfire splinters&amp;#039;, &amp;#039;Glory&amp;#039;)&lt;br /&gt;
					tr = minigames_table:tr()&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;lunar chests&amp;#039;, &amp;#039;Blood moon helm&amp;#039;, &amp;#039;Moons of Peril&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;the corrupted gauntlet&amp;#039;, &amp;#039;Corrupted youngllef&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;tzkal-zuk&amp;#039;, &amp;#039;Tzrek-zuk&amp;#039;, &amp;#039;The Inferno&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;sol heredit&amp;#039;, &amp;#039;Smol heredit&amp;#039;, &amp;#039;Fortis Colosseum&amp;#039;)&lt;br /&gt;
					tr:done()&lt;br /&gt;
				minigames_table:done()&lt;br /&gt;
		make_spacer(bottom_table, 1, 2)&lt;br /&gt;
			local raids_table = make_frame(bottom_table)&lt;br /&gt;
					tr = raids_table:tr()&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;chambers of xeric&amp;#039;, &amp;#039;Olmlet&amp;#039;, &amp;#039;Chambers of Xeric&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;theatre of blood&amp;#039;, &amp;#039;Lil\&amp;#039; zik&amp;#039;, &amp;#039;Theatre of Blood&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;tombs of amascut&amp;#039;, &amp;#039;Tumeken\&amp;#039;s guardian&amp;#039;, &amp;#039;Tombs of Amascut&amp;#039;)&lt;br /&gt;
					tr = raids_table:tr()&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;chambers of xeric challenge&amp;#039;, &amp;#039;Metamorphic dust&amp;#039;, &amp;#039;Chambers of Xeric/Challenge Mode&amp;#039;, &amp;#039;Chambers of Xeric Challenge Mode&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;theatre of blood hard&amp;#039;, &amp;#039;Sanguine dust&amp;#039;, &amp;#039;Theatre of Blood/Hard Mode&amp;#039;, &amp;#039;Theatre of Blood Hard Mode&amp;#039;)&lt;br /&gt;
						make_cell(tr:td(), &amp;#039;tombs of amascut expert&amp;#039;, &amp;#039;Ancient remnant&amp;#039;, &amp;#039;Tombs of Amascut&amp;#039;, &amp;#039;Tombs of Amascut Expert Mode&amp;#039;)&lt;br /&gt;
					tr:done()&lt;br /&gt;
				raids_table:done()&lt;br /&gt;
			bottom_table:done()&lt;br /&gt;
		right_side_table:done()&lt;br /&gt;
	ret:done()&lt;br /&gt;
	-- End of table&lt;br /&gt;
	&lt;br /&gt;
	--Wrap table in a responsive div for mobile support&lt;br /&gt;
	local wrapper = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:cssText(&amp;#039;max-width:100%; height:auto; overflow-x: auto;&amp;#039;)&lt;br /&gt;
		:cssText(string.format(&amp;#039;padding-bottom:%s;&amp;#039;, spacing))&lt;br /&gt;
		:node(ret)&lt;br /&gt;
	:allDone()&lt;br /&gt;
	wrapper = tostring(wrapper):gsub(&amp;#039;@NL@&amp;#039;, &amp;#039;&amp;amp;#10;&amp;#039;) --wikitext does not escape &amp;#039;&amp;amp;&amp;#039; and &amp;#039;&amp;amp;#10;&amp;#039; is a new line that works in title attributes&lt;br /&gt;
	return wrapper&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>