Module:Item/Mod: Difference between revisions
From Growtopia
Jump to navigationJump to search
>HashJona m add return |
>HashJona m add Cosmetic Clothes category |
||
| (127 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
local | local mods = require('Module:Item/ModList') | ||
local item = {} | local item = {} | ||
function | function join_with_connector(list, connector) | ||
connector = connector or 'and' | |||
local n = #list | |||
local n = # | |||
if n == 0 then | if n == 0 then | ||
return | return '' | ||
elseif n == 1 then | elseif n == 1 then | ||
return | return list[1] | ||
elseif n == 2 then | elseif n == 2 then | ||
return | return list[1] .. ' ' .. connector .. ' ' .. list[2] | ||
elseif n >= 3 then | |||
local first_part = table.concat(list, ', ', 1, n - 1) | |||
return first_part .. ', ' .. connector .. ' ' .. list[n] | |||
end | |||
end | |||
function starts_with(str, prefix) | |||
return str:sub(1, #prefix) == prefix | |||
end | |||
function length(obj) | |||
local count = 0 | |||
for _ in pairs(obj) do | |||
count = count + 1 | |||
end | |||
return count; | |||
end | |||
function non_empty(value, fallback) | |||
if value == nil or value == '' then | |||
return fallback | |||
else | else | ||
return value | |||
return | |||
end | end | ||
end | |||
function parse_args(args) | |||
local keys = {} | |||
for k, _ in pairs(args) do | |||
if type(k) == 'number' then | |||
table.insert(keys, k) | |||
end | |||
end | |||
return keys | |||
end | |||
function debug_result(var, debug_flag) | |||
if debug_flag == '1' then | |||
return '<pre>' .. var .. '</pre>' | |||
else | |||
return mw.getCurrentFrame():preprocess(var) | |||
end | |||
end | |||
function parse_notes(args) | |||
local notes = '' | |||
local categories = {} | |||
local keys = parse_args(args) | |||
local current_page = mw.title.getCurrentTitle() | |||
for i = 2, #keys do | |||
local argIndex = keys[i] | |||
local key = args[argIndex] | |||
local mod = mods[key] | |||
if mod ~= nil then | |||
if type(mod) == 'function' then | |||
mod = mod(args) | |||
end | |||
if mod['hide_mod_category'] ~= true | |||
and current_page | |||
and not starts_with(current_page.text, mod['mod_category'] .. '/') then | |||
table.insert(categories, "''[[" .. mod['mod_category'] .. '|'.. mod['label'] .."]]''") | |||
end | |||
if mod.notes ~= '' then | |||
notes = notes .. '|' .. mod.notes | |||
end | |||
end | |||
end | |||
categories = join_with_connector(categories, args["connector"]) | |||
if categories ~= '' then | |||
notes = '|Also grants ' .. categories .. notes | |||
end | |||
for i = 1, 2 do | |||
local note = args['note_' .. i] or '' | |||
if note ~= '' then | |||
notes = notes .. '|' .. note | |||
end | |||
end | |||
return notes | |||
end | |||
function item.parse_description(args) | |||
local parsed_effects = {} | |||
local categories = {} | |||
local add_cat = not args['no_cat'] | |||
local keys = parse_args(args) | |||
local is_mod_broken = false; | |||
for i = 2, #keys do | |||
local argIndex = keys[i] | |||
local key = args[argIndex] | |||
local mod = mods[key] | |||
if mod ~= nil then | |||
if type(mod) == 'function' then | |||
mod = mod(args) | |||
end | |||
if add_cat then | |||
table.insert(categories, '[[' .. mod.category .. ']]') | |||
end | |||
if mod.description ~= '' then | |||
table.insert(parsed_effects, mod.description) | |||
end | |||
else | |||
is_mod_broken = true | |||
end | |||
end | |||
if is_mod_broken and add_cat then | |||
table.insert(categories, '[[Category:Broken Mod]]') | |||
end | |||
return { | |||
description = join_with_connector(parsed_effects, args['connector']), | |||
categories = table.concat(categories) | |||
} | |||
end | end | ||
function item.description(frame) | function item.description(frame) | ||
local parent = frame:getParent().args | local parent = frame:getParent().args | ||
local label = parent['label'] or | local title = parent['title'] or mw.title.getCurrentTitle().text or 'unknown' | ||
local | local label = parent['label'] or parent[1] | ||
local parsed_effects = item.parse_description(parent) | |||
local base_sentence = "When equipped, the '''" .. mw.text.nowiki(title) .. "'''" | |||
local full_sentence | |||
if label ~= '' and label ~= nil then | |||
sentence_with_label = base_sentence .. " grants the ''" .. mw.text.nowiki(label) .. "'' [[Mods|mod]]" | |||
if parsed_effects.description == '' then | |||
full_sentence = sentence_with_label .. '.' | |||
elseif label == '-' then | |||
full_sentence = base_sentence .. ' allows the player to ' .. parsed_effects.description .. '.' | |||
else | |||
full_sentence = sentence_with_label .. ', which allows the player to ' .. parsed_effects.description .. '.' | |||
end | |||
else | |||
full_sentence = base_sentence .. " serves a purely cosmetic purpose.[[Category:Cosmetic Clothes]]" | |||
end | |||
return full_sentence .. parsed_effects.categories | |||
end | |||
function item.table(frame) | |||
local parent = frame:getParent().args | |||
local name = parent['title'] or '%PAGE%' | |||
local label = parent['label'] or parent[1] or '' | |||
local notes = parse_notes(parent) | |||
if label == '-' then | |||
label = '' | |||
end | |||
return '\n{{Mod|' .. name .. '|' .. label .. notes .. '}}' | |||
end | |||
function item.documentation(frame) | |||
local doc = {} | |||
local args = { | |||
misc = '<span style="background:#FF9999">misc</span>', | |||
skin = '<span style="background:#FF9999">skin</span>', | |||
gem_chance = '<span style="background:#FF9999">gem_chance</span>', | |||
block_chance = '<span style="background:#FF9999">block_chance</span>' | |||
} | |||
table.insert(doc, '{|class="article-table" border="0" cellpadding="1" cellspacing="1" width="100%"') | |||
table.insert(doc, '|-') | |||
table.insert(doc, '! scope="col" style="width:15%" |Parameter') | |||
table.insert(doc, '! scope="col" style="width:10%" |Value') | |||
table.insert(doc, '! scope="col" style="width:75%" |Meaning') | |||
table.insert(doc, '|-') | |||
table.insert(doc, '| rowspan=' .. length(mods) .. ' | <span style="background:#FF9999">Mod</span>') | |||
for k, v in pairs(mods) do | |||
table.insert(doc, "|'''" .. k .. "'''") | |||
if type(v) == 'function' then | |||
local default_value = v({}).description | |||
local value = v(args).description | |||
if(default_value == value) then | |||
table.insert(doc, '|' .. non_empty(default_value, "''No default value''")) | |||
else | |||
table.insert(doc, '|' .. '{{Bullet}} ' .. non_empty(default_value, "''No default value''") .. '<br>{{Bullet}} ' .. value) | |||
end | |||
else | |||
table.insert(doc, '|' .. v.description) | |||
end | |||
table.insert(doc, '|-') | |||
end | |||
table.insert(doc, '|}') | |||
return debug_result(table.concat(doc, '\n'), frame.args['debug']) | |||
end | end | ||
return item | return item | ||
Latest revision as of 15:21, 3 October 2025
Documentation for this module may be created at Module:Item/Mod/doc
local mods = require('Module:Item/ModList')
local item = {}
function join_with_connector(list, connector)
connector = connector or 'and'
local n = #list
if n == 0 then
return ''
elseif n == 1 then
return list[1]
elseif n == 2 then
return list[1] .. ' ' .. connector .. ' ' .. list[2]
elseif n >= 3 then
local first_part = table.concat(list, ', ', 1, n - 1)
return first_part .. ', ' .. connector .. ' ' .. list[n]
end
end
function starts_with(str, prefix)
return str:sub(1, #prefix) == prefix
end
function length(obj)
local count = 0
for _ in pairs(obj) do
count = count + 1
end
return count;
end
function non_empty(value, fallback)
if value == nil or value == '' then
return fallback
else
return value
end
end
function parse_args(args)
local keys = {}
for k, _ in pairs(args) do
if type(k) == 'number' then
table.insert(keys, k)
end
end
return keys
end
function debug_result(var, debug_flag)
if debug_flag == '1' then
return '<pre>' .. var .. '</pre>'
else
return mw.getCurrentFrame():preprocess(var)
end
end
function parse_notes(args)
local notes = ''
local categories = {}
local keys = parse_args(args)
local current_page = mw.title.getCurrentTitle()
for i = 2, #keys do
local argIndex = keys[i]
local key = args[argIndex]
local mod = mods[key]
if mod ~= nil then
if type(mod) == 'function' then
mod = mod(args)
end
if mod['hide_mod_category'] ~= true
and current_page
and not starts_with(current_page.text, mod['mod_category'] .. '/') then
table.insert(categories, "''[[" .. mod['mod_category'] .. '|'.. mod['label'] .."]]''")
end
if mod.notes ~= '' then
notes = notes .. '|' .. mod.notes
end
end
end
categories = join_with_connector(categories, args["connector"])
if categories ~= '' then
notes = '|Also grants ' .. categories .. notes
end
for i = 1, 2 do
local note = args['note_' .. i] or ''
if note ~= '' then
notes = notes .. '|' .. note
end
end
return notes
end
function item.parse_description(args)
local parsed_effects = {}
local categories = {}
local add_cat = not args['no_cat']
local keys = parse_args(args)
local is_mod_broken = false;
for i = 2, #keys do
local argIndex = keys[i]
local key = args[argIndex]
local mod = mods[key]
if mod ~= nil then
if type(mod) == 'function' then
mod = mod(args)
end
if add_cat then
table.insert(categories, '[[' .. mod.category .. ']]')
end
if mod.description ~= '' then
table.insert(parsed_effects, mod.description)
end
else
is_mod_broken = true
end
end
if is_mod_broken and add_cat then
table.insert(categories, '[[Category:Broken Mod]]')
end
return {
description = join_with_connector(parsed_effects, args['connector']),
categories = table.concat(categories)
}
end
function item.description(frame)
local parent = frame:getParent().args
local title = parent['title'] or mw.title.getCurrentTitle().text or 'unknown'
local label = parent['label'] or parent[1]
local parsed_effects = item.parse_description(parent)
local base_sentence = "When equipped, the '''" .. mw.text.nowiki(title) .. "'''"
local full_sentence
if label ~= '' and label ~= nil then
sentence_with_label = base_sentence .. " grants the ''" .. mw.text.nowiki(label) .. "'' [[Mods|mod]]"
if parsed_effects.description == '' then
full_sentence = sentence_with_label .. '.'
elseif label == '-' then
full_sentence = base_sentence .. ' allows the player to ' .. parsed_effects.description .. '.'
else
full_sentence = sentence_with_label .. ', which allows the player to ' .. parsed_effects.description .. '.'
end
else
full_sentence = base_sentence .. " serves a purely cosmetic purpose.[[Category:Cosmetic Clothes]]"
end
return full_sentence .. parsed_effects.categories
end
function item.table(frame)
local parent = frame:getParent().args
local name = parent['title'] or '%PAGE%'
local label = parent['label'] or parent[1] or ''
local notes = parse_notes(parent)
if label == '-' then
label = ''
end
return '\n{{Mod|' .. name .. '|' .. label .. notes .. '}}'
end
function item.documentation(frame)
local doc = {}
local args = {
misc = '<span style="background:#FF9999">misc</span>',
skin = '<span style="background:#FF9999">skin</span>',
gem_chance = '<span style="background:#FF9999">gem_chance</span>',
block_chance = '<span style="background:#FF9999">block_chance</span>'
}
table.insert(doc, '{|class="article-table" border="0" cellpadding="1" cellspacing="1" width="100%"')
table.insert(doc, '|-')
table.insert(doc, '! scope="col" style="width:15%" |Parameter')
table.insert(doc, '! scope="col" style="width:10%" |Value')
table.insert(doc, '! scope="col" style="width:75%" |Meaning')
table.insert(doc, '|-')
table.insert(doc, '| rowspan=' .. length(mods) .. ' | <span style="background:#FF9999">Mod</span>')
for k, v in pairs(mods) do
table.insert(doc, "|'''" .. k .. "'''")
if type(v) == 'function' then
local default_value = v({}).description
local value = v(args).description
if(default_value == value) then
table.insert(doc, '|' .. non_empty(default_value, "''No default value''"))
else
table.insert(doc, '|' .. '{{Bullet}} ' .. non_empty(default_value, "''No default value''") .. '<br>{{Bullet}} ' .. value)
end
else
table.insert(doc, '|' .. v.description)
end
table.insert(doc, '|-')
end
table.insert(doc, '|}')
return debug_result(table.concat(doc, '\n'), frame.args['debug'])
end
return item