Module:DropRateCalc: Difference between revisions

From Roat Pkz
Jump to navigation Jump to search
(vote boost toggle handling)
(add fix for vote toggle)
 
(One intermediate revision by the same user not shown)
Line 25: Line 25:
         return "#5c1a1a"  -- extremely rare  
         return "#5c1a1a"  -- extremely rare  
     end
     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
end


Line 31: Line 42:
     if not base then return "Invalid base rate" end
     if not base then return "Invalid base rate" end
     local noboost = frame.args[2] == "noboost"
     local noboost = frame.args[2] == "noboost"
    local rank = npcRank(frame)
     local cells = {}
     local cells = {}
     for _, tier in ipairs(buffs) do
     for i, b in ipairs(buffs) do
        local reduction
         local rate = math.floor(base * (1 - (noboost and 0 or b.reduction)))
        if noboost then
        -- lesser ranks get N/A on div/royal NPCs
            reduction = 0
         local na = (rank == "divine" and i > 1 and i < 7)
        else
                or (rank == "royal" and i > 1 and i < 6)
            reduction = tier.reduction
         local attrs = ''
        end
        if not na then -- fix for MediaWiki:VoteBoostToggle.js. N/As can't have datas, else toggle will re-render them
         local rate = math.floor(base * (1 - reduction))
            attrs = ' data-baserate="' .. base .. '" data-reduction="' .. b.reduction .. '"'
         local color = getColor(rate)
            if noboost then attrs = attrs .. ' data-noboost="1"' end
         local attrs = ' data-baserate="' .. base .. '"'
                  .. ' data-reduction="' .. tier.reduction .. '"'
        if noboost then
            attrs = attrs .. ' data-noboost="1"'
         end
         end
         table.insert(cells,
         table.insert(cells,
             '<td' .. attrs
             '<td' .. attrs
             .. ' style="background-color:' .. color .. '; color:#ffffff; text-align:center;"'
             .. ' style="background-color:' .. (na and '#4a4a55' or getColor(rate)) .. '; color:#ffffff; text-align:center;"'
             .. '>1/' .. rate .. '</td>'
             .. '>' .. (na and 'N/A' or '1/' .. rate) .. '</td>'
         )
         )
     end
     end

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