Jump to content

Module:YYSandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Yabaiyatsu (talk | contribs) at 15:25, 30 May 2024. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local public = {}
local private = {}

-- Removes leading and trailing spaces from strings
function private.trimWhitespace(str)
	local whitespace = { [" "]=true, ["\n"]=true, ["\r"]=true }
	
    local _start = 1
    while (whitespace[str:sub(_start, _start)]) do
        _start = _start + 1
    end
    local _end = str:len()
    while (whitespace[str:sub(_end, _end)]) do
        _end = _end - 1
    end
    return str:sub(_start, _end)
end

-- Checks if a table has a specific key
function private.hasKey(_table, key)
    return _table[key] ~= nil
end

-- Gets a specific item from a table, with a fallback if the table doesn't have that key
function private.getValue(_table, key, fallback)
    if private.hasKey(_table, key) then
        return _table[key]
    else
        return fallback
    end
end

-- Processes a csv row into a table and returns it
function private.processCsv(csv)
	local retval = {}
	for arg in csv:gmatch("([^,]+)") do
		table.insert(retval, private.trimWhitespace(arg))
	end
	return retval
end

-- Get the arguments from a frame
function private.parseArgs(frame)
	if private.getValue(frame.args, "external_args", false) then
		return frame:getParent().args
	end
	return frame.args
end

-- Converts a difficulty number into a format that handles sorting better for + difficulties
function public.SortableDifficulty(frame)
	local args = private.parseArgs(frame)
	if private.hasKey(args, 1) == false then
		return ''
	end
	local diff = args[1]
	if type(diff) == 'number' then
		return diff
	end
	diff = private.trimWhitespace(diff)
	if diff:sub(#diff, #diff) == '+' then
		return tonumber(diff:sub(1, #diff - 1) .. '.5')
	end
	return diff
end

-- Converts a version number into a format that handles sorting better
function public.SortableVersion(frame)
	local args = private.parseArgs(frame)
	if private.hasKey(args, 1) == false then
		return ''
	end
	local retval = ''
	for vpart in args[1]:gmatch('[^.]+') do
		while #vpart < 4 do
			vpart = '0' .. vpart
		end
		retval = retval .. vpart
	end
	return retval
end



local normed_stats = {
    0.00000000e+00,
    5.83175390e-04,
    4.66540312e-03,
    1.57457355e-02,
    3.73232250e-02,
    7.28969237e-02,
    1.25965884e-01,
    2.00029159e-01,
    2.98585800e-01,
    4.25134859e-01,
    5.74865141e-01,
    7.01414200e-01,
    7.99970841e-01,
    8.74034116e-01,
    9.27103076e-01,
    9.62676775e-01,
    9.84254264e-01,
    9.95334597e-01,
    9.99416825e-01,
    1.00000000e+00
}

-- Calculates Lv 1-20 FRAG/STEP/OVER given the Lv 1/20 values
function private.calculateStat(stat1, stat20, statInc, lv)
	if lv <= 20 then
    	return stat1 + normed_stats[lv] * (stat20 - stat1)
    else
    	return stat20 + (lv - 20) * statInc
    end
end


-- Generates rows (Template:ExactStatTableRow) for use by Template:ExactStatTable
function public.ExactStatTableRows(frame)
	local args = private.parseArgs(frame)
	-- local partnerStats = JsonUtils.jsonToObj("User:GKWS/partnerStats")
	local partnerStats = mw.loadJsonData("Module:YYSandbox/partnerStats.json")
	local stat = private.getValue(args, 'stat', false)
	local statIncStr = 'awakened' .. (stat:gsub("^%l", string.upper)) .. 'Increment'
	
	local rows = {}
	for partner, ps in pairs(partnerStats) do
		local ps = partnerStats[partner]
		
		local minLv = 1
		local maxLv = 20
		if partner == 'Hikari & Tairitsu (Reunion)' then
			minLv = 20
		end
		if ps['hasAwakening'] then
			maxLv = 30
		end
		
		-- local playRating = private.getValue(args, 'playrating', 10)
		-- local trackLostFactor = 0
		
		local row_args = {
			partner = partner,
			link = 'Arcaea',
		}
		local stat1 = ps[stat][1]
		local stat20 = ps[stat][2]
		local statInc = 0
		if ps['hasAwakening'] then
			statInc = ps[statIncStr]
		end
		for lv = minLv, maxLv, 1 do
			statLv = private.calculateStat(stat1, stat20, statInc, lv)
			row_args['stat' .. lv] = string.format("%.3f", statLv)
		end
		local row = frame:expandTemplate{title = 'YYExactStatTableRow', args=row_args}
		rows[#rows+1] = row
	end

	return table.concat(rows, "\n")
end

return public