Module:Weapon upgrade table

From The Remnant 2 Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:Weapon upgrade table/doc

local m_types = require('Module:TypesLib')
local m_args = require('Module:ArgsLib')
local data = mw.loadData('Module:Weapon_upgrade_table/data')

-----------------------------------------------------------------------------
-- Utility
-----------------------------------------------------------------------------
local u = {}

function u.comma_separate(value)
  return tostring(math.floor(value)):reverse():gsub("(%d%d%d)","%1,"):gsub(",(%-?)$","%1"):reverse()
end

-----------------------------------------------------------------------------
-- Builder
-----------------------------------------------------------------------------
local b = {}

function b.build_header(t_args)
	local _table = mw.html.create('table'):addClass('wikitable'):attr('style', 'text-align:center'):done()
	local tr = _table:tag('tr'):done()
	
	local rowspan = 1
	if type(t_args.damage_headings) == 'table' and #t_args.damage_headings > 0 then
		rowspan = 2
	end
	
	tr
		:tag('th'):attr('rowspan', rowspan):wikitext('Level'):done()
		:tag('th'):attr('colspan', #t_args.damage_values):wikitext('Damage'):done()
		:tag('th'):attr('colspan', data.cost_length):attr('rowspan', rowspan):wikitext('Cost'):done()
		:done()
	
	if type(t_args.damage_headings) == 'table' and #t_args.damage_headings > 0 then
		local tr2 = _table:tag('tr')
		for i=1, #t_args.damage_headings do
			tr2:tag('th'):wikitext(t_args.damage_headings[i]):done()
		end
	end
	
	return _table
end

function b.build_icon(image, page, amount)
	return mw.html.create('span'):addClass('row-center'):attr('style', 'gap:2px'):wikitext(string.format('[[File:%s|link=%s|30x30px]][[%s|%s]]', image, page, page, amount))
end

function b.build_colored_text(t, value)
	return mw.html.create('span'):attr('style', string.format('color:var(--color-%s)', t)):wikitext(value)
end

function b.build_rows(t_args, container)
	local metal = {}
	local metal_amount
		
	for i = 0, data.upgrade_cap do
		local tr = container:tag('tr')
		tr
			:tag('th'):wikitext('+' .. i):done()
		
		-- Damage cells
		local damage_scaling = 1 + (data.damage_increment * i)
		for j = 1, #t_args.damage_values do
			local t = t_args.damage_types and t_args.damage_types[j] or nil
			local val = t_args.damage_values[j] * damage_scaling
			local prefix = t_args.damage_prefixes and t_args.damage_prefixes[j] or ''
			local suffix = t_args.damage_suffixes and t_args.damage_suffixes[j] or ''
			
			local td = tr:tag('td')
			if t then
				td:wikitext(prefix):node(b.build_colored_text(t, val)):wikitext(suffix):done()
			else
				td:wikitext(prefix .. val .. suffix):done():done()
			end
		end
		
		-- If base value, blank cells
		if (i == 0) then
			tr:tag('td'):attr('colspan', data.cost_length):wikitext('N/A'):done()
		else
			-- Cost cells
			-- Metal
			metal = data.costs.metal[i] or metal
			
			tr:tag('td'):node(b.build_icon(metal.image, metal.page, metal.amount)):done()
		
			if (metal.increment ~= nil) then
				metal.amount = metal.amount + metal.increment
			end
		
			-- Lumenite
			if (t_args.is_special) then
				tr:tag('td'):node(b.build_icon(data.costs.lumenite.image, data.costs.lumenite.page, data.costs.lumenite.amount[i])):done()
			end
			
			-- Scrap
			tr:tag('td'):node(b.build_icon(data.costs.scrap.image, data.costs.scrap.page, u.comma_separate(data.costs.scrap.base + (data.costs.scrap.increment * (i - 1))))):done()
		end
	end
end

-----------------------------------------------------------------------------
-- Public
-----------------------------------------------------------------------------
local p = {}

function p.main(frame)
	local t_args = frame:getParent().args
	return p._main(t_args)
end

function p._main(t_args)
	t_args.is_special = m_types.to_bool(t_args.is_special)
	if (t_args.is_special) then
		data = data.special
	else
		data = data.standard
	end
	
	t_args.damage_values = m_args.merge_numbered_args(t_args, 'base_damage')
	t_args.damage_headings = m_args.merge_numbered_args(t_args, 'heading', #t_args.damage_values)
	
	if (t_args.damage_headings and #t_args.damage_headings ~= #t_args.damage_values) then
		error('No matching damage_heading for each damage_value.')
	end
	
	t_args.damage_types = m_args.merge_numbered_args(t_args, 'damage_type', #t_args.damage_values)
	t_args.damage_prefixes = m_args.merge_numbered_args(t_args, 'prefix', #t_args.damage_values)
	t_args.damage_suffixes = m_args.merge_numbered_args(t_args, 'suffix', #t_args.damage_values)
		
	local container = b.build_header(t_args)
	b.build_rows(t_args, container)
	
	return container
end

return p