Module:Item/sandbox

From The Remnant 2 Wiki
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