Module:Activity Details

From the RuneScape Wiki, the wiki for all things RuneScape
Jump to navigation Jump to search
Module documentation
This documentation is transcluded from Module:Activity Details/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:Activity Details/doc. [edit]
Module:Activity Details's function details is invoked by Template:Activity Details.
Function list
L 18 — skill_to_properties
L 27 — p.details
L 108 — subjectName
L 116 — iconParam
L 124 — iconDisp
L 152 — yearParam
L 167 — startDisp
L 175 — membersDisp
L 184 — difficultyParam
L 197 — lengthParam
L 210 — skillParam
L 223 — requirementDisp
L 273 — itemsDisp
L 292 — recommendedDisp
L 304 — nilToNone
L 312 — yesnoParam
L 326 — onQuickGuide
L 330 — addcategories

-- <nowiki>
-- {{Quest details}}
--
local p = {}

local onmain = require('Module:Mainonly').on_main
local yesno = require('Module:Yesno')
local infobox = require('Module:Infobox')
local skill_pics = require('Module:Skill clickpic')._main
local quest_req = require('Module:Questreq')._main
local has_quest_req = require('Module:Questreq').has_reqs
local arr = require('Module:Array')
local skill_list = require('Module:Skill list')

local pagename = mw.title.getCurrentTitle().fullText

-- Skill name, parameter name, Bucket field level
local function skill_to_properties(skill)
	local lowercase_skill = skill:gsub("^%u", string.lower)
	local require_skill = "require_" .. lowercase_skill
	local level = skill .. " level"
	return {lowercase_skill, require_skill, level, skill}
end

p.skills = arr.map(skill_list, skill_to_properties)

function p.details(frame)
    local _args = frame:getParent().args
    local ret = infobox.new(_args)

    ret:defineParams {
        { name = 'name', func = subjectName },
        { name = 'start', func = 'has_content' },
        { name = 'start_path', func = 'has_content' },
        { name = 'startDisp', func = { name = startDisp, params = { 'start', 'start_path' } } },
        { name = 'members', func = yesnoParam },
        { name = 'membersDisp', func = { name = membersDisp, params = { 'members' } } },
        { name = 'requirements', func = 'has_content' },
        { name = 'quest_requirement', func = yesnoParam },
        { name = 'quest_requirement_limit', func = 'numbers' },
        { name = 'quest_requirement_collapsed', func = yesnoParam },
        { name = 'items', func = itemsDisp },
        { name = 'kills', func = nilToNone },
        { name = 'recommended', func = recommendedDisp },
    }

    for _, skill in ipairs(p.skills) do
        local param_name = skill[2]
        -- Params
        ret:defineParams {
            { name = param_name, func = skillParam },
        }
    end

    ret:customButtonPlacement(true)
    ret:setAddRSWInfoboxClass(false)
    ret:create()
    ret:cleanParams()

    ret:addClass('questdetails plainlinks')
    ret:attr { cellspacing = '3' }

    local auto_width = { ["max-width"] = "85%", ["width"] = "auto" }
    ret:addRow {
        { tag = 'th', class = "questdetails-header", content = 'Start point' },
        { tag = 'argd', class = "questdetails-info", content = 'startDisp', css = auto_width },
        { tag = 'argd', class = "text-align-center", content = 'iconDisp', rowspan = 3,
            css = { ["vertical-align"] = "top" }
        }
    }

    ret:addRow {
        { tag = 'th', class = "questdetails-header", content = 'Member requirement' },
        { tag = 'argd', class = "questdetails-info", content = 'membersDisp', css = auto_width }
    }

    ret:addRow {
        { tag = 'th', class = "questdetails-header", content = 'Requirements' },
        { tag = 'td', class = "questdetails-info qc-active", content = requirementDisp(ret), colspan = 2 }
    }

    ret:addRow {
        { tag = 'th', class = "questdetails-header", content = 'Items required' },
        { tag = 'argd', class = "questdetails-info", content = 'items', colspan = 2 }
    }

    if ret:paramDefined('recommended') then
        ret:addRow {
            { tag = 'th', class = "questdetails-header", content = 'Recommended' },
            { tag = 'argd', class = "questdetails-info", content = 'recommended', colspan = 2 }
        }
    end

    ret:addRow {
        { tag = 'th', class = "questdetails-header", content = 'Enemies to defeat' },
        { tag = 'argd', class = "questdetails-info", content = 'kills', colspan = 2 }
    }

    ret:finish()
    if onmain() and not onQuickGuide() then
        local allargs = ret:param('all')
        local catargs = ret:categoryData()
        ret:wikitext(addcategories(allargs, catargs))
    end
    return ret:tostring()
end

function subjectName(arg)
    if infobox.isDefined(arg) then
        return arg
    end

	return pagename:gsub("/Quick guide", "")
end

function iconParam(icon)
    if infobox.isDefined(icon) then
        return icon
    else
        return nil
    end
end

function iconDisp(icon, year, year_nth)
    local node = mw.html.create('div')
        :addClass('floatright')

    if infobox.isDefined(icon) then
        node:wikitext('[[File:' .. icon .. '|50px]]')
    else
        node:tag('div')
            :css({ width = '50px', height = '50px' })
    end

    node
        :tag('br'):done()
        :tag('span')
        :wikitext(year)

    if infobox.isDefined(year_nth) then
        node:tag('sup')
            :css('display', 'none')
            :wikitext('#' .. year_nth)
            :done()
    end

    node:done()

    return tostring(node)
