Module:LeagueBoostedDrop

Module documentation
This documentation is transcluded from Template:No documentation/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:LeagueBoostedDrop/doc. [edit]
Module:LeagueBoostedDrop's function main is invoked by Template:LeagueBoostedDrop.

local p = {};
local lang = mw.language.getContentLanguage()

local rarity_class = {
	{ 1, 'table-bg-blue' },
	{ 1/25, 'table-bg-green' },
	{ 1/99.99, 'table-bg-yellow' },
	{ 1/999.99, 'table-bg-orange' },
	{ 1/9999999, 'table-bg-red' }
}

function get_rarity_class(val)
	for i,v in ipairs(rarity_class) do
		curr = v
		if val >= v[1] then
			break
		end
	end
	return curr[2]
end

function sigfig(n, f)
	f = math.floor(f-1)
	if n == 0 then return 0 end
	local m = math.floor(math.log10(n))
	local v = n / (10^(m-f))
	v = math.floor(v) * 10^(m-f)
	return v
end

function commas(n)
	if tonumber(n) then
		return lang:formatNum(tonumber(n))
	else
		return n
	end
end
p.commas = commas

function expr(t)
	t = t:gsub(',', '')
	local err, val = pcall(mw.ext.ParserFunctions.expr, t)
	if err then
		return tonumber(val)
	else
		return false
	end
end

function p.main(frame)
	local args = frame:getParent().args
	return p._main(args)
end

function p._main(args)
	local Image = args['Image']			-- only used if Name is blank, or wish to override default image. Can provide multiple images comma-delimited
	local Name = args['Name']			-- name of item or drop
	local OptName = args['OptName'] 	-- intended to be used when links are formatted differently, e.x. when they are multiple sources
	local Source = args['Source']		-- source of drop
	local OptSource = args['OptSource'] -- intended to be used when links are formatted differently, e.x. when they are multiple sources
	local Rarity = {args['Rarity']}		-- base rarity of drop
	local Tiers = args['Tiers']			-- Optional parameter to determine quantity of rarity tiers to create on table row, including base rarity (default is 3)
	local Columns = args['Columns']		-- Optional parameter to create a total number of columns if greater than Tiers
	local Unfloored = args['Unfloored'] -- Optional parameter to prevent rarity from being floored after the multiplier is applied

	local rv1, rv2 = string.match(Rarity[1]:gsub(',',''), '([%d%.]+)/([%d%.]+)')
	if rv1 and rv2 then
		Rarity[1] = rv1/rv2
	else
		Rarity[1] = expr(Rarity)
	end

	local TotalTiers
	if Tiers == isNothing then
		TotalTiers = 3
		else
			TotalTiers = tonumber(Tiers)
	end
	
	local TotalColumns
	if Columns == isNothing then
		TotalColumns = 0
		else
			TotalColumns = tonumber(Columns)
	end
	
	for index=2,TotalTiers do
		local Multi = args["Multi"..index-1] -- Optional change to tier rarity multiplier, default to tier number
		if Multi == isNothing then
			Rarity[index] = Rarity[1] * (index);
			else
				Rarity[index] = Rarity[1] * Multi
		end
	end
	
	local rare_class = {};	-- assign colors for rarity
	local rare_text = {};
	for index,rarity in ipairs(Rarity) do
		local Denominator = sigfig((1/Rarity[index] + 0.001), 5)
		if Unfloored ~= nil then
			rare_text[index] = '1/' .. commas(string.format('%.1f', Denominator))
			rare_class[index] = get_rarity_class(1/Denominator)
		elseif math.floor(Denominator) == 1 then
			rare_text[index] = "Always"
			rare_class[index] = get_rarity_class(1)
		else
			rare_text[index] = '1/' .. commas(math.floor(Denominator))
			rare_class[index] = get_rarity_class(1/math.floor(Denominator))
		end
	end
	
	--Use Name as image link, or Image exactly as written
	if Image == isNothing then
		image = mw.ustring.format('[[File:%s.png]]', Name)
		else
		image = ''
		for img in string.gmatch(Image, ' *([^,]+) *') do
			image = image .. mw.ustring.format('[[File:%s.png]]', img)
		end
	end
	
	--Use Name as link, or OptName exactly as written
	if Name == isNothing then
		Name = OptName
		else
		Name = mw.ustring.format('[[%s]]', Name)
	end
	
	--Use Source as link, or OptSource exactly as written if Source is empty
	if Source == isNothing then
		Source = OptSource
		else
		Source = mw.ustring.format('[[%s]]', Source)
	end
	
	--create rows for table	
	local ret = mw.html.create('tr')
		:tag('td')
			:addClass('inventory-image')
			:wikitext(image)
		:done()
		:tag('td')
			:css('text-align','left')
			:addClass('item-col')
			:wikitext(Name)
		:done()
		:tag('td')
			:css('text-align','center')
			:addClass('source-col')
			:wikitext(Source)
		:done()
	for index=1,TotalTiers do
		ret = ret
			:tag('td')
				:addClass(rare_class[index])
				:wikitext(rare_text[index])
				:attr('data-sort-value',1/Rarity[index])
			:done()
	end
	for index=TotalTiers+1,TotalColumns do
		ret = ret
			:tag('td')
				:addClass('table-na nohighlight')
				:css('text-align','center')
				:wikitext("N/A")
				:attr('data-sort-value',0)
			:done()
	end
	return tostring(ret)
end

return p;