Module:Sandbox/User:Jakesterwars/Skill calc/Helpers

Module documentation
This documentation is transcluded from Template:Module sandbox/doc. [edit] [history] [purge]
Module:Sandbox/User:Jakesterwars/Skill calc/Helpers requires Module:Addcommas.
Module:Sandbox/User:Jakesterwars/Skill calc/Helpers requires Module:Experience.
Module:Sandbox/User:Jakesterwars/Skill calc/Helpers requires Module:Yesno.
Module:Sandbox/User:Jakesterwars/Skill calc/Helpers is required by Module:Sandbox/User:Jakesterwars/Skill calc.
Module:Sandbox/User:Jakesterwars/Skill calc/Helpers is required by Module:Skill calc.

This module is a sandbox for Jakesterwars. It can be used to test changes to existing modules, prototype new modules, or just experimenting with lua features.

Invocations of this sandbox should be kept in userspace; if the module is intended for use in other namespaces, it should be moved out of the sandbox into a normal module and template.

This default documentation can be overridden by creating the /doc subpage of this module, as normal.

local p = {}

local yesNo = require('Module:Yesno')
local xp = require('Module:Experience').xp_at_level
local level = require('Module:Experience').level_at_xp_unr
local commas = require('Module:Addcommas')._add

function p.filterData(data, method, dataCriteria, goalLevel)
	local methodData = {}
	local addRow = false

	for i, v in ipairs(data) do
		if dataCriteria ~= 'Hide' or tonumber(v.level) <= tonumber(goalLevel) then
			if method == 'All' then
				table.insert(methodData, v)
			else
				for type in string.gmatch(v.type, '([^,]*)') do
					local formatted = string.gsub(type, '^%s*(.-)%s*$', '%1')
					if formatted == method then
						table.insert(methodData, v)
					end
				end	
			end
		end
	end

	-- Sort the data
	table.sort(methodData, function(a, b) return p.sortTable(a, b) end)
	
	return methodData
end

function p.calculateCurrentGoalInformation(curr, currToggle, goal, goalToggle)
	local currLevel, currXP, goalLevel, goalXP
    
    if currToggle == 'Level' and tonumber(curr) <= 99 then
    	if tonumber(curr) == 0 then
    		currLevel = 1
    		currXP = xp({args = {1}})
    	else
    		currLevel = curr
        	currXP = xp({args = {curr}})
        end
    else
    	currLevel = level({args = {curr}})
        currXP = curr
    end
    
    if goalToggle == 'Level' and tonumber(goal) <= 99 then
    	if tonumber(goal) == 0 then
    		goalLevel = 1
    		goalXP = xp({args = {1}})
    	else
    		goalLevel = goal
        	goalXP = xp({args = {goal}})
        end
    else
    	goalLevel = level({args = {goal}})
        goalXP = goal
    end

    -- Prevent negative values
    local remaining = math.ceil(goalXP - currXP)
    if remaining < 0 then
        remaining = 0
    end
    
    return { currentLevel = tonumber(currLevel), currentExperience = currXP, goalLevel = tonumber(goalLevel), goalExperience = goalXP, experienceRemaining = remaining }
end

function p.membersIcon(data)
	local icon
	if data then
		local membersOnly = yesNo(data, true)
		if membersOnly then
			icon = '[[File:Member icon.png|center|link=Members]]'
		else
			icon = '[[File:Free-to-play icon.png|center|link=Free-to-play]]'
		end
	else
		icon = '[[File:Free-to-play icon.png|center|link=Free-to-play]]'
	end
	
	return icon	
end

function p.checkForBoostingSetSkill(skill)
  return not not ({
    Woodcutting = true, Farming = true, Fishing = true, Mining = true, Firemaking = true, Construction = true, Prayer = true
  })[skill]
end

function p.determineSetValue(pieces, skill)
	local isEverythingTrue = true
	local value = 0
	for _, v in ipairs(pieces) do
		if v[1] == 'false' or v[1] == nil then
			isEverythingTrue = false
		else
			value = value + tonumber(v[2])
		end
	end
	
	if isEverythingTrue then
		return skill == 'Prayer' and 0.05 or 0.025
	else
		return value
	end
end

function p.createMessage(skill, bulkData)
    return string.format('To train %s from %s experience (level %s) to %s experience (level %s), %s experience is required.', 
    	skill, commas(bulkData.currentExperience), bulkData.currentLevel, commas(bulkData.goalExperience), bulkData.goalLevel, commas(bulkData.experienceRemaining))
end

function p.sortTable(a, b)
	local value = false
	
	if a.level == b.level then
		if a.xp == b.xp then
			if a.name == b.name then
				if a.title and b.title then
					value = a.title < b.title
				elseif a.title and not b.title then
					value = a.title < b.name
				elseif not a.title and b.title then
					value = a.name < b.title
				end
			else
				value = a.name < b.name	
			end
		else
			value = a.xp < b.xp
		end
	else
		value = a.level < b.level
	end
    
    return value
end

function p.jagexFloor(num, numDecimalPlaces)
  local mult = 10 ^ (numDecimalPlaces or 0)
  return math.floor(num * mult) / mult
end

function p.isRowGrey(actionLevel, currentLevel)
	local color = ''
	local aLevel = actionLevel and actionLevel or 1
	
	if aLevel > tonumber(currentLevel) then
		color = 'table-bg-fade'
	end
	
	return color
end

return p