Module:Equipment

From Roat Pkz
Revision as of 11:19, 6 May 2024 by Hefner (talk | contribs)
Jump to navigation Jump to search

Documentation for this module may be created at Module:Equipment/doc

-- <pre>Sandbox for testing stuff. Infoked by [[User:Joeytje50/Module]]
-- Current module being tested: Module:Equipment

local p = {}

local hasc = require('Module:Paramtest').has_content
local itemstats = require('Module:FetchItemStats')
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local GEPrice = require('Module:Exchange')._price

-- Parse item string and check if GIF icons are allowed
local function parseItem(ret, itemString, equipSlot, stats, quantity, clickableArg)
    local itemString = itemString
    local allowGif = false -- Set default to not allow GIF icons
    local itemName = ""
    local clickable = clickableArg -- Default clickable state

    -- Look for a ;g at the end of the string and separate them
    if hasc(itemString) then
        allowGif = itemString:sub(-2) == ";g"
        if allowGif then
            itemName = itemString:sub(0, -3)
        else
            itemName = itemString or ""
        end
    end

    -- Adjust clickable based on input arguments
    if clickableArg == nil then
        -- If no specific clickable argument is provided, default to false
        clickable = false
    elseif clickableArg == "yes" then
        -- If the argument is explicitly "yes", make the item clickable
        clickable = true
    end

    return ret, itemName, allowGif, equipSlot, stats, quantity, clickable
end

-- Formats a <div> element for items
local function makeDiv(ret, itemName, allowGif, equipSlot, stats, quantity, clickable)
    local itemName = itemName
    local allowGif = allowGif
    local topDivClass = "equipment-" .. equipSlot

    local names = mw.text.split(itemName, ";")
    if #names <= 1 or names[2] == 'g' then
        names[2] = itemstats.defaultVersion(names[1]) or names[1]
    end

    local imgType = allowGif == true and "gif" or "png"

    local equipSlotText = ""
    
    -- Check if the item name is not empty
    if itemName ~= '' then
        if clickable then
            -- Construct a clickable link to the article about the item using the plinkp2 template
            equipSlotText = string.format("{{plinkp2|pic=%s|%s}}", names[1], names[2])
        else
            -- Construct a plain image without a link using the plinkp template
            equipSlotText = string.format("{{plinkp|pic=%s|%s}}", names[1], names[2])
        end
    end

    -- Create the divs
    local topDiv = ret
        :tag("div")
        :addClass(topDivClass)

    local nestedDiv = topDiv
        :tag("div")
        :addClass("equipment-plinkp")
        :wikitext(equipSlotText)

    if quantity then
        local amt, quantclass = formatAmount(quantity)
        nestedDiv:tag('span')
            :addClass('inv-quantity-text')
            :addClass(quantclass)
            :wikitext(amt)
    end

    if stats and itemName ~= '' then
        -- Add stat-related code here if needed
    end

    if itemName ~= '' then
        topDiv:addClass("equipment-blank")
    end
end

function p.main(frame)
    local args = frame:getParent().args
    local buttons = yesno(args.buttons, false)
    local stats = yesno(args.stats, false)

    local align
    if args.align == "right" then
        align = "equipment-right"
    elseif args.align == "center" then
        align = "equipment-center"
    else
        align = "equipment-left"
    end
    -- general 'equipment' class for the whole thing
    align = "equipment " .. align

    local tbl = mw.html.create("table"):addClass(align):tag("tr")
    local ret = tbl:tag("td"):tag("div")
    if stats then
        stats = {
            astab = 0,
            aslash = 0,
            acrush = 0,
            amagic = 0,
            arange = 0,
            dstab = 0,
            dslash = 0,
            dcrush = 0,
            dmagic = 0,
            drange = 0,
            str = 0,
            rstr = 0,
            mdmg = 0,
            prayer = 0,
            weight = 0,
            ikods = {},
        }
    end

    if buttons then
        ret:addClass("equipment-div-buttons")
    else
        ret:addClass("equipment-div")
    end

    -- Fetch equipment and create divs
    makeDiv(parseItem(ret, args.head, "head", stats, nil, args.headClickable), args.headClickable == "yes")
    makeDiv(parseItem(ret, args.cape, "cape", stats, nil, args.capeClickable), args.capeClickable == "yes")
    makeDiv(parseItem(ret, args.neck, "neck", stats, nil, args.neckClickable), args.neckClickable == "yes")
    makeDiv(parseItem(ret, args.ammo, "ammo", stats, args.ammoquantity, args.ammoClickable), args.ammoClickable == "yes")
    makeDiv(parseItem(ret, args.weapon, "weapon", stats, args.weaponquantity, args.weaponClickable), args.weaponClickable == "yes")
    makeDiv(parseItem(ret, args.torso, "torso", stats, nil, args.torsoClickable), args.torsoClickable == "yes")
    makeDiv(parseItem(ret, args.shield, "shield", stats, nil, args.shieldClickable), args.shieldClickable == "yes")
    makeDiv(parseItem(ret, args.legs, "legs", stats, nil, args.legsClickable), args.legsClickable == "yes")
    makeDiv(parseItem(ret, args.gloves, "gloves", stats, nil, args.glovesClickable), args.glovesClickable == "yes")
    makeDiv(parseItem(ret, args.hands, "gloves", stats, nil, args.handsClickable), args.handsClickable == "yes")
    makeDiv(parseItem(ret, args.boots, "boots", stats, nil, args.bootsClickable), args.bootsClickable == "yes")
    makeDiv(parseItem(ret, args.ring, "ring", stats, nil, args.ringClickable), args.ringClickable == "yes")
    
    if stats then
        -- Add stat-related code here if needed
    end

    return tbl:done()
end

return p