Module:AttackSpeedCalculator

From WoopMC

Documentation for this module may be created at Module:AttackSpeedCalculator/doc

-- (4 + addition) * (1 + multiply)

local p = {}

function Round(val)
	return math.floor(val*100)/100
end

function Calculate(Add, AddMin, AddMax, Mult, MultMin, MultMax)
	local bitval = 0
	if Add ~= 0 then bitval = bitval + 1 end
	if AddMin ~= 0 then bitval = bitval + 2 end
	if AddMax ~= 0 then bitval = bitval + 4 end
	if Mult ~= 0 then
		bitval = bitval + 8
		Mult = 1 + Mult
	end
	if MultMin ~= 0 then
		bitval = bitval + 16
		MultMin = 1 + MultMin
	end
	if MultMax ~= 0 then
		bitval = bitval + 32
		MultMax = 1 + MultMax
	end

	-- Single addition and single multiply
	if bitval == 9 then
		local as = (4 + Add) * Mult
		return Round(as), Round(1/as)
	-- Single addition, range multiply
	elseif bitval == 49 then
		local as1 = (4 + Add) * MultMin
		local as2 = (4 + Add) * MultMax
		if as1 > as2 then as1, as2 = as2, as1 end
		return Round(as1), Round(1/as1), Round(as2), Round(1/as2)
	-- Range addition, single multiply
	elseif bitval == 14 then
		local as1 = (4 + AddMin) * Mult
		local as2 = (4 + AddMax) * Mult
		if as1 > as2 then as1, as2 = as2, as1 end
		return Round(as1), Round(1/as1), Round(as2), Round(1/as2)
	-- Range addition, range multiply
	elseif bitval == 54 then
		local as1 = (4 + AddMin) * MultMin
		local as2 = (4 + AddMax) * MultMax
		if as1 > as2 then as1, as2 = as2, as1 end
		return Round(as1), Round(1/as1), Round(as2), Round(1/as2)
	-- No addition, single multiply
	elseif bitval == 8 then
		local as = 4 * Mult
		return Round(as), Round(1/as)
	-- No addition, range multiply
	elseif bitval == 48 then
		local as1 = 4 * MultMin
		local as2 = 4 * MultMax
		if as1 > as2 then as1, as2 = as2, as1 end
		return Round(as1), Round(1/as1), Round(as2), Round(1/as2)
	-- Single addition, no multiply
	elseif bitval == 1 then
		local as = 4 + Add
		return Round(as), Round(1/as)
	-- Range addition, no multiply
	elseif bitval == 6 then
		local as1 = 4 * AddMin
		local as2 = 4 * AddMax
		if as1 > as2 then as1, as2 = as2, as1 end
		return Round(as1), Round(1/as1), Round(as2), Round(1/as2)
	-- Bruh
	else
		return nil
	end
end

p.Calculate = function(frame)
	local clean_args = {}
	for k, v in pairs(frame.args) do
		if k > 0 then
			table.insert(clean_args, k, tonumber(v))
		end
	end

	local as1, as2, as3, as4 = Calculate(unpack(clean_args)) --Getting an error here? change table.unpack to unpack!
	if not as1 then
		return "Invalid input!"
	elseif as3 then
		return string.format("%s - %s", frame:callParserFunction("#tip-text", as1, string.format("%s strikes per second", as2)), frame:callParserFunction("#tip-text", as3, string.format("%s strikes per second", as4)))
	else
		return frame:callParserFunction("#tip-text", as1, string.format("%s seconds per strike", as2))
	end
end

return p

-- print(p.Calculate(arg))
-- print(Calculate(tonumber(arg[1]), tonumber(arg[2]), tonumber(arg[3]), tonumber(arg[4]), tonumber(arg[5]), tonumber(arg[6])))