<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.roatpkz.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Roat Pkz - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.roatpkz.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/Special:Contributions/Admin"/>
	<updated>2026-05-25T15:48:28Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18658</id>
		<title>Module:DropsLine</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18658"/>
		<updated>2024-04-04T00:44:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local params = require(&#039;Module:Paramtest&#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
local coins_image = require(&#039;Module:Coins image&#039;)&lt;br /&gt;
local curr_image = require(&#039;Module:Currency Image&#039;)&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local var = mw.ext.VariablesLua&lt;br /&gt;
&lt;br /&gt;
-- precalculated cached data&lt;br /&gt;
local droppeditem_data = mw.loadJsonData(&#039;Module:DropsLine/itemData.json&#039;)&lt;br /&gt;
local geprices_data = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;)&lt;br /&gt;
local highalch_data = mw.loadJsonData(&#039;Module:GEHighAlchs/data.json&#039;)&lt;br /&gt;
&lt;br /&gt;
local ptitle = mw.title.getCurrentTitle()&lt;br /&gt;
local ns = ptitle.nsText&lt;br /&gt;
local title = ptitle.fullText&lt;br /&gt;
local pgTitle = ptitle.text&lt;br /&gt;
&lt;br /&gt;
local _noted = &#039;&amp;amp;nbsp;&amp;lt;span class=&amp;quot;dropsline-noted&amp;quot;&amp;gt;(noted)&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
local coins_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
local other_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--bg, txt, sort; acceptable non-quantity rarity names&lt;br /&gt;
local rarities = {&lt;br /&gt;
    always = { &#039;table-bg-blue&#039;, 1 },&lt;br /&gt;
    common = { &#039;table-bg-green&#039;, 16 },&lt;br /&gt;
    uncommon = { &#039;table-bg-yellow&#039;, 64 },&lt;br /&gt;
    rare = { &#039;table-bg-orange&#039;, 128 },&lt;br /&gt;
    [&#039;very rare&#039;] = { &#039;table-bg-red&#039;, 1024 },&lt;br /&gt;
    random = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    varies = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    once = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    conditional = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    _default = { &#039;table-bg-grey&#039;, 65536 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- colour-code&lt;br /&gt;
local rarities_class = {&lt;br /&gt;
    { 1, &#039;table-bg-blue&#039; },&lt;br /&gt;
    { 1/25, &#039;table-bg-green&#039; },&lt;br /&gt;
    { 1/99.99, &#039;table-bg-yellow&#039; },&lt;br /&gt;
    { 1/999.99, &#039;table-bg-orange&#039; },&lt;br /&gt;
    { 1/9999999, &#039;table-bg-red&#039; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_rarity_class(val)&lt;br /&gt;
    for i,v in ipairs(rarities_class) do&lt;br /&gt;
        curr = v&lt;br /&gt;
        if val &amp;gt;= v[1] then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return curr[2]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function commas(n)&lt;br /&gt;
    if tonumber(n) then&lt;br /&gt;
        return lang:formatNum(tonumber(n))&lt;br /&gt;
    else&lt;br /&gt;
        return n&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expr(t)&lt;br /&gt;
    local noerr, val = pcall(mw.ext.ParserFunctions.expr, t)&lt;br /&gt;
    if noerr then&lt;br /&gt;
        return tonumber(val)&lt;br /&gt;
    else&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sigfig(n, f)&lt;br /&gt;
    f = math.floor(f-1)&lt;br /&gt;
    if n == 0 then return 0 end&lt;br /&gt;
    local m = math.floor(math.log10(n))&lt;br /&gt;
    f = math.max(m, f)&lt;br /&gt;
    local v = n / (10^(m-f))&lt;br /&gt;
    v = math.floor(v + 0.5) * 10^(m-f)&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
p.sigfig = sigfig&lt;br /&gt;
p.commas = commas&lt;br /&gt;
&lt;br /&gt;
-- Function to adjust rarity based on donator rank&lt;br /&gt;
function adjust_rarity(rarity_value, adjustment)&lt;br /&gt;
    if not rarity_value or not tonumber(rarity_value) then return nil end&lt;br /&gt;
    local adjusted_value = 1 / ((1 / rarity_value) * (1 - adjustment))&lt;br /&gt;
    return adjusted_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to generate adjusted rarity cells&lt;br /&gt;
function generate_donator_rarity_cells(rarity_value)&lt;br /&gt;
    local adjustments = {&lt;br /&gt;
        [&#039;Normal Donator&#039;] = 0.15,&lt;br /&gt;
        [&#039;Super Donator&#039;] = 0.25,&lt;br /&gt;
        [&#039;Extreme Donator&#039;] = 0.30,&lt;br /&gt;
        [&#039;Legendary Donator&#039;] = 0.35,&lt;br /&gt;
        [&#039;Royal Donator&#039;] = 0.40&lt;br /&gt;
    }&lt;br /&gt;
    local cells = {}&lt;br /&gt;
    for rank, adjustment in pairs(adjustments) do&lt;br /&gt;
        local adjusted_rarity = adjust_rarity(rarity_value, adjustment)&lt;br /&gt;
        if adjusted_rarity then&lt;br /&gt;
            local rarity_text = string.format(&#039;1/%d&#039;, math.floor(adjusted_rarity))&lt;br /&gt;
            table.insert(cells, rarity_text)&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(cells, &#039;N/A&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return cells&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local frameArgs = frame.args&lt;br /&gt;
&lt;br /&gt;
    local name,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,alt_rarity,alt_rarity_endash,&lt;br /&gt;
        raritynotes,citation,monVers = params.defaults{&lt;br /&gt;
                    {args.name or args.Name,&#039;Item&#039;},&lt;br /&gt;
                    {args.namenotes or args.Namenotes,&#039;&#039;},&lt;br /&gt;
                    {args.quantity or args.Quantity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.quantitynotes or args.Quantitynotes,&#039;&#039;},&lt;br /&gt;
                    {args.rarity or args.Rarity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.altrarity or args.AltRarity,&#039;&#039;},&lt;br /&gt;
                    {args.altraritydash or args.AltRarityDash,&#039;&#039;},&lt;br /&gt;
                    {args.raritynotes or args.Raritynotes,&#039;&#039;},&lt;br /&gt;
                    {args.citation,&#039;&#039;},&lt;br /&gt;
                    {args.version or args.Version,&#039;&#039;},&lt;br /&gt;
        }&lt;br /&gt;
        raritynotes = raritynotes .. citation&lt;br /&gt;
    local rolls = tonumber(args.rolls or args.Rolls) or false&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
    end&lt;br /&gt;
    local approx = yesno(args.approx or args.Approx or &#039;no&#039;, false)&lt;br /&gt;
    local isCoins = name:lower() == &#039;coins&#039;&lt;br /&gt;
    local isNothing = name:lower() == &#039;nothing&#039;&lt;br /&gt;
    local altname = params.default_to(args.alt or args.Alt,name)&lt;br /&gt;
    local gemwname = params.default_to(args.gemwname,name)&lt;br /&gt;
    local _smwname = params.default_to(args.smwname,gemwname)&lt;br /&gt;
&lt;br /&gt;
    local cleanedName&lt;br /&gt;
    local dropVers = &#039;&#039;&lt;br /&gt;
    if _smwname:match(&#039; ?%(%d%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(gemwname, &#039;^(.-) ?(%(%d%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039; ?%(p%+*%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-) ?(%(p%+*%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039;%#&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-)%#([%w%s%(%)]+)$&#039;)&lt;br /&gt;
    else&lt;br /&gt;
        cleanedName = mw.ustring.gsub(_smwname, &#039; %(%d%)$&#039;, &#039;&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    cleanedName = mw.text.trim(cleanedName)&lt;br /&gt;
    dropVers = mw.text.trim(dropVers)&lt;br /&gt;
    &lt;br /&gt;
    local smwname = cleanedName &lt;br /&gt;
    if dropVers ~= &#039;&#039; then&lt;br /&gt;
        smwname = cleanedName..&#039;#&#039;..dropVers&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local useSmw = true&lt;br /&gt;
    if params.has_content(args.smw) then&lt;br /&gt;
        useSmw = args.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(frameArgs.smw) then&lt;br /&gt;
        useSmw = frameArgs.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rarity_value&lt;br /&gt;
    if rarities[rarity:lower()] then&lt;br /&gt;
        rarity = params.ucflc(rarity)&lt;br /&gt;
    else&lt;br /&gt;
        rarity_value = rarity:gsub(&#039;,&#039;,&#039;&#039;)&lt;br /&gt;
        local rv1, rv2 = string.match(rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            rarity_value = expr(rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local alt_rarity_value&lt;br /&gt;
    if rarities[alt_rarity:lower()] then&lt;br /&gt;
        alt_rarity = params.ucflc(alt_rarity)&lt;br /&gt;
    else&lt;br /&gt;
        alt_rarity_value = alt_rarity:gsub(&#039;,&#039;,&#039;&#039;)&lt;br /&gt;
        local rv1, rv2 = string.match(alt_rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            alt_rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            alt_rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            alt_rarity_value = expr(alt_rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    quantity = mw.ustring.lower(quantity)&lt;br /&gt;
    local gemw = yesno(args.gemw or &#039;yes&#039;, false)&lt;br /&gt;
    local alch = yesno(args.alch or &#039;yes&#039;, false)&lt;br /&gt;
&lt;br /&gt;
    local cached_dropdata = droppeditem_data[smwname]&lt;br /&gt;
    local cached_alch = nil&lt;br /&gt;
    if type(cached_dropdata) == &#039;table&#039; then&lt;br /&gt;
        if cached_dropdata[1] ~= nil and cached_dropdata[2] ~= nil then&lt;br /&gt;
            cached_alch = cached_dropdata[2]&lt;br /&gt;
        elseif cached_dropdata[1] ~= nil then&lt;br /&gt;
            cached_dropdata = cached_dropdata[1]&lt;br /&gt;
            if type(cached_dropdata) == &#039;boolean&#039; then&lt;br /&gt;
            elseif type(cached_dropdata) == &#039;number&#039; then&lt;br /&gt;
                cached_alch = cached_dropdata&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local geprice_frombulk = geprices_data[gemwname]&lt;br /&gt;
    if not (type(geprice_frombulk) == &#039;number&#039; and geprice_frombulk &amp;gt; 0) then&lt;br /&gt;
        geprice_frombulk = nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if cached_alch == nil then&lt;br /&gt;
        cached_alch = highalch_data[gemwname]&lt;br /&gt;
        if not (type(cached_alch) == &#039;number&#039; and cached_alch &amp;gt; -1) then&lt;br /&gt;
            cached_alch = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
        &lt;br /&gt;
    if isNothing then&lt;br /&gt;
        gemw = false&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        valueInfo = {&lt;br /&gt;
            alch = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            },&lt;br /&gt;
            ge = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        if alch then&lt;br /&gt;
            if cached_alch ~= nil then&lt;br /&gt;
                valueInfo.alch = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = cached_alch&lt;br /&gt;
                }&lt;br /&gt;
            elseif gemw then&lt;br /&gt;
                local hasgealch, gealchval = pcall(f_gealch,gemwname)&lt;br /&gt;
                if hasgealch then&lt;br /&gt;
                    if gealchval &amp;gt; -1 then&lt;br /&gt;
                        valueInfo.alch = {&lt;br /&gt;
                            has = true,&lt;br /&gt;
                            value = tonumber(gealchval)&lt;br /&gt;
                        }&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not valueInfo.alch.has then&lt;br /&gt;
                alch = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if gemw then&lt;br /&gt;
            if geprice_frombulk ~= nil then&lt;br /&gt;
                valueInfo.ge = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = geprice_frombulk&lt;br /&gt;
                }&lt;br /&gt;
            else&lt;br /&gt;
                gemw = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local image,image_n&lt;br /&gt;
    if isCoins then&lt;br /&gt;
        image_n = coins_image(quantity)&lt;br /&gt;
    else&lt;br /&gt;
        image_n = params.default_to(args.image or args.Image, name .. &#039;.png&#039;)&lt;br /&gt;
        image_n = mw.ustring.gsub(image_n, &#039;#.+$&#039;, &#039;.png&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if image_n:lower() == &#039;no&#039; or params.is_empty(args.name or args.Name) then&lt;br /&gt;
        image = &#039;&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        image = &#039;[[File:Bank filler.png|link=Nothing|alt=This does not exist.]]&#039;&lt;br /&gt;
    else&lt;br /&gt;
        image = mw.ustring.format(&#039;[[File:%s|alt=%s: %s drops %s with rarity %s%s in quantity %s]]&#039;, image_n, name, image_n, title, name, rollstext, rarity, quantity)&lt;br /&gt;
    end&lt;br /&gt;
    local rdt = string.lower(args.rdt or &#039;&#039;) == &#039;yes&#039;&lt;br /&gt;
        &lt;br /&gt;
    local ret =  p._main(name,&lt;br /&gt;
            altname,namenotes,&lt;br /&gt;
            quantity,quantitynotes,&lt;br /&gt;
            rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
            raritynotes,image,&lt;br /&gt;
            valueInfo,gemw,alch,alt,&lt;br /&gt;
            isCoins,&lt;br /&gt;
            isNothing,&lt;br /&gt;
            frameArgs,monVers,&lt;br /&gt;
            cleanedName,dropVers,smwname,&lt;br /&gt;
            rdt,useSmw,&lt;br /&gt;
            approx,rolls)&lt;br /&gt;
&lt;br /&gt;
    local cats = &#039;&#039;&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    if onMain and useSmw then&lt;br /&gt;
        cats = categories{name,quantity,rarity}&lt;br /&gt;
    end&lt;br /&gt;
    return ret..cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(name,&lt;br /&gt;
        altname,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
        raritynotes,image,&lt;br /&gt;
        valueInfo,gemw,alch,alt,&lt;br /&gt;
        isCoins,&lt;br /&gt;
        isNothing,&lt;br /&gt;
        frameArgs,monVers,&lt;br /&gt;
        cleanedName,dropVers,smwname,&lt;br /&gt;
        rdt,useSmw,&lt;br /&gt;
        approx, rolls)&lt;br /&gt;
    local total, alchtotal, vsort, vasort, _h, _l&lt;br /&gt;
    quantity, _h, _l = qty(quantity, isNothing)&lt;br /&gt;
    if valueInfo.ge.has then&lt;br /&gt;
        total, vsort, totalavg = get_total(valueInfo.ge.value,_h,_l)&lt;br /&gt;
        total = total or &#039;Not sold&#039;&lt;br /&gt;
    end&lt;br /&gt;
   &lt;br /&gt;
    if type(vsort) ~= &#039;number&#039; then&lt;br /&gt;
        vsort = 0&lt;br /&gt;
    end&lt;br /&gt;
    if type(vasort) ~= &#039;number&#039; then&lt;br /&gt;
        vasort = 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #quantitynotes &amp;gt; 3 then&lt;br /&gt;
        quantity = quantity..quantitynotes&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rare_class, rare_sort&lt;br /&gt;
    if rarity_value == nil then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities[rarity:lower()] or rarities._default)&lt;br /&gt;
    elseif rarity_value == false then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities._default)&lt;br /&gt;
    else&lt;br /&gt;
        rare_sort = 1/rarity_value&lt;br /&gt;
        rare_class = get_rarity_class(rarity_value)&lt;br /&gt;
    end&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
        rare_sort = rare_sort / rolls&lt;br /&gt;
        rare_class = get_rarity_class(math.min(1/rare_sort,0.99))&lt;br /&gt;
    end&lt;br /&gt;
    local tilde = &#039;&#039;&lt;br /&gt;
    if approx then&lt;br /&gt;
        tilde = &#039;~&#039;&lt;br /&gt;
    end&lt;br /&gt;
    local _r = rarity&lt;br /&gt;
    &lt;br /&gt;
    local hasRowwideVersion = false&lt;br /&gt;
    local tblVers = frameArgs.version&lt;br /&gt;
    local versionKey = &#039;DEFAULT&#039;&lt;br /&gt;
    if params.has_content(tblVers) then&lt;br /&gt;
       versionKey = tblVers&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(monVers) then&lt;br /&gt;
        versionKey = monVers&lt;br /&gt;
        hasRowwideVersion = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local quantityClassOverride = isNothing and &#039;table-na&#039; or nil&lt;br /&gt;
    local ret = mw.html.create(&#039;tr&#039;)&lt;br /&gt;
            :css(&#039;text-align&#039;,&#039;center&#039;)&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(&#039;inventory-image&#039;)&lt;br /&gt;
                :wikitext(image)&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :css(&#039;text-align&#039;,&#039;left&#039;)&lt;br /&gt;
                :addClass(&#039;item-col&#039;)&lt;br /&gt;
                :wikitext(string.format(&#039;%s&#039;,name,altname,#namenotes &amp;gt; 3 and namenotes or &#039;&#039;))&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(quantityClassOverride)&lt;br /&gt;
                :attr(&#039;data-sort-value&#039;,_h)&lt;br /&gt;
                :wikitext(quantity)&lt;br /&gt;
            :done()&lt;br /&gt;
    &lt;br /&gt;
    local rarity_cell = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local rarity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
    rarity_span:wikitext(rollstext .. tilde .. rarity)&lt;br /&gt;
    rarity_cell:attr(&#039;data-sort-value&#039;,rare_sort)&lt;br /&gt;
                :addClass(rare_class)&lt;br /&gt;
    if type(rarity_value) == &#039;number&#039; then&lt;br /&gt;
        rarity_cell:attr(&#039;title&#039;, rollstext .. tilde .. string.format(&#039;%.3g%%&#039;, 100 * rarity_value))&lt;br /&gt;
        rarity_span:attr({&lt;br /&gt;
            [&#039;data-drop-fraction&#039;] = rollstext .. tilde .. rarity,&lt;br /&gt;
            [&#039;data-drop-oneover&#039;] = rollstext .. tilde .. &#039;1/&#039; .. commas(sigfig(1/rarity_value, 4)),&lt;br /&gt;
            [&#039;data-drop-percent&#039;] = rollstext .. tilde .. sigfig(100 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permil&#039;] = rollstext .. tilde .. sigfig(1000 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permyriad&#039;] = rollstext .. tilde .. sigfig(10000 * rarity_value, 3),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if alt_rarity ~= &#039;&#039; then&lt;br /&gt;
        if alt_rarity_endash  ~= &#039;&#039; then&lt;br /&gt;
            rarity_cell:tag(&#039;span&#039;):wikitext(&#039;–&#039;)&lt;br /&gt;
        else&lt;br /&gt;
            rarity_cell:tag(&#039;span&#039;):wikitext(&#039;; &#039;)&lt;br /&gt;
        end&lt;br /&gt;
        local alt_rarity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
        alt_rarity_span:wikitext(alt_rarity)&lt;br /&gt;
        if type(alt_rarity_value) == &#039;number&#039; then&lt;br /&gt;
            alt_rarity_span:attr({&lt;br /&gt;
                [&#039;data-drop-fraction&#039;] = alt_rarity,&lt;br /&gt;
                [&#039;data-drop-oneover&#039;] = &#039;1/&#039; .. commas(sigfig(1/alt_rarity_value, 3)),&lt;br /&gt;
                [&#039;data-drop-percent&#039;] = sigfig(100 * alt_rarity_value, 3),&lt;br /&gt;
                [&#039;data-drop-permil&#039;] = sigfig(1000 * alt_rarity_value, 3),&lt;br /&gt;
                [&#039;data-drop-permyriad&#039;] = sigfig(10000 * alt_rarity_value, 3),&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #raritynotes &amp;gt; 3 then&lt;br /&gt;
        rarity_cell:wikitext(raritynotes)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Adjusted rarity for donator ranks&lt;br /&gt;
    local donator_rarity_cells = generate_donator_rarity_cells(rarity_value)&lt;br /&gt;
    for _, donator_rarity in ipairs(donator_rarity_cells) do&lt;br /&gt;
        ret:tag(&#039;td&#039;)&lt;br /&gt;
            :wikitext(donator_rarity)&lt;br /&gt;
            :addClass(rare_class)&lt;br /&gt;
            :attr(&#039;title&#039;, rollstext .. tilde .. &#039;Adjusted rarity for donator rank&#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ge_td = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local ge_td_title, ge_td_content, alch_td_title, alch_td_content&lt;br /&gt;
    if isNothing then&lt;br /&gt;
        ge_td_content = &#039;N/A&#039;&lt;br /&gt;
        ge_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        alch_td_content = &#039;N/A&#039;&lt;br /&gt;
        alch_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        alch_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        local coinsStr = lang:plural(vsort, &#039;&#039;, &#039;s&#039;)&lt;br /&gt;
        ge_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        ge_td_content = total&lt;br /&gt;
        alch_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        alch_td_content = total&lt;br /&gt;
    else&lt;br /&gt;
        if valueInfo.ge.has then&lt;br /&gt;
            ge_td_title = mw.ustring.format(other_priceString, commas(valueInfo.ge.value), lang:plural(valueInfo.ge.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            ge_td_content = total&lt;br /&gt;
        end&lt;br /&gt;
        if valueInfo.alch.has then&lt;br /&gt;
            alch_td_title = mw.ustring.format(other_priceString, commas(valueInfo.alch.value), lang:plural(valueInfo.alch.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            alch_td_content = alchtotal&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if ge_td_content == nil then&lt;br /&gt;
            ge_td_content = &#039;Not sold&#039;&lt;br /&gt;
            ge_td_title = &#039;This item cannot be traded on the Trading Post.&#039;&lt;br /&gt;
            ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
    ge_td:wikitext(ge_td_content):attr(&#039;title&#039;, ge_td_title)&lt;br /&gt;
&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    local unrecognizedDropVersionCategory = &#039;&#039;&lt;br /&gt;
    if onMain and useSmw and isNothing ~= true then&lt;br /&gt;
        local smw_sub = {}&lt;br /&gt;
      &lt;br /&gt;
        dropFrom = pgTitle&lt;br /&gt;
        if versionKey ~= &#039;DEFAULT&#039; then&lt;br /&gt;
            dropFrom = pgTitle .. &#039;#&#039; .. versionKey&lt;br /&gt;
        end&lt;br /&gt;
        local droppedItemName = &#039;Dropped item&#039;&lt;br /&gt;
        if rdt == true then&lt;br /&gt;
            droppedItemName = &#039;Dropped item from RDT&#039;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local smw_json = {&lt;br /&gt;
            [&#039;Dropped item&#039;]=smwname,&lt;br /&gt;
            [&#039;Name Notes&#039;]=smwNameNote,&lt;br /&gt;
            [&#039;Drop Quantity&#039;]=smwQuantity,&lt;br /&gt;
            [&#039;Quantity High&#039;]=_h,&lt;br /&gt;
            [&#039;Quantity Low&#039;]=_l,&lt;br /&gt;
            Rarity=rarity,&lt;br /&gt;
            [&#039;Alt Rarity&#039;]=alt_rarity,&lt;br /&gt;
            [&#039;Alt Rarity Dash&#039;] = alt_rarity_endash,&lt;br /&gt;
            [&#039;Rarity Notes&#039;]=smwRarityNote,&lt;br /&gt;
            [&#039;Rolls&#039;]=smwRolls,&lt;br /&gt;
            [&#039;Drop Value&#039;] = valueInfo.alch.value or 0,&lt;br /&gt;
            [&#039;Dropped from&#039;] = dropFrom,&lt;br /&gt;
            [&#039;Drop level&#039;] = dropLevel,&lt;br /&gt;
            [&#039;Drop type&#039;] = dropType&lt;br /&gt;
        }&lt;br /&gt;
        local smw_sub = {&lt;br /&gt;
            [droppedItemName] = smwname,&lt;br /&gt;
            [&#039;Dropped from&#039;] = dropFrom,&lt;br /&gt;
            [&amp;quot;Drop JSON&amp;quot;] = mw.text.jsonEncode(smw_json)&lt;br /&gt;
        }&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return tostring(ret) .. unrecognizedDropVersionCategory&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function qty(quantity, isNothing)&lt;br /&gt;
    if string.lower(quantity) == &#039;varies&#039; then&lt;br /&gt;
        return &#039;Varies&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        return &#039;N/A&#039;&lt;br /&gt;
    elseif not quantity or string.lower(quantity) == &#039;unknown&#039; then&lt;br /&gt;
        return &#039;Unknown&#039;&lt;br /&gt;
    end&lt;br /&gt;
    quantity = mw.ustring.gsub(quantity,&#039;[-—]&#039;,&#039;–&#039;)&lt;br /&gt;
        :gsub(&#039;%s&#039;,&#039;&#039;)&lt;br /&gt;
        :gsub(&#039;%(noted%)&#039;,&#039;$n&#039;)&lt;br /&gt;
    local vals = mw.text.split(quantity,&#039;[,;]&#039;)&lt;br /&gt;
    local low = 2147483648&lt;br /&gt;
    local high = 0&lt;br /&gt;
    local numstr = {}&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&#039;$n&#039;,&#039;&#039;)&lt;br /&gt;
        if mw.ustring.find(v,&#039;–&#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&#039;–&#039;)&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            if a &amp;gt; b then&lt;br /&gt;
                a,b = b,a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if b &amp;gt; high then&lt;br /&gt;
                high = b&lt;br /&gt;
            end&lt;br /&gt;
            local addx = commas(a)..&#039;–&#039;..commas(b)&lt;br /&gt;
            if v:find(&#039;$n&#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        else&lt;br /&gt;
            local a = tonumber(clean)&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;gt; high then &lt;br /&gt;
                high = a&lt;br /&gt;
            end&lt;br /&gt;
            local addx = commas(a)&lt;br /&gt;
            if v:find(&#039;$n&#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if #numstr &amp;gt; 11 then&lt;br /&gt;
        local mid = math.floor(#numstr/2)&lt;br /&gt;
        numstr[mid] = &#039;&amp;lt;br/&amp;gt;&#039;..numstr[mid]&lt;br /&gt;
    end&lt;br /&gt;
    numstr = table.concat(numstr,&#039;; &#039;)&lt;br /&gt;
    if not numstr:find(&#039;%d&#039;) then&lt;br /&gt;
        return &#039;Unknown&#039;, price&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return numstr, high, low&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_total(value,qhigh,qlow)&lt;br /&gt;
    if not value or string.lower(value) == &#039;unknown&#039; then&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(value) and tonumber(value) &amp;lt; 0 then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if not tonumber(value) and not value:find(&#039;%d&#039;) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    value = mw.ustring.gsub(value,&#039;[-—]&#039;,&#039;–&#039;)&lt;br /&gt;
        :gsub(&#039;%s&#039;,&#039;&#039;)&lt;br /&gt;
    local vals = mw.text.split(value,&#039;[,;]&#039;)&lt;br /&gt;
    local low = 2147483648&lt;br /&gt;
    local high = 0&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&#039;$n&#039;,&#039;&#039;)&lt;br /&gt;
        if mw.ustring.find(v,&#039;–&#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&#039;–&#039;)&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            if a &amp;gt; b then&lt;br /&gt;
                a,b = b,a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if b &amp;gt; high then&lt;br /&gt;
                high = b&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local a = tonumber(clean)&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;gt; high then &lt;br /&gt;
                high = a&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local valret, sort, avg&lt;br /&gt;
    if not qhigh or not qlow then&lt;br /&gt;
        sort = high&lt;br /&gt;
        avg = high&lt;br /&gt;
        valret = commas(high)&lt;br /&gt;
    else&lt;br /&gt;
        local lower = qlow * low&lt;br /&gt;
        local higher = qhigh * high&lt;br /&gt;
        if higher == lower then&lt;br /&gt;
            valret = commas(higher)&lt;br /&gt;
            avg = higher&lt;br /&gt;
        else&lt;br /&gt;
            valret = commas(lower)..&#039;–&#039;..commas(higher)&lt;br /&gt;
            avg = (lower+higher)/2&lt;br /&gt;
        end&lt;br /&gt;
        sort = higher&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return valret, sort, avg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function categories(...)&lt;br /&gt;
    local name,quantity,rarity = unpack(...)&lt;br /&gt;
    local ret = &#039;&#039;&lt;br /&gt;
    name = name:lower()&lt;br /&gt;
    quantity = quantity:lower()&lt;br /&gt;
    if name:find(&#039;clue scroll&#039;) then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if rarity == nil or rarity == &#039;&#039; or rarity:lower() == &#039;unknown&#039; then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if quantity:find(&#039;Unknown&#039;) then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18657</id>
		<title>Module:DropsLine</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18657"/>
		<updated>2024-04-04T00:43:11Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local params = require(&#039;Module:Paramtest&#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
local coins_image = require(&#039;Module:Coins image&#039;)&lt;br /&gt;
local curr_image = require(&#039;Module:Currency Image&#039;)&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local var = mw.ext.VariablesLua&lt;br /&gt;
&lt;br /&gt;
-- precalculated cached data&lt;br /&gt;
local droppeditem_data = mw.loadJsonData(&#039;Module:DropsLine/itemData.json&#039;)&lt;br /&gt;
local geprices_data = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;)&lt;br /&gt;
local highalch_data = mw.loadJsonData(&#039;Module:GEHighAlchs/data.json&#039;)&lt;br /&gt;
&lt;br /&gt;
local ptitle = mw.title.getCurrentTitle()&lt;br /&gt;
local ns = ptitle.nsText&lt;br /&gt;
local title = ptitle.fullText&lt;br /&gt;
local pgTitle = ptitle.text&lt;br /&gt;
&lt;br /&gt;
local _noted = &#039;&amp;amp;nbsp;&amp;lt;span class=&amp;quot;dropsline-noted&amp;quot;&amp;gt;(noted)&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
local coins_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
local other_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--bg, txt, sort; acceptable non-quantity rarity names&lt;br /&gt;
local rarities = {&lt;br /&gt;
    always = { &#039;table-bg-blue&#039;, 1 },&lt;br /&gt;
    common = { &#039;table-bg-green&#039;, 16 },&lt;br /&gt;
    uncommon = { &#039;table-bg-yellow&#039;, 64 },&lt;br /&gt;
    rare = { &#039;table-bg-orange&#039;, 128 },&lt;br /&gt;
    [&#039;very rare&#039;] = { &#039;table-bg-red&#039;, 1024 },&lt;br /&gt;
    random = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    varies = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    once = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    conditional = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    _default = { &#039;table-bg-grey&#039;, 65536 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- colour-code&lt;br /&gt;
local rarities_class = {&lt;br /&gt;
    { 1, &#039;table-bg-blue&#039; },&lt;br /&gt;
    { 1/25, &#039;table-bg-green&#039; },&lt;br /&gt;
    { 1/99.99, &#039;table-bg-yellow&#039; },&lt;br /&gt;
    { 1/999.99, &#039;table-bg-orange&#039; },&lt;br /&gt;
    { 1/9999999, &#039;table-bg-red&#039; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_rarity_class(val)&lt;br /&gt;
    for i,v in ipairs(rarities_class) do&lt;br /&gt;
        curr = v&lt;br /&gt;
        if val &amp;gt;= v[1] then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return curr[2]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function commas(n)&lt;br /&gt;
    if tonumber(n) then&lt;br /&gt;
        return lang:formatNum(tonumber(n))&lt;br /&gt;
    else&lt;br /&gt;
        return n&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expr(t)&lt;br /&gt;
    local noerr, val = pcall(mw.ext.ParserFunctions.expr, t)&lt;br /&gt;
    if noerr then&lt;br /&gt;
        return tonumber(val)&lt;br /&gt;
    else&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sigfig(n, f)&lt;br /&gt;
    f = math.floor(f-1)&lt;br /&gt;
    if n == 0 then return 0 end&lt;br /&gt;
    local m = math.floor(math.log10(n))&lt;br /&gt;
    f = math.max(m, f)&lt;br /&gt;
    local v = n / (10^(m-f))&lt;br /&gt;
    v = math.floor(v + 0.5) * 10^(m-f)&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
p.sigfig = sigfig&lt;br /&gt;
p.commas = commas&lt;br /&gt;
&lt;br /&gt;
function adjust_rarity(rarity_value, adjustment)&lt;br /&gt;
    if not rarity_value or not tonumber(rarity_value) then return nil end&lt;br /&gt;
    local adjusted_value = 1 / ((1 / rarity_value) * (1 - adjustment))&lt;br /&gt;
    return adjusted_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local frameArgs = frame.args&lt;br /&gt;
&lt;br /&gt;
    -- Params and defaults&lt;br /&gt;
    local name,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,alt_rarity,alt_rarity_endash,&lt;br /&gt;
        raritynotes,citation,monVers = params.defaults{&lt;br /&gt;
                    {args.name or args.Name,&#039;Item&#039;},&lt;br /&gt;
                    {args.namenotes or args.Namenotes,&#039;&#039;},&lt;br /&gt;
                    {args.quantity or args.Quantity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.quantitynotes or args.Quantitynotes,&#039;&#039;},&lt;br /&gt;
                    {args.rarity or args.Rarity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.altrarity or args.AltRarity,&#039;&#039;},&lt;br /&gt;
                    {args.altraritydash or args.AltRarityDash,&#039;&#039;},&lt;br /&gt;
                    {args.raritynotes or args.Raritynotes,&#039;&#039;},&lt;br /&gt;
                    {args.citation,&#039;&#039;},&lt;br /&gt;
                    {args.version or args.Version,&#039;&#039;},&lt;br /&gt;
        }&lt;br /&gt;
    raritynotes = raritynotes .. citation&lt;br /&gt;
    local rolls = tonumber(args.rolls or args.Rolls) or false&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
    end&lt;br /&gt;
    local approx = yesno(args.approx or args.Approx or &#039;no&#039;, false)&lt;br /&gt;
    local isCoins = name:lower() == &#039;coins&#039;&lt;br /&gt;
    local isNothing = name:lower() == &#039;nothing&#039;&lt;br /&gt;
    local altname = params.default_to(args.alt or args.Alt,name)&lt;br /&gt;
    local gemwname = params.default_to(args.gemwname,name)&lt;br /&gt;
    local _smwname = params.default_to(args.smwname,gemwname)&lt;br /&gt;
&lt;br /&gt;
    -- Clean name&lt;br /&gt;
    local cleanedName, dropVers = name, &#039;&#039;&lt;br /&gt;
    if _smwname:match(&#039; ?%(%d%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(gemwname, &#039;^(.-) ?(%(%d%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039; ?%(p%+*%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-) ?(%(p%+*%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039;%#&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-)%#([%w%s%(%)]+)$&#039;)&lt;br /&gt;
    else&lt;br /&gt;
        cleanedName = mw.ustring.gsub(_smwname, &#039; %(%d%)$&#039;, &#039;&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    cleanedName = mw.text.trim(cleanedName)&lt;br /&gt;
    dropVers = mw.text.trim(dropVers)&lt;br /&gt;
    &lt;br /&gt;
    local smwname = cleanedName &lt;br /&gt;
    if dropVers ~= &#039;&#039; then&lt;br /&gt;
        smwname = cleanedName..&#039;#&#039;..dropVers&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local useSmw = true&lt;br /&gt;
    if params.has_content(args.smw) then&lt;br /&gt;
        useSmw = args.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(frameArgs.smw) then&lt;br /&gt;
        useSmw = frameArgs.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rarity_value&lt;br /&gt;
    if rarities[rarity:lower()] then&lt;br /&gt;
        rarity = params.ucflc(rarity)&lt;br /&gt;
    else&lt;br /&gt;
        rarity_value = rarity:gsub(&#039;,&#039;,&#039;&#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            rarity_value = expr(rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local alt_rarity_value&lt;br /&gt;
    if rarities[alt_rarity:lower()] then&lt;br /&gt;
        alt_rarity = params.ucflc(alt_rarity)&lt;br /&gt;
    else&lt;br /&gt;
        alt_rarity_value = alt_rarity:gsub(&#039;,&#039;,&#039;&#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(alt_rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            alt_rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            alt_rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            alt_rarity_value = expr(alt_rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    quantity = mw.ustring.lower(quantity)&lt;br /&gt;
    local gemw = yesno(args.gemw or &#039;yes&#039;, false)&lt;br /&gt;
    local alch = yesno(args.alch or &#039;yes&#039;, false)&lt;br /&gt;
&lt;br /&gt;
    local cached_dropdata = droppeditem_data[smwname]&lt;br /&gt;
    local cached_alch = nil&lt;br /&gt;
    if type(cached_dropdata) == &#039;table&#039; then&lt;br /&gt;
        if cached_dropdata[1] ~= nil and cached_dropdata[2] ~= nil then&lt;br /&gt;
            cached_alch = cached_dropdata[2]&lt;br /&gt;
        elseif cached_dropdata[1] ~= nil then&lt;br /&gt;
            cached_dropdata = cached_dropdata[1]&lt;br /&gt;
            if type(cached_dropdata) == &#039;boolean&#039; then&lt;br /&gt;
            elseif type(cached_dropdata) == &#039;number&#039; then&lt;br /&gt;
                cached_alch = cached_dropdata&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local geprice_frombulk = geprices_data[gemwname]&lt;br /&gt;
    if not (type(geprice_frombulk) == &#039;number&#039; and geprice_frombulk &amp;gt; 0) then&lt;br /&gt;
        geprice_frombulk = nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if cached_alch == nil then&lt;br /&gt;
        cached_alch = highalch_data[gemwname]&lt;br /&gt;
        if not (type(cached_alch) == &#039;number&#039; and cached_alch &amp;gt; -1) then&lt;br /&gt;
            cached_alch = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
        &lt;br /&gt;
    if isNothing then&lt;br /&gt;
        gemw = false&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        -- coins override&lt;br /&gt;
        valueInfo = {&lt;br /&gt;
            alch = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            },&lt;br /&gt;
            ge = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        -- find alch price&lt;br /&gt;
        if alch then&lt;br /&gt;
            -- first check cache for alch value&lt;br /&gt;
            if cached_alch ~= nil then&lt;br /&gt;
                valueInfo.alch = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = cached_alch&lt;br /&gt;
                }&lt;br /&gt;
            elseif gemw then&lt;br /&gt;
                -- then check gemw for alch value&lt;br /&gt;
                local hasgealch, gealchval = pcall(f_gealch,gemwname)&lt;br /&gt;
                if hasgealch then&lt;br /&gt;
                    if gealchval &amp;gt; -1 then&lt;br /&gt;
                        valueInfo.alch = {&lt;br /&gt;
                            has = true,&lt;br /&gt;
                            value = tonumber(gealchval)&lt;br /&gt;
                        }&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not valueInfo.alch.has then&lt;br /&gt;
                -- failed to find alch in GEMW or is on the no-ge list/override&lt;br /&gt;
                -- lookup in SMW&lt;br /&gt;
&lt;br /&gt;
                if smwret and smwret.alch ~= nil then&lt;br /&gt;
                    -- alch is defined, use it&lt;br /&gt;
                    valueInfo.alch = {&lt;br /&gt;
                        has = true,&lt;br /&gt;
                        value = smwret.alch&lt;br /&gt;
                    }&lt;br /&gt;
                else&lt;br /&gt;
                    alch = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- find ge price&lt;br /&gt;
        if gemw then&lt;br /&gt;
            if geprice_frombulk ~= nil then&lt;br /&gt;
                valueInfo.ge = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = geprice_frombulk&lt;br /&gt;
                }&lt;br /&gt;
            else&lt;br /&gt;
                gemw = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local image,image_n&lt;br /&gt;
    if isCoins then&lt;br /&gt;
        image_n = coins_image(quantity)&lt;br /&gt;
    else&lt;br /&gt;
        image_n = params.default_to(args.image or args.Image, name .. &#039;.png&#039;)&lt;br /&gt;
        image_n = mw.ustring.gsub(image_n, &#039;#.+$&#039;, &#039;.png&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if image_n:lower() == &#039;no&#039; or params.is_empty(args.name or args.Name) then&lt;br /&gt;
        image = &#039;&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        image = &#039;[[File:Bank filler.png|link=Nothing|alt=This does not exist.]]&#039;&lt;br /&gt;
    else&lt;br /&gt;
        image = mw.ustring.format(&#039;[[File:%s|alt=%s: %s drops %s with rarity %s%s in quantity %s]]&#039;, image_n, name, image_n, title, name, rollstext, rarity, quantity)&lt;br /&gt;
    end&lt;br /&gt;
    local rdt = string.lower(args.rdt or &#039;&#039;) == &#039;yes&#039;&lt;br /&gt;
        &lt;br /&gt;
    local ret =  p._main(name,&lt;br /&gt;
            altname,namenotes,&lt;br /&gt;
            quantity,quantitynotes,&lt;br /&gt;
            rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
            raritynotes,image,&lt;br /&gt;
            valueInfo,gemw,alch,alt,&lt;br /&gt;
            isCoins,&lt;br /&gt;
            isNothing,&lt;br /&gt;
            frameArgs,monVers,&lt;br /&gt;
            cleanedName,dropVers,smwname,&lt;br /&gt;
            rdt,useSmw,&lt;br /&gt;
            approx,rolls)&lt;br /&gt;
&lt;br /&gt;
    local cats = &#039;&#039;&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    if onMain and useSmw then&lt;br /&gt;
        cats = categories{name,quantity,rarity}&lt;br /&gt;
    end&lt;br /&gt;
    return ret..cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(name,&lt;br /&gt;
        altname,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
        raritynotes,image,&lt;br /&gt;
        valueInfo,gemw,alch,alt,&lt;br /&gt;
        isCoins,&lt;br /&gt;
        isNothing,&lt;br /&gt;
        frameArgs,monVers,&lt;br /&gt;
        cleanedName,dropVers,smwname,&lt;br /&gt;
        rdt,useSmw,&lt;br /&gt;
        approx, rolls)&lt;br /&gt;
    local total, alchtotal, vsort, vasort, _h, _l&lt;br /&gt;
    quantity, _h, _l = qty(quantity, isNothing)&lt;br /&gt;
    if valueInfo.ge.has then&lt;br /&gt;
        total, vsort, totalavg = get_total(valueInfo.ge.value,_h,_l)&lt;br /&gt;
        total = total or &#039;Not sold&#039;&lt;br /&gt;
    end&lt;br /&gt;
   &lt;br /&gt;
    if type(vsort) ~= &#039;number&#039; then&lt;br /&gt;
        vsort = 0&lt;br /&gt;
    end&lt;br /&gt;
    if type(vasort) ~= &#039;number&#039; then&lt;br /&gt;
        vasort = 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #quantitynotes &amp;gt; 3 then&lt;br /&gt;
        quantity = quantity..quantitynotes&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rare_class, rare_sort&lt;br /&gt;
    if rarity_value == nil then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities[rarity:lower()] or rarities._default)&lt;br /&gt;
    elseif rarity_value == false then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities._default)&lt;br /&gt;
    else&lt;br /&gt;
        rare_sort = 1/rarity_value&lt;br /&gt;
        rare_class = get_rarity_class(rarity_value)&lt;br /&gt;
    end&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
        rare_sort = rare_sort / rolls&lt;br /&gt;
        rare_class = get_rarity_class(math.min(1/rare_sort,0.99))&lt;br /&gt;
    end&lt;br /&gt;
    local tilde = &#039;&#039;&lt;br /&gt;
    if approx then&lt;br /&gt;
        tilde = &#039;~&#039;&lt;br /&gt;
    end&lt;br /&gt;
    local _r = rarity&lt;br /&gt;
    &lt;br /&gt;
    local hasRowwideVersion = false&lt;br /&gt;
    local tblVers = frameArgs.version&lt;br /&gt;
    local versionKey = &#039;DEFAULT&#039;&lt;br /&gt;
    if params.has_content(tblVers) then&lt;br /&gt;
       versionKey = tblVers&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(monVers) then&lt;br /&gt;
        versionKey = monVers&lt;br /&gt;
        hasRowwideVersion = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local quantityClassOverride = isNothing and &#039;table-na&#039; or nil&lt;br /&gt;
    local ret = mw.html.create(&#039;tr&#039;)&lt;br /&gt;
            :css(&#039;text-align&#039;,&#039;center&#039;)&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(&#039;inventory-image&#039;)&lt;br /&gt;
                :wikitext(image)&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :css(&#039;text-align&#039;,&#039;left&#039;)&lt;br /&gt;
                :addClass(&#039;item-col&#039;)&lt;br /&gt;
                :wikitext(string.format(&#039;%s&#039;,name,altname,#namenotes &amp;gt; 3 and namenotes or &#039;&#039;))&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(quantityClassOverride)&lt;br /&gt;
                :attr(&#039;data-sort-value&#039;,_h)&lt;br /&gt;
                :wikitext(quantity)&lt;br /&gt;
            :done()&lt;br /&gt;
    &lt;br /&gt;
    local rarity_cell = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local rarity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
    rarity_span:wikitext(rollstext .. tilde .. rarity)&lt;br /&gt;
    rarity_cell:attr(&#039;data-sort-value&#039;,rare_sort)&lt;br /&gt;
                :addClass(rare_class)&lt;br /&gt;
    if type(rarity_value) == &#039;number&#039; then&lt;br /&gt;
        rarity_cell:attr(&#039;title&#039;, rollstext .. tilde .. string.format(&#039;%.3g%%&#039;, 100 * rarity_value))&lt;br /&gt;
        rarity_span:attr({&lt;br /&gt;
            [&#039;data-drop-fraction&#039;] = rollstext .. tilde .. rarity,&lt;br /&gt;
            [&#039;data-drop-oneover&#039;] = rollstext .. tilde .. &#039;1/&#039; .. commas(sigfig(1/rarity_value, 4)),&lt;br /&gt;
            [&#039;data-drop-percent&#039;] = rollstext .. tilde .. sigfig(100 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permil&#039;] = rollstext .. tilde .. sigfig(1000 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permyriad&#039;] = rollstext .. tilde .. sigfig(10000 * rarity_value, 3),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Adjusted rarity for donator ranks&lt;br /&gt;
    local adjustments = {&lt;br /&gt;
        [&#039;Normal Donator&#039;] = 0.15,&lt;br /&gt;
        [&#039;Super Donator&#039;] = 0.25,&lt;br /&gt;
        [&#039;Extreme Donator&#039;] = 0.30,&lt;br /&gt;
        [&#039;Legendary Donator&#039;] = 0.35,&lt;br /&gt;
        [&#039;Royal Donator&#039;] = 0.40&lt;br /&gt;
    }&lt;br /&gt;
    for rank, adjustment in pairs(adjustments) do&lt;br /&gt;
        local adjusted_rarity = adjust_rarity(rarity_value, adjustment)&lt;br /&gt;
        local adjusted_rarity_text = adjusted_rarity and string.format(&#039;1/%.0f&#039;, 1/adjusted_rarity) or &#039;N/A&#039;&lt;br /&gt;
        ret:tag(&#039;td&#039;)&lt;br /&gt;
            :addClass(rare_class)&lt;br /&gt;
            :wikitext(adjusted_rarity_text)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #raritynotes &amp;gt; 3 then&lt;br /&gt;
        rarity_cell:wikitext(raritynotes)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ge_td = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local ge_td_title, ge_td_content, alch_td_title, alch_td_content&lt;br /&gt;
    if isNothing then&lt;br /&gt;
        ge_td_content = &#039;N/A&#039;&lt;br /&gt;
        ge_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        alch_td_content = &#039;N/A&#039;&lt;br /&gt;
        alch_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        alch_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        local coinsStr = lang:plural(vsort, &#039;&#039;, &#039;s&#039;)&lt;br /&gt;
        ge_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        ge_td_content = total&lt;br /&gt;
        alch_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        alch_td_content = total&lt;br /&gt;
    else&lt;br /&gt;
        if valueInfo.ge.has then&lt;br /&gt;
            ge_td_title = mw.ustring.format(other_priceString, commas(valueInfo.ge.value), lang:plural(valueInfo.ge.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            ge_td_content = total&lt;br /&gt;
        end&lt;br /&gt;
        if valueInfo.alch.has then&lt;br /&gt;
            alch_td_title = mw.ustring.format(other_priceString, commas(valueInfo.alch.value), lang:plural(valueInfo.alch.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            alch_td_content = alchtotal&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if ge_td_content == nil then&lt;br /&gt;
            ge_td_content = &#039;Not sold&#039;&lt;br /&gt;
            ge_td_title = &#039;This item cannot be traded on the Grand Exchange.&#039;&lt;br /&gt;
            ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
    ge_td:wikitext(ge_td_content):attr(&#039;title&#039;, ge_td_title)&lt;br /&gt;
&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    local unrecognizedDropVersionCategory = &#039;&#039;&lt;br /&gt;
    if onMain and useSmw and isNothing ~= true then&lt;br /&gt;
        -- SMW data omitted for brevity&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return tostring(ret) .. unrecognizedDropVersionCategory&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function qty(quantity, isNothing)&lt;br /&gt;
    -- Quantity parsing function omitted for brevity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_total(value, qhigh, qlow)&lt;br /&gt;
    -- Value calculation function omitted for brevity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function categories(...)&lt;br /&gt;
    -- Category function omitted for brevity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18656</id>
		<title>Module:DropsLine</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18656"/>
		<updated>2024-04-04T00:34:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local params = require(&#039;Module:Paramtest&#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
local coins_image = require(&#039;Module:Coins image&#039;)&lt;br /&gt;
local curr_image = require(&#039;Module:Currency Image&#039;)&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local var = mw.ext.VariablesLua&lt;br /&gt;
&lt;br /&gt;
-- precalculated cached data&lt;br /&gt;
local droppeditem_data = mw.loadJsonData(&#039;Module:DropsLine/itemData.json&#039;)&lt;br /&gt;
local geprices_data = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;)&lt;br /&gt;
local highalch_data = mw.loadJsonData(&#039;Module:GEHighAlchs/data.json&#039;)&lt;br /&gt;
&lt;br /&gt;
local ptitle = mw.title.getCurrentTitle()&lt;br /&gt;
local ns = ptitle.nsText&lt;br /&gt;
local title = ptitle.fullText&lt;br /&gt;
local pgTitle = ptitle.text&lt;br /&gt;
&lt;br /&gt;
local _noted = &#039;&amp;amp;nbsp;&amp;lt;span class=&amp;quot;dropsline-noted&amp;quot;&amp;gt;(noted)&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
local coins_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
local other_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--bg, txt, sort; acceptable non-quantity rarity names&lt;br /&gt;
local rarities = {&lt;br /&gt;
    always = { &#039;table-bg-blue&#039;, 1 },&lt;br /&gt;
    common = { &#039;table-bg-green&#039;, 16 },&lt;br /&gt;
    uncommon = { &#039;table-bg-yellow&#039;, 64 },&lt;br /&gt;
    rare = { &#039;table-bg-orange&#039;, 128 },&lt;br /&gt;
    [&#039;very rare&#039;] = { &#039;table-bg-red&#039;, 1024 },&lt;br /&gt;
    random = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    varies = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    once = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    conditional = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    _default = { &#039;table-bg-grey&#039;, 65536 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- colour-code&lt;br /&gt;
local rarities_class = {&lt;br /&gt;
    { 1, &#039;table-bg-blue&#039; },&lt;br /&gt;
    { 1/25, &#039;table-bg-green&#039; },&lt;br /&gt;
    { 1/99.99, &#039;table-bg-yellow&#039; },&lt;br /&gt;
    { 1/999.99, &#039;table-bg-orange&#039; },&lt;br /&gt;
    { 1/9999999, &#039;table-bg-red&#039; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_rarity_class(val)&lt;br /&gt;
    for i,v in ipairs(rarities_class) do&lt;br /&gt;
        curr = v&lt;br /&gt;
        if val &amp;gt;= v[1] then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return curr[2]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function commas(n)&lt;br /&gt;
    if tonumber(n) then&lt;br /&gt;
        return lang:formatNum(tonumber(n))&lt;br /&gt;
    else&lt;br /&gt;
        return n&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expr(t)&lt;br /&gt;
    local noerr, val = pcall(mw.ext.ParserFunctions.expr, t)&lt;br /&gt;
    if noerr then&lt;br /&gt;
        return tonumber(val)&lt;br /&gt;
    else&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sigfig(n, f)&lt;br /&gt;
    f = math.floor(f-1)&lt;br /&gt;
    if n == 0 then return 0 end&lt;br /&gt;
    local m = math.floor(math.log10(n))&lt;br /&gt;
    f = math.max(m, f)&lt;br /&gt;
    local v = n / (10^(m-f))&lt;br /&gt;
    v = math.floor(v + 0.5) * 10^(m-f)&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
p.sigfig = sigfig&lt;br /&gt;
p.commas = commas&lt;br /&gt;
&lt;br /&gt;
-- Function to adjust rarity based on donator rank&lt;br /&gt;
function adjust_rarity(rarity_value, adjustment)&lt;br /&gt;
    if not rarity_value or not tonumber(rarity_value) then return nil end&lt;br /&gt;
    local adjusted_value = 1 / ((1 / rarity_value) * (1 - adjustment))&lt;br /&gt;
    return adjusted_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to generate adjusted rarity cells&lt;br /&gt;
function generate_donator_rarity_cells(rarity_value)&lt;br /&gt;
    local adjustments = {&lt;br /&gt;
        [&#039;Normal Donator&#039;] = 0.15,&lt;br /&gt;
        [&#039;Super Donator&#039;] = 0.25,&lt;br /&gt;
        [&#039;Extreme Donator&#039;] = 0.30,&lt;br /&gt;
        [&#039;Legendary Donator&#039;] = 0.35,&lt;br /&gt;
        [&#039;Royal Donator&#039;] = 0.40&lt;br /&gt;
    }&lt;br /&gt;
    local cells = {}&lt;br /&gt;
    for rank, adjustment in pairs(adjustments) do&lt;br /&gt;
        local adjusted_rarity = adjust_rarity(rarity_value, adjustment)&lt;br /&gt;
        if adjusted_rarity then&lt;br /&gt;
            local rarity_text = string.format(&#039;1/%d&#039;, math.floor(adjusted_rarity))&lt;br /&gt;
            table.insert(cells, rarity_text)&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(cells, &#039;N/A&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return cells&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local frameArgs = frame.args&lt;br /&gt;
&lt;br /&gt;
    local name,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,alt_rarity,alt_rarity_endash,&lt;br /&gt;
        raritynotes,citation,monVers = params.defaults{&lt;br /&gt;
                    {args.name or args.Name,&#039;Item&#039;},&lt;br /&gt;
                    {args.namenotes or args.Namenotes,&#039;&#039;},&lt;br /&gt;
                    {args.quantity or args.Quantity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.quantitynotes or args.Quantitynotes,&#039;&#039;},&lt;br /&gt;
                    {args.rarity or args.Rarity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.altrarity or args.AltRarity,&#039;&#039;},&lt;br /&gt;
                    {args.altraritydash or args.AltRarityDash,&#039;&#039;},&lt;br /&gt;
                    {args.raritynotes or args.Raritynotes,&#039;&#039;},&lt;br /&gt;
                    {args.citation,&#039;&#039;},&lt;br /&gt;
                    {args.version or args.Version,&#039;&#039;},&lt;br /&gt;
        }&lt;br /&gt;
        raritynotes = raritynotes .. citation&lt;br /&gt;
    local rolls = tonumber(args.rolls or args.Rolls) or false&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
    end&lt;br /&gt;
    local approx = yesno(args.approx or args.Approx or &#039;no&#039;, false)&lt;br /&gt;
    local isCoins = name:lower() == &#039;coins&#039;&lt;br /&gt;
    local isNothing = name:lower() == &#039;nothing&#039;&lt;br /&gt;
    local altname = params.default_to(args.alt or args.Alt,name)&lt;br /&gt;
    local gemwname = params.default_to(args.gemwname,name)&lt;br /&gt;
    local _smwname = params.default_to(args.smwname,gemwname)&lt;br /&gt;
&lt;br /&gt;
    local cleanedName&lt;br /&gt;
    local dropVers = &#039;&#039;&lt;br /&gt;
    if _smwname:match(&#039; ?%(%d%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(gemwname, &#039;^(.-) ?(%(%d%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039; ?%(p%+*%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-) ?(%(p%+*%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039;%#&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-)%#([%w%s%(%)]+)$&#039;)&lt;br /&gt;
    else&lt;br /&gt;
        cleanedName = mw.ustring.gsub(_smwname, &#039; %(%d%)$&#039;, &#039;&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    cleanedName = mw.text.trim(cleanedName)&lt;br /&gt;
    dropVers = mw.text.trim(dropVers)&lt;br /&gt;
    &lt;br /&gt;
    local smwname = cleanedName &lt;br /&gt;
    if dropVers ~= &#039;&#039; then&lt;br /&gt;
        smwname = cleanedName..&#039;#&#039;..dropVers&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local useSmw = true&lt;br /&gt;
    if params.has_content(args.smw) then&lt;br /&gt;
        useSmw = args.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(frameArgs.smw) then&lt;br /&gt;
        useSmw = frameArgs.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rarity_value&lt;br /&gt;
    if rarities[rarity:lower()] then&lt;br /&gt;
        rarity = params.ucflc(rarity)&lt;br /&gt;
    else&lt;br /&gt;
        rarity_value = rarity:gsub(&#039;,&#039;,&#039;&#039;)&lt;br /&gt;
        local rv1, rv2 = string.match(rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            rarity_value = expr(rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local alt_rarity_value&lt;br /&gt;
    if rarities[alt_rarity:lower()] then&lt;br /&gt;
        alt_rarity = params.ucflc(alt_rarity)&lt;br /&gt;
    else&lt;br /&gt;
        alt_rarity_value = alt_rarity:gsub(&#039;,&#039;,&#039;&#039;)&lt;br /&gt;
        local rv1, rv2 = string.match(alt_rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            alt_rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            alt_rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            alt_rarity_value = expr(alt_rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    quantity = mw.ustring.lower(quantity)&lt;br /&gt;
    local gemw = yesno(args.gemw or &#039;yes&#039;, false)&lt;br /&gt;
    local alch = yesno(args.alch or &#039;yes&#039;, false)&lt;br /&gt;
&lt;br /&gt;
    local cached_dropdata = droppeditem_data[smwname]&lt;br /&gt;
    local cached_alch = nil&lt;br /&gt;
    if type(cached_dropdata) == &#039;table&#039; then&lt;br /&gt;
        if cached_dropdata[1] ~= nil and cached_dropdata[2] ~= nil then&lt;br /&gt;
            cached_alch = cached_dropdata[2]&lt;br /&gt;
        elseif cached_dropdata[1] ~= nil then&lt;br /&gt;
            cached_dropdata = cached_dropdata[1]&lt;br /&gt;
            if type(cached_dropdata) == &#039;boolean&#039; then&lt;br /&gt;
            elseif type(cached_dropdata) == &#039;number&#039; then&lt;br /&gt;
                cached_alch = cached_dropdata&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local geprice_frombulk = geprices_data[gemwname]&lt;br /&gt;
    if not (type(geprice_frombulk) == &#039;number&#039; and geprice_frombulk &amp;gt; 0) then&lt;br /&gt;
        geprice_frombulk = nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if cached_alch == nil then&lt;br /&gt;
        cached_alch = highalch_data[gemwname]&lt;br /&gt;
        if not (type(cached_alch) == &#039;number&#039; and cached_alch &amp;gt; -1) then&lt;br /&gt;
            cached_alch = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
        &lt;br /&gt;
    if isNothing then&lt;br /&gt;
        gemw = false&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        valueInfo = {&lt;br /&gt;
            alch = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            },&lt;br /&gt;
            ge = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        if alch then&lt;br /&gt;
            if cached_alch ~= nil then&lt;br /&gt;
                valueInfo.alch = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = cached_alch&lt;br /&gt;
                }&lt;br /&gt;
            elseif gemw then&lt;br /&gt;
                local hasgealch, gealchval = pcall(f_gealch,gemwname)&lt;br /&gt;
                if hasgealch then&lt;br /&gt;
                    if gealchval &amp;gt; -1 then&lt;br /&gt;
                        valueInfo.alch = {&lt;br /&gt;
                            has = true,&lt;br /&gt;
                            value = tonumber(gealchval)&lt;br /&gt;
                        }&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not valueInfo.alch.has then&lt;br /&gt;
                alch = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if gemw then&lt;br /&gt;
            if geprice_frombulk ~= nil then&lt;br /&gt;
                valueInfo.ge = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = geprice_frombulk&lt;br /&gt;
                }&lt;br /&gt;
            else&lt;br /&gt;
                gemw = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local image,image_n&lt;br /&gt;
    if isCoins then&lt;br /&gt;
        image_n = coins_image(quantity)&lt;br /&gt;
    else&lt;br /&gt;
        image_n = params.default_to(args.image or args.Image, name .. &#039;.png&#039;)&lt;br /&gt;
        image_n = mw.ustring.gsub(image_n, &#039;#.+$&#039;, &#039;.png&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if image_n:lower() == &#039;no&#039; or params.is_empty(args.name or args.Name) then&lt;br /&gt;
        image = &#039;&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        image = &#039;[[File:Bank filler.png|link=Nothing|alt=This does not exist.]]&#039;&lt;br /&gt;
    else&lt;br /&gt;
        image = mw.ustring.format(&#039;[[File:%s|alt=%s: %s drops %s with rarity %s%s in quantity %s]]&#039;, image_n, name, image_n, title, name, rollstext, rarity, quantity)&lt;br /&gt;
    end&lt;br /&gt;
    local rdt = string.lower(args.rdt or &#039;&#039;) == &#039;yes&#039;&lt;br /&gt;
        &lt;br /&gt;
    local ret =  p._main(name,&lt;br /&gt;
            altname,namenotes,&lt;br /&gt;
            quantity,quantitynotes,&lt;br /&gt;
            rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
            raritynotes,image,&lt;br /&gt;
            valueInfo,gemw,alch,alt,&lt;br /&gt;
            isCoins,&lt;br /&gt;
            isNothing,&lt;br /&gt;
            frameArgs,monVers,&lt;br /&gt;
            cleanedName,dropVers,smwname,&lt;br /&gt;
            rdt,useSmw,&lt;br /&gt;
            approx,rolls)&lt;br /&gt;
&lt;br /&gt;
    local cats = &#039;&#039;&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    if onMain and useSmw then&lt;br /&gt;
        cats = categories{name,quantity,rarity}&lt;br /&gt;
    end&lt;br /&gt;
    return ret..cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(name,&lt;br /&gt;
        altname,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
        raritynotes,image,&lt;br /&gt;
        valueInfo,gemw,alch,alt,&lt;br /&gt;
        isCoins,&lt;br /&gt;
        isNothing,&lt;br /&gt;
        frameArgs,monVers,&lt;br /&gt;
        cleanedName,dropVers,smwname,&lt;br /&gt;
        rdt,useSmw,&lt;br /&gt;
        approx, rolls)&lt;br /&gt;
    local total, alchtotal, vsort, vasort, _h, _l&lt;br /&gt;
    quantity, _h, _l = qty(quantity, isNothing)&lt;br /&gt;
    if valueInfo.ge.has then&lt;br /&gt;
        total, vsort, totalavg = get_total(valueInfo.ge.value,_h,_l)&lt;br /&gt;
        total = total or &#039;Not sold&#039;&lt;br /&gt;
    end&lt;br /&gt;
   &lt;br /&gt;
    if type(vsort) ~= &#039;number&#039; then&lt;br /&gt;
        vsort = 0&lt;br /&gt;
    end&lt;br /&gt;
    if type(vasort) ~= &#039;number&#039; then&lt;br /&gt;
        vasort = 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #quantitynotes &amp;gt; 3 then&lt;br /&gt;
        quantity = quantity..quantitynotes&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rare_class, rare_sort&lt;br /&gt;
    if rarity_value == nil then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities[rarity:lower()] or rarities._default)&lt;br /&gt;
    elseif rarity_value == false then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities._default)&lt;br /&gt;
    else&lt;br /&gt;
        rare_sort = 1/rarity_value&lt;br /&gt;
        rare_class = get_rarity_class(rarity_value)&lt;br /&gt;
    end&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
        rare_sort = rare_sort / rolls&lt;br /&gt;
        rare_class = get_rarity_class(math.min(1/rare_sort,0.99))&lt;br /&gt;
    end&lt;br /&gt;
    local tilde = &#039;&#039;&lt;br /&gt;
    if approx then&lt;br /&gt;
        tilde = &#039;~&#039;&lt;br /&gt;
    end&lt;br /&gt;
    local _r = rarity&lt;br /&gt;
    &lt;br /&gt;
    local hasRowwideVersion = false&lt;br /&gt;
    local tblVers = frameArgs.version&lt;br /&gt;
    local versionKey = &#039;DEFAULT&#039;&lt;br /&gt;
    if params.has_content(tblVers) then&lt;br /&gt;
       versionKey = tblVers&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(monVers) then&lt;br /&gt;
        versionKey = monVers&lt;br /&gt;
        hasRowwideVersion = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local quantityClassOverride = isNothing and &#039;table-na&#039; or nil&lt;br /&gt;
    local ret = mw.html.create(&#039;tr&#039;)&lt;br /&gt;
            :css(&#039;text-align&#039;,&#039;center&#039;)&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(&#039;inventory-image&#039;)&lt;br /&gt;
                :wikitext(image)&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :css(&#039;text-align&#039;,&#039;left&#039;)&lt;br /&gt;
                :addClass(&#039;item-col&#039;)&lt;br /&gt;
                :wikitext(string.format(&#039;%s&#039;,name,altname,#namenotes &amp;gt; 3 and namenotes or &#039;&#039;))&lt;br /&gt;
            :done()&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(quantityClassOverride)&lt;br /&gt;
                :attr(&#039;data-sort-value&#039;,_h)&lt;br /&gt;
                :wikitext(quantity)&lt;br /&gt;
            :done()&lt;br /&gt;
    &lt;br /&gt;
    local rarity_cell = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local rarity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
    rarity_span:wikitext(rollstext .. tilde .. rarity)&lt;br /&gt;
    rarity_cell:attr(&#039;data-sort-value&#039;,rare_sort)&lt;br /&gt;
                :addClass(rare_class)&lt;br /&gt;
    if type(rarity_value) == &#039;number&#039; then&lt;br /&gt;
        rarity_cell:attr(&#039;title&#039;, rollstext .. tilde .. string.format(&#039;%.3g%%&#039;, 100 * rarity_value))&lt;br /&gt;
        rarity_span:attr({&lt;br /&gt;
            [&#039;data-drop-fraction&#039;] = rollstext .. tilde .. rarity,&lt;br /&gt;
            [&#039;data-drop-oneover&#039;] = rollstext .. tilde .. &#039;1/&#039; .. commas(sigfig(1/rarity_value, 4)),&lt;br /&gt;
            [&#039;data-drop-percent&#039;] = rollstext .. tilde .. sigfig(100 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permil&#039;] = rollstext .. tilde .. sigfig(1000 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permyriad&#039;] = rollstext .. tilde .. sigfig(10000 * rarity_value, 3),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if alt_rarity ~= &#039;&#039; then&lt;br /&gt;
        if alt_rarity_endash  ~= &#039;&#039; then&lt;br /&gt;
            rarity_cell:tag(&#039;span&#039;):wikitext(&#039;–&#039;)&lt;br /&gt;
        else&lt;br /&gt;
            rarity_cell:tag(&#039;span&#039;):wikitext(&#039;; &#039;)&lt;br /&gt;
        end&lt;br /&gt;
        local alt_rarity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
        alt_rarity_span:wikitext(alt_rarity)&lt;br /&gt;
        if type(alt_rarity_value) == &#039;number&#039; then&lt;br /&gt;
            alt_rarity_span:attr({&lt;br /&gt;
                [&#039;data-drop-fraction&#039;] = alt_rarity,&lt;br /&gt;
                [&#039;data-drop-oneover&#039;] = &#039;1/&#039; .. commas(sigfig(1/alt_rarity_value, 3)),&lt;br /&gt;
                [&#039;data-drop-percent&#039;] = sigfig(100 * alt_rarity_value, 3),&lt;br /&gt;
                [&#039;data-drop-permil&#039;] = sigfig(1000 * alt_rarity_value, 3),&lt;br /&gt;
                [&#039;data-drop-permyriad&#039;] = sigfig(10000 * alt_rarity_value, 3),&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #raritynotes &amp;gt; 3 then&lt;br /&gt;
        rarity_cell:wikitext(raritynotes)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Adjusted rarity for donator ranks&lt;br /&gt;
    local donator_rarity_cells = generate_donator_rarity_cells(rarity_value)&lt;br /&gt;
    for _, donator_rarity in ipairs(donator_rarity_cells) do&lt;br /&gt;
        ret:tag(&#039;td&#039;)&lt;br /&gt;
            :wikitext(donator_rarity)&lt;br /&gt;
            :addClass(rare_class)&lt;br /&gt;
            :attr(&#039;title&#039;, rollstext .. tilde .. &#039;Adjusted rarity for donator rank&#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ge_td = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local ge_td_title, ge_td_content, alch_td_title, alch_td_content&lt;br /&gt;
    if isNothing then&lt;br /&gt;
        ge_td_content = &#039;N/A&#039;&lt;br /&gt;
        ge_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        alch_td_content = &#039;N/A&#039;&lt;br /&gt;
        alch_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        alch_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        local coinsStr = lang:plural(vsort, &#039;&#039;, &#039;s&#039;)&lt;br /&gt;
        ge_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        ge_td_content = total&lt;br /&gt;
        alch_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        alch_td_content = total&lt;br /&gt;
    else&lt;br /&gt;
        if valueInfo.ge.has then&lt;br /&gt;
            ge_td_title = mw.ustring.format(other_priceString, commas(valueInfo.ge.value), lang:plural(valueInfo.ge.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            ge_td_content = total&lt;br /&gt;
        end&lt;br /&gt;
        if valueInfo.alch.has then&lt;br /&gt;
            alch_td_title = mw.ustring.format(other_priceString, commas(valueInfo.alch.value), lang:plural(valueInfo.alch.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            alch_td_content = alchtotal&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if ge_td_content == nil then&lt;br /&gt;
            ge_td_content = &#039;Not sold&#039;&lt;br /&gt;
            ge_td_title = &#039;This item cannot be traded on the Trading Post.&#039;&lt;br /&gt;
            ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
    ge_td:wikitext(ge_td_content):attr(&#039;title&#039;, ge_td_title)&lt;br /&gt;
&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    local unrecognizedDropVersionCategory = &#039;&#039;&lt;br /&gt;
    if onMain and useSmw and isNothing ~= true then&lt;br /&gt;
        local smw_sub = {}&lt;br /&gt;
      &lt;br /&gt;
        dropFrom = pgTitle&lt;br /&gt;
        if versionKey ~= &#039;DEFAULT&#039; then&lt;br /&gt;
            dropFrom = pgTitle .. &#039;#&#039; .. versionKey&lt;br /&gt;
        end&lt;br /&gt;
        local droppedItemName = &#039;Dropped item&#039;&lt;br /&gt;
        if rdt == true then&lt;br /&gt;
            droppedItemName = &#039;Dropped item from RDT&#039;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local smw_json = {&lt;br /&gt;
            [&#039;Dropped item&#039;]=smwname,&lt;br /&gt;
            [&#039;Name Notes&#039;]=smwNameNote,&lt;br /&gt;
            [&#039;Drop Quantity&#039;]=smwQuantity,&lt;br /&gt;
            [&#039;Quantity High&#039;]=_h,&lt;br /&gt;
            [&#039;Quantity Low&#039;]=_l,&lt;br /&gt;
            Rarity=rarity,&lt;br /&gt;
            [&#039;Alt Rarity&#039;]=alt_rarity,&lt;br /&gt;
            [&#039;Alt Rarity Dash&#039;] = alt_rarity_endash,&lt;br /&gt;
            [&#039;Rarity Notes&#039;]=smwRarityNote,&lt;br /&gt;
            [&#039;Rolls&#039;]=smwRolls,&lt;br /&gt;
            [&#039;Drop Value&#039;] = valueInfo.alch.value or 0,&lt;br /&gt;
            [&#039;Dropped from&#039;] = dropFrom,&lt;br /&gt;
            [&#039;Drop level&#039;] = dropLevel,&lt;br /&gt;
            [&#039;Drop type&#039;] = dropType&lt;br /&gt;
        }&lt;br /&gt;
        local smw_sub = {&lt;br /&gt;
            [droppedItemName] = smwname,&lt;br /&gt;
            [&#039;Dropped from&#039;] = dropFrom,&lt;br /&gt;
            [&amp;quot;Drop JSON&amp;quot;] = mw.text.jsonEncode(smw_json)&lt;br /&gt;
        }&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return tostring(ret) .. unrecognizedDropVersionCategory&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function qty(quantity, isNothing)&lt;br /&gt;
    if string.lower(quantity) == &#039;varies&#039; then&lt;br /&gt;
        return &#039;Varies&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        return &#039;N/A&#039;&lt;br /&gt;
    elseif not quantity or string.lower(quantity) == &#039;unknown&#039; then&lt;br /&gt;
        return &#039;Unknown&#039;&lt;br /&gt;
    end&lt;br /&gt;
    quantity = mw.ustring.gsub(quantity,&#039;[-—]&#039;,&#039;–&#039;)&lt;br /&gt;
        :gsub(&#039;%s&#039;,&#039;&#039;)&lt;br /&gt;
        :gsub(&#039;%(noted%)&#039;,&#039;$n&#039;)&lt;br /&gt;
    local vals = mw.text.split(quantity,&#039;[,;]&#039;)&lt;br /&gt;
    local low = 2147483648&lt;br /&gt;
    local high = 0&lt;br /&gt;
    local numstr = {}&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&#039;$n&#039;,&#039;&#039;)&lt;br /&gt;
        if mw.ustring.find(v,&#039;–&#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&#039;–&#039;)&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            if a &amp;gt; b then&lt;br /&gt;
                a,b = b,a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if b &amp;gt; high then&lt;br /&gt;
                high = b&lt;br /&gt;
            end&lt;br /&gt;
            local addx = commas(a)..&#039;–&#039;..commas(b)&lt;br /&gt;
            if v:find(&#039;$n&#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        else&lt;br /&gt;
            local a = tonumber(clean)&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;gt; high then &lt;br /&gt;
                high = a&lt;br /&gt;
            end&lt;br /&gt;
            local addx = commas(a)&lt;br /&gt;
            if v:find(&#039;$n&#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if #numstr &amp;gt; 11 then&lt;br /&gt;
        local mid = math.floor(#numstr/2)&lt;br /&gt;
        numstr[mid] = &#039;&amp;lt;br/&amp;gt;&#039;..numstr[mid]&lt;br /&gt;
    end&lt;br /&gt;
    numstr = table.concat(numstr,&#039;; &#039;)&lt;br /&gt;
    if not numstr:find(&#039;%d&#039;) then&lt;br /&gt;
        return &#039;Unknown&#039;, price&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return numstr, high, low&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_total(value,qhigh,qlow)&lt;br /&gt;
    if not value or string.lower(value) == &#039;unknown&#039; then&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(value) and tonumber(value) &amp;lt; 0 then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    if not tonumber(value) and not value:find(&#039;%d&#039;) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    value = mw.ustring.gsub(value,&#039;[-—]&#039;,&#039;–&#039;)&lt;br /&gt;
        :gsub(&#039;%s&#039;,&#039;&#039;)&lt;br /&gt;
    local vals = mw.text.split(value,&#039;[,;]&#039;)&lt;br /&gt;
    local low = 2147483648&lt;br /&gt;
    local high = 0&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&#039;$n&#039;,&#039;&#039;)&lt;br /&gt;
        if mw.ustring.find(v,&#039;–&#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&#039;–&#039;)&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            if a &amp;gt; b then&lt;br /&gt;
                a,b = b,a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if b &amp;gt; high then&lt;br /&gt;
                high = b&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local a = tonumber(clean)&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;gt; high then &lt;br /&gt;
                high = a&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local valret, sort, avg&lt;br /&gt;
    if not qhigh or not qlow then&lt;br /&gt;
        sort = high&lt;br /&gt;
        avg = high&lt;br /&gt;
        valret = commas(high)&lt;br /&gt;
    else&lt;br /&gt;
        local lower = qlow * low&lt;br /&gt;
        local higher = qhigh * high&lt;br /&gt;
        if higher == lower then&lt;br /&gt;
            valret = commas(higher)&lt;br /&gt;
            avg = higher&lt;br /&gt;
        else&lt;br /&gt;
            valret = commas(lower)..&#039;–&#039;..commas(higher)&lt;br /&gt;
            avg = (lower+higher)/2&lt;br /&gt;
        end&lt;br /&gt;
        sort = higher&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return valret, sort, avg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function categories(...)&lt;br /&gt;
    local name,quantity,rarity = unpack(...)&lt;br /&gt;
    local ret = &#039;&#039;&lt;br /&gt;
    name = name:lower()&lt;br /&gt;
    quantity = quantity:lower()&lt;br /&gt;
    if name:find(&#039;clue scroll&#039;) then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if rarity == nil or rarity == &#039;&#039; or rarity:lower() == &#039;unknown&#039; then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if quantity:find(&#039;Unknown&#039;) then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18586</id>
		<title>Module:DropsLine</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:DropsLine&amp;diff=18586"/>
		<updated>2024-04-03T22:09:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local params = require(&#039;Module:Paramtest&#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
local coins_image = require(&#039;Module:Coins image&#039;)&lt;br /&gt;
local curr_image = require(&#039;Module:Currency Image&#039;)&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local var = mw.ext.VariablesLua&lt;br /&gt;
&lt;br /&gt;
-- precalculated cached data&lt;br /&gt;
local droppeditem_data = mw.loadJsonData(&#039;Module:DropsLine/itemData.json&#039;)&lt;br /&gt;
local geprices_data = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;)&lt;br /&gt;
local highalch_data = mw.loadJsonData(&#039;Module:GEHighAlchs/data.json&#039;)&lt;br /&gt;
&lt;br /&gt;
local ptitle = mw.title.getCurrentTitle()&lt;br /&gt;
local ns = ptitle.nsText&lt;br /&gt;
local title = ptitle.fullText&lt;br /&gt;
local pgTitle = ptitle.text&lt;br /&gt;
&lt;br /&gt;
local _noted = &#039;&amp;amp;nbsp;&amp;lt;span class=&amp;quot;dropsline-noted&amp;quot;&amp;gt;(noted)&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
local coins_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
local other_priceString = &amp;quot;%s Pkp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--bg, txt, sort; acceptable non-quantity rarity names&lt;br /&gt;
local rarities = {&lt;br /&gt;
    always = { &#039;table-bg-blue&#039;, 1 },&lt;br /&gt;
    common = { &#039;table-bg-green&#039;, 16 },&lt;br /&gt;
    uncommon = { &#039;table-bg-yellow&#039;, 64 },&lt;br /&gt;
    rare = { &#039;table-bg-orange&#039;, 128 },&lt;br /&gt;
    [&#039;very rare&#039;] = { &#039;table-bg-red&#039;, 1024 },&lt;br /&gt;
    random = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    varies = { &#039;table-bg-pink&#039;, 4096 },&lt;br /&gt;
    once = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    conditional = { &#039;table-bg-pink&#039;, 65536 },&lt;br /&gt;
    _default = { &#039;table-bg-grey&#039;, 65536 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- colour-code&lt;br /&gt;
local rarities_class = {&lt;br /&gt;
    { 1, &#039;table-bg-blue&#039; },&lt;br /&gt;
    { 1/25, &#039;table-bg-green&#039; },&lt;br /&gt;
    { 1/99.99, &#039;table-bg-yellow&#039; },&lt;br /&gt;
    { 1/999.99, &#039;table-bg-orange&#039; },&lt;br /&gt;
    { 1/9999999, &#039;table-bg-red&#039; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local donator_bonuses = {&lt;br /&gt;
    [&amp;quot;Normal Donator&amp;quot;] = 0.15,&lt;br /&gt;
    [&amp;quot;Super Donator&amp;quot;] = 0.25,&lt;br /&gt;
    [&amp;quot;Extreme Donator&amp;quot;] = 0.30,&lt;br /&gt;
    [&amp;quot;Legendary Donator&amp;quot;] = 0.35,&lt;br /&gt;
    [&amp;quot;Royal Donator&amp;quot;] = 0.40,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_rarity_class(val)&lt;br /&gt;
    for i,v in ipairs(rarities_class) do&lt;br /&gt;
        curr = v&lt;br /&gt;
        if val &amp;gt;= v[1] then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return curr[2]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function commas(n)&lt;br /&gt;
    if tonumber(n) then&lt;br /&gt;
        return lang:formatNum(tonumber(n))&lt;br /&gt;
    else&lt;br /&gt;
        return n&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expr(t)&lt;br /&gt;
    local noerr, val = pcall(mw.ext.ParserFunctions.expr, t)&lt;br /&gt;
    if noerr then&lt;br /&gt;
        return tonumber(val)&lt;br /&gt;
    else&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
function sigfig(n, f)&lt;br /&gt;
    f = math.floor(f-1)&lt;br /&gt;
    if n == 0 then return 0 end&lt;br /&gt;
    local m = math.floor(math.log10(n))&lt;br /&gt;
    f = math.max(m, f)&lt;br /&gt;
    local v = n / (10^(m-f))&lt;br /&gt;
    v = math.floor(v + 0.5) * 10^(m-f)&lt;br /&gt;
    -- floor(x + 0.5) is standard rounding to one decimal place&lt;br /&gt;
    return v&lt;br /&gt;
end&lt;br /&gt;
p.sigfig = sigfig&lt;br /&gt;
p.commas = commas&lt;br /&gt;
&lt;br /&gt;
function adjust_rarity_for_donator(rarity, bonus)&lt;br /&gt;
    if not rarity or not tonumber(rarity) then return rarity end&lt;br /&gt;
    local adjusted_rarity = 1 / ((1 / rarity) * (1 - bonus))&lt;br /&gt;
    return adjusted_rarity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local frameArgs = frame.args&lt;br /&gt;
&lt;br /&gt;
    -- Params and defaults&lt;br /&gt;
    local name,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,alt_rarity,alt_rarity_endash,&lt;br /&gt;
        raritynotes,citation,monVers = params.defaults{&lt;br /&gt;
                    {args.name or args.Name,&#039;Item&#039;},&lt;br /&gt;
                    {args.namenotes or args.Namenotes,&#039;&#039;},&lt;br /&gt;
                    {args.quantity or args.Quantity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.quantitynotes or args.Quantitynotes,&#039;&#039;},&lt;br /&gt;
                    {args.rarity or args.Rarity,&#039;Unknown&#039;},&lt;br /&gt;
                    {args.altrarity or args.AltRarity,&#039;&#039;},&lt;br /&gt;
                    {args.altraritydash or args.AltRarityDash,&#039;&#039;},&lt;br /&gt;
                    {args.raritynotes or args.Raritynotes,&#039;&#039;},&lt;br /&gt;
                    {args.citation,&#039;&#039;},&lt;br /&gt;
                    {args.version or args.Version,&#039;&#039;},&lt;br /&gt;
        }&lt;br /&gt;
        raritynotes = raritynotes .. citation&lt;br /&gt;
    local rolls = tonumber(args.rolls or args.Rolls) or false&lt;br /&gt;
    local rollstext&lt;br /&gt;
&lt;br /&gt;
 = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
    end&lt;br /&gt;
    local approx = yesno(args.approx or args.Approx or &#039;no&#039;, false)&lt;br /&gt;
    local isCoins = name:lower() == &#039;coins&#039;&lt;br /&gt;
    local isNothing = name:lower() == &#039;nothing&#039;&lt;br /&gt;
    local altname = params.default_to(args.alt or args.Alt,name)&lt;br /&gt;
    local gemwname = params.default_to(args.gemwname,name)&lt;br /&gt;
    local _smwname = params.default_to(args.smwname,gemwname)&lt;br /&gt;
&lt;br /&gt;
    -- Remove version number from potions, enchanted jewellery, waterskins etc for smw&lt;br /&gt;
    local cleanedName&lt;br /&gt;
    local dropVers = &#039;&#039;&lt;br /&gt;
    if _smwname:match(&#039; ?%(%d%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(gemwname, &#039;^(.-) ?(%(%d%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039; ?%(p%+*%)$&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-) ?(%(p%+*%))$&#039;)&lt;br /&gt;
    elseif _smwname:match(&#039;%#&#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &#039;^(.-)%#([%w%s%(%)]+)$&#039;)&lt;br /&gt;
    else&lt;br /&gt;
        cleanedName = mw.ustring.gsub(_smwname, &#039; %(%d%)$&#039;, &#039;&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    cleanedName = mw.text.trim(cleanedName)&lt;br /&gt;
    dropVers = mw.text.trim(dropVers)&lt;br /&gt;
    &lt;br /&gt;
    local smwname = cleanedName &lt;br /&gt;
    if dropVers ~= &#039;&#039; then&lt;br /&gt;
        -- get subobject instead&lt;br /&gt;
        smwname = cleanedName..&#039;#&#039;..dropVers&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local useSmw = true&lt;br /&gt;
    if params.has_content(args.smw) then&lt;br /&gt;
        useSmw = args.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(frameArgs.smw) then&lt;br /&gt;
        useSmw = frameArgs.smw:lower() ~= &#039;no&#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local rarity_value&lt;br /&gt;
    if rarities[rarity:lower()] then&lt;br /&gt;
        rarity = params.ucflc(rarity)&lt;br /&gt;
    else&lt;br /&gt;
        rarity_value = rarity:gsub(&#039;,&#039;,&#039;&#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            rarity_value = expr(rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local alt_rarity_value&lt;br /&gt;
    if rarities[alt_rarity:lower()] then&lt;br /&gt;
        alt_rarity = params.ucflc(alt_rarity)&lt;br /&gt;
    else&lt;br /&gt;
        alt_rarity_value = alt_rarity:gsub(&#039;,&#039;,&#039;&#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(alt_rarity_value, &#039;([%d%.]+)/([%d%.]+)&#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            alt_rarity = commas(rv1) .. &#039;/&#039; .. commas(rv2)&lt;br /&gt;
            alt_rarity_value = rv1/rv2&lt;br /&gt;
        else&lt;br /&gt;
            alt_rarity_value = expr(alt_rarity)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    quantity = mw.ustring.lower(quantity)&lt;br /&gt;
    local gemw = yesno(args.gemw or &#039;yes&#039;, false)&lt;br /&gt;
    local alch = yesno(args.alch or &#039;yes&#039;, false)&lt;br /&gt;
&lt;br /&gt;
    -- Test for existance of alch value&lt;br /&gt;
    local hasmwalch, smwalchval&lt;br /&gt;
    local valueInfo = {&lt;br /&gt;
        alch = {&lt;br /&gt;
            has = false,&lt;br /&gt;
            value = 0&lt;br /&gt;
        },&lt;br /&gt;
        ge = {&lt;br /&gt;
            has = false,&lt;br /&gt;
            value = 0&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    local cached_dropdata = droppeditem_data[smwname]&lt;br /&gt;
    local cached_alch = nil&lt;br /&gt;
    if type(cached_dropdata) == &#039;table&#039; then&lt;br /&gt;
        if cached_dropdata[1] ~= nil and cached_dropdata[2] ~= nil then&lt;br /&gt;
            cached_alch = cached_dropdata[2]&lt;br /&gt;
        elseif cached_dropdata[1] ~= nil then&lt;br /&gt;
            cached_dropdata = cached_dropdata[1]&lt;br /&gt;
            if type(cached_dropdata) == &#039;boolean&#039; then&lt;br /&gt;
            elseif type(cached_dropdata) == &#039;number&#039; then&lt;br /&gt;
                cached_alch = cached_dropdata&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local geprice_frombulk = geprices_data[gemwname]&lt;br /&gt;
    if not (type(geprice_frombulk) == &#039;number&#039; and geprice_frombulk &amp;gt; 0) then&lt;br /&gt;
        geprice_frombulk = nil&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if cached_alch == nil then&lt;br /&gt;
        cached_alch = highalch_data[gemwname]&lt;br /&gt;
        if not (type(cached_alch) == &#039;number&#039; and cached_alch &amp;gt; -1) then&lt;br /&gt;
            cached_alch = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
        &lt;br /&gt;
    if isNothing then&lt;br /&gt;
        gemw = false&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        -- coins override&lt;br /&gt;
        valueInfo = {&lt;br /&gt;
            alch = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            },&lt;br /&gt;
            ge = {&lt;br /&gt;
                has = true,&lt;br /&gt;
                value = 1&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        -- find alch price&lt;br /&gt;
        if alch then&lt;br /&gt;
            -- first check cache for alch value&lt;br /&gt;
            if cached_alch ~= nil then&lt;br /&gt;
                valueInfo.alch = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = cached_alch&lt;br /&gt;
                }&lt;br /&gt;
            elseif gemw then&lt;br /&gt;
                -- then check gemw for alch value&lt;br /&gt;
                local hasgealch, gealchval = pcall(f_gealch,gemwname)&lt;br /&gt;
                if hasgealch then&lt;br /&gt;
                    if gealchval &amp;gt; -1 then&lt;br /&gt;
                        valueInfo.alch = {&lt;br /&gt;
                            has = true,&lt;br /&gt;
                            value = tonumber(gealchval)&lt;br /&gt;
                        }&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not valueInfo.alch.has then&lt;br /&gt;
                -- failed to find alch in GEMW or is on the no-ge list/override&lt;br /&gt;
                -- lookup in SMW&lt;br /&gt;
&lt;br /&gt;
                if smwret and smwret.alch ~= nil then&lt;br /&gt;
                    -- alch is defined, use it&lt;br /&gt;
                    valueInfo.alch = {&lt;br /&gt;
                        has = true,&lt;br /&gt;
                        value = smwret.alch&lt;br /&gt;
                    }&lt;br /&gt;
                else&lt;br /&gt;
                    alch = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- find ge price&lt;br /&gt;
        if gemw then&lt;br /&gt;
            if geprice_frombulk ~= nil then&lt;br /&gt;
                valueInfo.ge = {&lt;br /&gt;
                    has = true,&lt;br /&gt;
                    value = geprice_frombulk&lt;br /&gt;
                }&lt;br /&gt;
            else&lt;br /&gt;
                gemw = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Use &#039;File:&amp;lt;name&amp;gt;.png&#039; if no image param&lt;br /&gt;
    -- Use &#039;File:&amp;lt;image&amp;gt;&#039; if image param; image param will include extension&lt;br /&gt;
    -- Special catch for coins&lt;br /&gt;
    local image,image_n&lt;br /&gt;
    if isCoins then&lt;br /&gt;
        image_n = coins_image(quantity)&lt;br /&gt;
    else&lt;br /&gt;
        image_n = params.default_to(args.image or args.Image, name .. &#039;.png&#039;)&lt;br /&gt;
        image_n = mw.ustring.gsub(image_n, &#039;#.+$&#039;, &#039;.png&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if image_n:lower() == &#039;no&#039; or params.is_empty(args.name or args.Name) then&lt;br /&gt;
        image = &#039;&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        image = &#039;[[File:Bank filler.png|link=Nothing|alt=This does not exist.]]&#039;&lt;br /&gt;
    else&lt;br /&gt;
        image = mw.ustring.format(&#039;[[File:%s|alt=%s: %s drops %s with rarity %s%s in quantity %s]]&#039;, image_n, name, image_n, title, name, rollstext, rarity, quantity)&lt;br /&gt;
    end&lt;br /&gt;
    -- this only affects the JSON&lt;br /&gt;
    local rdt = string.lower(args.rdt or &#039;&#039;) == &#039;yes&#039;&lt;br /&gt;
        &lt;br /&gt;
    -- Table row&lt;br /&gt;
    local ret =  p._main(name,&lt;br /&gt;
            altname,namenotes,&lt;br /&gt;
            quantity,quantitynotes,&lt;br /&gt;
            rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
            raritynotes,image,&lt;br /&gt;
            valueInfo,gemw,alch,alt,&lt;br /&gt;
            isCoins,&lt;br /&gt;
            isNothing,&lt;br /&gt;
            frameArgs,monVers,&lt;br /&gt;
            cleanedName,dropVers,smwname,&lt;br /&gt;
            rdt,useSmw,&lt;br /&gt;
            approx,rolls)&lt;br /&gt;
&lt;br /&gt;
    -- If the rarity is numerical, calculate and display adjusted rarities for donator ranks&lt;br /&gt;
    if type(rarity_value) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        for rank, bonus in pairs(donator_bonuses) do&lt;br /&gt;
            local adjusted_rarity = adjust_rarity_for_donator(rarity_value, bonus)&lt;br /&gt;
            ret = ret .. p._main(name,&lt;br /&gt;
                    altname,namenotes,&lt;br /&gt;
                    quantity,quantitynotes,&lt;br /&gt;
                    &amp;quot;1/&amp;quot;..tostring(math.floor(1/adjusted_rarity)),adjusted_rarity,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
                    raritynotes..&amp;quot; (&amp;quot;..rank..&amp;quot;)&amp;quot;,image,&lt;br /&gt;
                    valueInfo,gemw,alch,alt,&lt;br /&gt;
                    isCoins,&lt;br /&gt;
                    isNothing,&lt;br /&gt;
                    frameArgs,monVers,&lt;br /&gt;
                    cleanedName,dropVers,smwname,&lt;br /&gt;
                    rdt,useSmw,&lt;br /&gt;
                    approx,rolls)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- categories for mainspace&lt;br /&gt;
    local cats = &#039;&#039;&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    if onMain and useSmw then&lt;br /&gt;
        cats = categories{name,quantity,rarity}&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
&lt;br /&gt;
..cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- main function to generate the row&lt;br /&gt;
function p._main(name,&lt;br /&gt;
        altname,namenotes,&lt;br /&gt;
        quantity,quantitynotes,&lt;br /&gt;
        rarity,rarity_value,alt_rarity,alt_rarity_endash,alt_rarity_value,&lt;br /&gt;
        raritynotes,image,&lt;br /&gt;
        valueInfo,gemw,alch,alt,&lt;br /&gt;
        isCoins,&lt;br /&gt;
        isNothing,&lt;br /&gt;
        frameArgs,monVers,&lt;br /&gt;
        cleanedName,dropVers,smwname,&lt;br /&gt;
        rdt,useSmw,&lt;br /&gt;
        approx, rolls)&lt;br /&gt;
    -- GE value, alch value, quantity cell contents&lt;br /&gt;
    local total, alchtotal, vsort, vasort, _h, _l&lt;br /&gt;
    quantity, _h, _l = qty(quantity, isNothing)&lt;br /&gt;
    if valueInfo.ge.has then&lt;br /&gt;
        total, vsort, totalavg = get_total(valueInfo.ge.value,_h,_l)&lt;br /&gt;
        total = total or &#039;Not sold&#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
    -- value sorts&lt;br /&gt;
    if type(vsort) ~= &#039;number&#039; then&lt;br /&gt;
        vsort = 0&lt;br /&gt;
    end&lt;br /&gt;
    if type(vasort) ~= &#039;number&#039; then&lt;br /&gt;
        vasort = 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- quantity notes&lt;br /&gt;
    if #quantitynotes &amp;gt; 3 then&lt;br /&gt;
        quantity = quantity..quantitynotes&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- rarity cell contents&lt;br /&gt;
    local rare_class, rare_sort&lt;br /&gt;
    if rarity_value == undefined then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities[rarity:lower()] or rarities._default)&lt;br /&gt;
    elseif rarity_value == false then&lt;br /&gt;
        rare_class, rare_sort = unpack(rarities._default)&lt;br /&gt;
    else&lt;br /&gt;
        rare_sort = 1/rarity_value&lt;br /&gt;
        rare_class = get_rarity_class(rarity_value)&lt;br /&gt;
    end&lt;br /&gt;
    local rollstext = &#039;&#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &#039; × &#039;&lt;br /&gt;
        rare_sort = rare_sort / rolls&lt;br /&gt;
        rare_class = get_rarity_class(math.min(1/rare_sort,0.99))&lt;br /&gt;
    end&lt;br /&gt;
    local tilde = &#039;&#039;&lt;br /&gt;
    if approx then&lt;br /&gt;
        tilde = &#039;~&#039;&lt;br /&gt;
    end&lt;br /&gt;
    local _r = rarity&lt;br /&gt;
    &lt;br /&gt;
    -- monster versions&lt;br /&gt;
    local hasRowwideVersion = false&lt;br /&gt;
    local tblVers = frameArgs.version&lt;br /&gt;
    local versionKey = &#039;DEFAULT&#039;&lt;br /&gt;
    if params.has_content(tblVers) then&lt;br /&gt;
        -- versions applied to the entire table&lt;br /&gt;
       versionKey = tblVers&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(monVers) then&lt;br /&gt;
        -- versions applied to this row&lt;br /&gt;
        versionKey = monVers&lt;br /&gt;
        hasRowwideVersion = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local quantityClassOverride = isNothing and &#039;table-na&#039; or nil&lt;br /&gt;
    -- Table row creation&lt;br /&gt;
    local ret = mw.html.create(&#039;tr&#039;)&lt;br /&gt;
            -- row-wide things&lt;br /&gt;
            :css(&#039;text-align&#039;,&#039;center&#039;)&lt;br /&gt;
            -- inventory image&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(&#039;inventory-image&#039;)&lt;br /&gt;
                :wikitext(image)&lt;br /&gt;
            :done()&lt;br /&gt;
            -- item name&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :css(&#039;text-align&#039;,&#039;left&#039;)&lt;br /&gt;
                :addClass(&#039;item-col&#039;)&lt;br /&gt;
                :wikitext(string.format(&#039;%s&#039;,name,altname,#namenotes &amp;gt; 3 and namenotes or &#039;&#039;))&lt;br /&gt;
            :done()&lt;br /&gt;
            -- quantity&lt;br /&gt;
            :tag(&#039;td&#039;)&lt;br /&gt;
                :addClass(quantityClassOverride)&lt;br /&gt;
                :attr(&#039;data-sort-value&#039;,_h)&lt;br /&gt;
                :wikitext(quantity)&lt;br /&gt;
            :done()&lt;br /&gt;
    &lt;br /&gt;
    -- rarity&lt;br /&gt;
    local rarity_cell = ret:tag(&#039;td&#039;)&lt;br /&gt;
    local rarity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
    rarity_span:wikitext(rollstext .. tilde .. rarity)&lt;br /&gt;
    rarity_cell:attr(&#039;data-sort-value&#039;,rare_sort)&lt;br /&gt;
                :addClass(rare_class)&lt;br /&gt;
    if type(rarity_value) == &#039;number&#039; then&lt;br /&gt;
        rarity_cell:attr(&#039;title&#039;, rollstext .. tilde .. string.format(&#039;%.3g%%&#039;, 100 * rarity_value))&lt;br /&gt;
        rarity_span:attr({&lt;br /&gt;
            [&#039;data-drop-fraction&#039;] = rollstext .. tilde .. rarity,&lt;br /&gt;
            [&#039;data-drop-oneover&#039;] = rollstext .. tilde .. &#039;1/&#039; .. commas(sigfig(1/rarity_value, 4)),&lt;br /&gt;
            [&#039;data-drop-percent&#039;] = rollstext .. tilde .. sigfig(100 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permil&#039;] = rollstext .. tilde .. sigfig(1000 * rarity_value, 3),&lt;br /&gt;
            [&#039;data-drop-permyriad&#039;] = rollstext .. tilde .. sigfig(10000 * rarity_value, 3),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if alt_rarity ~= &#039;&#039; then&lt;br /&gt;
        if alt_rarity_endash  ~= &#039;&#039; then&lt;br /&gt;
            rarity_cell:tag(&#039;span&#039;):wikitext(&#039;–&#039;)&lt;br /&gt;
        else&lt;br /&gt;
            rarity_cell:tag(&#039;span&#039;):wikitext(&#039;; &#039;)&lt;br /&gt;
        end&lt;br /&gt;
        local alt_r&lt;br /&gt;
&lt;br /&gt;
arity_span = rarity_cell:tag(&#039;span&#039;)&lt;br /&gt;
        alt_rarity_span:wikitext(alt_rarity)&lt;br /&gt;
        if type(alt_rarity_value) == &#039;number&#039; then&lt;br /&gt;
            alt_rarity_span:attr({&lt;br /&gt;
                [&#039;data-drop-fraction&#039;] = alt_rarity,&lt;br /&gt;
                [&#039;data-drop-oneover&#039;] = &#039;1/&#039; .. commas(sigfig(1/alt_rarity_value, 3)),&lt;br /&gt;
                [&#039;data-drop-percent&#039;] = sigfig(100 * alt_rarity_value, 3),&lt;br /&gt;
                [&#039;data-drop-permil&#039;] = sigfig(1000 * alt_rarity_value, 3),&lt;br /&gt;
                [&#039;data-drop-permyriad&#039;] = sigfig(10000 * alt_rarity_value, 3),&lt;br /&gt;
            })&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #raritynotes &amp;gt; 3 then&lt;br /&gt;
        rarity_cell:wikitext(raritynotes)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- setup GE and alch cells&lt;br /&gt;
    local ge_td = ret:tag(&#039;td&#039;)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    -- common attributes&lt;br /&gt;
    ge_td   :attr(&#039;data-sort-value&#039;,vsort)&lt;br /&gt;
	    :addClass(&#039;ge-column&#039;)&lt;br /&gt;
	    :css({&lt;br /&gt;
	        [&#039;text-align&#039;] = &#039;right&#039;,&lt;br /&gt;
	        cursor = &#039;help&#039;&lt;br /&gt;
	    })&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
    local ge_td_title, ge_td_content, alch_td_title, alch_td_content&lt;br /&gt;
    --Cases for the GE, alch values, and isNothing handling&lt;br /&gt;
    if isNothing then&lt;br /&gt;
        ge_td_content = &#039;N/A&#039;&lt;br /&gt;
        ge_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        alch_td_content = &#039;N/A&#039;&lt;br /&gt;
        alch_td_title = &#039;This does not exist.&#039;&lt;br /&gt;
        alch_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        local coinsStr = lang:plural(vsort, &#039;&#039;, &#039;s&#039;)&lt;br /&gt;
        ge_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        ge_td_content = total&lt;br /&gt;
        alch_td_title = mw.ustring.format(coins_priceString, total, coinsStr)&lt;br /&gt;
        alch_td_content = total&lt;br /&gt;
    else&lt;br /&gt;
        if valueInfo.ge.has then&lt;br /&gt;
            ge_td_title = mw.ustring.format(other_priceString, commas(valueInfo.ge.value), lang:plural(valueInfo.ge.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            ge_td_content = total&lt;br /&gt;
        end&lt;br /&gt;
        if valueInfo.alch.has then&lt;br /&gt;
            alch_td_title = mw.ustring.format(other_priceString, commas(valueInfo.alch.value), lang:plural(valueInfo.alch.value, &#039;&#039;, &#039;s&#039;))&lt;br /&gt;
            alch_td_content = alchtotal&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if ge_td_content == nil then&lt;br /&gt;
            ge_td_content = &#039;Not sold&#039;&lt;br /&gt;
            ge_td_title = &#039;This item cannot be traded on the Trading Post.&#039;&lt;br /&gt;
            ge_td:addClass(&#039;table-na&#039;):css(&#039;text-decoration&#039;, &#039;underline dotted&#039;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
    ge_td:wikitext(ge_td_content):attr(&#039;title&#039;, ge_td_title)&lt;br /&gt;
&lt;br /&gt;
    -- SMW&lt;br /&gt;
    local onMain = ns == &#039;&#039; or ns == &#039;RuneScape&#039;&lt;br /&gt;
    local unrecognizedDropVersionCategory = &#039;&#039;&lt;br /&gt;
    if onMain and useSmw and isNothing ~= true then&lt;br /&gt;
        local smw_sub = {}&lt;br /&gt;
        -- check if applies to all or only a version&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
        dropFrom = pgTitle&lt;br /&gt;
        if versionKey ~= &#039;DEFAULT&#039; then&lt;br /&gt;
            dropFrom = pgTitle .. &#039;#&#039; .. versionKey&lt;br /&gt;
        end&lt;br /&gt;
        local droppedItemName = &#039;Dropped item&#039;&lt;br /&gt;
        if rdt == true then&lt;br /&gt;
            droppedItemName = &#039;Dropped item from RDT&#039;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        local smw_json = {&lt;br /&gt;
            [&#039;Dropped item&#039;]=smwname,&lt;br /&gt;
            [&#039;Name Notes&#039;]=smwNameNote,&lt;br /&gt;
            [&#039;Drop Quantity&#039;]=smwQuantity,&lt;br /&gt;
            [&#039;Quantity High&#039;]=_h,&lt;br /&gt;
            [&#039;Quantity Low&#039;]=_l,&lt;br /&gt;
            Rarity=rarity,&lt;br /&gt;
            [&#039;Alt Rarity&#039;]=alt_rarity,&lt;br /&gt;
            [&#039;Alt Rarity Dash&#039;] = alt_rarity_endash,&lt;br /&gt;
            [&#039;Rarity Notes&#039;]=smwRarityNote,&lt;br /&gt;
            [&#039;Rolls&#039;]=smwRolls,&lt;br /&gt;
            [&#039;Drop Value&#039;] = valueInfo.alch.value or 0,&lt;br /&gt;
            [&#039;Dropped from&#039;] = dropFrom,&lt;br /&gt;
            [&#039;Drop level&#039;] = dropLevel,&lt;br /&gt;
            [&#039;Drop type&#039;] = dropType&lt;br /&gt;
        }&lt;br /&gt;
        local smw_sub = {&lt;br /&gt;
            [droppedItemName] = smwname,&lt;br /&gt;
            [&#039;Dropped from&#039;] = dropFrom,&lt;br /&gt;
            [&amp;quot;Drop JSON&amp;quot;] = mw.text.jsonEncode(smw_json)&lt;br /&gt;
        }&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return tostring(ret) .. unrecognizedDropVersionCategory&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function qty(quantity, isNothing)&lt;br /&gt;
    -- if no quantity is given, return unknown&lt;br /&gt;
    if string.lower(quantity) == &#039;varies&#039; then&lt;br /&gt;
        return &#039;Varies&#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        return &#039;N/A&#039;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
 elseif not quantity or string.lower(quantity) == &#039;unknown&#039; then&lt;br /&gt;
        return &#039;Unknown&#039;&lt;br /&gt;
    end&lt;br /&gt;
    -- en dashes are the proper dash for number ranges&lt;br /&gt;
    -- replace all hyphens and em dashes with en&lt;br /&gt;
    -- strip *all* whitespace&lt;br /&gt;
    -- change &#039;(noted)&#039; to &#039;$n&#039; for parsing&lt;br /&gt;
    quantity = mw.ustring.gsub(quantity,&#039;[-—]&#039;,&#039;–&#039;)&lt;br /&gt;
        :gsub(&#039;%s&#039;,&#039;&#039;)&lt;br /&gt;
        :gsub(&#039;%(noted%)&#039;,&#039;$n&#039;)&lt;br /&gt;
    -- split list into table&lt;br /&gt;
    local vals = mw.text.split(quantity,&#039;[,;]&#039;)&lt;br /&gt;
    local low = 2147483648&lt;br /&gt;
    local high = 0&lt;br /&gt;
    -- recreate the quantity string to ensure consistent formatting&lt;br /&gt;
    local numstr = {}&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&#039;$n&#039;,&#039;&#039;)&lt;br /&gt;
        -- if list element contains an en dash (indicating range)&lt;br /&gt;
        -- Find the smaller/larger number (just in case)&lt;br /&gt;
        -- Compare them to the current min/max&lt;br /&gt;
        -- put them in order with desired format&lt;br /&gt;
        if mw.ustring.find(v,&#039;–&#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&#039;–&#039;)&lt;br /&gt;
            -- assume a is smaller, b is larger&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            -- Just in case&lt;br /&gt;
            if a &amp;gt; b then&lt;br /&gt;
                a,b = b,a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if b &amp;gt; high then&lt;br /&gt;
                high = b&lt;br /&gt;
            end&lt;br /&gt;
            local addx = commas(a)..&#039;–&#039;..commas(b)&lt;br /&gt;
            if v:find(&#039;$n&#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        else&lt;br /&gt;
            local a = tonumber(clean)&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;gt; high then &lt;br /&gt;
                high = a&lt;br /&gt;
            end&lt;br /&gt;
            local addx = commas(a)&lt;br /&gt;
            if v:find(&#039;$n&#039;) then&lt;br /&gt;
                addx = addx.._noted&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(numstr,addx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Add a line break if there are too many elements&lt;br /&gt;
    -- To keep the tables thin&lt;br /&gt;
    if #numstr &amp;gt; 11 then&lt;br /&gt;
        local mid = math.floor(#numstr/2)&lt;br /&gt;
        numstr[mid] = &#039;&amp;lt;br/&amp;gt;&#039;..numstr[mid]&lt;br /&gt;
    end&lt;br /&gt;
    -- To prevent any possible confusion with formatted numbers&lt;br /&gt;
    -- elements should be separated with semicolons followed by a space&lt;br /&gt;
    numstr = table.concat(numstr,&#039;; &#039;)&lt;br /&gt;
    -- If no numbers are found in the string, return unknown&lt;br /&gt;
    if not numstr:find(&#039;%d&#039;) then&lt;br /&gt;
        return &#039;Unknown&#039;, price&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return numstr, high, low&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_total(value,qhigh,qlow)&lt;br /&gt;
    -- if no alch value is given, return unknown&lt;br /&gt;
    if not value or string.lower(value) == &#039;unknown&#039; then&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
    -- if value is negative (from smw/ge) it cannot be alched&lt;br /&gt;
    if tonumber(value) and tonumber(value) &amp;lt; 0 then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
    -- if no numbers return not alchemisable&lt;br /&gt;
    if not tonumber(value) and not value:find(&#039;%d&#039;) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- en dashes are the proper dash for number ranges&lt;br /&gt;
    -- replace all hyphens and em dashes with en&lt;br /&gt;
    -- strip *all* whitespace&lt;br /&gt;
    value = mw.ustring.gsub(value,&#039;[-—]&#039;,&#039;–&#039;)&lt;br /&gt;
        :gsub(&#039;%s&#039;,&#039;&#039;)&lt;br /&gt;
    -- split list into table&lt;br /&gt;
    local vals = mw.text.split(value,&#039;[,;]&#039;)&lt;br /&gt;
    -- All value ranges will be a range&lt;br /&gt;
    -- e.g. if items valued at 100 coins are dropped in quantities of 1, 3, 5&lt;br /&gt;
    -- the value returned will be 100–500 rather than 100; 300; 500&lt;br /&gt;
    -- If low and high vars are the same in the end, only 1 value is displayed&lt;br /&gt;
    local low = 2147483648&lt;br /&gt;
    local high = 0&lt;br /&gt;
    -- recreate the alchval string to ensure consistent formatting&lt;br /&gt;
    for i, v in ipairs(vals) do&lt;br /&gt;
        local clean = v:gsub(&#039;$n&#039;,&#039;&#039;)&lt;br /&gt;
        -- if list element contains an en dash (indicating range)&lt;br /&gt;
        -- Find the smaller/larger number (just in case)&lt;br /&gt;
        -- Compare them to the current min/max&lt;br /&gt;
        -- put them in order with desired format&lt;br /&gt;
        if mw.ustring.find(v,&#039;–&#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&#039;–&#039;)&lt;br /&gt;
            -- assume a is smaller, b is larger&lt;br /&gt;
            local a = tonumber(splitvals[1])&lt;br /&gt;
            local b = tonumber(splitvals[2])&lt;br /&gt;
            -- Just in case&lt;br /&gt;
            if a &amp;gt; b then&lt;br /&gt;
                a,b = b,a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if b &amp;gt; high then&lt;br /&gt;
                high = b&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local a = tonumber(clean)&lt;br /&gt;
            if a &amp;lt; low then&lt;br /&gt;
                low = a&lt;br /&gt;
            end&lt;br /&gt;
            if a &amp;gt; high then &lt;br /&gt;
                high = a&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local valret, sort, avg&lt;br /&gt;
    if not qhigh or not qlow then&lt;br /&gt;
        sort = high&lt;br /&gt;
        avg = high&lt;br /&gt;
        valret = commas(high)&lt;br /&gt;
    else&lt;br /&gt;
        local lower = qlow * low&lt;br /&gt;
        local higher = qhigh * high&lt;br /&gt;
        if higher == lower then&lt;br /&gt;
            valret = commas(higher)&lt;br /&gt;
            avg = higher&lt;br /&gt;
        else&lt;br /&gt;
            valret = commas(lower)..&#039;–&#039;..commas(higher)&lt;br /&gt;
            avg = (lower+higher)/2&lt;br /&gt;
        end&lt;br /&gt;
        sort = higher&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return valret, sort, avg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- adding categories to mainspace&lt;br /&gt;
function categories(...)&lt;br /&gt;
    local name,quantity,rarity = unpack(...)&lt;br /&gt;
    local ret = &#039;&#039;&lt;br /&gt;
    name = name:lower()&lt;br /&gt;
    quantity = quantity:lower()&lt;br /&gt;
    if name:find(&#039;clue scroll&#039;) then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if rarity == nil or rarity == &#039;&#039; or rarity:lower() == &#039;unknown&#039; then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    if quantity:find(&#039;Unknown&#039;) then&lt;br /&gt;
        ret = ret .. &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>