Module:DropRateCalc: Difference between revisions

From Roat Pkz
Jump to navigation Jump to search
(add n/a to output for div/royal-exclusive npcs)
(add fix for vote toggle)
 
Line 49: Line 49:
         local na = (rank == "divine" and i > 1 and i < 7)
         local na = (rank == "divine" and i > 1 and i < 7)
                 or (rank == "royal" and i > 1 and i < 6)
                 or (rank == "royal" and i > 1 and i < 6)
         local attrs = ' data-baserate="' .. base .. '" data-reduction="' .. b.reduction .. '"'
         local attrs = ''
        if noboost then attrs = attrs .. ' data-noboost="1"' end
        if not na then -- fix for MediaWiki:VoteBoostToggle.js. N/As can't have datas, else toggle will re-render them
            attrs = ' data-baserate="' .. base .. '" data-reduction="' .. b.reduction .. '"'
            if noboost then attrs = attrs .. ' data-noboost="1"' end
        end
         table.insert(cells,
         table.insert(cells,
             '<td' .. attrs
             '<td' .. attrs

Latest revision as of 15:52, 12 August 2026

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 = ''
        if not na then -- fix for MediaWiki:VoteBoostToggle.js. N/As can't have datas, else toggle will re-render them
            attrs = ' data-baserate="' .. base .. '" data-reduction="' .. b.reduction .. '"'
            if noboost then attrs = attrs .. ' data-noboost="1"' end
        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