Module:DropRateCalc
Need to test if Larran's keys are buffed, specifically for Template:CallistoDrops and the other bosses like that.
local p = {}
local buffs = {
{label = "Base", reduction = 0},
{label = "Donator", reduction = 0.15},
{label = "Super donator", reduction = 0.25},
{label = "Extreme donator", reduction = 0.30},
{label = "Legendary donator", reduction = 0.35},
{label = "Royal donator", reduction = 0.40},
{label = "Divine donator", reduction = 0.45},
}
-- somewhat matches osrs wiki
local function getColor(rate)
if rate == 1 then
return "#0b5884" -- always
elseif rate <= 16 then
return "#3c780a" -- common
elseif rate <= 64 then
return "#a48900" -- uncommon
elseif rate <= 256 then
return "#b55e0c" -- rare
elseif rate <= 999 then
return "#9f261e" -- very rare
else
return "#5c1a1a" -- extremely rare
end
end
-- pass rank like {{DropRateCalc|512||d}} or {{DropRateCalc|512||r}}. The two || between rate and rank are necessary, otherwise the arg is matched as noboost.
-- fallback to title to save edits on all pre-existing div pages (hopefully)
local function npcRank(frame)
local f = frame.args[3] and frame.args[3]:lower() or ""
if f == "d" then return "divine" end
if f == "r" then return "royal" end
local title = mw.title.getCurrentTitle().text:lower()
if title:find("divine", 1, true) then return "divine" end
if title:find("royal", 1, true) then return "royal" end
end
function p.calc(frame)
local base = tonumber(frame.args[1])
if not base then return "Invalid base rate" end
local noboost = frame.args[2] == "noboost"
local rank = npcRank(frame)
local cells = {}
for i, b in ipairs(buffs) do
local rate = math.floor(base * (1 - (noboost and 0 or b.reduction)))
-- lesser ranks get N/A on div/royal NPCs
local na = (rank == "divine" and i > 1 and i < 7)
or (rank == "royal" and i > 1 and i < 6)
local attrs = ' data-baserate="' .. base .. '" data-reduction="' .. b.reduction .. '"'
if noboost then attrs = attrs .. ' data-noboost="1"' end
table.insert(cells,
'<td' .. attrs
.. ' style="background-color:' .. (na and '#4a4a55' or getColor(rate)) .. '; color:#ffffff; text-align:center;"'
.. '>' .. (na and 'N/A' or '1/' .. rate) .. '</td>'
)
end
return table.concat(cells, "")
end
return p