Module:Abilities

From Super Fantasy Kingdom Wiki
Jump to navigation Jump to search
Template-info.svg Documentation

Creates an ability table with upgrades for a unit. (Code at Module:Abilities).

The ability grids are created with the submodule Module:Abilities/Grid, see there for infos about creating the grid.

{{abilities
|name1=Tentacles
|abilityType1 = Magical
|element = Dark
|dm1= 1x
|cd1=1.5s
|desc1=Opens up the door to another dimension<br/> Applies {{effect|fear}} to all monsters hit.
|upgrade1.1= Decrease {{stat|cd|to 1.25s}}
|upgrade1.2= Decrease {{stat|cd|to 1s}}
|upgrade1.3= Increase {{stat|ar}}
|name2=Barrier
|abilityType2 = Support
|cd2=6s
|desc2=Cast {{Effect|Barrier}} onto the hero above
|grid2.mark=8
|upgrade2.3= Applies to more allies
|upgrade2.3grid=7,8,9
}}
Tentacles
Magical damage
Damage.png 1x • Cooldown.png 1.5s
Opens up the door to another dimension
Applies fear to all monsters hit.
Upgrade1.png Decrease Cooldown.png to 1.25s
Upgrade2.png Decrease Cooldown.png to 1s
Upgrade3.png Increase Area.png
Barrier
Support
Cooldown.png 6s
Cast Barrier onto the hero above
Upgrade3.png Applies to more allies

local p = {}

local statNames = require ('Module:Stats/StatNames')
local stats = require('Module:Stats')
local gridCreation = require('Module:Abilities/Grid')

function p.abilities(f)
	return p.create(f:getParent().args)
end
		             
function p.create(args)
    local result = ''
	-- currently there are up to 2 abilities and sometimes a sub ability
	for abilityIndex = 1,3 do
	    result = result .. abilityRow(args, abilityIndex)
	end
	
	if string.len(result) == 0 then
	    return ''
	end
	
	return '<div class="ability-supercontainer">'..result..'</div>'
end

function abilityRow(args, index)
	if (args['name'..index] or '') == '' and (args['desc'..index] or '') == '' then
		return ''
	end
	
	local name = args['name'..index]
	local abilityType = p.combatIcon(args['abilityType'..index])
	local element = p.combatIcon(args['element'..index])
	local titleCell = ''
	if name ~= nil or abilityType ~= nil or element ~= nil then
		titleCell = '<div class="ability-name">'..(name or '')..'</div><div class="ability-icons">'..
		(abilityType or '')..(element or '')..'</div>'
	end
	
	local statValues = {['inline'] = '1'}
	for _,s in ipairs(statNames) do
		if args[s[1]..index] ~= nil then
			statValues[s[1]] = args[s[1]..index]
		end
	end
	
	local statsDisplay = '<div class="ability-stats">'..stats.create(statValues)..'</div>'
	
	local grid = ''
	if args['grid'..index..'.mark'] ~= nil then
		grid = '<div>'..gridCreation.create({['mark'] = args['grid'..index..'.mark'], ['markSource'] = args['grid'..index..'.markSource']})..'</div>'
	end
	
	local descriptionRow = ''
	local descriptionText = args['desc'..index] or ''
	if descriptionText ~= '' then
	    descriptionRow = '<div class="ability-description">'..descriptionText..'</div>'
	end
	
	local upgradeRows = createUpgradeRows(args, index)
	if upgradeRows ~= '' then
	    upgradeRows = '<div class="ability-upgrades">'..upgradeRows..'</div>'
	end
	
	local subAbilityClass = ''
	if args['subAbility'..index] == '1' or args['subAbility'..index] == 'true' then
		subAbilityClass = ' ability-subability'
	end
	
	return '<div class="ability-container'..subAbilityClass..'"><div class="ability-header">'..titleCell..statsDisplay..grid..'</div>'..
	    descriptionRow..upgradeRows..'</div>'
end

function createUpgradeRows(args, index)
    local upgradeTexts = {}
	
	for i = 1,3 do
	    local upgradeText = args['upgrade'..index..'.'..i] or ''
	    -- some upgrades change the grid, then show that
	    local upgradeGrid = args['upgrade'..index..'.'..i..'grid'] or ''
	    if upgradeGrid ~= '' or upgradeText ~= '' then
	    	if upgradeGrid ~= '' then
	    		table.insert(upgradeTexts, '<div style="display: flex;"><div>[[File:Upgrade'..i..'.png|26px]] '..upgradeText..
	    			'</div><div style="margin-left: auto;">'..gridCreation.create({['mark'] = upgradeGrid})..'</div></div>')
	    	else
	    		table.insert(upgradeTexts, '<div>[[File:Upgrade'..i..'.png|26px]] '..upgradeText..'</div>')
	    	end
	    end
	end
	
	if #upgradeTexts == 0 then
		return ''
	end
	
	return table.concat(upgradeTexts, '')
end

function p.combatIcon(name)
	if name == nil or name == '' then
		return nil
	end
	
	-- attack types, passive types, elements
	local combatIcons = {
		['physical damage'] = 'Physical damage',
		['physical'] = 'Physical damage',
		['magical damage'] = 'Magical damage',
		['magical'] = 'Magical damage',
		['self boost'] = 'Self boost',
		['selfbuff'] = 'Selfbuff',
		['support'] = 'Support',
		['summoner'] = 'Summoner',
		['dark'] = 'Dark',
		['earth'] = 'Earth',
		['electric'] = 'Electric',
		['fire'] = 'Fire',
		['holy'] = 'Holy',
		['ice'] = 'Ice',
		['plant'] = 'Plant',
		['poison'] = 'Poison',
		['water'] = 'Water (Element)',
		['none'] = nil
	}
	
	local result = combatIcons[string.lower(name)]
	if result ~= nil then
		return '[[File:'..result..'.png|16x16px|class=itemlink|alt='..result..'|link='..result..']]'
	end
	
	return name
end

return p