Module:MutationValue

local p = {} local cap = 60

local function round_half_up(n) local base, frac = math.modf(n) if frac >= 0.5 then return base + 1 else return base end end

function truncate_to(number, max_digits) local integral_part_digits = math.floor(math.log10(number)) + 1 if integral_part_digits >= max_digits then return round_half_up(number) else local digit_diff_pow10 = 10^(max_digits - integral_part_digits) return round_half_up(number * digit_diff_pow10) / digit_diff_pow10 end end

function searchcap(formula, limit, initial, left, right) if left > right then return false end local mid = math.floor((left+right)/2) local equat = formula:gsub('base', initial):gsub('i', tostring(mid-1)) if tonumber(mw.ext.ParserFunctions.expr(equat)) >= limit then cap = mid searchcap(formula, limit, initial, left, mid-1) else searchcap(formula, limit, initial, mid+1, right) end end

function p.main(frame) local args = require("Module:Arguments").getArgs(frame) local base = args['base'] local eqt = args['equation'] local unit = args['unit'] local d = args['digits'] local vcap = args['value_cap'] local cap2 = args['cap'] if not d then d = 1 end if not unit then unit = '' end base = tonumber(base) if cap2 then cap = cap2 end if vcap then vcap = tonumber(vcap) searchcap(eqt, vcap, base, 1, 60) else vcap = 9999999 end d = tonumber(d)

result = {} result[1] = ' ' result[2] = '{| class=wikitable style="text-align:center;'	result[3] = '!Number of stats || 1 '	result[4] = '|-'	result[5] = '|Mutation effect || ' .. base .. unit .. ' '	result[6] = '|}'	result[7] = ' '	local equation = ''	local value = 0	for k = 2, math.min(10, cap-1) do		result[3] = result[3] .. '|| ' .. k		equation = eqt:gsub('base', base):gsub('i', tostring(k-1))		value = tonumber(mw.ext.ParserFunctions.expr(equation))		value = truncate_to(value, d)		result[5] = result[5] .. '|| ' .. value .. unit	end	for k = 3, math.floor((cap-1)/5) do		local k5 = k*5		result[3] = result[3] .. '|| ' .. k5		equation = eqt:gsub('base',base):gsub('i', tostring(k5-1))		value = tonumber(mw.ext.ParserFunctions.expr(equation))		value = truncate_to(value, d)		result[5] = result[5] .. '|| ' .. value .. unit	end	result[3] = result[3] .. '|| ' .. cap	equation = eqt:gsub('base',base):gsub('i', tostring(cap-1)) value = tonumber(mw.ext.ParserFunctions.expr(equation)) value = truncate_to(value, d)	value = math.min(vcap, value) result[5] = result[5] .. '|| ' .. value .. unit if cap < 60 then result[3] = result[3] .. '+ ' end result[3] = result[3] .. '|| ...'	result[5] = result[5] .. '|| ...'	return table.concat(result, "\n") end

return p