end

function yearParam(y)
    if not infobox.isDefined(y) then
        return nil
    end

    local yr = tonumber(y)
    -- Keep the lower bound check only
    -- if yr >= 2001 and yr <= tonumber(os.date("%Y")) + 1 then
    if yr >= 2001 then
        return yr
    else
        return nil
    end
end

function startDisp(start, startPath)
    if infobox.isDefined(startPath) then
        return '[[File:Quest map icon.png|17px|link=]] ' .. start .. " " .. startPath
    else
        return '[[File:Quest map icon.png|17px|link=]] ' .. start
    end
end

function membersDisp(members)
    if not infobox.isDefined(members) then
        return nil
    end

    return members == 'Yes' and '[[File:P2P icon.png|30px|link=]] Members only' or
        '[[File:F2P icon.png|30px|link=]] Free to play'
end

function difficultyParam(d)
    if not infobox.isDefined(d) then
        return nil
    end

    local diff = d:lower()
    if diff == "no" or diff == "none" or diff == "n/a" then
        return p.difficulties.none[3]
    end

    return p.difficulties[diff][3]
end

function lengthParam(length)
    if not infobox.isDefined(length) then
        return nil
    end

    local len = length:lower()
    if len == "no" or len == "none" or len == "n/a" then
        return p.lengths.none[2]
    end

    return p.lengths[len][2]
end

function skillParam(skill_level)
    if not infobox.isDefined(skill_level) then
        return nil
    end

    local level = tonumber(skill_level)
    if level >= 1 then
        return level
    else
        return nil
    end
end

function requirementDisp(ret)
    local name = ret:param('name')
    if not infobox.isDefined(name) then
        return nil
    end
    local quest_req_limit = ret:param('quest_requirement_limit')
    if not infobox.isDefined(quest_req_limit) then
        quest_req_limit = 3
    end
    local quest_req_collapsed = ret:param('quest_requirement_collapsed')
    if not infobox.isDefined(quest_req_collapsed) then
        quest_req_collapsed = false
    end

    local req = mw.html.create()

    local must_show_quest_req = ret:param('quest_requirement')
    if not infobox.isDefined(must_show_quest_req) then
        must_show_quest_req = nil
    end

    local extra = ret:param('requirements')
    if must_show_quest_req == 'Yes' or (must_show_quest_req ~= 'No' and string.find(extra, "questreq")) then
        req:node(quest_req(name, quest_req_limit, quest_req_collapsed)):newline()
    else -- Skip adding questreq if it does
        req = req:newline()
    end

    local has_requirement = has_quest_req(name)
    for _, skill in ipairs(p.skills) do
        local skill_level = ret:param(skill[2])
        if infobox.isDefined(skill_level) then
            req:wikitext('* ' .. skill_pics(skill[1], skill_level) .. ' [[' .. skill[4] .. ']]'):newline()
            has_requirement = true
        end
    end


    if infobox.isDefined(extra) then
        req:wikitext(extra):newline()
        has_requirement = true
    end

    if not has_requirement then
        req:wikitext('* None')
    end

    return tostring(req)
end

function itemsDisp(items)
    local node = mw.html.create()
        :tag('i')
        :wikitext('Items from the [[tool belt]] are not listed unless they do not work or are not automatically added.')
        :done()

    if not infobox.isDefined(items) then
        node:newline():wikitext("* None")
        return tostring(node)
    end

    node
        :tag('div')
        :addClass("lighttable checklist")
        :newline()
        :wikitext(items)
    return tostring(node)
end

function recommendedDisp(recommended)
    if not infobox.isDefined(recommended) then
        return nil
    end

    local node = mw.html.create('div')
        :addClass("qc-active lighttable checklist")
        :newline()
        :wikitext(recommended)
    return tostring(node)
end

function nilToNone(value)
    if not infobox.isDefined(value) then
        return "* None"
    end

    return value
end

function yesnoParam(p)
    if infobox.isDefined(p) then
        local b = yesno(p)
        if b then
            return 'Yes'
        elseif not b then
            return 'No'
        else
            return nil
        end
    end
    return nil
end

function onQuickGuide()
    return mw.title.getCurrentTitle().subpageText == "Quick guide"
end

function addcategories(args, catargs)
    local ret = {}

    local cat_map = {
        -- Added if the parameter has content
        defined = {
        },
        -- Added if the parameter has no content
        notdefined = {
        },
    }

    -- Run and add mapped categories
    for n, v in pairs(cat_map.defined) do
        if catargs[n] and catargs[n].one_defined then
            table.insert(ret, v)
        end
    end
    for n, v in pairs(cat_map.notdefined) do
        if catargs[n] and catargs[n].all_defined == false then
            table.insert(ret, v)
        end
    end

    -- combine table and format category wikicode
    for i, v in ipairs(ret) do
        if v ~= '' then
            ret[i] = string.format('[[Category:%s]]', v)
        end
    end

    return table.concat(ret, '')
end

return p
-- </nowiki>