<?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%3AExperience</id>
	<title>Module:Experience - 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%3AExperience"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Experience&amp;action=history"/>
	<updated>2026-06-15T19:17:01Z</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:Experience&amp;diff=34194&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local p = {} local commas_strip = require(&#039;Module:Addcommas&#039;)._strip local XPAtLevel = mw.loadData(&#039;Module:Experience/data&#039;) local XPAtLevelUnr = mw.loadData(&#039;Module:Experience/dataunr&#039;)  -- -- Returns lowest needed XP to have required level -- Template:XP --  function p._xp_at_level(level) 	level = tonumber(level)  	-- calling tonumber on a string returns nil 	if not level then 		 return &quot;You must pass numbers as arguments&quot; 	end  	-- Level range is 1 to 99 	if level...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Experience&amp;diff=34194&amp;oldid=prev"/>
		<updated>2024-10-15T23:24:28Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local commas_strip = require(&amp;#039;Module:Addcommas&amp;#039;)._strip local XPAtLevel = mw.loadData(&amp;#039;Module:Experience/data&amp;#039;) local XPAtLevelUnr = mw.loadData(&amp;#039;Module:Experience/dataunr&amp;#039;)  -- -- Returns lowest needed XP to have required level -- &lt;a href=&quot;/w/Template:XP&quot; title=&quot;Template:XP&quot;&gt;Template:XP&lt;/a&gt; --  function p._xp_at_level(level) 	level = tonumber(level)  	-- calling tonumber on a string returns nil 	if not level then 		 return &amp;quot;You must pass numbers as arguments&amp;quot; 	end  	-- Level range is 1 to 99 	if level...&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;
local commas_strip = require(&amp;#039;Module:Addcommas&amp;#039;)._strip&lt;br /&gt;
local XPAtLevel = mw.loadData(&amp;#039;Module:Experience/data&amp;#039;)&lt;br /&gt;
local XPAtLevelUnr = mw.loadData(&amp;#039;Module:Experience/dataunr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns lowest needed XP to have required level&lt;br /&gt;
-- [[Template:XP]]&lt;br /&gt;
-- &lt;br /&gt;
function p._xp_at_level(level)&lt;br /&gt;
	level = tonumber(level)&lt;br /&gt;
&lt;br /&gt;
	-- calling tonumber on a string returns nil&lt;br /&gt;
	if not level then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Level range is 1 to 99&lt;br /&gt;
	if level &amp;lt; 0 or level &amp;gt; 99 then&lt;br /&gt;
		return &amp;quot;Value must be in the range 1 - 99&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return XPAtLevel[level]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.xp_at_level(frame)&lt;br /&gt;
	return p._xp_at_level(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Same as above, but with the 99 level cap removed&lt;br /&gt;
function p._xp_at_level_unr(level)&lt;br /&gt;
	level = tonumber(level)&lt;br /&gt;
&lt;br /&gt;
	-- calling tonumber on a string returns nil&lt;br /&gt;
	if not level then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Virtual level range is 1 to 126&lt;br /&gt;
	if level &amp;lt; 0 or level &amp;gt; 126 then&lt;br /&gt;
		return &amp;quot;Value must be in the range 1 - 126&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return XPAtLevelUnr[level]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.xp_at_level_unr(frame)&lt;br /&gt;
	return p._xp_at_level_unr(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- The maximum amount of experience you can have at a given level&lt;br /&gt;
-- [[Template:Max XP for level]]&lt;br /&gt;
--&lt;br /&gt;
function p._max_xp_at_level(level)&lt;br /&gt;
	level = tonumber(level)&lt;br /&gt;
&lt;br /&gt;
	-- calling tonumber on a string returns nil&lt;br /&gt;
	if not level then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Just in case&lt;br /&gt;
	level = math.floor(level)&lt;br /&gt;
&lt;br /&gt;
	if level == -1 then&lt;br /&gt;
		return 0&lt;br /&gt;
	elseif level &amp;lt;= 0 or level &amp;gt; 99 then&lt;br /&gt;
		return &amp;quot;Value must be in the range 1 - 99&amp;quot;&lt;br /&gt;
	-- Highest level is 99, highest XP is 200M&lt;br /&gt;
	elseif level == 99 then&lt;br /&gt;
		return 200000000&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return XP required for the *next* level minus 1&lt;br /&gt;
	local xp_at_next = XPAtLevel[level + 1]&lt;br /&gt;
	return xp_at_next - 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.max_xp_at_level(frame)&lt;br /&gt;
	return p._max_xp_at_level(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- What level you have when at a given xp&lt;br /&gt;
-- [[Template:Level]]&lt;br /&gt;
--&lt;br /&gt;
function p._level_at_xp(xp)&lt;br /&gt;
	if type(xp) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 xp = commas_strip(xp)&lt;br /&gt;
	end&lt;br /&gt;
	xp = tonumber(xp)&lt;br /&gt;
&lt;br /&gt;
	-- calling tonumber on an empty string returns nil&lt;br /&gt;
	if not xp then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	elseif xp &amp;lt; 0 or xp &amp;gt; 200000000 then&lt;br /&gt;
		return &amp;quot;Value must be in the range 0 - 200,000,000&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i = 99, 1, -1 do&lt;br /&gt;
		if XPAtLevel[i] &amp;lt;= xp then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.level_at_xp(frame)&lt;br /&gt;
	return p._level_at_xp(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Same as above, but with the 99 level cap removed&lt;br /&gt;
function p._level_at_xp_unr(xp)&lt;br /&gt;
	if type(xp) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 xp = commas_strip(xp)&lt;br /&gt;
	end&lt;br /&gt;
	xp = tonumber(xp)&lt;br /&gt;
&lt;br /&gt;
	-- calling tonumber on a string returns nil&lt;br /&gt;
	if not xp then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if xp == -1 then&lt;br /&gt;
		return 0&lt;br /&gt;
	elseif xp &amp;lt; 0 or xp &amp;gt; 200000000 then&lt;br /&gt;
		return &amp;quot;Value must be in the range 0 - 200,000,000&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i = 126, 1, -1 do&lt;br /&gt;
		if XPAtLevelUnr[i] &amp;lt;= xp then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.level_at_xp_unr(frame)&lt;br /&gt;
	return p._level_at_xp_unr(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Experience needed to obtain a level from a given amount of xp&lt;br /&gt;
-- If current xp is greater than target, returns 0&lt;br /&gt;
-- [[Template:XP to Level]]&lt;br /&gt;
--&lt;br /&gt;
function p._xp_to_level(xp, target)&lt;br /&gt;
	target = tonumber(target)&lt;br /&gt;
&lt;br /&gt;
	if type(xp) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 xp = commas_strip(xp)&lt;br /&gt;
	end&lt;br /&gt;
	xp = tonumber(xp)&lt;br /&gt;
	&lt;br /&gt;
	-- calling tonumber on a string returns nil&lt;br /&gt;
	if not xp or not target then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	elseif xp &amp;lt; 0 or xp &amp;gt; 200000000 then&lt;br /&gt;
		return &amp;quot;XP value must be in the range 0 - 200,000,000&amp;quot;&lt;br /&gt;
	elseif target &amp;lt; 2 or target &amp;gt; 99 then&lt;br /&gt;
		return &amp;quot;Level value must be in the range 2 - 99&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local target_xp = XPAtLevel[target]&lt;br /&gt;
&lt;br /&gt;
	if xp &amp;gt;= target_xp then&lt;br /&gt;
		return 0&lt;br /&gt;
	else&lt;br /&gt;
		return target_xp - xp&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.xp_to_level(frame)&lt;br /&gt;
	return p._xp_to_level(frame.args[1], frame.args[2])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Same as above, but with the 99 level cap removed&lt;br /&gt;
function p._xp_to_level_unr(xp, target)&lt;br /&gt;
	target = tonumber(target)&lt;br /&gt;
&lt;br /&gt;
	if type(xp) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 xp = commas_strip(xp)&lt;br /&gt;
	end&lt;br /&gt;
	xp = tonumber(xp)&lt;br /&gt;
	&lt;br /&gt;
	-- calling tonumber on a string returns nil&lt;br /&gt;
	if not xp or not target then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	elseif xp &amp;lt; 0 or xp &amp;gt; 200000000 then&lt;br /&gt;
		return &amp;quot;XP value must be in the range 0 - 200,000,000&amp;quot;&lt;br /&gt;
	elseif target &amp;lt; 2 or target &amp;gt; 126 then&lt;br /&gt;
		return &amp;quot;Level value must be in the range 2 - 99&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local target_xp = XPAtLevelUnr[target]&lt;br /&gt;
&lt;br /&gt;
	if xp &amp;gt;= target_xp then&lt;br /&gt;
		return 0&lt;br /&gt;
	else&lt;br /&gt;
		return target_xp - xp&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.xp_to_level_unr(frame)&lt;br /&gt;
	return p._xp_to_level_unr(frame.args[1], frame.args[2])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Experience between two levels; will always return absolute value&lt;br /&gt;
-- [[Template:XP level to level]]&lt;br /&gt;
--&lt;br /&gt;
function p._level_to_level(level1, level2)&lt;br /&gt;
	if type(level1) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 level1 = commas_strip(level1)&lt;br /&gt;
	end&lt;br /&gt;
	level1 = tonumber(level1)&lt;br /&gt;
&lt;br /&gt;
	if type(level2) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 level2 = commas_strip(level2)&lt;br /&gt;
	end&lt;br /&gt;
	level2 = tonumber(level2)&lt;br /&gt;
&lt;br /&gt;
	if not level1 or not level2 then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	elseif level1 &amp;lt; 1 or level1 &amp;gt; 99 or level2 &amp;lt; 1 or level2 &amp;gt; 99 then&lt;br /&gt;
		return &amp;quot;Level must be in the range 1 - 99&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local difference = XPAtLevel[level1] - XPAtLevel[level2]&lt;br /&gt;
	return math.abs(difference)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.level_to_level(frame)&lt;br /&gt;
	return p._level_to_level(frame.args[1], frame.args[2])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Same as above, but with the 99 level cap removed&lt;br /&gt;
function p._level_to_level_unr(level1, level2)&lt;br /&gt;
	if type(level1) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 level1 = commas_strip(level1)&lt;br /&gt;
	end&lt;br /&gt;
	level1 = tonumber(level1)&lt;br /&gt;
&lt;br /&gt;
	if type(level2) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		 level2 = commas_strip(level2)&lt;br /&gt;
	end&lt;br /&gt;
	level2 = tonumber(level2)&lt;br /&gt;
&lt;br /&gt;
	if not level1 or not level2 then&lt;br /&gt;
		 return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
	elseif level1 &amp;lt; 1 or level1 &amp;gt; 126 or level2 &amp;lt; 1 or level2 &amp;gt; 126 then&lt;br /&gt;
		return &amp;quot;Level must be in the range 1 - 126&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local difference = XPAtLevelUnr[level1] - XPAtLevelUnr[level2]&lt;br /&gt;
	return math.abs(difference)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.level_to_level_unr(frame)&lt;br /&gt;
	return p._level_to_level_unr(frame.args[1], frame.args[2])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._exp_diff(startxp, startlevel, targetxp, targetlevel)&lt;br /&gt;
	if startxp then&lt;br /&gt;
		startxp = tonumber(startxp) or 0&lt;br /&gt;
		if startxp &amp;lt; 0 or startxp &amp;gt; 200000000 then&lt;br /&gt;
			return &amp;quot;Experience must be in the range 0 - 200,000,000&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif startlevel then&lt;br /&gt;
		startlevel = tonumber(startlevel)&lt;br /&gt;
		if not startlevel then &lt;br /&gt;
			return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
		elseif startlevel &amp;lt; 1 or startlevel &amp;gt; 99 then&lt;br /&gt;
			return &amp;quot;Level must be in the range 1 - 99&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		startxp = XPAtLevel[startlevel]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if targetxp then&lt;br /&gt;
		targetxp = tonumber(targetxp) or 0&lt;br /&gt;
		if targetxp &amp;lt; 1 or targetxp &amp;gt; 200000000 then&lt;br /&gt;
			return &amp;quot;Experience must be in the range 1 - 200,000,000&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif targetlevel then&lt;br /&gt;
			targetlevel = tonumber(targetlevel)&lt;br /&gt;
		if not targetlevel then&lt;br /&gt;
			return &amp;quot;You must pass numbers as arguments&amp;quot;&lt;br /&gt;
		elseif targetlevel &amp;lt; 1 or targetlevel &amp;gt; 99 then&lt;br /&gt;
			return &amp;quot;Level must be in the range 1 - 99&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		targetxp = XPAtLevel[targetlevel]&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;You must pass either a target level or target xp.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if targetxp &amp;lt; startxp then&lt;br /&gt;
		return &amp;quot;Target must be higher than start.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return targetxp - startxp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.exp_diff(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	return p._exp_diff(args.startxp, args.startlevel, args.xp, args.level)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>