<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADropsLineReward</id>
	<title>Module:DropsLineReward - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADropsLineReward"/>
	<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:DropsLineReward&amp;action=history"/>
	<updated>2026-04-25T13:28:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:DropsLineReward&amp;diff=6106&amp;oldid=prev</id>
		<title>Hefner: Created page with &quot;-- &lt;nowiki&gt; local p = {}  local params = require(&#039;Module:Paramtest&#039;) local lang = mw.language.getContentLanguage() local coins_image = require(&#039;Module:Coins image&#039;) local curr_image = require(&#039;Module:Currency Image&#039;) local exchange = require(&#039;Module:Exchange&#039;)  local yesno = require(&#039;Module:Yesno&#039;)  local var = mw.ext.VariablesLua  -- precalculated cached data local droppeditem_data = mw.loadJsonData(&#039;Module:DropsLine/itemData.json&#039;) local geprices_data = mw.loadJsonData...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:DropsLineReward&amp;diff=6106&amp;oldid=prev"/>
		<updated>2024-04-01T14:20:26Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local p = {}  local params = require(&amp;#039;Module:Paramtest&amp;#039;) local lang = mw.language.getContentLanguage() local coins_image = require(&amp;#039;Module:Coins image&amp;#039;) local curr_image = require(&amp;#039;Module:Currency Image&amp;#039;) local exchange = require(&amp;#039;Module:Exchange&amp;#039;)  local yesno = require(&amp;#039;Module:Yesno&amp;#039;)  local var = mw.ext.VariablesLua  -- precalculated cached data local droppeditem_data = mw.loadJsonData(&amp;#039;Module:DropsLine/itemData.json&amp;#039;) local geprices_data = mw.loadJsonData...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local params = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
local coins_image = require(&amp;#039;Module:Coins image&amp;#039;)&lt;br /&gt;
local curr_image = require(&amp;#039;Module:Currency Image&amp;#039;)&lt;br /&gt;
local exchange = require(&amp;#039;Module:Exchange&amp;#039;) &lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#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(&amp;#039;Module:DropsLine/itemData.json&amp;#039;)&lt;br /&gt;
local geprices_data = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;)&lt;br /&gt;
local highalch_data = mw.loadJsonData(&amp;#039;Module:GEHighAlchs/data.json&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local geprice = exchange._price&lt;br /&gt;
local f_gealch = exchange._highalch&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 = &amp;#039;&amp;amp;nbsp;&amp;lt;span class=&amp;quot;dropsline-noted&amp;quot;&amp;gt;(noted)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local coins_priceString = &amp;quot;%s coin%s&amp;quot;&lt;br /&gt;
local other_priceString = &amp;quot;%s coin%s&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local smwData = nil&lt;br /&gt;
function getSMWInfo(item)&lt;br /&gt;
    mw.log(&amp;quot;smw&amp;quot;, item)&lt;br /&gt;
    if smwData ~= nil then&lt;br /&gt;
        return smwData&lt;br /&gt;
    end&lt;br /&gt;
    local smw = mw.smw.ask({&lt;br /&gt;
        &amp;#039;[[&amp;#039;..item..&amp;#039;]]&amp;#039;,&lt;br /&gt;
        &amp;#039;?High Alchemy value&amp;#039;&lt;br /&gt;
    })&lt;br /&gt;
    if smw and smw[1] then&lt;br /&gt;
        smwData = {&lt;br /&gt;
            alch = smw[1][&amp;#039;High Alchemy value&amp;#039;]&lt;br /&gt;
        }&lt;br /&gt;
    else&lt;br /&gt;
        smwData = false&lt;br /&gt;
    end&lt;br /&gt;
    return smwData&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--bg, txt, sort; acceptable non-quantity rarity names&lt;br /&gt;
local rarities = {&lt;br /&gt;
    always = { &amp;#039;table-bg-blue&amp;#039;, 1 },&lt;br /&gt;
    common = { &amp;#039;table-bg-green&amp;#039;, 16 },&lt;br /&gt;
    uncommon = { &amp;#039;table-bg-yellow&amp;#039;, 64 },&lt;br /&gt;
    rare = { &amp;#039;table-bg-orange&amp;#039;, 128 },&lt;br /&gt;
    [&amp;#039;very rare&amp;#039;] = { &amp;#039;table-bg-red&amp;#039;, 1024 },&lt;br /&gt;
    random = { &amp;#039;table-bg-pink&amp;#039;, 4096 },&lt;br /&gt;
    varies = { &amp;#039;table-bg-pink&amp;#039;, 4096 },&lt;br /&gt;
    once = { &amp;#039;table-bg-pink&amp;#039;, 65536 },&lt;br /&gt;
    conditional = { &amp;#039;table-bg-pink&amp;#039;, 65536 },&lt;br /&gt;
    _default = { &amp;#039;table-bg-grey&amp;#039;, 65536 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- colour-code&lt;br /&gt;
local rarities_class = {&lt;br /&gt;
    { 1, &amp;#039;table-bg-blue&amp;#039; },&lt;br /&gt;
    { 1/25, &amp;#039;table-bg-green&amp;#039; },&lt;br /&gt;
    { 1/99.99, &amp;#039;table-bg-yellow&amp;#039; },&lt;br /&gt;
    { 1/999.99, &amp;#039;table-bg-orange&amp;#039; },&lt;br /&gt;
    { 1/9999999, &amp;#039;table-bg-red&amp;#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;
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 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,&amp;#039;Item&amp;#039;},&lt;br /&gt;
                    {args.namenotes or args.Namenotes,&amp;#039;&amp;#039;},&lt;br /&gt;
                    {args.quantity or args.Quantity,&amp;#039;Unknown&amp;#039;},&lt;br /&gt;
                    {args.quantitynotes or args.Quantitynotes,&amp;#039;&amp;#039;},&lt;br /&gt;
                    {args.rarity or args.Rarity,&amp;#039;Unknown&amp;#039;},&lt;br /&gt;
                    {args.altrarity or args.AltRarity,&amp;#039;&amp;#039;},&lt;br /&gt;
                    {args.altraritydash or args.AltRarityDash,&amp;#039;&amp;#039;},&lt;br /&gt;
                    {args.raritynotes or args.Raritynotes,&amp;#039;&amp;#039;},&lt;br /&gt;
                    {args.citation,&amp;#039;&amp;#039;},&lt;br /&gt;
                    {args.version or args.Version,&amp;#039;&amp;#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 = &amp;#039;&amp;#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &amp;#039; × &amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local approx = yesno(args.approx or args.Approx or &amp;#039;no&amp;#039;, false)&lt;br /&gt;
    local isCoins = name:lower() == &amp;#039;coins&amp;#039;&lt;br /&gt;
    local isNothing = name:lower() == &amp;#039;nothing&amp;#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 = &amp;#039;&amp;#039;&lt;br /&gt;
    if _smwname:match(&amp;#039; ?%(%d%)$&amp;#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(gemwname, &amp;#039;^(.-) ?(%(%d%))$&amp;#039;)&lt;br /&gt;
    elseif _smwname:match(&amp;#039; ?%(p%+*%)$&amp;#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &amp;#039;^(.-) ?(%(p%+*%))$&amp;#039;)&lt;br /&gt;
    elseif _smwname:match(&amp;#039;%#&amp;#039;) then&lt;br /&gt;
        cleanedName, dropVers = mw.ustring.match(_smwname, &amp;#039;^(.-)%#([%w%s%(%)]+)$&amp;#039;)&lt;br /&gt;
    else&lt;br /&gt;
        cleanedName = mw.ustring.gsub(_smwname, &amp;#039; %(%d%)$&amp;#039;, &amp;#039;&amp;#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 ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        -- get subobject instead&lt;br /&gt;
        smwname = cleanedName..&amp;#039;#&amp;#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() ~= &amp;#039;no&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if params.has_content(frameArgs.smw) then&lt;br /&gt;
        useSmw = frameArgs.smw:lower() ~= &amp;#039;no&amp;#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(&amp;#039;,&amp;#039;,&amp;#039;&amp;#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(rarity_value, &amp;#039;([%d%.]+)/([%d%.]+)&amp;#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            rarity = commas(rv1) .. &amp;#039;/&amp;#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(&amp;#039;,&amp;#039;,&amp;#039;&amp;#039;) --temp place to put this without overriding rarity&lt;br /&gt;
        local rv1, rv2 = string.match(alt_rarity_value, &amp;#039;([%d%.]+)/([%d%.]+)&amp;#039;)&lt;br /&gt;
        if rv1 and rv2 then&lt;br /&gt;
            alt_rarity = commas(rv1) .. &amp;#039;/&amp;#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 &amp;#039;yes&amp;#039;, false)&lt;br /&gt;
    local alch = yesno(args.alch or &amp;#039;yes&amp;#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) == &amp;#039;table&amp;#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) == &amp;#039;boolean&amp;#039; then&lt;br /&gt;
            elseif type(cached_dropdata) == &amp;#039;number&amp;#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) == &amp;#039;number&amp;#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) == &amp;#039;number&amp;#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;
                local smwret = getSMWInfo(smwname)&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 &amp;#039;File:&amp;lt;name&amp;gt;.png&amp;#039; if no image param&lt;br /&gt;
    -- Use &amp;#039;File:&amp;lt;image&amp;gt;&amp;#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 .. &amp;#039;.png&amp;#039;)&lt;br /&gt;
        image_n = mw.ustring.gsub(image_n, &amp;#039;#.+$&amp;#039;, &amp;#039;.png&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if image_n:lower() == &amp;#039;no&amp;#039; or params.is_empty(args.name or args.Name) then&lt;br /&gt;
        image = &amp;#039;&amp;#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        image = &amp;#039;[[File:Bank filler.png|link=Nothing|alt=This does not exist.]]&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        image = mw.ustring.format(&amp;#039;[[File:%s|link=%s|alt=%s: %s drops %s with rarity %s%s in quantity %s]]&amp;#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 &amp;#039;&amp;#039;) == &amp;#039;yes&amp;#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;
    -- categories for mainspace&lt;br /&gt;
    local cats = &amp;#039;&amp;#039;&lt;br /&gt;
    local onMain = ns == &amp;#039;&amp;#039; or ns == &amp;#039;RuneScape&amp;#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;
-- 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 &amp;#039;Not sold&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if valueInfo.alch.has then&lt;br /&gt;
        alchtotal, vasort, alchtotalavg = get_total(valueInfo.alch.value,_h,_l)&lt;br /&gt;
        alchtotal = alchtotal or &amp;#039;N/A&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- value sorts&lt;br /&gt;
    if type(vsort) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
        vsort = 0&lt;br /&gt;
    end&lt;br /&gt;
    if type(vasort) ~= &amp;#039;number&amp;#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 = &amp;#039;&amp;#039;&lt;br /&gt;
    if rolls then&lt;br /&gt;
        rollstext = rolls .. &amp;#039; × &amp;#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 = &amp;#039;&amp;#039;&lt;br /&gt;
    if approx then&lt;br /&gt;
        tilde = &amp;#039;~&amp;#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 = &amp;#039;DEFAULT&amp;#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 &amp;#039;table-na&amp;#039; or nil&lt;br /&gt;
    -- Table row creation&lt;br /&gt;
    local ret = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
            -- row-wide things&lt;br /&gt;
            :css(&amp;#039;text-align&amp;#039;,&amp;#039;center&amp;#039;)&lt;br /&gt;
            -- inventory image&lt;br /&gt;
            :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
                :addClass(&amp;#039;inventory-image&amp;#039;)&lt;br /&gt;
                :wikitext(image)&lt;br /&gt;
            :done()&lt;br /&gt;
            -- item name&lt;br /&gt;
            :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
                :css(&amp;#039;text-align&amp;#039;,&amp;#039;left&amp;#039;)&lt;br /&gt;
                :addClass(&amp;#039;item-col&amp;#039;)&lt;br /&gt;
                :wikitext(string.format(&amp;#039;[[%s|%s]]%s&amp;#039;,name,altname,#namenotes &amp;gt; 3 and namenotes or &amp;#039;&amp;#039;))&lt;br /&gt;
            :done()&lt;br /&gt;
            -- quantity&lt;br /&gt;
            :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
                :addClass(quantityClassOverride)&lt;br /&gt;
                :attr(&amp;#039;data-sort-value&amp;#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(&amp;#039;td&amp;#039;)&lt;br /&gt;
    local rarity_span = rarity_cell:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
    rarity_span:wikitext(rollstext .. tilde .. rarity)&lt;br /&gt;
    rarity_cell:attr(&amp;#039;data-sort-value&amp;#039;,rare_sort)&lt;br /&gt;
                :addClass(rare_class)&lt;br /&gt;
    if type(rarity_value) == &amp;#039;number&amp;#039; then&lt;br /&gt;
        rarity_cell:attr(&amp;#039;title&amp;#039;, rollstext .. tilde .. string.format(&amp;#039;%.3g%%&amp;#039;, 100 * rarity_value))&lt;br /&gt;
        rarity_span:attr({&lt;br /&gt;
            [&amp;#039;data-drop-fraction&amp;#039;] = rollstext .. tilde .. rarity,&lt;br /&gt;
            [&amp;#039;data-drop-oneover&amp;#039;] = rollstext .. tilde .. &amp;#039;1/&amp;#039; .. commas(sigfig(1/rarity_value, 4)),&lt;br /&gt;
            [&amp;#039;data-drop-percent&amp;#039;] = rollstext .. tilde .. sigfig(100 * rarity_value, 3),&lt;br /&gt;
            [&amp;#039;data-drop-permil&amp;#039;] = rollstext .. tilde .. sigfig(1000 * rarity_value, 3),&lt;br /&gt;
            [&amp;#039;data-drop-permyriad&amp;#039;] = rollstext .. tilde .. sigfig(10000 * rarity_value, 3),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if alt_rarity ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        if alt_rarity_endash  ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            rarity_cell:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;–&amp;#039;)&lt;br /&gt;
        else&lt;br /&gt;
            rarity_cell:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;; &amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        local alt_rarity_span = rarity_cell:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
        alt_rarity_span:wikitext(alt_rarity)&lt;br /&gt;
        if type(alt_rarity_value) == &amp;#039;number&amp;#039; then&lt;br /&gt;
            alt_rarity_span:attr({&lt;br /&gt;
                [&amp;#039;data-drop-fraction&amp;#039;] = alt_rarity,&lt;br /&gt;
                [&amp;#039;data-drop-oneover&amp;#039;] = &amp;#039;1/&amp;#039; .. commas(sigfig(1/alt_rarity_value, 3)),&lt;br /&gt;
                [&amp;#039;data-drop-percent&amp;#039;] = sigfig(100 * alt_rarity_value, 3),&lt;br /&gt;
                [&amp;#039;data-drop-permil&amp;#039;] = sigfig(1000 * alt_rarity_value, 3),&lt;br /&gt;
                [&amp;#039;data-drop-permyriad&amp;#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(&amp;#039;td&amp;#039;)&lt;br /&gt;
    local alch_td = ret:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    -- common attributes&lt;br /&gt;
    ge_td   :attr(&amp;#039;data-sort-value&amp;#039;,vsort)&lt;br /&gt;
	    :addClass(&amp;#039;ge-column&amp;#039;)&lt;br /&gt;
	    :css({&lt;br /&gt;
	        [&amp;#039;text-align&amp;#039;] = &amp;#039;right&amp;#039;,&lt;br /&gt;
	        cursor = &amp;#039;help&amp;#039;&lt;br /&gt;
	    })&lt;br /&gt;
    alch_td :attr(&amp;#039;data-sort-value&amp;#039;,vsort)&lt;br /&gt;
            :addClass(&amp;#039;alch-column&amp;#039;)&lt;br /&gt;
            :css({&lt;br /&gt;
                [&amp;#039;text-align&amp;#039;] = &amp;#039;right&amp;#039;,&lt;br /&gt;
                cursor = &amp;#039;help&amp;#039;&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 = &amp;#039;N/A&amp;#039;&lt;br /&gt;
        ge_td_title = &amp;#039;This does not exist.&amp;#039;&lt;br /&gt;
        ge_td:addClass(&amp;#039;table-na&amp;#039;):css(&amp;#039;text-decoration&amp;#039;, &amp;#039;underline dotted&amp;#039;)&lt;br /&gt;
        alch_td_content = &amp;#039;N/A&amp;#039;&lt;br /&gt;
        alch_td_title = &amp;#039;This does not exist.&amp;#039;&lt;br /&gt;
        alch_td:addClass(&amp;#039;table-na&amp;#039;):css(&amp;#039;text-decoration&amp;#039;, &amp;#039;underline dotted&amp;#039;)&lt;br /&gt;
    elseif isCoins then&lt;br /&gt;
        local coinsStr = lang:plural(vsort, &amp;#039;&amp;#039;, &amp;#039;s&amp;#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, &amp;#039;&amp;#039;, &amp;#039;s&amp;#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, &amp;#039;&amp;#039;, &amp;#039;s&amp;#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 = &amp;#039;Not sold&amp;#039;&lt;br /&gt;
            ge_td_title = &amp;#039;This item cannot be traded on the Grand Exchange.&amp;#039;&lt;br /&gt;
            ge_td:addClass(&amp;#039;table-na&amp;#039;):css(&amp;#039;text-decoration&amp;#039;, &amp;#039;underline dotted&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        if alch_td_content == nil then&lt;br /&gt;
            -- nothing else triggered&lt;br /&gt;
            alch_td_content = &amp;#039;N/A&amp;#039;&lt;br /&gt;
            alch_td_title = &amp;#039;This item cannot be alchemised.&amp;#039;&lt;br /&gt;
            alch_td:addClass(&amp;#039;table-na&amp;#039;):css(&amp;#039;text-decoration&amp;#039;, &amp;#039;underline dotted&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    ge_td:wikitext(ge_td_content):attr(&amp;#039;title&amp;#039;, ge_td_title)&lt;br /&gt;
    alch_td:wikitext(alch_td_content):attr(&amp;#039;title&amp;#039;, alch_td_title)&lt;br /&gt;
&lt;br /&gt;
    -- SMW&lt;br /&gt;
    local onMain = ns == &amp;#039;&amp;#039; or ns == &amp;#039;RuneScape&amp;#039;&lt;br /&gt;
    local unrecognizedDropVersionCategory = &amp;#039;&amp;#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;
        --add function to reduce image to File:Some name.png&lt;br /&gt;
        local smwImage = mw.text.encode(image)&lt;br /&gt;
        local smwNameNote = mw.text.killMarkers(namenotes)&lt;br /&gt;
        local smwQuantity = mw.text.killMarkers(quantity)&lt;br /&gt;
        smwQuantity = smwQuantity:gsub(&amp;#039;&amp;lt;span class=&amp;quot;dropsline%-noted&amp;quot;&amp;gt;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
        smwQuantity = smwQuantity:gsub(&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
        smwQuantity = smwQuantity:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
        smwQuantity = smwQuantity:gsub(&amp;#039;&amp;amp;nbsp;&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
        smwQuantity = smwQuantity:gsub(&amp;#039;;&amp;#039;, &amp;#039;,&amp;#039;)&lt;br /&gt;
        local smwRarityNote = mw.text.killMarkers(raritynotes)&lt;br /&gt;
        local smwRolls = rolls or 1&lt;br /&gt;
        local subcount = 1&lt;br /&gt;
        if var.varexists( &amp;#039;dropcount&amp;#039; ) then&lt;br /&gt;
            subcount =    var.var( &amp;#039;dropcount&amp;#039;, 1 )&lt;br /&gt;
            subcount = subcount + 1&lt;br /&gt;
            var.vardefine( &amp;#039;dropcount&amp;#039;, subcount)&lt;br /&gt;
        else&lt;br /&gt;
            var.vardefine( &amp;#039;dropcount&amp;#039;, 1)&lt;br /&gt;
        end&lt;br /&gt;
        local subname = &amp;#039;DROP_&amp;#039;..subcount..&amp;#039;_&amp;#039;..smwname..&amp;#039;_&amp;#039;..smwQuantity..&amp;#039;_&amp;#039;..rarity&lt;br /&gt;
        subname = string.gsub(subname,&amp;#039;#&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
        dropFrom = pgTitle&lt;br /&gt;
        if versionKey ~= &amp;#039;DEFAULT&amp;#039; then&lt;br /&gt;
            dropFrom = pgTitle .. &amp;#039;#&amp;#039; .. versionKey&lt;br /&gt;
        end&lt;br /&gt;
        local droppedItemName = &amp;#039;Dropped item&amp;#039;&lt;br /&gt;
        if rdt == true then&lt;br /&gt;
            droppedItemName = &amp;#039;Dropped item from RDT&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        local dropType = frameArgs.dtype or &amp;#039;combat&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        local seenLevels = {}&lt;br /&gt;
        for dropVersion in string.gmatch(versionKey, &amp;#039; *([^,]+) *&amp;#039;) do&lt;br /&gt;
            local dropLevelVar = string.format(&amp;quot;DropLevel_%s_%s&amp;quot;, dropType, dropVersion)&lt;br /&gt;
            if not var.varexists(dropLevelVar) and versionKey ~= &amp;#039;DEFAULT&amp;#039; and dropType ~= &amp;#039;reward&amp;#039; then&lt;br /&gt;
                unrecognizedDropVersionCategory = unrecognizedDropVersionCategory..&amp;#039;[[Category:Uses unrecognized drop version]]&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
            local curDropLevelValues = var.var(dropLevelVar)&lt;br /&gt;
            for curDropLevel in string.gmatch(curDropLevelValues, &amp;#039; *([^,]+) *&amp;#039;) do&lt;br /&gt;
                seenLevels[curDropLevel] = true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        local orderedLevels = {}&lt;br /&gt;
        for level, _ in pairs(seenLevels) do&lt;br /&gt;
            local n = tonumber(level)&lt;br /&gt;
            if n ~= nil then&lt;br /&gt;
                table.insert(orderedLevels, n)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        table.sort(orderedLevels)&lt;br /&gt;
        local dropLevel = table.concat(orderedLevels, &amp;#039;,&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
        local smw_json = {&lt;br /&gt;
            [&amp;#039;Dropped item&amp;#039;]=smwname,&lt;br /&gt;
            [&amp;#039;Name Notes&amp;#039;]=smwNameNote,&lt;br /&gt;
            [&amp;#039;Drop Quantity&amp;#039;]=smwQuantity,&lt;br /&gt;
            [&amp;#039;Quantity High&amp;#039;]=_h,&lt;br /&gt;
            [&amp;#039;Quantity Low&amp;#039;]=_l,&lt;br /&gt;
            Rarity=rarity,&lt;br /&gt;
            [&amp;#039;Alt Rarity&amp;#039;]=alt_rarity,&lt;br /&gt;
            [&amp;#039;Alt Rarity Dash&amp;#039;] = alt_rarity_endash,&lt;br /&gt;
            [&amp;#039;Rarity Notes&amp;#039;]=smwRarityNote,&lt;br /&gt;
            [&amp;#039;Rolls&amp;#039;]=smwRolls,&lt;br /&gt;
            [&amp;#039;Drop Value&amp;#039;] = valueInfo.alch.value or 0,&lt;br /&gt;
            [&amp;#039;Dropped from&amp;#039;] = dropFrom,&lt;br /&gt;
            [&amp;#039;Drop level&amp;#039;] = dropLevel,&lt;br /&gt;
            [&amp;#039;Drop type&amp;#039;] = dropType&lt;br /&gt;
        }&lt;br /&gt;
        local smw_sub = {&lt;br /&gt;
            [droppedItemName] = smwname,&lt;br /&gt;
            [&amp;#039;Dropped from&amp;#039;] = dropFrom,&lt;br /&gt;
            [&amp;quot;Drop JSON&amp;quot;] = mw.text.jsonEncode(smw_json)&lt;br /&gt;
        }&lt;br /&gt;
        mw.smw.subobject(smw_sub, subname)&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) == &amp;#039;varies&amp;#039; then&lt;br /&gt;
        return &amp;#039;Varies&amp;#039;&lt;br /&gt;
    elseif isNothing then&lt;br /&gt;
        return &amp;#039;N/A&amp;#039;&lt;br /&gt;
    elseif not quantity or string.lower(quantity) == &amp;#039;unknown&amp;#039; then&lt;br /&gt;
        return &amp;#039;Unknown&amp;#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 &amp;#039;(noted)&amp;#039; to &amp;#039;$n&amp;#039; for parsing&lt;br /&gt;
    quantity = mw.ustring.gsub(quantity,&amp;#039;[-—]&amp;#039;,&amp;#039;–&amp;#039;)&lt;br /&gt;
        :gsub(&amp;#039;%s&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
        :gsub(&amp;#039;%(noted%)&amp;#039;,&amp;#039;$n&amp;#039;)&lt;br /&gt;
    -- split list into table&lt;br /&gt;
    local vals = mw.text.split(quantity,&amp;#039;[,;]&amp;#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(&amp;#039;$n&amp;#039;,&amp;#039;&amp;#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,&amp;#039;–&amp;#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&amp;#039;–&amp;#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)..&amp;#039;–&amp;#039;..commas(b)&lt;br /&gt;
            if v:find(&amp;#039;$n&amp;#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(&amp;#039;$n&amp;#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] = &amp;#039;&amp;lt;br/&amp;gt;&amp;#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,&amp;#039;; &amp;#039;)&lt;br /&gt;
    -- If no numbers are found in the string, return unknown&lt;br /&gt;
    if not numstr:find(&amp;#039;%d&amp;#039;) then&lt;br /&gt;
        return &amp;#039;Unknown&amp;#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) == &amp;#039;unknown&amp;#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(&amp;#039;%d&amp;#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,&amp;#039;[-—]&amp;#039;,&amp;#039;–&amp;#039;)&lt;br /&gt;
        :gsub(&amp;#039;%s&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
    -- split list into table&lt;br /&gt;
    local vals = mw.text.split(value,&amp;#039;[,;]&amp;#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(&amp;#039;$n&amp;#039;,&amp;#039;&amp;#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,&amp;#039;–&amp;#039;) then&lt;br /&gt;
            local splitvals = mw.text.split(clean,&amp;#039;–&amp;#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)..&amp;#039;–&amp;#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 = &amp;#039;&amp;#039;&lt;br /&gt;
    name = name:lower()&lt;br /&gt;
    quantity = quantity:lower()&lt;br /&gt;
    if name:find(&amp;#039;clue scroll&amp;#039;) then&lt;br /&gt;
        ret = ret .. &amp;#039;[[Category:Monsters that drop clues]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if rarity == nil or rarity == &amp;#039;&amp;#039; or rarity:lower() == &amp;#039;unknown&amp;#039; then&lt;br /&gt;
        ret = ret .. &amp;#039;[[Category:Needs drop rarity added]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if quantity:find(&amp;#039;Unknown&amp;#039;) then&lt;br /&gt;
        ret = ret .. &amp;#039;[[Category:Needs drop quantity added]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hefner</name></author>
	</entry>
</feed>