Module:Monster Drops

From Idlescape Wiki
Jump to navigation Jump to search

local p = {}
local findId = require("Module:FindId")
local img = require("Module:img")
local itemsData = mw.loadData("Module:Items/data")
local monstersDropsData = mw.loadData("Module:Monsters drops/data")
local monstersData = mw.loadData("Module:Monsters/data")
local pageName = mw.title.getCurrentTitle().fullText

local function round(num)
    return tostring(math.floor(num * 1000 + 0.5) / 1000)
end

local function addSeparator(num)
    return tostring(tonumber(num)):reverse():gsub("(%d%d%d)", "%1,"):gsub(",(%-?)$", "%1"):reverse()
end

---decides the collase state based on the given string
---@param collapse string
---@return string
local function decideCollapseState(collapse)
    if collapse == "collapsible" then
        collapse = " mw-made-collapsible mw-collapsible"
    elseif collapse == "collapsed" then
        collapse = " mw-made-collapsible mw-collapsible mw-collapsed"
    else
        collapse = ""
    end
    return collapse
end

local function pairsByKeys(t, f)
    local a = {}
    local orgi_key_type
    local orgi_key_numbered
    for n in pairs(t) do
        if tonumber(n) == nil then
            table.insert(a, n)
            orgi_key_type = "word"
        elseif type(n) == "number" then
            table.insert(a, n)
            orgi_key_type = "int"
        elseif type(n) == "string" and type(tonumber(n) == "number") then
            orgi_key_type = "number"
            table.insert(a, tonumber(n))
        end
    end
    table.sort(a, f)
    local key
    local value
    local i = 0             -- iterator variable
    local iter = function() -- iterator function
        i = i + 1
        if a[i] == nil then
            return nil
        elseif orgi_key_type == "word" or orgi_key_type == "int" then
            key = a[i]
            value = t[a[i]]
        elseif orgi_key_type == "number" then
            key = tostring(a[i])
            value = t[tostring(a[i])]
        end
        return key, value
    end
    return iter
end

---fetches an item object from items/data module
---@param itemId integer|string or string
---@return table|string
local function getItem(itemId)
    local item = itemsData[tostring(itemId)]
    if item then
        return item
    else
        return "Module:Items/data out of date"
    end
end

local function createImgCell(item)
    local imgCell = mw.html.create('td')
        :wikitext(img._img({ item.name, '30' }))
        :done()
    return imgCell
end

local function createNameCell(item)
    local nameCell = mw.html.create('td')
        :wikitext("[[" .. item.name .. "]]")
        :done()
    return nameCell
end

local function createQuantityCell(drop)
    local s = ""
    if drop.minAmount == drop.maxAmount then
        s = drop.minAmount
    else
        s = drop.minAmount .. "-" .. drop.maxAmount
    end
    local QuantityCell = mw.html.create('td'):css('text-align', 'center')
        :wikitext(s)
        :done()
    return QuantityCell
end

local function createRarityCell(drop)
    local RarityCell = mw.html.create('td'):css('text-align', 'center')
        :wikitext(round(drop.chance * 100) .. "%")
        :done()
    return RarityCell
end

local function createPriceCell(item)
    local PriceCell = mw.html.create('td'):css('text-align', 'center')
        :wikitext(addSeparator(item.value or 1) .. " ")
            :tag('img')
                :attr('src', "https://www.play.idlescape.com/images/gold_coin.png")
                :attr('width', '15')
                :attr('height', '15')
                :attr('alt', "Gold Coin")
            :done()
        :done()
    return PriceCell
end

local function genTable(name, collapse)

    local mId = findId._findId({name, 'monster'})
    local t = mw.html.create('table')
        :addClass("wikitable sortable jquery-tablesorter" .. collapse)
        :tag('tr')
        :tag('th')
        :attr("colspan", "2")
        :wikitext("Item")
        :done()
        :tag('th')
        :wikitext("Quantity")
        :done()
        :tag('th')
        :wikitext("Rarity")
        :done()
        :tag('th')
        :wikitext("Vendor Price")
        :done()
        :done()
    for _, drop in ipairs(monstersDropsData[tostring(mId)]) do
        local item = getItem(drop.id)
        t:tag('tr')
            :node(createImgCell(item))
            :node(createNameCell(item))
            :node(createQuantityCell(drop))
            :node(createRarityCell(drop))
            :node(createPriceCell(item))
            :done()
    end
    return t
end

function p.monsterDrops(frame)
    return p._monsterDrops(frame:getParent().args)
end

function p._monsterDrops(_args)
    local name = ""
    if _args[1] then
        name = _args[1]
    else
        name = pageName
    end
    local t = genTable(name, decideCollapseState(_args["collapse"]))
    return t
end

return p