Module:Activity Details
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.
Module:Activity Details requires .
| 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>