Module:AbilityInteraction: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
Vergir (talk | contribs)
m Add several interactions. Update comments
Simplify the docs table to interaction (key and aliases) and example (with help from vergir-bot LLM)
Line 140: Line 140:
table.sort(keys)
table.sort(keys)


local out = { '{| class="wikitable"', '! Interaction !! Aliases !! Type !! Example' }
local out = { '{| class="wikitable"', '! Interaction !! Example' }
for _, key in ipairs(keys) do
for _, key in ipairs(keys) do
local entry = REGISTRY[key]
local entry = REGISTRY[key]
local aliases = {}
local names = { '<code>' .. key .. '</code>' }
for _, alias in ipairs(entry.aliases or {}) do
for _, alias in ipairs(entry.aliases or {}) do
table.insert(aliases, '<code>' .. alias .. '</code>')
table.insert(names, '<code>' .. alias .. '</code>')
end
end
table.insert(out, '|-')
table.insert(out, '|-')
table.insert(out, '| <code>' .. key .. '</code>')
table.insert(out, '| ' .. table.concat(names, ' / '))
table.insert(out, '| ' .. (#aliases > 0 and table.concat(aliases, ', ') or '—'))
table.insert(out, '| ' .. entry.type)
table.insert(out, '| ' .. frame:expandTemplate{
table.insert(out, '| ' .. frame:expandTemplate{
title = 'AbilityInteraction',
title = 'AbilityInteraction',

Revision as of 15:57, 15 July 2026

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

-- To add an interaction, add a REGISTRY entry:
--   aliases  = other names resolving to this entry; assumed not to overlap
--   title    = header text
--   type     = positive | negative | info
--   iconfile = image file name, without the File: prefix
--   link     = wiki page name, or a full URL

local REGISTRY = {
	
	['ability duration'] = {
		aliases  = { 'duration', 'duration extender' },
		title    = 'Ability Duration',
		type     = 'positive',
		iconfile = 'Duration Extender.png',
		link     = 'Ability Duration',
	},
	['ability range'] = {
		aliases  = { 'range', 'greater expansion' },
		title    = 'Ability Range',
		type     = 'positive',
		iconfile = 'Greater Expansion.png',
		link     = 'Ability Range',
	},
	['debuff resist'] = {
		aliases  = { 'debuff reducer' },
		title    = 'Debuff Resist',
		type     = 'negative',
		iconfile = 'Debuff Reducer.png',
		link     = 'Debuff Resist',
	},
	['dispel'] = {
		aliases  = { 'dispel magic', 'purge', 'cleanse' },
		title    = 'Dispel',
		type     = 'negative',
		iconfile = 'Dispel Magic.png',
		link     = 'Dispel Magic',
	},
	['heroic aura'] = {
		aliases  = {},
		title    = 'Heroic Aura',
		type     = 'positive',
		iconfile = 'Heroic Aura.png',
		link     = 'Heroic Aura',
	},
	['indomitable'] = {
		aliases  = {},
		title    = 'Indomitable',
		type     = 'negative',
		iconfile = 'Indomitable.png',
		link     = 'Indomitable',
	},
	['interrupt'] = {
		aliases  = { 'knockdown', 'stun' },
		title    = 'Interrupt',
		type     = 'negative',
		iconfile = 'Knockdown.png',
		link     = 'Knockdown',
	},
	['monster rounds'] = {
		aliases  = {},
		title    = 'Monster Rounds',
		type     = 'negative',
		iconfile = 'Monster Rounds.png',
		link     = 'Monster Rounds',
	},
	['slowing hex'] = {
		aliases  = {},
		title    = 'Slowing Hex',
		type     = 'info',
		iconfile = 'Slowing Hex.png',
		link     = 'Slowing Hex',
	},
	['unstoppable'] = {
		aliases  = {},
		title    = 'Unstoppable',
		type     = 'negative',
		iconfile = 'Unstoppable.png',
		link     = 'Unstoppable',
	},
}

local p = {}
local getArgs = require('Module:Arguments').getArgs

local index = {}
for _, entry in pairs(REGISTRY) do
	for _, alias in ipairs(entry.aliases or {}) do
		index[alias] = entry
	end
end
for key, entry in pairs(REGISTRY) do
	index[key] = entry
end

local function err(msg)
	return '<strong class="error">AbilityInteraction: ' .. mw.text.nowiki(msg) .. '</strong>'
end

function p.box(frame)
	local args = getArgs(frame)

	local state = mw.ustring.lower(mw.text.trim(args.state or ''))
	local key   = mw.ustring.lower(mw.text.trim(args.interaction or ''))

	if key == '' then
		return err('no interaction specified')
	end

	local entry = index[key]
	if entry == nil then
		return err('unknown interaction "' .. key .. '"')
	end

	-- A disabled box means the interaction does not apply, so it carries no
	-- valence; the neutral header overrides the registry type.
	local box_type = entry.type
	if state == 'disabled' then
		box_type = 'info'
	end

	return frame:expandTemplate{
		title = 'IconBox',
		args  = {
			title    = entry.title,
			type     = box_type,
			iconfile = entry.iconfile,
			link     = entry.link,
			state    = state,
			text     = args.text or '',
		},
	}
end

-- A function to be used on the Template Doc page to list all available Interactions
function p.list(frame)
	local keys = {}
	for key in pairs(REGISTRY) do
		table.insert(keys, key)
	end
	table.sort(keys)

	local out = { '{| class="wikitable"', '! Interaction !! Example' }
	for _, key in ipairs(keys) do
		local entry = REGISTRY[key]
		local names = { '<code>' .. key .. '</code>' }
		for _, alias in ipairs(entry.aliases or {}) do
			table.insert(names, '<code>' .. alias .. '</code>')
		end
		table.insert(out, '|-')
		table.insert(out, '| ' .. table.concat(names, ' / '))
		table.insert(out, '| ' .. frame:expandTemplate{
			title = 'AbilityInteraction',
			args  = { interaction = key, text = 'Example text.' },
		})
	end
	table.insert(out, '|}')
	return table.concat(out, '\n')
end

return p