Module:Move7: Difference between revisions

From Wavu Wiki, the 🌊 wavy Tekken wiki
No edit summary
No edit summary
Line 72: Line 72:
p.punisher = function(frame)
p.punisher = function(frame)
local id = getQueryId(frame)
local id = getQueryId(frame)
local enemy = frame:getParent().args[1]
local enemy = frame:getParent().args[2]
local rowspan = frame:getParent().args['rowspan']
local rowspan = frame:getParent().args['rowspan']

Revision as of 17:43, 24 August 2023

Documentation for this module may be created at Module:Move7/doc

local p = {};
local cargo = mw.ext.cargo
local tables = 'MoveDataCargoTest'

p.fields = 'id,name,input,target,damage,reach,tracksLeft,tracksRight,startup,recv,tot,crush,block,hit,ch,notes'

-- Get move id for querying, which is the 1st unnamed param of a template.
-- Moves are queried like this: {{TempateName|<moveId>}}
function getQueryId(frame)
	local id = assert(frame:getParent().args[1], '1st unnamed param must be move id')
	return mw.text.trim(id) -- whitespace is stripped only from named params
end

function moveNotFoundMsg(id)
	return "move with id = '" .. id .. "' not found"
end

p.display = function(frame)
	local function appendFrom(dst, src)
		for k, v in pairs(src) do
			dst[k] = v
		end
	end
	local function getLeads(parentId)
		local leads = {}
		while (parentId ~= nil and parentId ~= '') do
			local parent = cargo.query(tables, 'input,target,damage,parent', { where = "id='" .. parentId .. "'" })[1]
			assert(parent, 'parent = "' .. parentId .. '" not found')

			parentId = parent['parent']
			parent['parent'] = nil
			
			for k, v in pairs(parent) do
				local leadName = k .. 'Lead'
				if leads[leadName] == nil then
					leads[leadName] = ''
				end
				
				leads[leadName] = v .. leads[leadName]
			end
		end
		
		return leads
	end
	
	local leads = getLeads(frame:getParent().args['parent'])
	if next(leads) == nil then
		return frame:expandTemplate{ title = 'MoveData', args = frame:getParent().args }
	end
	
	local args = {}
	appendFrom(args, frame:getParent().args)
	appendFrom(args, leads)
	return frame:expandTemplate{ title = 'MoveData', args = args }
end

p.query = function(frame)
	local id = getQueryId(frame)
	local result = cargo.query(tables, p.fields, { where = "id = '" .. id .. "'" })[1]
	assert(result, moveNotFoundMsg)
	
	for k, v in pairs(result) do
		local override = frame:getParent().args[k]
		if override ~= nil then
			result[k] = override
		end
	end
	
	return frame:expandTemplate{ title = 'MoveDataCargoTest/Display', args = result }
end

p.punisher = function(frame)
	local id = getQueryId(frame)
	local enemy = frame:getParent().args[2]
	local rowspan = frame:getParent().args['rowspan']
	
	local input = ''
	local damage = 0
	local hit = nil
	while (id ~= '') do
		local move = cargo.query(tables, 'parent,input,damage,hit', { where = "id = '" .. id .. "'" })[1]
		assert(move, moveNotFoundMsg(id))
		
		input = move['input'] .. input
		damage = damage + move['damage']
		if hit == nil then
			hit = move['hit']
		end
		
		id = move['parent']
	end
	
	local row = mw.html.create('tr')
	if enemy ~= nil then
		row:tag('td'):wikitext(enemy):attr('rowspan', rowspan or 1)
	end
	row:tag('td'):wikitext(input)
	row:tag('td'):wikitext(damage)
	row:tag('td'):wikitext(hit)
	return row
end

return p