<?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%3ASlayer_weight_calculator</id>
	<title>Module:Slayer weight 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%3ASlayer_weight_calculator"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Slayer_weight_calculator&amp;action=history"/>
	<updated>2026-04-30T16:05:17Z</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:Slayer_weight_calculator&amp;diff=34254&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local Paramtest = require( &#039;Module:Paramtest&#039; ) local Slayerlib = require (&#039;Module:Slayer_task_library&#039; )  local p = {}  function p.invoke_main( frame ) 	local result = p.main( frame:getParent().args ) 	 	return result end   function p.tobool(str) 	if str == &#039;true&#039; then 		return true 	end 	return false end  function p.main( args ) 	-- Handle inputs 	local combatLevel, slayerLevel, defenceLevel, agilityLevel, rangedLevel, strengthLevel, hitpointsLevel, thievingCheck, fire...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Slayer_weight_calculator&amp;diff=34254&amp;oldid=prev"/>
		<updated>2024-10-15T23:59:40Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local Paramtest = require( &amp;#039;Module:Paramtest&amp;#039; ) local Slayerlib = require (&amp;#039;Module:Slayer_task_library&amp;#039; )  local p = {}  function p.invoke_main( frame ) 	local result = p.main( frame:getParent().args ) 	 	return result end   function p.tobool(str) 	if str == &amp;#039;true&amp;#039; then 		return true 	end 	return false end  function p.main( args ) 	-- Handle inputs 	local combatLevel, slayerLevel, defenceLevel, agilityLevel, rangedLevel, strengthLevel, hitpointsLevel, thievingCheck, fire...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Paramtest = require( &amp;#039;Module:Paramtest&amp;#039; )&lt;br /&gt;
local Slayerlib = require (&amp;#039;Module:Slayer_task_library&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.invoke_main( frame )&lt;br /&gt;
	local result = p.main( frame:getParent().args )&lt;br /&gt;
	&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.tobool(str)&lt;br /&gt;
	if str == &amp;#039;true&amp;#039; then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main( args )&lt;br /&gt;
	-- Handle inputs&lt;br /&gt;
	local combatLevel, slayerLevel, defenceLevel, agilityLevel, rangedLevel, strengthLevel, hitpointsLevel, thievingCheck, firemakingCheck, magicCheck = Paramtest.defaults{&lt;br /&gt;
		{ tonumber(args.combatLevel), 1 },&lt;br /&gt;
		{ tonumber(args.slayerLevel), 1 },&lt;br /&gt;
		{ tonumber(args.defenceLevel), 1 },&lt;br /&gt;
		{ tonumber(args.agilityLevel), 1 },&lt;br /&gt;
		{ tonumber(args.rangedLevel), 1 },&lt;br /&gt;
		{ tonumber(args.strengthLevel), 1 },&lt;br /&gt;
		{ tonumber(args.hitpointsLevel), 10 },&lt;br /&gt;
		{ args.thievingCheck, true },&lt;br /&gt;
		{ args.firemakingCheck, true },&lt;br /&gt;
		{ args.magicCheck, true }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local block1, block2, block3, block4, block5, block6, block7= Paramtest.defaults{&lt;br /&gt;
		{ args.block1, &amp;#039;None&amp;#039;},&lt;br /&gt;
		{ args.block2, &amp;#039;None&amp;#039;},&lt;br /&gt;
		{ args.block3, &amp;#039;None&amp;#039;},&lt;br /&gt;
		{ args.block4, &amp;#039;None&amp;#039;},&lt;br /&gt;
		{ args.block5, &amp;#039;None&amp;#039;},&lt;br /&gt;
		{ args.block6, &amp;#039;None&amp;#039;},&lt;br /&gt;
		{ args.block7, &amp;#039;None&amp;#039;},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local blocks = {&lt;br /&gt;
		block1,&lt;br /&gt;
		block2,&lt;br /&gt;
		block3,&lt;br /&gt;
		block4,&lt;br /&gt;
		block5,&lt;br /&gt;
		block6,&lt;br /&gt;
		block7&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- Magic number 23 since this is the highest level required for thieving (magic axes)&lt;br /&gt;
	local thievingLevel = 23&lt;br /&gt;
	if p.tobool(thievingCheck) == false then&lt;br /&gt;
		thievingLevel = 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Magic number 33 since this is the highest level required for firemaking&lt;br /&gt;
	local firemakingLevel = 33&lt;br /&gt;
	if p.tobool(firemakingCheck) == false then&lt;br /&gt;
		firemakingLevel = 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Magic number 50 since this is the highest level required for magic&lt;br /&gt;
	local magicLevel = 50&lt;br /&gt;
	if p.tobool(magicCheck) == false then&lt;br /&gt;
		magicLevel = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Need to create a stats table, unlocks table, quests table, and other table&lt;br /&gt;
	local stats = {&lt;br /&gt;
		Combat = combatLevel,&lt;br /&gt;
		Slayer = slayerLevel,&lt;br /&gt;
		Magic = magicLevel,&lt;br /&gt;
		Agility = agilityLevel,&lt;br /&gt;
		Strength = strengthLevel,&lt;br /&gt;
		Firemaking = firemakingLevel,&lt;br /&gt;
		Defence = defenceLevel,&lt;br /&gt;
		Hitpoints = hitpointsLevel,&lt;br /&gt;
		Ranged = rangedLevel,&lt;br /&gt;
		Thieving = thievingLevel&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- Since the checkboxes return the name of the unlock (same as in UNLOCK_IDS)&lt;br /&gt;
	-- if checked and nil if not checked, this array will only be the names of&lt;br /&gt;
	-- activated unlocks.&lt;br /&gt;
	local unlocks = { args.seeingRed, args.iHopeYouMithMe, args.watchTheBirdie,&lt;br /&gt;
		args.hotStuff, args.reptileGotRipped, args.likeABoss, args.stopTheWyvern, &lt;br /&gt;
		args.basilocked, args.unlockedVamps, args.iWildyMoreSlayer, args.warpedreality&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- Similarly, this will become a list of completed quests.&lt;br /&gt;
	local quests = {&lt;br /&gt;
		args.priestInPeril,&lt;br /&gt;
		args.dragonSlayerII,&lt;br /&gt;
		args.dragonSlayer,&lt;br /&gt;
		args.cabinFever,&lt;br /&gt;
		args.horrorFromTheDeep,&lt;br /&gt;
		args.mourningsEndPartII,&lt;br /&gt;
		args.desertTreasure,&lt;br /&gt;
		args.regicide,&lt;br /&gt;
		args.boneVoyage,&lt;br /&gt;
		args.lostCity,&lt;br /&gt;
		args.elementalWorkshopI,&lt;br /&gt;
		args.deathPlateau,&lt;br /&gt;
		args.lunarDiplomacy,&lt;br /&gt;
		args.olafsQuest,&lt;br /&gt;
		args.contact,&lt;br /&gt;
		args.rumDeal,&lt;br /&gt;
		args.skippyAndTheMogres,&lt;br /&gt;
		args.deathToTheDorgeshuun,&lt;br /&gt;
		args.legendsQuest,&lt;br /&gt;
		args.ernestTheChicken,&lt;br /&gt;
		args.royalTrouble,&lt;br /&gt;
		args.hauntedMine,&lt;br /&gt;
		args.porcineOfInterest,&lt;br /&gt;
		args.SecretsOfTheNorth,&lt;br /&gt;
		args.DesertTreasure2,&lt;br /&gt;
		args.perilousMoons&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- List of completed other activities.&lt;br /&gt;
	local accessGWD = nil&lt;br /&gt;
	if stats[&amp;quot;Strength&amp;quot;] &amp;gt;= 60 or stats[&amp;quot;Agility&amp;quot;] &amp;gt;= 60 then&lt;br /&gt;
		accessGWD = &amp;#039;Access GWD&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local other = {&lt;br /&gt;
		args.ancientCavern,&lt;br /&gt;
		accessGWD,&lt;br /&gt;
		args.brittleKey,&lt;br /&gt;
		args.accessAbyss&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- Create the player status given our various inputs&lt;br /&gt;
	status = Slayerlib.create_status(stats, quests, unlocks, other, blocks)&lt;br /&gt;
&lt;br /&gt;
	-- Get the entire task table of the chosen slayer master.&lt;br /&gt;
	masterTable = Slayerlib.get_table(args.master)&lt;br /&gt;
	&lt;br /&gt;
	-- Get the tables of available and unavailable tasks.&lt;br /&gt;
	effectiveTable, unavailableTable = Slayerlib.get_effective_table(masterTable, status, true)&lt;br /&gt;
&lt;br /&gt;
	-- Pass these to calculate percents.&lt;br /&gt;
	local results, subResults = p.calculate_percents(effectiveTable, unavailableTable)&lt;br /&gt;
	&lt;br /&gt;
	-- Render the results&lt;br /&gt;
	local resultsDiv = mw.html.create( &amp;#039;div&amp;#039; )&lt;br /&gt;
	local renderedResults = p.render_table(results, (args.master .. &amp;#039; Main Task Table&amp;#039;), &amp;#039;Monster Name&amp;#039;)&lt;br /&gt;
	renderedResults:css({display = &amp;#039;inline-block&amp;#039;,&lt;br /&gt;
	float = &amp;#039;left&amp;#039;})&lt;br /&gt;
	resultsDiv:node(tostring(renderedResults))&lt;br /&gt;
	if next(subResults) ~= nil then&lt;br /&gt;
		local renderedSubResults = p.render_table(subResults, (args.master .. &amp;#039; Boss Subtable&amp;#039;), &amp;#039;Boss Name&amp;#039;)&lt;br /&gt;
		renderedSubResults:css({display = &amp;#039;inline-block&amp;#039;})&lt;br /&gt;
		resultsDiv:node(tostring(renderedSubResults))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultsDiv&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Calculates the percent chance of getting each task from effectiveTable.&lt;br /&gt;
--&lt;br /&gt;
-- @param effectiveTable {table} A table of all tasks the player can be assigned.&lt;br /&gt;
-- @param unavailableTable {table} A table of all tasks the player cannot be assigned.&lt;br /&gt;
--&lt;br /&gt;
-- @return {table} Returns a table that contains the task name as key and the&lt;br /&gt;
--					percent chance (decimal form) of getting it as the value.&lt;br /&gt;
--&lt;br /&gt;
function p.calculate_percents(effectiveTable, unavailableTable)&lt;br /&gt;
	local totalWeight = 0&lt;br /&gt;
	for k, v in pairs(effectiveTable) do&lt;br /&gt;
		totalWeight = totalWeight + v[&amp;#039;weight&amp;#039;]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local percentageTable = {}&lt;br /&gt;
	local subPercentageTable = {}&lt;br /&gt;
	for k, v in pairs(effectiveTable) do&lt;br /&gt;
		if v[&amp;#039;subtable&amp;#039;] ~= nil then&lt;br /&gt;
			subtablePercents = p.calculate_percents(v[&amp;#039;subtable&amp;#039;], v[&amp;#039;unavailableSubtable&amp;#039;])&lt;br /&gt;
			subtableMult = v[&amp;#039;weight&amp;#039;]/totalWeight&lt;br /&gt;
			for sK, sV in pairs(subtablePercents) do&lt;br /&gt;
				subPercentageTable[sK] = sV*subtableMult&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		percentageTable[v[&amp;#039;name&amp;#039;]] = v[&amp;#039;weight&amp;#039;]/totalWeight&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(unavailableTable) do&lt;br /&gt;
		percentageTable[v[&amp;#039;name&amp;#039;]] = 0&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return percentageTable, subPercentageTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function pairs_by_keys(t, f)&lt;br /&gt;
	local a = {}&lt;br /&gt;
	for n in pairs(t) do table.insert(a, n) end&lt;br /&gt;
	table.sort(a, f)&lt;br /&gt;
	local i = 0      -- iterator variable&lt;br /&gt;
	local iter = function ()   -- iterator function&lt;br /&gt;
    	i = i + 1&lt;br /&gt;
    	if a[i] == nil then return nil&lt;br /&gt;
    	else return a[i], t[a[i]]&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
	return iter&lt;br /&gt;
end&lt;br /&gt;
    &lt;br /&gt;
-- Render the results table.&lt;br /&gt;
function p.render_table(results, headerName, monsterColumnTitle)&lt;br /&gt;
	local resultsTable = mw.html.create( &amp;#039;table&amp;#039; )&lt;br /&gt;
	resultsTable:addClass( &amp;#039;wikitable&amp;#039; )&lt;br /&gt;
		:addClass( &amp;#039;sortable&amp;#039;)&lt;br /&gt;
		:addClass( &amp;#039;align-center-1&amp;#039; )&lt;br /&gt;
		:tag( &amp;#039;tr&amp;#039; )&lt;br /&gt;
			:tag( &amp;#039;th&amp;#039; )&lt;br /&gt;
				:wikitext( headerName )&lt;br /&gt;
				:attr( &amp;#039;colspan&amp;#039;, 2 )&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag( &amp;#039;tr&amp;#039; )&lt;br /&gt;
			:tag( &amp;#039;th&amp;#039; )&lt;br /&gt;
				:wikitext( monsterColumnTitle )&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag( &amp;#039;th&amp;#039; )&lt;br /&gt;
				:wikitext( &amp;#039;Assignment Chance&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
	:done()&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs_by_keys(results) do&lt;br /&gt;
		resultsTable:tag( &amp;#039;tr&amp;#039; )&lt;br /&gt;
			:tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
				:wikitext( k )&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
				:wikitext( string.format(&amp;quot;%.2f&amp;quot;, 100*v ) .. &amp;quot;%&amp;quot;)&lt;br /&gt;
				:attr( &amp;#039;align&amp;#039;, &amp;#039;right&amp;#039; )&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultsTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>