Module:Item/sandbox
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Item/sandbox/doc
local m_args = require('Module:ArgsLib')
local m_cargo = require('Module:CargoLib')
local core = mw.loadData('Module:Game/core')
local cfg = mw.loadData('Module:Item/config/sandbox')
local i18n = cfg.i18n
-- TODO:
-- Set automatic categories for special/standard, ranged/melee muts, etc.
-- change css labels/values to only care about container class
-- change accuracy bar classes to generalized names .infobox-bar and .infobox-bar-fill
-- cache query https://gitlab.com/hydrawiki/extensions/LuaCache
-- /config
-- Automate cargo fields into declare page so only one needs to change
-- Create extra field that matches a param name to convert param -> cargo field
-- Helpers
--------------------------------------------------------------------------------
local h = {}
function h.format(value, fmt)
if fmt == 'value' then
return value
elseif fmt == 'range' then
return value .. i18n.units.meters
elseif fmt == 'percent' then
return value .. '%'
elseif fmt == 'bar' then
return string.format('width:%s%%;--bg:#c9c9c9;--lines:#dadada', value)
end
end
function h.query_mod(args)
return m_cargo.query(
'items, weapon_mods',
'items.description=desc, weapon_mods.power_req=req',
{
join = 'items.ukey=weapon_mods.item_key',
where = string.format('items.name="%s"', args.attached_mod),
limit = 1,
}
)
end
function h.get_class_data(args)
args._class_data = cfg.class_data[args.class_id]
for _, params in ipairs(args._class_data.params) do
m_args.cast(args, params)
end
end
-- Subroutines
--------------------------------------------------------------------------------
local s = {}
function s.create_main(args, params)
local main = mw.html.create('ul'):addClass('infobox-mainstats box-lines'):attr('style', '--bg:#1d1d1d;--lines:#242424')
local i = 0
for _, v in ipairs(params) do
if args[v] then
local _label = i18n.labels[v]
local _value = args[v]
main:tag('li')
:tag('span'):addClass('infobox-mainstats-label'):wikitext(_label):done()
:tag('span'):addClass('infobox-mainstats-value'):wikitext(_value):done()
:done()
i = i + 1
end
end
if i > 0 then return main end
end
function s.create_res(args, params)
local res = mw.html.create('ul'):addClass('infobox-resistances box-lines'):attr('style', '--bg:#2c2c2c;--lines:#2f2f2f')
local i = 0
for _, v in ipairs(params) do
if args[v] then
local _icon = string.format('[[File:%s|link=|alt=%s|32px]]', core.icons.resistances[v], i18n.tooltips[v])
local _value = args[v]
res:tag('li')
:tag('span'):wikitext(_icon):done()
:tag('span'):addClass('infobox-resistances-value'):wikitext(_value):done()
:done()
i = i + 1
end
end
if i > 0 then return res end
end
function s.create_stats(args, params)
local stats = mw.html.create('ul'):tag('ul'):addClass('infobox-substats box-lines'):attr('style', '--bg:#2a2a2a;--lines:#2c2c2c')
local i = 0
for _, v in ipairs(params) do
local _field = v.field
if args[_field] then
local _label = i18n.labels[_field]
local _tooltip = i18n.tooltips[_field]
local _value = h.format(args[_field], v.format)
local li = stats:tag('li')
if _tooltip then
li:tag('abbr'):addClass('infobox-substats-label'):attr('title', _tooltip):wikitext(_label):done()
else
li:tag('span'):addClass('infobox-substats-label'):wikitext(_label):done()
end
if v.format == 'bar' then
li:tag('span'):addClass('infobox-substats-bar')
:tag('span'):addClass('infobox-substats-accuracy box-lines'):attr('style', _value):done()
:done()
else
li
:tag('hr'):done()
:tag('span'):addClass('infobox-substats-value'):wikitext(_value):done()
end
i = i + 1
end
end
if i > 0 then return stats end
end
function s.create_mod(args)
local _result = h.query_mod(args)
local attachment = mw.html.create('div'):addClass('infobox-attachment'):attr('style', '--color:#204053bb'):wikitext(string.format('[[File:%s.png|link=%s|64px]]', args.attached_mod, args.attached_mod))
local div = attachment:tag('div')
div
:tag('div'):addClass('infobox-attachment-name'):wikitext(args.attached_mod):done()
if (_result and _result[1]) then
div:tag('div'):addClass('infobox-attachment-description'):wikitext(_result[1].desc):done()
end
return attachment
end
function s.create_cats(args)
local _ns = mw.title.getCurrentTitle().namespace
if _ns ~= 0 then return end
local _cat_string = '[[Category:%s]]'
local str = ''
if not args.ignore_default_cats then
str = args._class_data.categories
end
if args.cats then
local _cats = mw.text.split(args.cats, ',')
for _, v in ipairs(_cats) do
str = str .. string.format(_cat_string, v)
end
end
return str
end
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p.main(frame)
local args = m_args.merge()
return p._main(args)
end
function p._main(args)
h.get_class_data(args)
args.ukey = mw.title.getCurrentTitle()
args.item_key = args.ukey
args.image = args.image or string.format('[[File:%s.png|%s|x128px]]', args.name, args.name)
args.class = args._class_data.name
local infobox = mw.html.create('span'):addClass('infobox')
infobox
:tag('div'):addClass('infobox-header box-lines'):attr('style', '--bg:#0a0a0a;--lines:#111')
:tag('div'):addClass('infobox-name'):wikitext(args.name):done()
:tag('div'):addClass('infobox-class'):wikitext(args.class):done()
:done()
:tag('div'):addClass('infobox-image diamond-lines'):wikitext(args.image):done()
:node(s.create_main(args, cfg.display_fields.main))
:node(s.create_res(args, cfg.display_fields.res))
:node(s.create_stats(args, cfg.display_fields.stats))
if args.description then
infobox:tag('div'):addClass('infobox-description'):wikitext(args.description):done()
end
if args.attached_mod then
infobox:node(s.create_mod(args)):done()
end
infobox:tag('div'):tag('div'):addClass('infobox-end box-lines'):attr('style', '--bg:#0a0a0a;--lines:#111'):done()
args.html = tostring(infobox)
m_cargo.storeFields(args, args._class_data.tables)
infobox:wikitext(s.create_cats(args)):done()
return infobox
end
return p