Module:A: Difference between revisions
From Teriock
More actions
// via Wikitext Extension for VSCode |
// via Wikitext Extension for VSCode Tag: Reverted |
||
| Line 3: | Line 3: | ||
local aliases = { | local aliases = { | ||
keys = { | keys = { | ||
pre = { | pre = {'pre', 'premade'}, | ||
' | maneuver = {'man', 'maneuver', 'm'}, | ||
' | interaction = {'int', 'interaction', 'i'}, | ||
delivery = {'del', 'delivery', 'd'}, | |||
target = {'tar', 'target', 't'}, | |||
duration = {'dur', 'duration', 'dr'}, | |||
upgrade = {'upg', 'upgrade', 'u'}, | |||
executionTime = {'executionTime', 'et', 'x'}, | |||
piercing = {'prc', 'piercing', 'p'}, | |||
-- nearRange = { | |||
-- 'nearRange', | |||
-- 'nr' | |||
-- }, | |||
-- farRange = { | |||
-- 'farRange', | |||
-- 'fr' | |||
-- }, | |||
flaw = {'flaw', 'fl', 'f'}, | |||
special = {'special', 'sp', 's'}, | |||
range = {'range', 'rng', 'r'}, | |||
attribute = {'attribute', 'attr', 'a'}, | |||
expansion = {'expansion', 'exp'}, | |||
expansionRange = {'expansionRange', 'er'}, | |||
expansionCount = {'expansionCount', 'ec'}, | |||
expansionAttribute = {'expansionAttribute', 'ea'}, | |||
sustained = {'sustained', 'sus'}, | |||
requirement = {'req', 'requirement', 'rq'}, | |||
verbal = {'ver', 'verbal'}, | |||
somatic = {'som', 'somatic'}, | |||
material = {'mat', 'material'}, | |||
magelore = {'mag', 'magelore', 'ml'}, | |||
invoked = {'inv', 'invoked', 'invoke'}, | |||
hp = {'hp', 'health', 'hitpoints', 'hitPoints', 'hit points'}, | |||
hpx = {'hpx', 'healthx', 'hitpointsx', 'hitPointsx', 'hit pointsx'}, | |||
mp = { | |||
'mp', 'mana', 'magic', 'magick', 'magik', 'mana points', | |||
'magic points', 'magick points', 'magik points' | |||
}, | |||
mpx = { | |||
'mpx', 'manax', 'manapointsx', 'mana pointsx', 'magic pointsx', | |||
'magick pointsx', 'magik pointsx' | |||
}, | }, | ||
gp = {'gp', 'gold', 'goldPieces', 'gold pieces'}, | |||
gpx = {'gpx', 'goldx', 'goldPiecesx', 'gold piecesx'}, | |||
matx = {'matx', 'materialx'}, | |||
class = {'class'} | |||
}, | |||
values = { | |||
maneuver = { | maneuver = { | ||
' | active = {'ac', 'active', 'a'}, | ||
' | reactive = {'re', 'reaction', 'r'}, | ||
' | passive = {'ps', 'passive', 'p'}, | ||
slow = {'sl', 'slow', 's'} | |||
}, | }, | ||
interaction = { | interaction = { | ||
' | attack = {'atk', 'attack', 'a'}, | ||
' | block = {'blk', 'block', 'b'}, | ||
' | manifest = {'man', 'manifest', 'm'}, | ||
feat = {'fea', 'feat', 'f'} | |||
}, | }, | ||
delivery = { | delivery = { | ||
' | self = {'sel', 'self', 's'}, | ||
' | missile = {'mis', 'missile', 'm'}, | ||
' | hand = {'han', 'hand', 'h', 'claw'}, | ||
bite = {'bit', 'bite', 'b', 'mouth'}, | |||
item = {'itm', 'item', 'i'}, | |||
magelore = {'mag', 'magelore', 'ml'}, | |||
weapon = {'wep', 'weapon', 'w'}, | |||
shield = {'shl', 'shield', 'sh'}, | |||
armor = {'rmr', 'armor', 'r'}, | |||
sight = {'sit', 'sight', 'eye', 'e'}, | |||
aura = {'aur', 'aura', 'a'}, | |||
cone = {'con', 'cone', 'c'}, | |||
other = {'oth', 'other', 'o'} | |||
}, | }, | ||
target = { | target = { | ||
' | self = {'sel', 'self', 's'}, | ||
' | creature = {'cre', 'creature', 'c'}, | ||
' | body = {'bod', 'body', 'b'}, | ||
vitals = {'vit', 'vitals', 'v'}, | |||
limb = {'lim', 'limb', 'l'}, | |||
arm = {'arm'}, | |||
leg = {'leg'}, | |||
item = {'itm', 'item', 'i'}, | |||
weapon = {'wep', 'weapon', 'w'}, | |||
shield = {'shl', 'shield', 'sh'}, | |||
armor = {'rmr', 'armor', 'r'}, | |||
ship = {'ship'}, | |||
attack = {'atk', 'attack', 'a'}, | |||
ability = {'ab', 'ability'}, | |||
spell = {'spl', 'spell'}, | |||
other = {'oth', 'other', 'o'}, | |||
ci = {'ci', 'creatureItem', 'itemCreature', 'ic'}, | |||
ai = {'ai', 'attackItem', 'itemAttack', 'ia'}, | |||
area = {'area', 'ar'}, | |||
aci = { | |||
'cia', 'iac', 'aci', 'ica', 'cai', 'aic', 'creatureItemArea', | |||
'itemCreatureArea', 'AreaCreatureItem', 'itemAreaCreature', | |||
'creatureAreaItem', 'AreaItemCreature' | |||
}, | |||
ac = {'ac', 'ca', 'areaCreature', 'creatureArea'}, | |||
al = {'al', 'la', 'armLeg', 'legArm'}, | |||
cs = {'cs', 'sc', 'creatureSelf', 'selfCreature'} | |||
}, | }, | ||
duration = { | duration = { | ||
' | instant = {'0', 'in', 'instant', 'i'}, | ||
' | always = {'always', 'forever', '4', 'inf'}, | ||
' | noLimit = {'noLimit', '1', 'nl'}, | ||
whileUp = {'up', 'whileUp', 'u'}, | |||
whileDown = {'dn', 'whileDown', 'd'}, | |||
whileAlive = {'al', 'whileAlive', 'a'}, | |||
whileDead = {'dd', 'whileDead'}, | |||
endOfTurn = {'end', 'endOfTurn', 'e'}, | |||
dawn = {'dawn', 'd'}, | |||
startOfTargetNextTurn = {'tStart', 'startOfTargetNextTurn', 'ts'}, | |||
endOfTargetNextTurn = {'tEnd', 'endOfTargetNextTurn', 'te'}, | |||
startOfYourNextTurn = {'uStart', 'startOfYourNextTurn', 'us'}, | |||
endOfYourNextTurn = {'uEnd', 'endOfYourNextTurn', 'ue'}, | |||
endOfCombat = {'endOfCombat', 'ec'}, | |||
timeParse = {'^%d+[mhdwys]$'} | |||
}, | }, | ||
upgrade = { | upgrade = { | ||
' | warded = {'wrd', 'warded', 'w'}, | ||
' | absolute = {'abs', 'absolute', 'a'} | ||
}, | }, | ||
executionTime = { | executionTime = { | ||
' | freeAction = {'0a', 'freeAction', 'fa'}, | ||
' | singleAction = {'1a', 'a', 'singleAction', 'sa'}, | ||
doubleAction = {'2a', 'doubleAction', 'da'}, | |||
tripleAction = {'3a', 'tripleAction', 'ta'}, | |||
freeReaction = {'0r', 'freeReaction', 'fr'}, | |||
reaction = {'1r', 'reaction', 'r'}, | |||
shortRest = {'sr', 'shortRest', 's'}, | |||
longRest = {'lr', 'longRest', 'l'}, | |||
timeParse = {'^%d+[mhdwy]$'} | |||
' | |||
' | |||
}, | }, | ||
piercing = {av0 = {'av0', 'a'}, unblockable = {'ub', 'u'}}, | |||
range = { | range = { | ||
' | melee = {'melee', 'm'}, | ||
' | weapon = {'weapon', 'weaponReach', 'w'}, | ||
'r' | hand = {'hand', 'handReach', 'h'}, | ||
bite = {'bite', 'biteReach', 'b'}, | |||
item = {'item', 'itemReach', 'i'}, | |||
shield = {'shield', 'shieldReach', 'sh'}, | |||
armor = {'armor', 'armorReach', 'r'}, | |||
sight = {'sight', 'sightReach', 'eye', 'e'}, | |||
self = {'self', 's'}, | |||
distParse = {'^%d+[fm]$'}, | |||
other = {'other', 'o'} | |||
}, | }, | ||
attribute = { | attribute = { | ||
' | int = {'int', 'INT', 'i'}, | ||
' | str = {'str', 'STR', 's'}, | ||
' | mov = {'mov', 'MOV', 'm'}, | ||
per = {'per', 'PER', 'p'}, | |||
snk = {'snk', 'SNK', 's'}, | |||
unp = {'unp', 'UNP', 'u'} | |||
}, | |||
expansionAttribute = { | |||
int = {'int', 'INT', 'i'}, | |||
str = {'str', 'STR', 's'}, | |||
mov = {'mov', 'MOV', 'm'}, | |||
per = {'per', 'PER', 'p'}, | |||
snk = {'snk', 'SNK', 's'}, | |||
unp = {'unp', 'UNP', 'u'} | |||
}, | }, | ||
expansion = { | expansion = { | ||
' | detonate = {'det', 'detonate', 'd'}, | ||
ripple = {'rip', 'ripple', 'r'}, | |||
cascade = {'cas', 'cascade', 'c'}, | |||
fork = {'for', 'fork', 'f'} | |||
}, | }, | ||
expansionRange = {distParse = {'^%d+[fm]$'}}, | |||
expansionCount = {expansionCount = {'expansionCount', 'ec'}}, | |||
sustained = {sustained = {'sus', 'sustained', 's', '1'}}, | |||
verbal = {verbal = {'ver', 'verbal', 'v', '1'}}, | |||
somatic = {somatic = {'som', 'somatic', 's', '1'}}, | |||
material = {material = {'mat', 'material', 'm', '1'}}, | |||
magelore = {magelore = {'mag', 'magelore', 'ml', '1'}}, | |||
invoked = {invoked = {'inv', 'invoked', 'i', '1'}}, | |||
class = { | |||
ber = {'ber'}, | |||
due = {'due'}, | |||
vet = {'vet'}, | |||
kni = {'kni'}, | |||
pal = {'pal'}, | |||
ass = {'ass'}, | |||
cor = {'cor'}, | |||
arc = {'arc'}, | |||
thi = {'thi'}, | |||
ran = {'ran'}, | |||
fla = {'fla'}, | |||
sto = {'sto'}, | |||
lif = {'lif'}, | |||
nec = {'nec'}, | |||
nat = {'nat'} | |||
} | |||
} | |||
} | |||
local tags = { | |||
verbal = { | |||
verbal = { | verbal = { | ||
' | text = 'Verbal', | ||
'verbal' | link = 'Verbal component abilities', | ||
}, | symbol = '🗣️', | ||
color = '#f9f06b', | |||
class = 'component-tagged verbal' | |||
} | |||
}, | |||
somatic = { | |||
somatic = { | somatic = { | ||
' | text = 'Somatic', | ||
'somatic' | link = 'Somatic component abilities', | ||
}, | symbol = '👐', | ||
material = { | color = '#f9f06b', | ||
' | class = 'component-tagged somatic' | ||
'material' | } | ||
}, | }, | ||
material = { | |||
material = { | |||
text = 'Material', | |||
link = 'Material component abilities', | |||
symbol = '💎', | |||
color = '#ff7800', | |||
class = 'component-tagged material' | |||
} | |||
}, | |||
magelore = { | |||
magelore = { | magelore = { | ||
' | text = 'Magelore', | ||
' | link = 'Magelore component abilities', | ||
' | symbol = '🔮', | ||
}, | color = '#f9f06b', | ||
class = 'component-tagged magelore' | |||
} | |||
}, | |||
invoked = { | |||
invoked = { | invoked = { | ||
' | text = 'Invoked', | ||
' | link = 'Invoked component abilities', | ||
symbol = '🪄', | |||
color = '#f9f06b', | |||
class = 'component-tagged invoked' | |||
} | |||
' | }, | ||
' | flaw = { | ||
flaw = { | |||
text = 'Flaw', | |||
} | link = 'Flaw abilities', | ||
symbol = '❌', | |||
color = '#e01b24', | |||
class = 'flaw-tagged flaw' | |||
} | |||
' | |||
} | |||
}, | }, | ||
special = { | |||
special = { | |||
text = 'Special', | |||
link = 'Special abilities', | |||
symbol = '✴️', | |||
color = '#9141AC', | |||
class = 'special-tagged special' | |||
} | |||
}, | |||
es = { | |||
es = { | |||
text = 'Elder Sorcery', | |||
link = 'Elder Sorcery abilities', | |||
symbol = '🌌', | |||
color = '#9141AC', | |||
class = 'elderSorcery-tagged elderSorcery' | |||
} | |||
}, | |||
warded = { | |||
warded = { | |||
text = 'Warded', | |||
link = 'Warded abilities', | |||
symbol = '🏮', | |||
color = '#f9f06b', | |||
class = 'warded-tagged warded' | |||
} | |||
}, | |||
elements = { | |||
life = { | |||
text = 'Life', | |||
link = 'Life element abilities', | |||
symbol = '☀️', | |||
color = '#ffffff', | |||
class = 'element-tagged life' | |||
}, | }, | ||
storm = { | |||
text = 'Storm', | |||
link = 'Storm element abilities', | |||
symbol = '💧', | |||
color = '#3584e4', | |||
class = 'element-tagged storm' | |||
}, | }, | ||
necro = { | |||
text = 'Necromancy', | |||
link = 'Necromancy element abilities', | |||
symbol = '💀', | |||
color = '#3d3846', | |||
class = 'element-tagged necromancy' | |||
}, | }, | ||
flame = { | |||
text = 'Flame', | |||
link = 'Flame element abilities', | |||
symbol = '🔥', | |||
color = '#e01b24', | |||
class = 'element-tagged flame' | |||
}, | }, | ||
nature = { | |||
text = 'Nature', | |||
link = 'Nature element abilities', | |||
symbol = '🌱', | |||
color = '#33d17a', | |||
class = 'element-tagged nature' | |||
} | |||
}, | |||
class = { | |||
ber = { | |||
text = 'Berserker', | |||
link = 'Berserker class abilities', | |||
symbol = '🪓', | |||
class = 'class-tagged berserker' | |||
}, | }, | ||
due = { | |||
text = 'Duelist', | |||
link = 'Duelist class abilities', | |||
symbol = '🤺', | |||
class = 'class-tagged duelist' | |||
}, | }, | ||
vet = { | |||
text = 'Veteran', | |||
link = 'Veteran class abilities', | |||
symbol = '🪖', | |||
class = 'class-tagged veteran' | |||
}, | }, | ||
kni = { | |||
text = 'Knight', | |||
link = 'Knight class abilities', | |||
symbol = '⚔️', | |||
class = 'class-tagged knight' | |||
}, | }, | ||
pal = { | |||
text = 'Paladin', | |||
link = 'Paladin class abilities', | |||
symbol = '🛡️', | |||
class = 'class-tagged paladin' | |||
}, | }, | ||
ass = { | |||
text = 'Assassin', | |||
link = 'Assassin class abilities', | |||
symbol = '🗡️', | |||
class = 'class-tagged assassin' | |||
}, | }, | ||
cor = { | |||
text = 'Corsair', | |||
link = 'Corsair class abilities', | |||
symbol = '🏴☠️', | |||
class = 'class-tagged corsair' | |||
}, | }, | ||
arc = { | |||
text = 'Archer', | |||
link = 'Archer class abilities', | |||
symbol = '🏹', | |||
class = 'class-tagged archer' | |||
}, | }, | ||
thi = { | |||
text = 'Thief', | |||
link = 'Thief class abilities', | |||
symbol = '💰️', | |||
class = 'class-tagged thief' | |||
}, | }, | ||
ran = { | |||
text = 'Ranger', | |||
link = 'Ranger class abilities', | |||
symbol = '🐾', | |||
class = 'class-tagged ranger' | |||
}, | }, | ||
fla = { | |||
text = 'Flame Mage', | |||
link = 'Flame Mage class abilities', | |||
symbol = '🧙', | |||
class = 'class-tagged flameMage' | |||
}, | }, | ||
sto = { | |||
text = 'Storm Mage', | |||
link = 'Storm Mage class abilities', | |||
symbol = '🧙', | |||
class = 'class-tagged stormMage' | |||
}, | }, | ||
lif = { | |||
text = 'Life Mage', | |||
link = 'Life Mage class abilities', | |||
symbol = '🧙', | |||
class = 'class-tagged lifeMage' | |||
}, | |||
nec = { | |||
}, | text = 'Necromancer', | ||
link = 'Necromancer class abilities', | |||
symbol = '🧙', | |||
class = 'class-tagged necromancer' | |||
}, | }, | ||
nat = { | |||
text = 'Nature Mage', | |||
link = 'Nature Mage class abilities', | |||
symbol = '🧙', | |||
class = 'class-tagged natureMage' | |||
} | |||
}, | |||
power = { | |||
divine = { | |||
text = 'Divine', | |||
link = 'Divinely powered abilities', | |||
symbol = '🪽', | |||
} | |||
} | |||
text = ' | |||
link = ' | |||
symbol = ' | |||
color = '#f9f06b', | color = '#f9f06b', | ||
class = ' | class = 'power-tagged divine' | ||
}, | }, | ||
magic = { | |||
text = 'Magical', | |||
link = 'Magically powered abilities', | |||
text = ' | symbol = '✨', | ||
link = ' | color = '#9141ac', | ||
symbol = ' | class = 'power-tagged magical' | ||
color = '# | }, | ||
class = ' | spirit = { | ||
text = 'Spiritual', | |||
link = 'Spiritually powered abilities', | |||
symbol = '🪭', | |||
color = '#9a9996', | |||
class = 'power-tagged spiritual' | |||
}, | }, | ||
martial = { | |||
text = 'Martial', | |||
link = 'Martially powered abilities', | |||
text = ' | symbol = '💪', | ||
link = ' | |||
symbol = ' | |||
color = '#ff7800', | color = '#ff7800', | ||
class = ' | class = 'power-tagged martial' | ||
}, | }, | ||
psionic = { | |||
text = 'Psionic', | |||
link = 'Psionically powered abilities', | |||
text = ' | symbol = '🤯', | ||
link = ' | color = '#3584e4', | ||
symbol = ' | class = 'power-tagged psionic' | ||
color = '# | |||
class = ' | |||
}, | }, | ||
primal = { | |||
text = 'Primal', | |||
link = 'Primally powered abilities', | |||
text = ' | symbol = '⛰️', | ||
link = ' | color = '#986a44', | ||
symbol = ' | class = 'power-tagged primal' | ||
color = '# | |||
class = ' | |||
}, | }, | ||
techo = { | |||
text = 'Technological', | |||
link = 'Technologically powered abilities', | |||
text = ' | symbol = '⚙️', | ||
link = ' | color = '#e01b24', | ||
symbol = ' | class = 'power-tagged technological' | ||
color = '# | }, | ||
class = ' | finance = { | ||
text = 'Financial', | |||
link = 'Financially powered abilities', | |||
symbol = '🪙', | |||
color = '#fcc200', | |||
class = 'power-tagged financial' | |||
}, | }, | ||
alchemy = { | |||
text = 'Alchemical', | |||
link = 'Alchemically powered abilities', | |||
symbol = '🧪', | |||
color = '#33d17a', | |||
class = 'power-tagged alchemical' | |||
text = ' | |||
link = ' | |||
symbol = ' | |||
color = '# | |||
class = ' | |||
}, | }, | ||
unknown = { | |||
text = 'Unknown', | |||
link = 'Unknown powered abilities', | |||
symbol = '❓', | |||
color = '#77767b', | |||
class = 'power-tagged unknown' | |||
} | |||
}, | }, | ||
category = { | |||
skill = { | |||
text = ' | text = 'Skill', | ||
link = ' | link = 'Skills', | ||
symbol = ' | symbol = '🤹', | ||
class = 'skill' | |||
class = ' | |||
}, | }, | ||
spell = { | |||
text = 'Spell', | |||
link = 'Spells', | |||
text = ' | symbol = '✨', | ||
link = ' | class = 'spell' | ||
symbol = ' | |||
class = ' | |||
}, | }, | ||
semblant = { | |||
text = ' | text = 'Semblant', | ||
link = ' | link = 'Semblant skills', | ||
symbol = ' | symbol = '🎭', | ||
class = 'standard-tagged semblant' | |||
class = ' | |||
}, | }, | ||
conjure = { | |||
text = ' | text = 'Conjured', | ||
link = ' | link = 'Conjured spells', | ||
symbol = ' | symbol = '🔮', | ||
class = 'standard-tagged conjure' | |||
class = ' | |||
}, | }, | ||
standard = { | |||
text = ' | text = 'Standard', | ||
link = ' | link = 'Standard abilities', | ||
symbol = ' | symbol = '🏁', | ||
class = 'standard-tagged normal' | |||
class = ' | |||
}, | }, | ||
rotator = { | |||
text = 'Rotator', | |||
link = 'Rotator abilities', | |||
symbol = '🔄', | |||
class = 'rotator' | |||
} | |||
}, | }, | ||
effects = { | |||
mental = { | |||
text = ' | text = 'Mental', | ||
link = ' | link = 'Mental effects', | ||
symbol = ' | symbol = '🧠', | ||
class = ' | class = 'effect-tagged mental' | ||
}, | |||
truth = { | |||
text = 'Truth detecting', | |||
link = 'Truth detecting effects', | |||
symbol = '⚖️', | |||
class = 'effect-tagged truthDetecting' | |||
}, | }, | ||
duelMod = { | |||
text = ' | text = 'Duel modifying', | ||
link = ' | link = 'Duel modifying effects', | ||
symbol = '🤺', | symbol = '🤺', | ||
class = ' | class = 'effect-tagged duelModifying' | ||
}, | }, | ||
movement = { | |||
text = ' | text = 'Movement', | ||
link = ' | link = 'Movement effects', | ||
symbol = ' | symbol = '👣', | ||
class = ' | class = 'effect-tagged movement' | ||
}, | }, | ||
poison = { | |||
text = ' | text = 'Poison', | ||
link = ' | link = 'Poison effects', | ||
symbol = ' | symbol = '☠️', | ||
class = ' | class = 'effect-tagged poison' | ||
}, | }, | ||
displacement = { | |||
text = ' | text = 'Displacement', | ||
link = ' | link = 'Displacement effects', | ||
symbol = ' | symbol = '🌀', | ||
class = ' | class = 'effect-tagged displacement' | ||
}, | }, | ||
transformation = { | |||
text = ' | text = 'Transformation', | ||
link = ' | link = 'Transformation effects', | ||
symbol = ' | symbol = '🌳', | ||
class = ' | class = 'effect-tagged transformation' | ||
}, | }, | ||
control = { | |||
text = ' | text = 'Control', | ||
link = ' | link = 'Control effects', | ||
symbol = ' | symbol = '⛓️', | ||
class = ' | class = 'effect-tagged control' | ||
}, | }, | ||
resist = { | |||
text = ' | text = 'Resistance', | ||
link = ' | link = 'Resistance effects', | ||
symbol = ' | symbol = '🚫', | ||
class = ' | class = 'effect-tagged resistance' | ||
}, | }, | ||
awaken = { | |||
text = ' | text = 'Awakening', | ||
link = ' | link = 'Awakening effects', | ||
symbol = ' | symbol = '🌞', | ||
class = ' | class = 'effect-tagged awakening' | ||
}, | }, | ||
immune = { | |||
text = ' | text = 'Immunity', | ||
link = ' | link = 'Immunity effects', | ||
symbol = ' | symbol = '🚫', | ||
class = ' | class = 'effect-tagged immunity' | ||
}, | }, | ||
long = { | |||
text = ' | text = 'Long range', | ||
link = ' | link = 'Long range effects', | ||
symbol = ' | symbol = '📏', | ||
class = ' | class = 'effect-tagged longRange' | ||
}, | }, | ||
sense = { | |||
text = ' | text = 'Sensory', | ||
link = ' | link = 'Sensory effects', | ||
symbol = ' | symbol = '👁️', | ||
class = ' | class = 'effect-tagged sensory' | ||
}, | }, | ||
revive = { | |||
text = ' | text = 'Revival', | ||
link = ' | link = 'Revival effects', | ||
symbol = ' | symbol = '🤍', | ||
class = ' | class = 'effect-tagged revival' | ||
}, | }, | ||
summon = { | |||
text = ' | text = 'Summoning', | ||
link = ' | link = 'Summoning effects', | ||
symbol = ' | symbol = '🖤', | ||
class = ' | class = 'effect-tagged summoning' | ||
}, | }, | ||
heal = { | |||
text = ' | text = 'Healing', | ||
link = ' | link = 'Healing effects', | ||
symbol = ' | symbol = '❤️', | ||
class = ' | class = 'effect-tagged healing' | ||
}, | }, | ||
reanimate = { | |||
text = 'Reanimation', | |||
link = 'Reanimation effects', | |||
text = ' | symbol = '🩶', | ||
link = ' | class = 'effect-tagged reanimation' | ||
symbol = ' | |||
class = ' | |||
}, | }, | ||
regenerate = { | |||
text = ' | text = 'Regeneration', | ||
link = ' | link = 'Regeneration effects', | ||
symbol = ' | symbol = '💚', | ||
class = 'effect-tagged regeneration' | |||
class = ' | |||
}, | }, | ||
revitalize = { | |||
text = ' | text = 'Revitalization', | ||
link = ' | link = 'Revitalization effects', | ||
symbol = ' | symbol = '🩵', | ||
class = 'effect-tagged revitalization' | |||
class = ' | |||
}, | }, | ||
kill = { | |||
text = ' | text = 'Killing', | ||
link = ' | link = 'Killing effects', | ||
symbol = ' | symbol = '☠️', | ||
class = 'effect-tagged killing' | |||
class = ' | |||
}, | }, | ||
damage = { | |||
text = ' | text = 'Damaging', | ||
link = ' | link = 'Damaging effects', | ||
symbol = ' | symbol = '💢', | ||
class = 'effect-tagged damaging' | |||
class = ' | |||
}, | }, | ||
steal = { | |||
text = ' | text = 'Stealing', | ||
link = ' | link = 'Stealing effects', | ||
symbol = ' | symbol = '💰', | ||
class = 'effect-tagged stealing' | |||
class = ' | |||
}, | }, | ||
loud = { | |||
text = ' | text = 'Loud', | ||
link = ' | link = 'Loud effects', | ||
symbol = ' | symbol = '🔊', | ||
class = 'effect-tagged loud' | |||
class = ' | |||
}, | }, | ||
knockout = { | |||
text = ' | text = 'Knockout', | ||
link = ' | link = 'Knockout effects', | ||
symbol = ' | symbol = '💤', | ||
class = 'effect-tagged knockout' | |||
class = ' | |||
}, | }, | ||
time = { | |||
text = ' | text = 'Temporal', | ||
link = ' | link = 'Temporal effects', | ||
symbol = ' | symbol = '🕰️', | ||
class = 'effect-tagged temporal' | |||
class = ' | } | ||
}, | |||
pre = { | |||
strike = { | |||
text = 'Strike', | |||
link = 'Strike delivery abilities', | |||
symbol = '⚔️', | |||
class = 'deliveryPackage-tagged strike' | |||
}, | }, | ||
ray = { | |||
text = ' | text = 'Ray', | ||
link = ' | link = 'Ray delivery abilities', | ||
symbol = ' | symbol = '⚡️', | ||
class = 'deliveryPackage-tagged ray' | |||
class = ' | |||
}, | }, | ||
ball = { | |||
text = 'Ball', | |||
link = 'Ball delivery abilities', | |||
text = ' | symbol = '🔥', | ||
link = ' | class = 'deliveryPackage-tagged ball' | ||
symbol = ' | |||
class = ' | |||
}, | }, | ||
aura = { | |||
text = ' | text = 'Aura', | ||
link = ' | link = 'Aura delivery abilities', | ||
symbol = ' | symbol = '🌟', | ||
class = ' | class = 'deliveryPackage-tagged aura' | ||
}, | }, | ||
ritual = { | |||
text = ' | text = 'Ritual', | ||
link = ' | link = 'Ritual delivery abilities', | ||
symbol = ' | symbol = '🕯️', | ||
class = ' | class = 'deliveryPackage-tagged ritual' | ||
}, | }, | ||
touch = { | |||
text = ' | text = 'Touch', | ||
link = ' | link = 'Touch delivery abilities', | ||
symbol = ' | symbol = '👉️', | ||
class = ' | class = 'deliveryPackage-tagged touch' | ||
} | |||
}, | |||
maneuver = { | |||
active = { | |||
text = 'Active', | |||
link = 'Active abilities', | |||
symbol = '➡️', | |||
class = 'maneuver-tagged active' | |||
}, | }, | ||
reactive = { | |||
text = ' | text = 'Reactive', | ||
link = ' | link = 'Reactive abilities', | ||
symbol = ' | symbol = '↩️', | ||
class = ' | class = 'maneuver-tagged reactive' | ||
}, | }, | ||
passive = { | |||
text = ' | text = 'Passive', | ||
link = ' | link = 'Passive abilities', | ||
symbol = ' | symbol = '🔁', | ||
class = ' | class = 'maneuver-tagged passive' | ||
}, | }, | ||
slow = { | |||
text = 'Slow', | |||
link = 'Slow abilities', | |||
symbol = '🐢', | |||
class = 'maneuver-tagged slow' | |||
} | |||
}, | }, | ||
interaction = { | |||
attack = { | |||
text = ' | text = 'Attack', | ||
link = ' | link = 'Attack abilities', | ||
symbol = ' | symbol = '⚔️', | ||
class = ' | color = '#ff7800', | ||
class = 'interaction-tagged attack' | |||
}, | }, | ||
block = { | |||
text = ' | text = 'Block', | ||
link = ' | link = 'Block abilities', | ||
symbol = ' | symbol = '🛡️', | ||
class = ' | color = '#ff7800', | ||
class = 'interaction-tagged block' | |||
}, | }, | ||
manifest = { | |||
text = ' | text = 'Manifest', | ||
link = ' | link = 'Manifest abilities', | ||
symbol = ' | symbol = '✳️', | ||
class = ' | color = '#ff7800', | ||
class = 'interaction-tagged manifest' | |||
}, | }, | ||
feat = { | |||
text = ' | text = 'Feat', | ||
link = ' | link = 'Feat abilities', | ||
symbol = ' | symbol = '🎖️', | ||
class = ' | color = '#ff7800', | ||
class = 'interaction-tagged feat' | |||
} | |||
}, | |||
delivery = { | |||
self = { | |||
text = 'Self', | |||
link = 'Self delivery abilities', | |||
symbol = '🤲', | |||
color = '#f6d32d', | |||
class = 'delivery-tagged self' | |||
}, | }, | ||
missile = { | |||
text = ' | text = 'Missile', | ||
link = ' | link = 'Missile delivery abilities', | ||
symbol = ' | symbol = '🏹', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged missile' | |||
}, | }, | ||
hand = { | |||
text = ' | text = 'Hand', | ||
link = ' | link = 'Hand delivery abilities', | ||
symbol = ' | symbol = '🤚', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged hand' | |||
}, | }, | ||
bite = { | |||
text = ' | text = 'Bite', | ||
link = ' | link = 'Bite delivery abilities', | ||
symbol = ' | symbol = '🦷', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged bite' | |||
}, | }, | ||
item = { | |||
text = ' | text = 'Item', | ||
link = ' | link = 'Item delivery abilities', | ||
symbol = ' | symbol = '📦', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged item' | |||
}, | }, | ||
magelore = { | |||
text = ' | text = 'Magelore', | ||
link = ' | link = 'Magelore delivery abilities', | ||
symbol = ' | symbol = '🔮', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged magelore' | |||
}, | }, | ||
weapon = { | |||
text = ' | text = 'Weapon', | ||
link = ' | link = 'Weapon delivery abilities', | ||
symbol = ' | symbol = '🗡️', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged weapon' | |||
}, | }, | ||
shield = { | |||
text = ' | text = 'Shield', | ||
link = ' | link = 'Shield delivery abilities', | ||
symbol = ' | symbol = '🛡️', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged shield' | |||
}, | }, | ||
armor = { | |||
text = ' | text = 'Armor', | ||
link = ' | link = 'Armor delivery abilities', | ||
symbol = ' | symbol = '🪖', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged armor' | |||
}, | }, | ||
sight = { | |||
text = ' | text = 'Sight', | ||
link = ' | link = 'Sight delivery abilities', | ||
symbol = '👁️', | symbol = '👁️', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged sight' | |||
}, | }, | ||
aura = { | |||
text = ' | text = 'Aura', | ||
link = ' | link = 'Aura delivery abilities', | ||
symbol = ' | symbol = '🌟', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged aura' | |||
}, | }, | ||
cone = { | |||
text = ' | text = 'Cone', | ||
link = ' | link = 'Cone delivery abilities', | ||
symbol = ' | symbol = '🐲', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged cone' | |||
}, | }, | ||
other = { | |||
text = ' | text = 'Other', | ||
link = ' | link = 'Other delivery abilities', | ||
symbol = ' | symbol = '❓', | ||
class = ' | color = '#f6d32d', | ||
class = 'delivery-tagged other' | |||
} | |||
}, | |||
target = { | |||
self = { | |||
text = 'Self', | |||
link = 'Self target abilities', | |||
symbol = '🤲', | |||
color = '#f6d32d', | |||
class = 'target-tagged self' | |||
}, | }, | ||
creature = { | |||
text = ' | text = 'Creature', | ||
link = ' | link = 'Creature target abilities', | ||
symbol = ' | symbol = '👤', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged creature' | |||
}, | }, | ||
body = { | |||
text = ' | text = 'Body', | ||
link = ' | link = 'Body target abilities', | ||
symbol = ' | symbol = '🧍', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged body' | |||
}, | }, | ||
vitals = { | |||
text = ' | text = 'Vitals', | ||
link = ' | link = 'Vitals target abilities', | ||
symbol = ' | symbol = '🫀', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged vitals' | |||
}, | }, | ||
limb = { | |||
text = ' | text = 'Limb', | ||
link = ' | link = 'Limb target abilities', | ||
symbol = ' | symbol = '🦾', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged limb' | |||
}, | }, | ||
arm = { | |||
text = ' | text = 'Arm', | ||
link = ' | link = 'Arm target abilities', | ||
symbol = ' | symbol = '💪', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged arm' | |||
}, | }, | ||
leg = { | |||
text = ' | text = 'Leg', | ||
link = ' | link = 'Leg target abilities', | ||
symbol = ' | symbol = '🦵', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged leg' | |||
}, | }, | ||
item = { | |||
text = ' | text = 'Item', | ||
link = ' | link = 'Item target abilities', | ||
symbol = ' | symbol = '📦', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged item' | |||
}, | }, | ||
weapon = { | |||
text = ' | text = 'Weapon', | ||
link = ' | link = 'Weapon target abilities', | ||
symbol = ' | symbol = '🗡️', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged weapon' | |||
}, | }, | ||
shield = { | |||
text = ' | text = 'Shield', | ||
link = ' | link = 'Shield target abilities', | ||
symbol = ' | symbol = '🛡️', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged shield' | |||
}, | }, | ||
armor = { | |||
text = 'Armor', | |||
link = 'Armor target abilities', | |||
text = ' | symbol = '🪖', | ||
link = ' | color = '#f6d32d', | ||
symbol = ' | class = 'target-tagged armor' | ||
class = ' | |||
}, | }, | ||
ship = { | |||
text = ' | text = 'Ship', | ||
link = ' | link = 'Ship target abilities', | ||
symbol = ' | symbol = '⛵️', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged ship' | |||
}, | }, | ||
attack = { | |||
text = ' | text = 'Attack', | ||
link = ' | link = 'Attack target abilities', | ||
symbol = ' | symbol = '⚔️', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged attack' | |||
}, | }, | ||
ability = { | |||
text = ' | text = 'Ability', | ||
link = ' | link = 'Ability target abilities', | ||
symbol = ' | symbol = '🅰', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged ability' | |||
}, | }, | ||
spell = { | |||
text = ' | text = 'Spell', | ||
link = ' | link = 'Spell target abilities', | ||
symbol = ' | symbol = '💫', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged spell' | |||
}, | |||
other = { | |||
text = 'Other', | |||
link = 'Other target abilities', | |||
symbol = '❓', | |||
color = '#f6d32d', | |||
class = 'target-tagged other' | |||
}, | }, | ||
area = { | |||
text = ' | text = 'Area', | ||
link = ' | link = 'Area target abilities', | ||
symbol = ' | symbol = '🏕️', | ||
class = ' | color = '#f6d32d', | ||
class = 'target-tagged area' | |||
}, | }, | ||
ci = {tags = {'creature', 'item'}}, | |||
ai = {tags = {'attack', 'item'}}, | |||
aci = {tags = {'area', 'creature', 'item'}}, | |||
ac = {tags = {'area', 'creature'}}, | |||
al = {tags = {'arm', 'leg'}}, | |||
cs = {tags = {'creature', 'self'}} | |||
}, | }, | ||
upgrade = { | |||
warded = { | |||
text = ' | text = 'Warded', | ||
link = ' | link = 'Warded abilities', | ||
class = 'upgrade-tagged warded' | |||
class = ' | |||
}, | }, | ||
absolute = { | |||
text = ' | text = 'Absolute', | ||
link = ' | link = 'Absolute abilities', | ||
symbol = ' | class = 'upgrade-tagged absolute' | ||
class = ' | } | ||
}, | |||
executionTime = { | |||
freeAction = { | |||
text = 'Free action', | |||
symbol = '0️⃣', | |||
link = 'Free action abilities', | |||
class = 'executionTime-tagged a0' | |||
}, | }, | ||
singleAction = { | |||
text = ' | text = 'Single action', | ||
symbol = '1️⃣', | |||
link = 'Single action abilities', | |||
class = ' | class = 'executionTime-tagged a1' | ||
}, | }, | ||
doubleAction = { | |||
text = ' | text = 'Double action', | ||
symbol = '2️⃣', | |||
link = 'Double action abilities', | |||
class = ' | class = 'executionTime-tagged a2' | ||
}, | }, | ||
tripleAction = { | |||
text = 'Triple action', | |||
symbol = '3️⃣', | |||
text = ' | link = 'Triple action abilities', | ||
class = 'executionTime-tagged a3' | |||
symbol = ' | |||
class = ' | |||
}, | }, | ||
freeReaction = { | |||
text = ' | text = 'Free reaction', | ||
link = ' | symbol = '0️⃣', | ||
symbol = ' | link = 'Free reaction abilities', | ||
class = 'executionTime-tagged r0' | |||
class = ' | }, | ||
reaction = { | |||
text = 'Reaction', | |||
symbol = '1️⃣', | |||
link = 'Reaction abilities', | |||
class = 'executionTime-tagged r1' | |||
}, | }, | ||
shortRest = { | |||
text = ' | text = 'Short rest', | ||
symbol = '🌙', | |||
symbol = ' | link = 'Short rest abilities', | ||
class = 'executionTime-tagged shortRest' | |||
class = ' | |||
}, | }, | ||
longRest = { | |||
text = ' | text = 'Long rest', | ||
symbol = '🌙', | |||
symbol = ' | link = 'Long rest abilities', | ||
class = 'executionTime-tagged longRest' | |||
class = ' | } | ||
} | }, | ||
}, | piercing = { | ||
av0 = { | |||
text = 'AV0', | |||
text = ' | symbol = '🎯', | ||
link = 'AV0 abilities', | |||
color = '#33d17a', | |||
color = '# | class = 'piercing-tagged av0' | ||
class = ' | |||
}, | }, | ||
unblockable = { | |||
text = ' | text = 'UB', | ||
symbol = '🪨', | |||
link = 'UB abilities', | |||
color = '# | color = '#33d17a', | ||
class = ' | class = 'piercing-tagged ub' | ||
} | |||
}, | |||
duration = { | |||
instant = { | |||
text = 'Instant', | |||
link = 'Instant duration abilities', | |||
no = true | |||
}, | }, | ||
always = { | |||
text = ' | text = 'Always active', | ||
link = ' | link = 'Always active duration abilities', | ||
no = true | |||
}, | }, | ||
noLimit = { | |||
text = ' | text = 'No limit', | ||
link = ' | link = 'No limit duration abilities', | ||
no = true | |||
}, | }, | ||
whileUp = { | |||
text = ' | text = 'While up', | ||
link = ' | link = 'While up duration abilities', | ||
no = true | |||
}, | }, | ||
whileDown = { | |||
text = ' | text = 'While down', | ||
link = ' | link = 'While down duration abilities', | ||
no = true | |||
}, | }, | ||
whileAlive = { | |||
text = ' | text = 'While alive', | ||
link = ' | link = 'While alive duration abilities', | ||
no = true | |||
}, | }, | ||
whileDead = { | |||
text = ' | text = 'While dead', | ||
link = ' | link = 'While dead duration abilities', | ||
no = true | |||
}, | }, | ||
endOfTurn = { | |||
text = ' | text = 'Until the end of the turn', | ||
link = ' | link = 'Until end of turn duration abilities', | ||
no = true | |||
}, | }, | ||
dawn = { | |||
text = ' | text = 'Until dawn', | ||
link = ' | link = 'Until dawn duration abilities', | ||
no = true | |||
}, | }, | ||
startOfTargetNextTurn = { | |||
text = ' | text = 'Until the start of target\'s next turn', | ||
link = ' | link = 'Until start of target\'s next turn duration abilities', | ||
no = true | |||
}, | |||
endOfTargetNextTurn = { | |||
text = 'Until the end of target\'s next turn', | |||
link = 'Until end of target\'s next turn duration abilities', | |||
no = true | |||
}, | }, | ||
startOfYourNextTurn = { | |||
text = ' | text = 'Until the start of your next turn', | ||
link = ' | link = 'Until start of your next turn duration abilities', | ||
no = true | |||
}, | }, | ||
endOfYourNextTurn = { | |||
text = ' | text = 'Until the end of your next turn', | ||
link = ' | link = 'Until end of your next turn duration abilities', | ||
no = true | |||
}, | |||
endOfCombat = { | |||
text = 'Until the end of combat', | |||
link = 'Until end of combat duration abilities', | |||
no = true | |||
} | } | ||
}, | }, | ||
range = { | |||
melee = { | |||
text = ' | text = 'Your melee range', | ||
link = ' | -- link = 'Melee abilities', | ||
no = true | |||
}, | }, | ||
weapon = { | |||
text = ' | text = 'Your weapon\'s range', | ||
link = ' | -- link = 'Weapon range abilities', | ||
no = true | |||
}, | }, | ||
hand = { | |||
text = ' | text = 'Your hand\'s range', | ||
link = ' | -- link = 'Hand range abilities', | ||
no = true | |||
}, | }, | ||
bite = { | |||
text = ' | text = 'Your bite\'s range', | ||
link = ' | -- link = 'Bite range abilities', | ||
no = true | |||
}, | }, | ||
item = { | |||
text = ' | text = 'Your item\'s range', | ||
link = ' | -- link = 'Item range abilities', | ||
no = true | |||
}, | }, | ||
shield = { | |||
text = ' | text = 'Your shield\'s range', | ||
link = ' | -- link = 'Shield range abilities', | ||
no = true | |||
}, | }, | ||
armor = { | |||
text = ' | text = 'Your armor\'s range', | ||
link = ' | -- link = 'Armor range abilities', | ||
symbol = ' | no = true | ||
} | |||
class = ' | }, | ||
attribute = { | |||
int = { | |||
text = 'Intelligence', | |||
symbol = 'INT', | |||
link = 'INT save abilities', | |||
class = 'saveAttribute-tagged int' | |||
}, | }, | ||
str = { | |||
text = ' | text = 'Strength', | ||
symbol = 'STR', | |||
symbol = ' | link = 'STR save abilities', | ||
class = 'saveAttribute-tagged str' | |||
class = ' | |||
}, | }, | ||
mov = { | |||
text = ' | text = 'Movement', | ||
symbol = 'MOV', | |||
symbol = ' | link = 'MOV save abilities', | ||
class = 'saveAttribute-tagged mov' | |||
class = ' | |||
}, | }, | ||
per = { | |||
text = ' | text = 'Perception', | ||
symbol = 'PER', | |||
symbol = ' | link = 'PER save abilities', | ||
class = 'saveAttribute-tagged per' | |||
class = ' | |||
}, | }, | ||
snk = { | |||
text = ' | text = 'Sneak', | ||
symbol = 'SNK', | |||
symbol = ' | link = 'SNK save abilities', | ||
class = 'saveAttribute-tagged snk' | |||
class = ' | |||
}, | }, | ||
unp = { | |||
text = ' | text = 'Unused Presence', | ||
symbol = 'UNP', | |||
symbol = ' | link = 'UNP save abilities', | ||
class = 'saveAttribute-tagged unp' | |||
class = ' | } | ||
}, | }, | ||
expansionAttribute = { | |||
text = ' | int = { | ||
text = 'Intelligence', | |||
symbol = ' | symbol = 'INT', | ||
link = 'INT save abilities', | |||
class = ' | class = 'expansionAttribute-tagged int' | ||
}, | }, | ||
str = { | |||
text = 'Strength', | |||
symbol = 'STR', | |||
link = 'STR save abilities', | |||
class = 'expansionAttribute-tagged str' | |||
class = ' | |||
}, | }, | ||
mov = { | |||
text = ' | text = 'Movement', | ||
symbol = 'MOV', | |||
symbol = ' | link = 'MOV save abilities', | ||
class = 'expansionAttribute-tagged mov' | |||
class = ' | |||
}, | }, | ||
per = { | |||
text = ' | text = 'Perception', | ||
symbol = 'PER', | |||
symbol = ' | link = 'PER save abilities', | ||
class = 'expansionAttribute-tagged per' | |||
class = ' | |||
}, | }, | ||
snk = { | |||
text = ' | text = 'Sneak', | ||
symbol = 'SNK', | |||
symbol = ' | link = 'SNK save abilities', | ||
class = 'expansionAttribute-tagged snk' | |||
class = ' | |||
}, | }, | ||
unp = { | |||
text = 'Unused Presence', | |||
symbol = 'UNP', | |||
link = 'UNP save abilities', | |||
class = 'expansionAttribute-tagged unp' | |||
} | |||
}, | |||
expansion = { | |||
detonate = { | |||
text = 'Detonate', | |||
symbol = '💥', | |||
link = 'Detonate expansion abilities', | |||
class = 'expansion-tagged detonate' | |||
}, | }, | ||
ripple = { | |||
text = 'Ripple', | |||
symbol = '🌊', | |||
link = 'Ripple expansion abilities', | |||
class = 'expansion-tagged ripple' | |||
}, | }, | ||
cascade = { | |||
text = 'Cascade', | |||
symbol = '➰', | |||
link = 'Cascade expansion abilities', | |||
class = 'expansion-tagged cascade' | |||
}, | }, | ||
fork = { | |||
text = 'Fork', | |||
symbol = '🔱', | |||
link = 'Fork expansion abilities', | |||
class = 'expansion-tagged fork' | |||
} | |||
}, | }, | ||
sustained = { | |||
sustained = { | |||
text = ' | text = 'Sustained', | ||
symbol = '⏳️', | |||
link = 'Sustained abilities', | |||
class = 'sustained' | |||
link = ' | |||
class = ' | |||
} | } | ||
} | |||
} | |||
local premades = { | |||
strike = { | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'attack', | |||
delivery = 'weapon', | |||
target = 'creature', | |||
duration = 'instant', | |||
range = 'weapon' | |||
}, | }, | ||
ray = { | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'attack', | |||
delivery = 'missile', | |||
target = 'creature', | |||
duration = 'instant', | |||
range = '60f', | |||
piercing = 'av0' | |||
}, | |||
ball = { | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'attack', | |||
delivery = 'missile', | |||
target = 'creature', | |||
duration = 'instant', | |||
range = '30f', | |||
piercing = 'ub' | |||
}, | |||
aura = { | |||
skip = true, | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'feat', | |||
delivery = 'aura', | |||
target = 'creature', | |||
duration = 'instant', | |||
range = '10f', | |||
attribute = 'mov' | |||
}, | |||
ritual = { | |||
maneuver = 'slow', | |||
executionTime = '10m', | |||
interaction = 'manifest', | |||
delivery = 'sight', | |||
target = 'creature', | |||
duration = 'instant', | |||
range = '5f' | |||
}, | }, | ||
touch = { | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'attack', | |||
delivery = 'hand', | |||
target = 'creature', | |||
duration = 'instant', | |||
range = 'hand', | |||
piercing = 'ub' | |||
}, | |||
triumph = { | |||
skip = true, | |||
maneuver = 'reactive', | |||
executionTime = '0r', | |||
interaction = 'manifest', | |||
delivery = 'self', | |||
target = 'self', | |||
duration = 'instant', | |||
range = 'self' | |||
}, | }, | ||
self = { | |||
skip = true, | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'man', | |||
delivery = 'self', | |||
target = 'self', | |||
duration = 'instant', | |||
range = 'self' | |||
}, | |||
passive = { | |||
skip = true, | |||
maneuver = 'passive', | |||
interaction = 'man', | |||
delivery = 'self', | |||
target = 'self', | |||
duration = '4', | |||
range = 'self' | |||
}, | |||
crown = { | |||
skip = true, | |||
maneuver = 'active', | |||
executionTime = '1a', | |||
interaction = 'man', | |||
delivery = 'self', | |||
target = 'self', | |||
duration = '8h', | |||
range = 'self', | |||
sustained = 'sus' | |||
} | |||
} | |||
function noPlural(word) | |||
-- Common irregular plural forms | |||
local irregulars = { | |||
["children"] = "child", | |||
["men"] = "man", | |||
["women"] = "woman", | |||
["feet"] = "foot", | |||
["teeth"] = "tooth", | |||
["mice"] = "mouse", | |||
["geese"] = "goose" | |||
} | |||
-- Check for irregular forms | |||
if irregulars[word] then return irregulars[word] end | |||
-- Regular pluralization rules | |||
if word:match("ies$") then | |||
-- Change words ending in 'ies' to 'y' (e.g., "parties" -> "party") | |||
return word:sub(1, -4) .. "y" | |||
elseif word:match("ves$") then | |||
-- Change words ending in 'ves' to 'f' or 'fe' (e.g., "wolves" -> "wolf") | |||
return word:sub(1, -4) .. "f" | |||
elseif word:match("s$") and not word:match("ss$") then | |||
-- Remove trailing 's' (e.g., "cats" -> "cat", but keep "boss") | |||
return word:sub(1, -2) | |||
else | |||
-- Return the word unchanged if no pluralization rule applies | |||
return word | |||
end | |||
end | |||
local function addCategory(category, key, val, skill, spell, addCats, noLower) | |||
if addCats then | |||
if not noLower then category = category:lower() end | |||
if tags[key] and tags[key][val] then | |||
if tags[key][val].tags then | |||
out = '' | |||
for _, t in ipairs(tags[key][val].tags) do | |||
out = out .. | |||
addCategory(category, key, t, skill, spell, | |||
addCats, true) | |||
end | |||
return out | |||
else | |||
category = tags[key][val].link | |||
end | |||
end | |||
if skill then | |||
skillCategory = category:gsub('ability', 'skill'):gsub('abilities', | |||
'skills') | |||
skillCategory = skillCategory:gsub("^%l", string.upper) | |||
end | |||
if spell then | |||
spellCategory = category:gsub('ability', 'spell'):gsub('abilities', | |||
'spells') | |||
spellCategory = spellCategory:gsub("^%l", string.upper) | |||
end | |||
category = category:gsub("^%l", string.upper) | |||
local c = '[[Category:' .. tostring(category) .. ']]' | |||
if skill then | |||
c = c .. '[[Category:' .. tostring(skillCategory) .. ']]' | |||
end | |||
if spell then | |||
c = c .. '[[Category:' .. tostring(spellCategory) .. ']]' | |||
end | |||
return c | |||
else | |||
return '' | |||
end | |||
} | end | ||
local function makeTag(frame, key, value, makeCat, transparent) | |||
if not tags[key] or not tags[key][value] then | |||
if value then | |||
local out = | |||
} | frame:preprocess("{{ucfirst:" .. tostring(value) .. "}}") | ||
if not ('.' == out:sub(-1)) then out = out .. '.' end | |||
return out | |||
else | |||
return '' | |||
end | |||
end | |||
local tag = tags[key][value] | |||
if tag.no then | |||
local out = frame:preprocess("{{ucfirst:" .. tag.text .. "}}") | |||
if not ('.' == out:sub(-1)) then out = out .. '.' end | |||
return out | |||
end | |||
if tag.tags then | |||
local out = '' | |||
for _, t in ipairs(tag.tags) do | |||
out = out .. makeTag(frame, key, t, makeCat, transparent) | |||
end | |||
return out | |||
end | |||
local tagText = "{{Tag|{{ucfirst:" .. tag.text .. "}}" | |||
if tag.symbol then tagText = tagText .. "|" .. tag.symbol end | |||
if tag.link then | |||
tagText = tagText .. "|l=:Category:{{ucfirst:" .. tag.link .. "}}" | |||
end | |||
if tag.color then tagText = tagText .. "|c=" .. tag.color end | |||
if tag.class then tagText = tagText .. "|class=" .. tag.class end | |||
if transparent then tagText = tagText .. "|o=1" end | |||
tagText = tagText .. "}}" | |||
-- out = frame:preprocess(tagText) | |||
out = tagText | |||
return out | |||
end | |||
local function makeContent(frame, table, keys, makeCat) | |||
local content = '' | |||
local subContent = '' | |||
local hasPre = false | |||
for _, key in ipairs(keys) do | |||
if ('pre' == key and table['pre']) or | |||
('executionTime' == key and table['executionTime']) or | |||
('target' == key) or ('duration' == key) or | |||
('invoked' == key and table['invoked']) then | |||
hasPre = true | |||
content = content .. | |||
frame:preprocess( | |||
makeTag(frame, key, table[key], makeCat)) | |||
else | |||
if hasPre then | |||
subContent = subContent .. | |||
makeTag(frame, key, table[key], makeCat) | |||
else | |||
content = content .. | |||
frame:preprocess( | |||
makeTag(frame, key, table[key], makeCat)) | |||
end | |||
end | |||
end | |||
if hasPre then | |||
content = content .. frame:preprocess('{{TagSub|' .. subContent .. '}}') | |||
-- content = content .. '{{TagSub|' .. subContent .. '}}' | |||
end | |||
if content == '' then | |||
for _, key in ipairs(keys) do | |||
if table[key] then | |||
content = frame:preprocess( | |||
'{{ucfirst:' .. content .. table[key] .. '}}') | |||
end | |||
end | |||
end | |||
return content | |||
end | |||
local function makeBar(frame, title, content, link, flags, bottom) | |||
if content == '' then return '' end | |||
local barSpace = mw.html.create('span') | |||
barSpace:wikitext(frame:preprocess(' ')):css('display', 'none') | |||
local barTitle = mw.html.create('span') | |||
local barTitleClass = "{{lc:" .. title .. "}}" | |||
barTitleClass = barTitleClass:gsub(' ', '-') | |||
barTitleClass = barTitleClass:gsub('\'', '') | |||
barTitleClass = barTitleClass:gsub('\"', '') | |||
local barText = "{{ucfirst:" .. title .. "}}" | |||
if link then barText = "[[" .. link .. "|" .. barText .. "]]" end | |||
barText = barText .. ":" | |||
barTitle:addClass('ability-bar-title'):wikitext(frame:preprocess(barText)) | |||
:css('font-weight', 'bold'):css('margin-right', '0.5em') | |||
local barContent = mw.html.create('span') | |||
barContent:addClass('ability-bar-content'):wikitext(content) | |||
local output = mw.html.create('div') | |||
if bottom then output = mw.html.create('span') end | |||
if not flags then flags = {} end | |||
for k, v in pairs(flags) do | |||
if type(v) == 'string' then | |||
output:addClass('flag-' .. k .. '-' .. v) | |||
end | |||
end | |||
output:addClass('ability-bar'):addClass('ability-bar-' .. barTitleClass) | |||
:attr(flags):attr('test', 'out'):node(barSpace):node(barTitle):node( | |||
barSpace):node(barContent):css('display', 'block') | |||
-- if flags then | |||
-- for k, v in ipairs(flags) do | |||
-- output:attr(k, v) | |||
-- end | |||
-- end | |||
return tostring(output) | |||
end | |||
local function nonempty(v) | |||
if v == nil then return false end | |||
if type(v) ~= 'string' then return true end | |||
} | return mw.text.trim(v) ~= '' | ||
end | |||
local function resolveAlias(args, aliases) | |||
local resolved = {} | |||
-- Resolve keys | |||
for canonicalKey, keyAliasList in pairs(aliases.keys) do | |||
for _, alias in ipairs(keyAliasList) do | |||
local v = args[alias] | |||
if nonempty(v) then | |||
resolved[canonicalKey] = v | |||
break | |||
end | |||
end | |||
end | |||
-- Resolve values | |||
for canonicalKey, canonicalValueTable in pairs(aliases.values) do | |||
local rawValue = resolved[canonicalKey] | |||
-- Treat empty/whitespace as false | |||
if rawValue ~= nil and not nonempty(rawValue) then | |||
resolved[canonicalKey] = false | |||
elseif rawValue ~= nil then | |||
for canonicalValue, valueAliasList in pairs(canonicalValueTable) do | |||
for _, alias in ipairs(valueAliasList) do | |||
if rawValue == alias then | |||
resolved[canonicalKey] = canonicalValue | |||
break | |||
elseif type(valueAliasList) == "table" and valueAliasList[1] and | |||
type(rawValue) == "string" and | |||
rawValue:match(valueAliasList[1]) then | |||
-- (keep your existing time/range parsing here unchanged) | |||
if canonicalKey == "duration" or canonicalKey == | |||
"executionTime" then | |||
local num = tonumber(rawValue:match("^(%d+)")) | |||
local unit = rawValue:match("[%a]+$") | |||
local unitMap = { | |||
m = "minute", | |||
h = "hour", | |||
d = "day", | |||
w = "week", | |||
y = "year", | |||
r = "round", | |||
s = "second" | |||
} | |||
resolved[canonicalKey] = unitMap[unit] and | |||
(num .. " " .. | |||
unitMap[unit] .. | |||
(num > 1 and "s" or | |||
"")) or | |||
rawValue | |||
elseif canonicalKey == "range" or canonicalKey == | |||
"expansionRange" then | |||
local num = tonumber(rawValue:match("^(%d+)")) | |||
local unit = rawValue:match("[%a]+$") | |||
local unitMap = {f = "feet", m = "miles"} | |||
resolved[canonicalKey] = unitMap[unit] and | |||
(num .. " " .. | |||
unitMap[unit]) or | |||
rawValue | |||
end | |||
end | |||
end | |||
end | |||
end | |||
end | |||
return resolved | |||
end | |||
local classFixes = {bar = 'ber', sam = 'due', ama = 'cor'} | |||
local | local classArchetypes = { | ||
ber = 'warr', | |||
due = 'warr', | |||
vet = 'warr', | |||
kni = 'warr', | |||
pal = 'warr', | |||
ass = 'semi', | |||
cor = 'semi', | |||
arc = 'semi', | |||
thi = 'semi', | |||
ran = 'semi', | |||
fla = 'mage', | |||
sto = 'mage', | |||
lif = 'mage', | |||
nec = 'mage', | |||
nat = 'mage' | |||
} | |||
local className = { | |||
ber = 'Berserker', | |||
due = 'Duelist', | |||
vet = 'Veteran', | |||
kni = 'Knight', | |||
pal = 'Paladin', | |||
ass = 'Assassin', | |||
cor = 'Corsair', | |||
arc = 'Archer', | |||
thi = 'Thief', | |||
ran = 'Ranger', | |||
fla = 'Flame Mage', | |||
sto = 'Storm Mage', | |||
lif = 'Life Mage', | |||
nec = 'Necromancer', | |||
nat = 'Nature Mage' | |||
} | |||
local archetypeName = {warr = 'Warrior', semi = 'Semi', mage = 'Mage'} | |||
function p.a(frame) | |||
makeCat = true | |||
-- Figure out all the default values | |||
-- Prefer parent args if invoked via a template | |||
local parent = frame:getParent() | |||
local rawArgs = parent and parent.args or frame.args | |||
-- Drop empty/whitespace-only values so "" behaves like false/nil | |||
local args = {} | |||
for k, v in pairs(rawArgs) do if nonempty(v) then args[k] = v end end | |||
local resolved = {} | |||
if args['pre'] then | |||
local toResolve = resolveAlias(premades[args['pre']], aliases) | |||
for k, v in pairs(toResolve) do resolved[k] = v end | |||
end | |||
local userResolve = resolveAlias(args, aliases) | |||
for k, v in pairs(userResolve) do resolved[k] = v end | |||
if resolved['pre'] and premades[args['pre']]['skip'] then | |||
resolved['pre'] = nil | |||
end | |||
if not resolved['duration'] then resolved['duration'] = 'instant' end | |||
if resolved['interaction'] == 'attack' then | |||
local dc = "Hit target's {{AC}}" | |||
if resolved['target'] == 'limb' then | |||
dc = "Hit target's {{Var:ACLimb}}" | |||
target = | end | ||
if resolved['target'] == 'arm' then | |||
dc = "Hit target's {{Var:ACLimb}}" | |||
end | |||
if resolved['target'] == 'leg' then | |||
dc = "Hit target's {{Var:ACLimb}}" | |||
end | |||
if resolved['target'] == 'vitals' then | |||
dc = "Hit target's {{Var:ACVitals}}" | |||
end | |||
target = | if resolved['target'] == 'item' then | ||
dc = "Hit DC [[Core:Item Target|depends on item]]" | |||
end | |||
if resolved['target'] == 'shield' then | |||
dc = "Hit user's {{Var:ACWielded}}" | |||
end | |||
if resolved['target'] == 'armor' then | |||
dc = "Hit user's {{Var:ACWorn}}" | |||
end | |||
if resolved['target'] == 'weapon' then | |||
dc = "Hit user's {{Var:ACWielded}}" | |||
end | |||
resolved['hitDC'] = dc | |||
target | |||
} | |||
[ | |||
[ | |||
end | end | ||
if resolved['expansionCount'] then | |||
if resolved['expansionCount'] == '1' then | |||
resolved['expansionCount'] = '{{Space}}' .. | |||
resolved['expansionCount'] .. | |||
' extra execution.' | |||
else | |||
resolved['expansionCount'] = '{{Space}}' .. | |||
resolved['expansionCount'] .. | |||
' extra executions.' | |||
end | |||
end | |||
if resolved['invoked'] then | |||
resolved['verbal'] = 'verbal' | |||
resolved['somatic'] = 'somatic' | |||
resolved['mage'] = 'magelore' | |||
end | end | ||
local | local skill = false | ||
local spell = false | |||
local standard = false | |||
local | local class = nil | ||
local classFull = nil | |||
local archetype = nil | |||
local archetypeFull = nil | |||
local rank = nil | |||
if args['class'] then | |||
class = args['class'] | |||
if classFixes[class] then class = classFixes[class] end | |||
end | |||
end | end | ||
if args['class'] or args['arch'] then | |||
archetype = classArchetypes[class] | |||
if args['arch'] then archetype = args['arch'] end | |||
if | classFull = className[class] | ||
archetypeFull = archetypeName[archetype] | |||
standard = true | |||
if archetype == 'warr' or archetype == 'semi' then skill = true end | |||
if archetype == 'mage' then spell = true end | |||
end | end | ||
if | local costMP = nil | ||
local costHP = nil | |||
local costGP = nil | |||
if args['pre'] == 'crown' then | |||
spell = true | |||
costMP = '1' | |||
rank = '2' | |||
end | |||
if args['rank'] then rank = args['rank'] end | |||
if args['skill'] then | |||
skill = true | |||
if args['skill'] == '0' or args['skill'] == 'false' then | |||
skill = false | |||
end | end | ||
end | end | ||
if args['spell'] then | |||
spell = true | |||
if args['spell'] == '0' or args['spell'] == 'false' then | |||
spell = false | |||
end | |||
end | end | ||
if | if args['standard'] then | ||
standard = true | |||
if args['standard'] == '0' or args['standard'] == 'false' then | |||
standard = false | |||
end | |||
end | end | ||
if | if args['mp'] then costMP = args['mp'] end | ||
if args['hp'] then costHP = args['hp'] end | |||
end | if args['gp'] then costGP = args['gp'] end | ||
if | if args['shatter'] then costShatter = args['shatter'] end | ||
local basic = false | |||
if | local journeyman = false | ||
if args['basic'] then basic = true end | |||
end | if args['journeyman'] or args['jm'] then journeyman = true end | ||
-- | -- Category string | ||
local c = '' | |||
local | local name = args['name'] | ||
local | local page = mw.title.getCurrentTitle().text | ||
local | local namespace = frame:preprocess('{{NAMESPACE}}') | ||
local | local addCats = ((namespace == 'Ability') and (page == name)) | ||
c = c .. addCategory('Abilities', nil, nil, skill, spell, addCats) | |||
if basic then | |||
c = c .. | |||
addCategory('Basic abilities', 'basic', nil, skill, spell, | |||
addCats) | |||
end | end | ||
if | if journeyman then | ||
c = c .. | |||
addCategory('Journeyman abilities', 'journeyman', nil, skill, | |||
spell, addCats) | |||
end | end | ||
if | if standard then | ||
c = c .. | |||
addCategory('Standard abilities', nil, nil, false, false, | |||
addCats) | |||
if skill then | |||
c = c .. | |||
addCategory('Semblant skills', nil, nil, skill, spell, | |||
addCats) | |||
end | |||
if spell then | |||
c = c .. | |||
addCategory('Conjured spells', nil, nil, skill, spell, | |||
addCats) | |||
end | end | ||
else | |||
c = c .. | |||
addCategory('Nonstandard abilities', nil, nil, skill, spell, | |||
addCats) | |||
end | end | ||
if args['ethereal'] then | |||
c = c .. | |||
addCategory('Ethereal abilities', nil, nil, skill, spell, | |||
addCats) | |||
if | end | ||
if args['av'] then | |||
c = c .. | |||
addCategory('AV granting abilities', nil, nil, skill, spell, | |||
addCats, true) | |||
c = c .. | |||
addCategory('AV' .. args['av'] .. ' granting abilities', nil, | |||
nil, skill, spell, addCats, true) | |||
end | end | ||
if (archetype and archetypeFull) then | |||
c = c .. | |||
addCategory(archetypeFull .. ' archetype abilities', | |||
'archetype', archetype, skill, spell, addCats) | |||
end | end | ||
if (class and classFull) then | |||
c = c .. | |||
addCategory(classFull .. ' class abilities', 'class', class, | |||
skill, spell, addCats, true) | |||
end | end | ||
if | if (rank and (class and classFull)) then | ||
if rank == '3' then rank = '3+' end | |||
c = c .. | |||
addCategory('Rank ' .. rank .. ' ' .. classFull .. ' abilities', | |||
'rank', rank, skill, spell, addCats, true) | |||
end | end | ||
if resolved['pre'] then | |||
c = c .. | |||
addCategory(resolved['pre'] .. 'abilities', 'pre', | |||
resolved['pre'], skill, spell, addCats) | |||
end | |||
if resolved['interaction'] then | |||
c = c .. | |||
addCategory(resolved['interaction'] .. ' interaction abilities', | |||
'interaction', resolved['interaction'], skill, | |||
spell, addCats) | |||
end | |||
if resolved['delivery'] then | |||
c = c .. | |||
addCategory(resolved['delivery'] .. ' delivery abilities', | |||
'delivery', resolved['delivery'], skill, spell, | |||
addCats) | |||
end | |||
if resolved['target'] then | |||
c = c .. | |||
addCategory(resolved['target'] .. ' target abilities', 'target', | |||
resolved['target'], skill, spell, addCats) | |||
end | |||
if resolved['duration'] then | |||
c = c .. | |||
addCategory( | |||
noPlural(resolved['duration']) .. ' duration abilities', | |||
'duration', resolved['duration'], skill, spell, addCats) | |||
end | end | ||
-- if resolved['range'] then | |||
-- c = c .. addCategory(resolved['range'] .. ' range abilities', 'range', resolved['range'], skill, spell, addCats) | |||
-- end | -- end | ||
if resolved['expansion'] then | |||
c = c .. | |||
addCategory(resolved['expansion'] .. ' expansion abilities', | |||
'expansion', resolved['expansion'], skill, spell, | |||
addCats) | |||
end | end | ||
-- if resolved['expansionRange'] then | |||
-- | -- c = c .. addCategory(resolved['expansionRange'] .. ' expansion range abilities', 'expansionRange', resolved['expansionRange'], skill, spell, addCats) | ||
-- end | |||
if resolved['attribute'] then | |||
c = c .. | |||
addCategory(resolved['attribute'] .. ' save abilities', | |||
'attribute', resolved['attribute'], skill, spell, | |||
addCats) | |||
end | |||
if resolved['piercing'] then | |||
c = c .. addCategory(resolved['piercing'] .. ' abilities', 'piercing', | |||
resolved['piercing'], skill, spell, addCats) | |||
end | |||
if resolved['sustained'] then | |||
c = c .. | |||
addCategory('Sustained abilities', 'sustained', | |||
resolved['sustained'], skill, spell, addCats) | |||
end | |||
if resolved['upgrade'] then | |||
c = c .. | |||
addCategory(resolved['upgrade'] .. ' abilities', 'upgrade', | |||
resolved['upgrade'], skill, spell, addCats) | |||
end | |||
if resolved['executionTime'] then | |||
c = c .. | |||
addCategory( | |||
noPlural(resolved['executionTime']) .. | |||
' execution time abilities', 'executionTime', | |||
resolved['executionTime'], skill, spell, addCats) | |||
end | |||
if resolved['maneuver'] then | |||
c = c .. addCategory(resolved['maneuver'] .. ' abilities', 'maneuver', | |||
resolved['maneuver'], skill, spell, addCats) | |||
end | |||
if resolved['verbal'] then | |||
c = c .. | |||
addCategory('Verbal component abilities', 'verbal', | |||
resolved['verbal'], skill, spell, addCats) | |||
end | |||
if resolved['somatic'] then | |||
c = c .. | |||
addCategory('Somatic component abilities', 'somatic', | |||
resolved['somatic'], skill, spell, addCats) | |||
end | |||
if resolved['material'] then | |||
c = c .. | |||
addCategory('Material component abilities', 'material', | |||
resolved['material'], skill, spell, addCats) | |||
end | |||
if resolved['magelore'] then | |||
c = c .. | |||
addCategory('Magelore component abilities', 'magelore', | |||
resolved['magelore'], skill, spell, addCats) | |||
end | |||
if resolved['invoked'] then | |||
c = c .. | |||
addCategory('Invoke component abilities', 'invoked', | |||
resolved['invoked'], skill, spell, addCats) | |||
end | end | ||
local flawContent = '' | |||
end | if args['flaw'] or args['f'] or args['fl'] then | ||
flawContent = flawContent .. makeTag(frame, 'flaw', 'flaw', makeCat) | |||
local | c = c .. | ||
addCategory('Flaw abilities', 'flaw', 'flaw', skill, spell, | |||
addCats) | |||
end | |||
local specialContent = '' | |||
if args['special'] or args['s'] or args['sp'] then | |||
specialContent = specialContent .. | |||
makeTag(frame, 'special', 'special', makeCat) | |||
c = c .. | |||
addCategory('Special abilities', 'special', 'special', skill, | |||
spell, addCats) | |||
end | |||
local esContent = '' | |||
if args['es'] then | |||
esContent = esContent .. makeTag(frame, 'es', 'es', makeCat) | |||
c = c .. | |||
addCategory('Elder Sorcery abilities', 'es', 'es', skill, spell, | |||
addCats) | |||
end | |||
local wardedContent = '' | |||
if args['warded'] then | |||
wardedContent = wardedContent .. | |||
makeTag(frame, 'warded', 'warded', makeCat) | |||
c = c .. | |||
addCategory('Warded abilities', 'warded', 'warded', skill, | |||
spell, addCats) | |||
end | |||
local | local elementContent = '' | ||
if args['life'] then | |||
elementContent = elementContent .. | |||
makeTag(frame, 'elements', 'life', makeCat) | |||
c = c .. | |||
addCategory('Life element abilities', 'elements', 'life', skill, | |||
spell, addCats) | |||
end | |||
if args['storm'] then | |||
elementContent = elementContent .. | |||
makeTag(frame, 'elements', 'storm', makeCat) | |||
c = c .. | |||
addCategory('Storm element abilities', 'elements', 'storm', | |||
skill, spell, addCats) | |||
end | |||
if args['necro'] then | |||
elementContent = elementContent .. | |||
makeTag(frame, 'elements', 'necro', makeCat) | |||
c = c .. | |||
addCategory('Necromancy element abilities', 'elements', 'necro', | |||
skill, spell, addCats) | |||
end | |||
if args['flame'] then | |||
elementContent = elementContent .. | |||
makeTag(frame, 'elements', 'flame', makeCat) | |||
c = c .. | |||
addCategory('Flame element abilities', 'elements', 'flame', | |||
skill, spell, addCats) | |||
end | |||
if args['nature'] then | |||
elementContent = elementContent .. | |||
makeTag(frame, 'elements', 'nature', makeCat) | |||
c = c .. | |||
addCategory('Nature element abilities', 'elements', 'nature', | |||
skill, spell, addCats) | |||
end | |||
local | local powerContent = '' | ||
if args['magic'] then | |||
powerContent = powerContent .. makeTag(frame, 'power', 'magic', makeCat) | |||
c = c .. | |||
addCategory('Magically powered abilities', 'power', 'magic', | |||
skill, spell, addCats) .. | |||
addCategory('Magical effects', nil, nil, false, false, addCats) | |||
end | end | ||
if args['divine'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'divine', makeCat) | |||
c = c .. | |||
addCategory('Divinely powered abilities', 'power', 'divine', | |||
skill, spell, addCats) .. | |||
addCategory('Divine effects', nil, nil, false, false, addCats) | |||
end | end | ||
if | if args['spirit'] then | ||
resolved[' | powerContent = powerContent .. | ||
makeTag(frame, 'power', 'spirit', makeCat) | |||
c = c .. | |||
addCategory('Spiritually powered abilities', 'power', 'spirit', | |||
skill, spell, addCats) .. | |||
addCategory('Spiritual effects', nil, nil, false, false, addCats) | |||
end | |||
if args['primal'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'primal', makeCat) | |||
c = c .. | |||
addCategory('Primally powered abilities', 'power', 'primal', | |||
skill, spell, addCats) .. | |||
addCategory('Primal effects', nil, nil, false, false, addCats) | |||
end | |||
if args['martial'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'martial', makeCat) | |||
c = c .. | |||
addCategory('Martially powered abilities', 'power', 'martial', | |||
skill, spell, addCats) | |||
end | |||
if args['psionic'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'psionic', makeCat) | |||
c = c .. | |||
addCategory('Psionically powered abilities', 'power', 'psionic', | |||
skill, spell, addCats) .. | |||
addCategory('Mental effects', nil, nil, false, false, addCats) | |||
end | |||
if args['techo'] then | |||
powerContent = powerContent .. makeTag(frame, 'power', 'techo', makeCat) | |||
c = c .. | |||
addCategory('Technologically powered abilities', 'power', | |||
'techo', skill, spell, addCats) .. | |||
addCategory('Technological effects', nil, nil, false, false, | |||
addCats) | |||
end | |||
if args['finance'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'finance', makeCat) | |||
c = c .. | |||
addCategory('Financially powered abilities', 'power', 'finance', | |||
skill, spell, addCats) .. | |||
addCategory('Financial effects', nil, nil, false, false, addCats) | |||
end | |||
if args['alchemy'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'alchemy', makeCat) | |||
c = c .. | |||
addCategory('Alchemically powered abilities', 'power', | |||
'alchemy', skill, spell, addCats) .. | |||
addCategory('Alchemical effects', nil, nil, false, false, | |||
addCats) | |||
end | |||
if args['unknown'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'power', 'unknown', makeCat) | |||
c = c .. | |||
addCategory('Unknown powered abilities', 'power', 'unknown', | |||
skill, spell, addCats) | |||
end | |||
if class then | |||
classContent = makeContent(frame, resolved, {'class'}, makeCat) | |||
powerContent = powerContent .. classContent | |||
end | |||
if args['rotator'] then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'category', 'rotator', makeCat) | |||
end | |||
powerContent = powerContent .. elementContent | |||
if skill then | |||
powerContent = powerContent .. | |||
makeTag(frame, 'category', 'skill', makeCat) | |||
end | end | ||
if | if spell then | ||
powerContent = powerContent .. | |||
makeTag(frame, 'category', 'spell', makeCat) | |||
end | end | ||
local deliveryContent = '' | |||
if standard and skill then | |||
deliveryContent = deliveryContent .. | |||
makeTag(frame, 'category', 'semblant', makeCat) | |||
end | |||
if standard and spell then | |||
deliveryContent = deliveryContent .. | |||
makeTag(frame, 'category', 'conjure', makeCat) | |||
end | end | ||
if | local effectContent = '' | ||
if args['mental'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'mental', makeCat) | |||
c = c .. | |||
addCategory('Mental effects', 'effect', 'mental', skill, spell, | |||
addCats) | |||
end | |||
if args['truth'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'truth', makeCat) | |||
c = c .. | |||
addCategory('Truth detecting effects', 'effect', | |||
'truthDetecting', skill, spell, addCats) | |||
end | end | ||
if args['duelMod'] then | |||
if | effectContent = effectContent .. | ||
makeTag(frame, 'effects', 'duelModifying', makeCat) | |||
c = c .. | |||
addCategory('Duel modifying effects', 'effect', 'duelModifying', | |||
skill, spell, addCats) | |||
end | end | ||
if args['movement'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'movement', makeCat) | |||
c = c .. | |||
addCategory('Movement effects', 'effect', 'movement', skill, | |||
spell, addCats) | |||
if args[' | |||
end | end | ||
if args[' | if args['poison'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'poison', makeCat) | |||
c = c .. | |||
addCategory('Poison effects', 'effect', 'poison', skill, spell, | |||
addCats) | |||
end | |||
if args['displacement'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'displacement', makeCat) | |||
c = c .. | |||
addCategory('Displacement effects', 'effect', 'displacement', | |||
skill, spell, addCats) | |||
end | end | ||
if args['transformation'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'transformation', makeCat) | |||
if args[' | c = c .. | ||
addCategory('Transformation effects', 'effect', | |||
'transformation', skill, spell, addCats) | |||
end | end | ||
if args[' | if args['control'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'control', makeCat) | |||
c = c .. | |||
addCategory('Control effects', 'effect', 'control', skill, | |||
spell, addCats) | |||
end | end | ||
if args['resist'] then | |||
if args[' | effectContent = effectContent .. | ||
makeTag(frame, 'effects', 'resist', makeCat) | |||
c = c .. | |||
addCategory('Resistance effects', 'effect', 'resist', skill, | |||
spell, addCats) | |||
end | end | ||
if args[' | if args['awaken'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'awaken', makeCat) | |||
c = c .. | |||
addCategory('Awakening effects', 'effect', 'awaken', skill, | |||
spell, addCats) | |||
end | end | ||
if args[' | if args['immune'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'immune', makeCat) | |||
c = c .. | |||
addCategory('Immunity effects', 'effect', 'immune', skill, | |||
spell, addCats) | |||
end | end | ||
if args[' | if args['long'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'long', makeCat) | |||
c = c .. | |||
addCategory('Long range effects', 'effect', 'long', skill, | |||
spell, addCats) | |||
end | end | ||
if args[' | if args['sense'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'sense', makeCat) | |||
c = c .. | |||
addCategory('Sensory effects', 'effect', 'sense', skill, spell, | |||
addCats) | |||
end | end | ||
if args[' | if args['revive'] or args['rev'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'revive', makeCat) | |||
c = c .. | |||
addCategory('Revival effects', 'effect', 'revive', skill, spell, | |||
addCats) | |||
end | end | ||
if args[' | if args['summon'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'summon', makeCat) | |||
c = c .. | |||
addCategory('Summoning effects', 'effect', 'summon', skill, | |||
spell, addCats) | |||
end | |||
if args['heal'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'heal', makeCat) | |||
c = c .. | |||
addCategory('Healing effects', 'effect', 'heal', skill, spell, | |||
addCats) | |||
end | end | ||
if args['reanimate'] or args['rean'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'reanimate', makeCat) | |||
if args[' | c = c .. | ||
addCategory('Reanimation effects', 'effect', 'reanimate', skill, | |||
spell, addCats) | |||
end | end | ||
if args[' | if args['regenerate'] or args['regen'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'regenerate', makeCat) | |||
c = c .. | |||
addCategory('Regeneration effects', 'effect', 'regenerate', | |||
skill, spell, addCats) | |||
end | end | ||
if args['revitalize'] or args['revit'] then | |||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'revitalize', makeCat) | |||
c = c .. | |||
addCategory('Revitalization effects', 'effect', 'revitalize', | |||
skill, spell, addCats) | |||
end | end | ||
if | if args['kill'] then | ||
c = c .. addCategory(' | effectContent = effectContent .. | ||
makeTag(frame, 'effects', 'kill', makeCat) | |||
c = c .. | |||
addCategory('Killing effects', 'effect', 'kill', skill, spell, | |||
addCats) | |||
end | end | ||
if | if args['damage'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'damage', makeCat) | |||
c = c .. | |||
addCategory('Damaging effects', 'effect', 'damage', skill, | |||
spell, addCats) | |||
end | end | ||
if args[' | if args['steal'] then | ||
c = c .. addCategory(' | effectContent = effectContent .. | ||
makeTag(frame, 'effects', 'steal', makeCat) | |||
c = c .. | |||
addCategory('Stealing effects', 'effect', 'steal', skill, spell, | |||
addCats) | |||
end | end | ||
if args[' | if args['loud'] then | ||
effectContent = effectContent .. | |||
makeTag(frame, 'effects', 'loud', makeCat) | |||
c = c .. | |||
addCategory('Loud effects', 'effect', 'loud', skill, spell, | |||
addCats) | |||
end | end | ||
if ( | if args['knockout'] then | ||
c = c .. addCategory( | effectContent = effectContent .. | ||
makeTag(frame, 'effects', 'knockout', makeCat) | |||
c = c .. | |||
addCategory('Knockout effects', 'effect', 'knockout', skill, | |||
spell, addCats) | |||
end | end | ||
if ( | if args['time'] then | ||
c = c .. addCategory( | effectContent = effectContent .. | ||
makeTag(frame, 'effects', 'time', makeCat) | |||
c = c .. | |||
addCategory('Temporal effects', 'effect', 'time', skill, spell, | |||
addCats) | |||
end | end | ||
if ( | |||
if | local costContent = '' | ||
if costMP then | |||
c = c .. | |||
addCategory('MP cost abilities', 'costMP', costMP, skill, spell, | |||
addCats, true) | |||
if costMP == 'x' then | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|X MP|🩵|l=:Category:MP cost abilities|c=#3584e4|class=cost-tagged mpx}}") | |||
c = c .. | |||
addCategory('Variable MP cost abilities', 'costMP', 'x', | |||
skill, spell, addCats, true) | |||
else | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|" .. costMP .. | |||
" MP|🩵|l=:Category:MP cost abilities|c=#3584e4|class=cost-tagged mp" .. | |||
costMP .. "}}") | |||
c = c .. | |||
addCategory(costMP .. ' MP cost abilities', 'costMP', | |||
costMP, skill, spell, addCats, true) | |||
end | end | ||
end | end | ||
if | if costHP then | ||
c = c .. addCategory( | c = c .. | ||
addCategory('HP cost abilities', 'costHP', costHP, skill, spell, | |||
addCats, true) | |||
if costHP == 'x' then | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|X HP|❤️|l=:Category:HP cost abilities|c=#e01b24|class=cost-tagged hpx}}") | |||
c = c .. | |||
addCategory('Variable HP cost abilities', 'costHP', 'x', | |||
skill, spell, addCats, true) | |||
else | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|" .. costHP .. | |||
" HP|❤️|l=:Category:HP cost abilities|c=#e01b24|class=cost-tagged hp" .. | |||
costHP .. "}}") | |||
c = c .. | |||
addCategory(costHP .. ' HP cost abilities', 'costHP', | |||
costHP, skill, spell, addCats, true) | |||
end | |||
end | end | ||
if | if costGP then | ||
c = c .. addCategory( | c = c .. | ||
addCategory('GP cost abilities', 'costGP', costGP, skill, spell, | |||
addCats, true) | |||
if costGP == 'x' then | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|X GP|🪙|l=:Category:GP cost abilities|c=#F6D32D|class=cost-tagged gpx}}") | |||
c = c .. | |||
addCategory('Variable GP cost abilities', 'costGP', 'x', | |||
skill, spell, addCats, true) | |||
else | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|" .. costGP .. | |||
" GP|🪙|l=:Category:GP cost abilities|c=#F6D32D|class=cost-tagged gp" .. | |||
costGP .. "}}") | |||
c = c .. | |||
addCategory(costGP .. ' GP cost abilities', 'costGP', | |||
costGP, skill, spell, addCats, true) | |||
end | |||
end | end | ||
if | if costShatter then | ||
c = c .. addCategory( | c = c .. | ||
addCategory('Shatter cost abilities', 'costShatter', | |||
costShatter, skill, spell, addCats) | |||
costContent = costContent .. frame:preprocess( | |||
"{{Tag|Shatter|💥|l=:Category:Shatter cost abilities|class=cost-tagged shatter}}") | |||
end | end | ||
if | if args['cost'] then | ||
costContent = costContent .. frame:preprocess(args['cost']) | |||
end | end | ||
if | |||
local executionTimeTitle = 'Execution time' | |||
if spell then executionTimeTitle = 'Casting time' end | |||
-- | |||
-- | local expansionContent = 'TEST' | ||
-- if args['ec'] or args['expCount'] or args['expansionCount'] then | |||
-- -- local ec = args['ec'] or args['expCount'] or args['expansionCount'] | |||
-- -- ec = tostring(ec) | |||
-- local ec = '1' | |||
-- expansionContent = 'This ability expands ' .. ec .. ' time' .. (tonumber(ec) > 1 and 's' or '') .. '.' | |||
-- end | -- end | ||
if | |||
local heightenedContent = '' | |||
if args['heightened'] then | |||
heightenedContent = heightenedContent .. | |||
'For each additional {{L|Core|MP}} spent, ' .. | |||
args['heightened'] | |||
-- heightenedContent = heightenedContent .. ' You can only {{L|Core|Heightening|Heighten}} if you are {{L|Core|Proficiency Bonus|Proficient}} or {{L|Core|Fluency Bonus|Fluent}} in ' .. args['name'] .. ' and only up to the corresponding bonus.' | |||
c = c .. | |||
addCategory('Heightened abilities', 'heightened', | |||
args['heightened'], skill, spell, addCats, true) | |||
end | end | ||
local proficiencyContent = '' | |||
if args['pro'] then | |||
if | proficiencyContent = proficiencyContent .. frame:preprocess(args['pro']) | ||
end | end | ||
if | |||
local fluencyContent = '' | |||
if args['flu'] then | |||
fluencyContent = fluencyContent .. frame:preprocess(args['flu']) | |||
end | end | ||
if | |||
local restrictionContent = '' | |||
if args['restrict'] then | |||
restrictionContent = restrictionContent .. | |||
frame:preprocess(args['restrict']) | |||
end | end | ||
if | |||
c = c .. addCategory( | local statValContent = '' | ||
local statFeatContent = '' | |||
if args['vstat'] and args['val'] then | |||
local vstat = frame:preprocess("{{uc:" .. args['vstat'] .. "}}") | |||
statValContent = 'This ability sets your {{L|Core|' .. vstat .. '}}' .. | |||
' score to a minimum of ' .. args['val'] .. '.' | |||
c = c .. | |||
addCategory('Attribute setting abilities', 'val', args['val'], | |||
skill, spell, addCats, true) | |||
c = c .. | |||
addCategory(vstat .. ' setting abilities', 'vstat', | |||
args['vstat'], skill, spell, addCats, true) | |||
c = c .. | |||
addCategory( | |||
vstat .. ' value of ' .. args['val'] .. ' setting abilities', | |||
'val', args['val'], skill, spell, addCats, true) | |||
end | end | ||
if | local f = 'proficiency' | ||
c = c .. addCategory( | if args['fflu'] then f = 'fluency' end | ||
if args['fstat'] and (args['fflu'] or args['fpro']) then | |||
local fstat = frame:preprocess("{{uc:" .. args['fstat'] .. "}}") | |||
statFeatContent = | |||
'This ability gives {{L|Core|' .. f .. ' Bonus|' .. f .. | |||
'}} in {{L|Core|' .. fstat .. | |||
'}} {{L|Core|Feat Interaction|Feat Saves}}.' | |||
c = c .. | |||
addCategory('Feat save improvement abilities', 'flu', | |||
args['fflu'], skill, spell, addCats) | |||
c = c .. | |||
addCategory('Feat save ' .. f .. ' granting abilities', 'fstat', | |||
args['fstat'], skill, spell, addCats, true) | |||
c = c .. | |||
addCategory( | |||
fstat .. ' feat save ' .. f .. ' granting abilities', | |||
'fstat', args['fstat'], skill, spell, addCats, true) | |||
end | end | ||
if | if args['rotator'] then | ||
c = c .. addCategory( | c = c .. | ||
addCategory('Rotator abilities', 'rotator', args['rotator'], | |||
skill, spell, addCats) | |||
end | end | ||
if | if args['style'] then | ||
c = c .. addCategory(' | c = c .. | ||
addCategory('Casting style abilities', 'style', args['style'], | |||
skill, spell, addCats) | |||
end | end | ||
if | if args['weapon'] then | ||
c = c .. addCategory(' | c = c .. | ||
addCategory('Weapon fighting style abilities', 'weapon', | |||
args['weapon'], skill, spell, addCats) | |||
end | end | ||
-- Remove range from self targeted abilities | |||
if resolved['target'] == 'self' or resolved['range'] == 'self' then | |||
if resolved[' | resolved['range'] = nil | ||
end | end | ||
local | local barsTop = { | ||
-- { | |||
-- title = 'elements', | |||
-- content = frame:preprocess(elementContent) | |||
-- }, | |||
{ | |||
title = 'power sources', | |||
content = frame:preprocess(esContent .. powerContent), | |||
link = ':Category:Powered abilities' | |||
}, { | |||
title = 'effect types', | |||
content = frame:preprocess(flawContent .. specialContent .. | |||
effectContent), | |||
link = ':Category:Effects' | |||
}, { | |||
title = 'delivery', | |||
content = frame:preprocess(wardedContent .. deliveryContent) .. | |||
makeContent(frame, resolved, { | |||
'expansion', 'pre', 'upgrade', 'piercing', 'delivery', | |||
'interaction' | |||
}, makeCat), | |||
link = ':Category:Delivery abilities' | |||
}, { | |||
title = 'save attribute', | |||
content = makeContent(frame, resolved, {'attribute'}, makeCat), | |||
link = 'Core:Feat Interaction' | |||
}, { | |||
title = 'expansion save attribute', | |||
content = makeContent(frame, resolved, {'expansionAttribute'}, | |||
makeCat) | |||
}, { | |||
title = 'target', | |||
content = makeContent(frame, resolved, {'target', 'hitDC'}, makeCat), | |||
link = ':Category:Target abilities' | |||
}, { | |||
title = executionTimeTitle, | |||
content = makeContent(frame, resolved, | |||
{'executionTime', 'maneuver'}, makeCat), | |||
link = 'Core:Maneuvers' | |||
}, { | |||
title = 'trigger', | |||
content = args['trigger'] or '', | |||
link = 'Core:Reactive Maneuvers' | |||
}, { | |||
title = 'cost and components', | |||
content = frame:preprocess(costContent) .. | |||
makeContent(frame, resolved, { | |||
'material', 'invoked', 'verbal', 'somatic', 'magelore' | |||
}, makeCat), | |||
link = ':Category:Cost abilities' | |||
}, { | |||
title = 'Mana cost', | |||
content = args['mpx'] or '', | |||
link = ':Category:MP cost abilities' | |||
}, { | |||
title = 'Hit cost', | |||
content = args['hpx'] or '', | |||
link = ':Category:HP cost abilities' | |||
}, { | |||
title = 'Gold cost', | |||
content = args['gpx'] or '', | |||
link = ':Category:GP cost abilities' | |||
}, { | |||
title = 'Material cost', | |||
content = makeContent(frame, resolved, {'matx'}, makeCat), | |||
link = ':Category:Material component abilities' | |||
}, { | |||
title = 'duration', | |||
content = makeContent(frame, resolved, {'duration', 'sustained'}, | |||
makeCat), | |||
link = ':Category:Duration abilities' | |||
}, { | |||
title = 'range', | |||
content = makeContent(frame, resolved, {'range'}, makeCat), | |||
link = 'Core:Range' | |||
}, -- { | |||
-- title = 'expansion', | |||
-- content = makeContent(frame, resolved, {'expansion'}, makeCat) | |||
-- }, | |||
{ | |||
title = 'expansion range', | |||
content = makeContent(frame, resolved, | |||
{'expansionRange', 'expansionCount'}, makeCat), | |||
link = 'Core:Expansions' | |||
}, -- { | |||
-- title = 'expansion count', | |||
-- content = frame:preprocess('TEST') | |||
-- }, | |||
{ | |||
title = 'Requirements', | |||
content = makeContent(frame, resolved, {'requirement'}, makeCat) | |||
} | |||
} | |||
local | local barsBottom = { | ||
{title = 'End condition', content = args['end'] or ''}, | |||
{title = 'On critical hit', content = args['crithit'] or ''}, | |||
{title = 'On hit', content = args['hit'] or ''}, | |||
{title = 'On miss', content = args['miss'] or ''}, | |||
{title = 'On critically miss', content = args['critmiss'] or ''}, | |||
{title = 'On critical fail', content = args['critfail'] or ''}, | |||
{title = 'On fail', content = args['fail'] or ''}, | |||
{title = 'On success', content = args['success'] or ''}, | |||
{title = 'On critical success', content = args['critsuccess'] or ''}, { | |||
title = 'Heightened', | |||
content = frame:preprocess(heightenedContent), | |||
link = ':Category:Heightened abilities' | |||
}, { | |||
title = 'If proficient', | |||
content = proficiencyContent, | |||
link = 'Core:Proficiency Bonus' | |||
}, | |||
{ | |||
title = 'If fluent', | |||
content = fluencyContent, | |||
link = 'Core:Fluency Bonus' | |||
}, { | |||
title = 'Attribute improvement', | |||
content = frame:preprocess(statValContent), | |||
link = 'Core:Attributes', | |||
flags = { | |||
attribute = args['vstat'] and | |||
frame:preprocess('{{lc:' .. args['vstat'] .. '}}') or "", | |||
value = args['val'] | |||
} | |||
}, { | |||
title = 'Feat save improvement', | |||
content = frame:preprocess(statFeatContent), | |||
link = 'Core:Feat Interaction', | |||
flags = { | |||
attribute = args['fstat'] and | |||
frame:preprocess('{{lc:' .. args['fstat'] .. '}}'), | |||
value = f | |||
} | |||
} | |||
} | |||
local outputTop = '' | |||
for _, bar in ipairs(barsTop) do | |||
outputTop = outputTop .. | |||
makeBar(frame, bar['title'], bar['content'], | |||
bar['link'], bar['flags'], false) | |||
end | end | ||
local outputBottom = '' | |||
for _, bar in ipairs(barsBottom) do | |||
outputBottom = outputBottom .. | |||
makeBar(frame, bar['title'], bar['content'], | |||
bar['link'], bar['flags'], true) | |||
local outputBottom = '' | |||
for _, bar in ipairs(barsBottom) do | |||
outputBottom = outputBottom .. makeBar(frame, bar['title'], bar['content'], bar['link'], bar['flags'], true) | |||
end | end | ||
local outputMiddle = '' | local outputMiddle = '' | ||
if args['e'] then | if args['e'] then outputMiddle = frame:preprocess(args['e']) end | ||
local output = mw.html.create('span') | |||
output:addClass('ability-variables') | |||
local output = mw.html.create('span') | if args['basic'] then output:addClass('ability-basic') end | ||
output | output:wikitext(outputTop) | ||
if args['basic'] then | |||
output:wikitext(outputTop) | |||
if outputMiddle ~= '' then | if outputMiddle ~= '' then | ||
output | output:wikitext('<hr>'):wikitext( | ||
'<span class="ability-overview-base">' .. outputMiddle .. '</span>') | |||
end | end | ||
if outputBottom ~= '' then | if outputBottom ~= '' then output:wikitext('<hr>'):wikitext(outputBottom) end | ||
output = tostring(output) .. c | output = tostring(output) .. c | ||
output = output .. frame:preprocess('<templatestyles src="Template:Ability/styles.css" />') | output = output .. | ||
frame:preprocess( | |||
'<templatestyles src="Template:Ability/styles.css" />') | |||
if not name then | if not name then | ||
output = output .. '<span style="color: red;>NO NAME PROVIDED VERY BAD EVERY ABILITY NEEDS A NAME OKAY</span>' | output = output .. | ||
'<span style="color: red;>NO NAME PROVIDED VERY BAD EVERY ABILITY NEEDS A NAME OKAY</span>' | |||
end | end | ||
Revision as of 04:49, 13 August 2025
Module:A Parameter Documentation
This page details all the parameters and their aliases accepted by the Module:A Scribunto module for formatting TTRPG abilities. Call the module using:
{{#invoke:A|a|name=Example Ability|<other parameters>}}
Core Parameters
Basic Information
name- The name of the ability (required)e- The effect/description of the abilitytrigger- What triggers the ability to activate
Type Flags
skill- Flag to mark this as a skill ability- Setting a warrior or semi class will automatically set this flag to
true. This can be overridden by setting it to0orfalse.
- Setting a warrior or semi class will automatically set this flag to
spell- Flag to mark this as a spell ability- Setting a mage class will automatically set this flag to
true. This can be overridden by setting it to0orfalse.
- Setting a mage class will automatically set this flag to
standard- Flag to mark this as a standard ability- Setting a class will automatically set this flag to
true. This can be overridden by setting it to0orfalse. - Note that abilities that are provided by other class abilities are not always considered standard abilities nor abilities of that class. The main exceptions are crowns and other mage rotators.
- Setting a class will automatically set this flag to
Class Information
class- The class this ability belongs to
Supported values:bar/ber(Berserker)sam/due(Duelist)vet(Veteran)kni(Knight)pal(Paladin)ass(Assassin)ama/cor(Corsair)arc(Archer)thi(Thief)ran(Ranger)fla(Flame Mage)sto(Storm Mage)lif(Life Mage)nec(Necromancer)nat(Nature Mage)
arch- Override the default archetype for a class
Supported values:warr(Warrior)semi(Semi)mage(Mage)
rank- The rank requirement for the ability
Supported values:1(Rank 1)2(Rank 2)3(Rank 3+)
Ability Properties
Maneuver Type (maneuver/man/m)
active/ac/a- Active maneuverreactive/re/r- Reactive maneuverpassive/ps/p- Passive maneuverslow/sl/s- Slow maneuver
Execution Time (executionTime/time/et/x)
0a/freeAction/fa- Free action1a/a/singleAction/sa- Single action2a/doubleAction/da- Double action3a/tripleAction/ta- Triple action0r/freeReaction/fr- Free reaction1r/reaction/r- Reactionsr/shortRest/s- Short restlr/longRest/l- Long rest- Time duration format:
XmXhXdXwXy(minutes, hours, days, weeks, years)
Interaction Type (interaction/int/i)
attack/atk/a- Attack interactionblock/blk/b- Block interactionmanifest/man/m- Manifest interactionfeat/fea/f- Feat interaction
Delivery Method (delivery/del/d)
self/sel/s- Self deliverymissile/mis/m- Missile deliveryhand/han/h/claw- Hand deliverybite/bit/b/mouth- Bite deliveryitem/itm/i- Item deliverymagelore/mag/ml- Magelore deliveryweapon/wep/w- Weapon deliveryshield/shl/sh- Shield deliveryarmor/rmr/r- Armor deliverysight/sit/eye/e- Sight deliveryaura/aur/a- Aura deliverycone/con/c- Cone deliveryother/oth/o- Other delivery
Target Type (target/tar/t)
self/sel/s- Self targetcreature/cre/c- Creature targetbody/bod/b- Body targetvitals/vit/v- Vitals targetlimb/lim/l- Limb targetarm- Arm targetleg- Leg targetitem/itm/i- Item targetweapon/wep/w- Weapon targetshield/shl/sh- Shield targetarmor/rmr/r- Armor targetattack/atk/a- Attack targetother/oth/o- Other target
Duration (duration/dur/dr)
instant/in/i/0- Instant durationalways/forever/4/inf- Always active- Note: Use one of the aliases. Entering
alwaysis currently bugged.
- Note: Use one of the aliases. Entering
whileUp/up/u- While upwhileDown/dn/d- While downwhileAlive/al/a- While alivewhileDead/dd- While deadendOfTurn/end/e- Until end of turndawn/d- Until dawnstartOfTargetNextTurn/tStart/ts- Until start of target's next turnendOfTargetNextTurn/tEnd/te- Until end of target's next turnstartOfYourNextTurn/uStart/us- Until start of your next turnendOfYourNextTurn/uEnd/ue- Until end of your next turnendOfCombat/ec- Until end of combat- Time duration format:
XmXhXdXwXy(minutes, hours, days, weeks, years)
Sustained Flag
sustained/sus/s- Ability is sustained
Range (range/rng/r)
melee/m- Melee rangeweapon/w- Weapon rangehand/h- Hand rangebite/b- Bite rangeitem/i- Item rangeshield/sh- Shield rangearmor/a- Armor rangesight/eye/e- Sight rangeself/s- Self range- Distance format:
XforXm(feet or miles)
Attribute Saves (attribute/attr/a)
int/INT/i- Intelligence savestr/STR/s- Strength savemov/MOV/m- Movement saveper/PER/p- Perception savesnk/SNK/s- Sneak save
Expansion Type (expansion/exp)
detonate/det/d- Detonate expansionripple/rip/r- Ripple expansioncascade/cas/c- Cascade expansionfork/for/f- Fork expansion
Piercing (piercing/prc/p)
av0/a- AV0 piercingunblockable/ub/u- Unblockable
Component Flags
verbal/ver/v- Verbal componentsomatic/som/s- Somatic componentmaterial/mat/m- Material componentmagelore/mag/ml- Magelore componentinvoked/inv/i- Invoked component
Resource Costs
mp- Mana point costmpx- Variable mana point cost descriptionhp- Hit point costhpx- Variable hit point cost descriptionmatx- Material component cost description
Element Flags
life- Life elementstorm- Storm elementnecro- Necro elementflame- Flame elementnature- Nature element
Power Source Flags
magic- Magical power sourcedivine- Divine power sourcespirit- Spirit power sourceprimal- Primal power sourcemartial- Martial power sourcepsionic- Psionic power sourcetecho- Techno power source
Effect Type Flags
mental- Mental effecttruth- Truth detection effectduelMod- Duel modification effectmovement- Movement effectdisplacement- Displacement effecttransformation- Transformation effectcontrol- Control effectresist- Resistance effectimmune- Immunity effectlong- Long range effectsense- Sensory effectrevive- Revival effectsummon- Summoning effectheal- Healing effect
State Parameters
end- The condition under which the ability ends
Results Parameters
crithit- Critical hit effecthit- Hit effectmiss- Miss effectcritmiss- Critical miss effectcritfail- Critical fail effectfail- Fail effectsave- Save effectcritsave- Critical save effect
Attribute Modification
vstat- Attribute to modifyval- New minimum value for the attributefstat- Feat save attribute to modifyflu- Flag for fluency in feat savepro- Flag for proficiency in feat save
Premade Templates
The module includes several premade templates that can be used as a base for abilities:
Strike Template (pre=strike)
{
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'weapon',
target = 'creature',
duration = 'instant',
range = 'weapon',
}
Ray Template (pre=ray)
{
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'missile',
target = 'creature',
duration = 'instant',
range = '60f',
piercing = 'av0',
}
Ball Template (pre=ball)
{
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'missile',
target = 'creature',
duration = 'instant',
range = '30f',
piercing = 'ub',
}
Touch Template (pre=touch)
{
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'hand',
target = 'creature',
duration = 'instant',
range = 'hand',
piercing = 'ub',
}
Ritual Template (pre=ritual)
{
maneuver = 'slow',
executionTime = '10m',
interaction = 'manifest',
delivery = 'sight',
target = 'creature',
duration = 'instant',
range = '5f',
}
Additional Features
The module automatically handles:
- Adding AC modifiers for limb (+2), vitals (+5), and other specific targets
- Managing item interaction DCs
- Handling class archetypes and their hierarchies
- Processing time and distance formats
- Managing component requirements for invoked abilities
local p = {}
local aliases = {
keys = {
pre = {'pre', 'premade'},
maneuver = {'man', 'maneuver', 'm'},
interaction = {'int', 'interaction', 'i'},
delivery = {'del', 'delivery', 'd'},
target = {'tar', 'target', 't'},
duration = {'dur', 'duration', 'dr'},
upgrade = {'upg', 'upgrade', 'u'},
executionTime = {'executionTime', 'et', 'x'},
piercing = {'prc', 'piercing', 'p'},
-- nearRange = {
-- 'nearRange',
-- 'nr'
-- },
-- farRange = {
-- 'farRange',
-- 'fr'
-- },
flaw = {'flaw', 'fl', 'f'},
special = {'special', 'sp', 's'},
range = {'range', 'rng', 'r'},
attribute = {'attribute', 'attr', 'a'},
expansion = {'expansion', 'exp'},
expansionRange = {'expansionRange', 'er'},
expansionCount = {'expansionCount', 'ec'},
expansionAttribute = {'expansionAttribute', 'ea'},
sustained = {'sustained', 'sus'},
requirement = {'req', 'requirement', 'rq'},
verbal = {'ver', 'verbal'},
somatic = {'som', 'somatic'},
material = {'mat', 'material'},
magelore = {'mag', 'magelore', 'ml'},
invoked = {'inv', 'invoked', 'invoke'},
hp = {'hp', 'health', 'hitpoints', 'hitPoints', 'hit points'},
hpx = {'hpx', 'healthx', 'hitpointsx', 'hitPointsx', 'hit pointsx'},
mp = {
'mp', 'mana', 'magic', 'magick', 'magik', 'mana points',
'magic points', 'magick points', 'magik points'
},
mpx = {
'mpx', 'manax', 'manapointsx', 'mana pointsx', 'magic pointsx',
'magick pointsx', 'magik pointsx'
},
gp = {'gp', 'gold', 'goldPieces', 'gold pieces'},
gpx = {'gpx', 'goldx', 'goldPiecesx', 'gold piecesx'},
matx = {'matx', 'materialx'},
class = {'class'}
},
values = {
maneuver = {
active = {'ac', 'active', 'a'},
reactive = {'re', 'reaction', 'r'},
passive = {'ps', 'passive', 'p'},
slow = {'sl', 'slow', 's'}
},
interaction = {
attack = {'atk', 'attack', 'a'},
block = {'blk', 'block', 'b'},
manifest = {'man', 'manifest', 'm'},
feat = {'fea', 'feat', 'f'}
},
delivery = {
self = {'sel', 'self', 's'},
missile = {'mis', 'missile', 'm'},
hand = {'han', 'hand', 'h', 'claw'},
bite = {'bit', 'bite', 'b', 'mouth'},
item = {'itm', 'item', 'i'},
magelore = {'mag', 'magelore', 'ml'},
weapon = {'wep', 'weapon', 'w'},
shield = {'shl', 'shield', 'sh'},
armor = {'rmr', 'armor', 'r'},
sight = {'sit', 'sight', 'eye', 'e'},
aura = {'aur', 'aura', 'a'},
cone = {'con', 'cone', 'c'},
other = {'oth', 'other', 'o'}
},
target = {
self = {'sel', 'self', 's'},
creature = {'cre', 'creature', 'c'},
body = {'bod', 'body', 'b'},
vitals = {'vit', 'vitals', 'v'},
limb = {'lim', 'limb', 'l'},
arm = {'arm'},
leg = {'leg'},
item = {'itm', 'item', 'i'},
weapon = {'wep', 'weapon', 'w'},
shield = {'shl', 'shield', 'sh'},
armor = {'rmr', 'armor', 'r'},
ship = {'ship'},
attack = {'atk', 'attack', 'a'},
ability = {'ab', 'ability'},
spell = {'spl', 'spell'},
other = {'oth', 'other', 'o'},
ci = {'ci', 'creatureItem', 'itemCreature', 'ic'},
ai = {'ai', 'attackItem', 'itemAttack', 'ia'},
area = {'area', 'ar'},
aci = {
'cia', 'iac', 'aci', 'ica', 'cai', 'aic', 'creatureItemArea',
'itemCreatureArea', 'AreaCreatureItem', 'itemAreaCreature',
'creatureAreaItem', 'AreaItemCreature'
},
ac = {'ac', 'ca', 'areaCreature', 'creatureArea'},
al = {'al', 'la', 'armLeg', 'legArm'},
cs = {'cs', 'sc', 'creatureSelf', 'selfCreature'}
},
duration = {
instant = {'0', 'in', 'instant', 'i'},
always = {'always', 'forever', '4', 'inf'},
noLimit = {'noLimit', '1', 'nl'},
whileUp = {'up', 'whileUp', 'u'},
whileDown = {'dn', 'whileDown', 'd'},
whileAlive = {'al', 'whileAlive', 'a'},
whileDead = {'dd', 'whileDead'},
endOfTurn = {'end', 'endOfTurn', 'e'},
dawn = {'dawn', 'd'},
startOfTargetNextTurn = {'tStart', 'startOfTargetNextTurn', 'ts'},
endOfTargetNextTurn = {'tEnd', 'endOfTargetNextTurn', 'te'},
startOfYourNextTurn = {'uStart', 'startOfYourNextTurn', 'us'},
endOfYourNextTurn = {'uEnd', 'endOfYourNextTurn', 'ue'},
endOfCombat = {'endOfCombat', 'ec'},
timeParse = {'^%d+[mhdwys]$'}
},
upgrade = {
warded = {'wrd', 'warded', 'w'},
absolute = {'abs', 'absolute', 'a'}
},
executionTime = {
freeAction = {'0a', 'freeAction', 'fa'},
singleAction = {'1a', 'a', 'singleAction', 'sa'},
doubleAction = {'2a', 'doubleAction', 'da'},
tripleAction = {'3a', 'tripleAction', 'ta'},
freeReaction = {'0r', 'freeReaction', 'fr'},
reaction = {'1r', 'reaction', 'r'},
shortRest = {'sr', 'shortRest', 's'},
longRest = {'lr', 'longRest', 'l'},
timeParse = {'^%d+[mhdwy]$'}
},
piercing = {av0 = {'av0', 'a'}, unblockable = {'ub', 'u'}},
range = {
melee = {'melee', 'm'},
weapon = {'weapon', 'weaponReach', 'w'},
hand = {'hand', 'handReach', 'h'},
bite = {'bite', 'biteReach', 'b'},
item = {'item', 'itemReach', 'i'},
shield = {'shield', 'shieldReach', 'sh'},
armor = {'armor', 'armorReach', 'r'},
sight = {'sight', 'sightReach', 'eye', 'e'},
self = {'self', 's'},
distParse = {'^%d+[fm]$'},
other = {'other', 'o'}
},
attribute = {
int = {'int', 'INT', 'i'},
str = {'str', 'STR', 's'},
mov = {'mov', 'MOV', 'm'},
per = {'per', 'PER', 'p'},
snk = {'snk', 'SNK', 's'},
unp = {'unp', 'UNP', 'u'}
},
expansionAttribute = {
int = {'int', 'INT', 'i'},
str = {'str', 'STR', 's'},
mov = {'mov', 'MOV', 'm'},
per = {'per', 'PER', 'p'},
snk = {'snk', 'SNK', 's'},
unp = {'unp', 'UNP', 'u'}
},
expansion = {
detonate = {'det', 'detonate', 'd'},
ripple = {'rip', 'ripple', 'r'},
cascade = {'cas', 'cascade', 'c'},
fork = {'for', 'fork', 'f'}
},
expansionRange = {distParse = {'^%d+[fm]$'}},
expansionCount = {expansionCount = {'expansionCount', 'ec'}},
sustained = {sustained = {'sus', 'sustained', 's', '1'}},
verbal = {verbal = {'ver', 'verbal', 'v', '1'}},
somatic = {somatic = {'som', 'somatic', 's', '1'}},
material = {material = {'mat', 'material', 'm', '1'}},
magelore = {magelore = {'mag', 'magelore', 'ml', '1'}},
invoked = {invoked = {'inv', 'invoked', 'i', '1'}},
class = {
ber = {'ber'},
due = {'due'},
vet = {'vet'},
kni = {'kni'},
pal = {'pal'},
ass = {'ass'},
cor = {'cor'},
arc = {'arc'},
thi = {'thi'},
ran = {'ran'},
fla = {'fla'},
sto = {'sto'},
lif = {'lif'},
nec = {'nec'},
nat = {'nat'}
}
}
}
local tags = {
verbal = {
verbal = {
text = 'Verbal',
link = 'Verbal component abilities',
symbol = '🗣️',
color = '#f9f06b',
class = 'component-tagged verbal'
}
},
somatic = {
somatic = {
text = 'Somatic',
link = 'Somatic component abilities',
symbol = '👐',
color = '#f9f06b',
class = 'component-tagged somatic'
}
},
material = {
material = {
text = 'Material',
link = 'Material component abilities',
symbol = '💎',
color = '#ff7800',
class = 'component-tagged material'
}
},
magelore = {
magelore = {
text = 'Magelore',
link = 'Magelore component abilities',
symbol = '🔮',
color = '#f9f06b',
class = 'component-tagged magelore'
}
},
invoked = {
invoked = {
text = 'Invoked',
link = 'Invoked component abilities',
symbol = '🪄',
color = '#f9f06b',
class = 'component-tagged invoked'
}
},
flaw = {
flaw = {
text = 'Flaw',
link = 'Flaw abilities',
symbol = '❌',
color = '#e01b24',
class = 'flaw-tagged flaw'
}
},
special = {
special = {
text = 'Special',
link = 'Special abilities',
symbol = '✴️',
color = '#9141AC',
class = 'special-tagged special'
}
},
es = {
es = {
text = 'Elder Sorcery',
link = 'Elder Sorcery abilities',
symbol = '🌌',
color = '#9141AC',
class = 'elderSorcery-tagged elderSorcery'
}
},
warded = {
warded = {
text = 'Warded',
link = 'Warded abilities',
symbol = '🏮',
color = '#f9f06b',
class = 'warded-tagged warded'
}
},
elements = {
life = {
text = 'Life',
link = 'Life element abilities',
symbol = '☀️',
color = '#ffffff',
class = 'element-tagged life'
},
storm = {
text = 'Storm',
link = 'Storm element abilities',
symbol = '💧',
color = '#3584e4',
class = 'element-tagged storm'
},
necro = {
text = 'Necromancy',
link = 'Necromancy element abilities',
symbol = '💀',
color = '#3d3846',
class = 'element-tagged necromancy'
},
flame = {
text = 'Flame',
link = 'Flame element abilities',
symbol = '🔥',
color = '#e01b24',
class = 'element-tagged flame'
},
nature = {
text = 'Nature',
link = 'Nature element abilities',
symbol = '🌱',
color = '#33d17a',
class = 'element-tagged nature'
}
},
class = {
ber = {
text = 'Berserker',
link = 'Berserker class abilities',
symbol = '🪓',
class = 'class-tagged berserker'
},
due = {
text = 'Duelist',
link = 'Duelist class abilities',
symbol = '🤺',
class = 'class-tagged duelist'
},
vet = {
text = 'Veteran',
link = 'Veteran class abilities',
symbol = '🪖',
class = 'class-tagged veteran'
},
kni = {
text = 'Knight',
link = 'Knight class abilities',
symbol = '⚔️',
class = 'class-tagged knight'
},
pal = {
text = 'Paladin',
link = 'Paladin class abilities',
symbol = '🛡️',
class = 'class-tagged paladin'
},
ass = {
text = 'Assassin',
link = 'Assassin class abilities',
symbol = '🗡️',
class = 'class-tagged assassin'
},
cor = {
text = 'Corsair',
link = 'Corsair class abilities',
symbol = '🏴☠️',
class = 'class-tagged corsair'
},
arc = {
text = 'Archer',
link = 'Archer class abilities',
symbol = '🏹',
class = 'class-tagged archer'
},
thi = {
text = 'Thief',
link = 'Thief class abilities',
symbol = '💰️',
class = 'class-tagged thief'
},
ran = {
text = 'Ranger',
link = 'Ranger class abilities',
symbol = '🐾',
class = 'class-tagged ranger'
},
fla = {
text = 'Flame Mage',
link = 'Flame Mage class abilities',
symbol = '🧙',
class = 'class-tagged flameMage'
},
sto = {
text = 'Storm Mage',
link = 'Storm Mage class abilities',
symbol = '🧙',
class = 'class-tagged stormMage'
},
lif = {
text = 'Life Mage',
link = 'Life Mage class abilities',
symbol = '🧙',
class = 'class-tagged lifeMage'
},
nec = {
text = 'Necromancer',
link = 'Necromancer class abilities',
symbol = '🧙',
class = 'class-tagged necromancer'
},
nat = {
text = 'Nature Mage',
link = 'Nature Mage class abilities',
symbol = '🧙',
class = 'class-tagged natureMage'
}
},
power = {
divine = {
text = 'Divine',
link = 'Divinely powered abilities',
symbol = '🪽',
color = '#f9f06b',
class = 'power-tagged divine'
},
magic = {
text = 'Magical',
link = 'Magically powered abilities',
symbol = '✨',
color = '#9141ac',
class = 'power-tagged magical'
},
spirit = {
text = 'Spiritual',
link = 'Spiritually powered abilities',
symbol = '🪭',
color = '#9a9996',
class = 'power-tagged spiritual'
},
martial = {
text = 'Martial',
link = 'Martially powered abilities',
symbol = '💪',
color = '#ff7800',
class = 'power-tagged martial'
},
psionic = {
text = 'Psionic',
link = 'Psionically powered abilities',
symbol = '🤯',
color = '#3584e4',
class = 'power-tagged psionic'
},
primal = {
text = 'Primal',
link = 'Primally powered abilities',
symbol = '⛰️',
color = '#986a44',
class = 'power-tagged primal'
},
techo = {
text = 'Technological',
link = 'Technologically powered abilities',
symbol = '⚙️',
color = '#e01b24',
class = 'power-tagged technological'
},
finance = {
text = 'Financial',
link = 'Financially powered abilities',
symbol = '🪙',
color = '#fcc200',
class = 'power-tagged financial'
},
alchemy = {
text = 'Alchemical',
link = 'Alchemically powered abilities',
symbol = '🧪',
color = '#33d17a',
class = 'power-tagged alchemical'
},
unknown = {
text = 'Unknown',
link = 'Unknown powered abilities',
symbol = '❓',
color = '#77767b',
class = 'power-tagged unknown'
}
},
category = {
skill = {
text = 'Skill',
link = 'Skills',
symbol = '🤹',
class = 'skill'
},
spell = {
text = 'Spell',
link = 'Spells',
symbol = '✨',
class = 'spell'
},
semblant = {
text = 'Semblant',
link = 'Semblant skills',
symbol = '🎭',
class = 'standard-tagged semblant'
},
conjure = {
text = 'Conjured',
link = 'Conjured spells',
symbol = '🔮',
class = 'standard-tagged conjure'
},
standard = {
text = 'Standard',
link = 'Standard abilities',
symbol = '🏁',
class = 'standard-tagged normal'
},
rotator = {
text = 'Rotator',
link = 'Rotator abilities',
symbol = '🔄',
class = 'rotator'
}
},
effects = {
mental = {
text = 'Mental',
link = 'Mental effects',
symbol = '🧠',
class = 'effect-tagged mental'
},
truth = {
text = 'Truth detecting',
link = 'Truth detecting effects',
symbol = '⚖️',
class = 'effect-tagged truthDetecting'
},
duelMod = {
text = 'Duel modifying',
link = 'Duel modifying effects',
symbol = '🤺',
class = 'effect-tagged duelModifying'
},
movement = {
text = 'Movement',
link = 'Movement effects',
symbol = '👣',
class = 'effect-tagged movement'
},
poison = {
text = 'Poison',
link = 'Poison effects',
symbol = '☠️',
class = 'effect-tagged poison'
},
displacement = {
text = 'Displacement',
link = 'Displacement effects',
symbol = '🌀',
class = 'effect-tagged displacement'
},
transformation = {
text = 'Transformation',
link = 'Transformation effects',
symbol = '🌳',
class = 'effect-tagged transformation'
},
control = {
text = 'Control',
link = 'Control effects',
symbol = '⛓️',
class = 'effect-tagged control'
},
resist = {
text = 'Resistance',
link = 'Resistance effects',
symbol = '🚫',
class = 'effect-tagged resistance'
},
awaken = {
text = 'Awakening',
link = 'Awakening effects',
symbol = '🌞',
class = 'effect-tagged awakening'
},
immune = {
text = 'Immunity',
link = 'Immunity effects',
symbol = '🚫',
class = 'effect-tagged immunity'
},
long = {
text = 'Long range',
link = 'Long range effects',
symbol = '📏',
class = 'effect-tagged longRange'
},
sense = {
text = 'Sensory',
link = 'Sensory effects',
symbol = '👁️',
class = 'effect-tagged sensory'
},
revive = {
text = 'Revival',
link = 'Revival effects',
symbol = '🤍',
class = 'effect-tagged revival'
},
summon = {
text = 'Summoning',
link = 'Summoning effects',
symbol = '🖤',
class = 'effect-tagged summoning'
},
heal = {
text = 'Healing',
link = 'Healing effects',
symbol = '❤️',
class = 'effect-tagged healing'
},
reanimate = {
text = 'Reanimation',
link = 'Reanimation effects',
symbol = '🩶',
class = 'effect-tagged reanimation'
},
regenerate = {
text = 'Regeneration',
link = 'Regeneration effects',
symbol = '💚',
class = 'effect-tagged regeneration'
},
revitalize = {
text = 'Revitalization',
link = 'Revitalization effects',
symbol = '🩵',
class = 'effect-tagged revitalization'
},
kill = {
text = 'Killing',
link = 'Killing effects',
symbol = '☠️',
class = 'effect-tagged killing'
},
damage = {
text = 'Damaging',
link = 'Damaging effects',
symbol = '💢',
class = 'effect-tagged damaging'
},
steal = {
text = 'Stealing',
link = 'Stealing effects',
symbol = '💰',
class = 'effect-tagged stealing'
},
loud = {
text = 'Loud',
link = 'Loud effects',
symbol = '🔊',
class = 'effect-tagged loud'
},
knockout = {
text = 'Knockout',
link = 'Knockout effects',
symbol = '💤',
class = 'effect-tagged knockout'
},
time = {
text = 'Temporal',
link = 'Temporal effects',
symbol = '🕰️',
class = 'effect-tagged temporal'
}
},
pre = {
strike = {
text = 'Strike',
link = 'Strike delivery abilities',
symbol = '⚔️',
class = 'deliveryPackage-tagged strike'
},
ray = {
text = 'Ray',
link = 'Ray delivery abilities',
symbol = '⚡️',
class = 'deliveryPackage-tagged ray'
},
ball = {
text = 'Ball',
link = 'Ball delivery abilities',
symbol = '🔥',
class = 'deliveryPackage-tagged ball'
},
aura = {
text = 'Aura',
link = 'Aura delivery abilities',
symbol = '🌟',
class = 'deliveryPackage-tagged aura'
},
ritual = {
text = 'Ritual',
link = 'Ritual delivery abilities',
symbol = '🕯️',
class = 'deliveryPackage-tagged ritual'
},
touch = {
text = 'Touch',
link = 'Touch delivery abilities',
symbol = '👉️',
class = 'deliveryPackage-tagged touch'
}
},
maneuver = {
active = {
text = 'Active',
link = 'Active abilities',
symbol = '➡️',
class = 'maneuver-tagged active'
},
reactive = {
text = 'Reactive',
link = 'Reactive abilities',
symbol = '↩️',
class = 'maneuver-tagged reactive'
},
passive = {
text = 'Passive',
link = 'Passive abilities',
symbol = '🔁',
class = 'maneuver-tagged passive'
},
slow = {
text = 'Slow',
link = 'Slow abilities',
symbol = '🐢',
class = 'maneuver-tagged slow'
}
},
interaction = {
attack = {
text = 'Attack',
link = 'Attack abilities',
symbol = '⚔️',
color = '#ff7800',
class = 'interaction-tagged attack'
},
block = {
text = 'Block',
link = 'Block abilities',
symbol = '🛡️',
color = '#ff7800',
class = 'interaction-tagged block'
},
manifest = {
text = 'Manifest',
link = 'Manifest abilities',
symbol = '✳️',
color = '#ff7800',
class = 'interaction-tagged manifest'
},
feat = {
text = 'Feat',
link = 'Feat abilities',
symbol = '🎖️',
color = '#ff7800',
class = 'interaction-tagged feat'
}
},
delivery = {
self = {
text = 'Self',
link = 'Self delivery abilities',
symbol = '🤲',
color = '#f6d32d',
class = 'delivery-tagged self'
},
missile = {
text = 'Missile',
link = 'Missile delivery abilities',
symbol = '🏹',
color = '#f6d32d',
class = 'delivery-tagged missile'
},
hand = {
text = 'Hand',
link = 'Hand delivery abilities',
symbol = '🤚',
color = '#f6d32d',
class = 'delivery-tagged hand'
},
bite = {
text = 'Bite',
link = 'Bite delivery abilities',
symbol = '🦷',
color = '#f6d32d',
class = 'delivery-tagged bite'
},
item = {
text = 'Item',
link = 'Item delivery abilities',
symbol = '📦',
color = '#f6d32d',
class = 'delivery-tagged item'
},
magelore = {
text = 'Magelore',
link = 'Magelore delivery abilities',
symbol = '🔮',
color = '#f6d32d',
class = 'delivery-tagged magelore'
},
weapon = {
text = 'Weapon',
link = 'Weapon delivery abilities',
symbol = '🗡️',
color = '#f6d32d',
class = 'delivery-tagged weapon'
},
shield = {
text = 'Shield',
link = 'Shield delivery abilities',
symbol = '🛡️',
color = '#f6d32d',
class = 'delivery-tagged shield'
},
armor = {
text = 'Armor',
link = 'Armor delivery abilities',
symbol = '🪖',
color = '#f6d32d',
class = 'delivery-tagged armor'
},
sight = {
text = 'Sight',
link = 'Sight delivery abilities',
symbol = '👁️',
color = '#f6d32d',
class = 'delivery-tagged sight'
},
aura = {
text = 'Aura',
link = 'Aura delivery abilities',
symbol = '🌟',
color = '#f6d32d',
class = 'delivery-tagged aura'
},
cone = {
text = 'Cone',
link = 'Cone delivery abilities',
symbol = '🐲',
color = '#f6d32d',
class = 'delivery-tagged cone'
},
other = {
text = 'Other',
link = 'Other delivery abilities',
symbol = '❓',
color = '#f6d32d',
class = 'delivery-tagged other'
}
},
target = {
self = {
text = 'Self',
link = 'Self target abilities',
symbol = '🤲',
color = '#f6d32d',
class = 'target-tagged self'
},
creature = {
text = 'Creature',
link = 'Creature target abilities',
symbol = '👤',
color = '#f6d32d',
class = 'target-tagged creature'
},
body = {
text = 'Body',
link = 'Body target abilities',
symbol = '🧍',
color = '#f6d32d',
class = 'target-tagged body'
},
vitals = {
text = 'Vitals',
link = 'Vitals target abilities',
symbol = '🫀',
color = '#f6d32d',
class = 'target-tagged vitals'
},
limb = {
text = 'Limb',
link = 'Limb target abilities',
symbol = '🦾',
color = '#f6d32d',
class = 'target-tagged limb'
},
arm = {
text = 'Arm',
link = 'Arm target abilities',
symbol = '💪',
color = '#f6d32d',
class = 'target-tagged arm'
},
leg = {
text = 'Leg',
link = 'Leg target abilities',
symbol = '🦵',
color = '#f6d32d',
class = 'target-tagged leg'
},
item = {
text = 'Item',
link = 'Item target abilities',
symbol = '📦',
color = '#f6d32d',
class = 'target-tagged item'
},
weapon = {
text = 'Weapon',
link = 'Weapon target abilities',
symbol = '🗡️',
color = '#f6d32d',
class = 'target-tagged weapon'
},
shield = {
text = 'Shield',
link = 'Shield target abilities',
symbol = '🛡️',
color = '#f6d32d',
class = 'target-tagged shield'
},
armor = {
text = 'Armor',
link = 'Armor target abilities',
symbol = '🪖',
color = '#f6d32d',
class = 'target-tagged armor'
},
ship = {
text = 'Ship',
link = 'Ship target abilities',
symbol = '⛵️',
color = '#f6d32d',
class = 'target-tagged ship'
},
attack = {
text = 'Attack',
link = 'Attack target abilities',
symbol = '⚔️',
color = '#f6d32d',
class = 'target-tagged attack'
},
ability = {
text = 'Ability',
link = 'Ability target abilities',
symbol = '🅰',
color = '#f6d32d',
class = 'target-tagged ability'
},
spell = {
text = 'Spell',
link = 'Spell target abilities',
symbol = '💫',
color = '#f6d32d',
class = 'target-tagged spell'
},
other = {
text = 'Other',
link = 'Other target abilities',
symbol = '❓',
color = '#f6d32d',
class = 'target-tagged other'
},
area = {
text = 'Area',
link = 'Area target abilities',
symbol = '🏕️',
color = '#f6d32d',
class = 'target-tagged area'
},
ci = {tags = {'creature', 'item'}},
ai = {tags = {'attack', 'item'}},
aci = {tags = {'area', 'creature', 'item'}},
ac = {tags = {'area', 'creature'}},
al = {tags = {'arm', 'leg'}},
cs = {tags = {'creature', 'self'}}
},
upgrade = {
warded = {
text = 'Warded',
link = 'Warded abilities',
class = 'upgrade-tagged warded'
},
absolute = {
text = 'Absolute',
link = 'Absolute abilities',
class = 'upgrade-tagged absolute'
}
},
executionTime = {
freeAction = {
text = 'Free action',
symbol = '0️⃣',
link = 'Free action abilities',
class = 'executionTime-tagged a0'
},
singleAction = {
text = 'Single action',
symbol = '1️⃣',
link = 'Single action abilities',
class = 'executionTime-tagged a1'
},
doubleAction = {
text = 'Double action',
symbol = '2️⃣',
link = 'Double action abilities',
class = 'executionTime-tagged a2'
},
tripleAction = {
text = 'Triple action',
symbol = '3️⃣',
link = 'Triple action abilities',
class = 'executionTime-tagged a3'
},
freeReaction = {
text = 'Free reaction',
symbol = '0️⃣',
link = 'Free reaction abilities',
class = 'executionTime-tagged r0'
},
reaction = {
text = 'Reaction',
symbol = '1️⃣',
link = 'Reaction abilities',
class = 'executionTime-tagged r1'
},
shortRest = {
text = 'Short rest',
symbol = '🌙',
link = 'Short rest abilities',
class = 'executionTime-tagged shortRest'
},
longRest = {
text = 'Long rest',
symbol = '🌙',
link = 'Long rest abilities',
class = 'executionTime-tagged longRest'
}
},
piercing = {
av0 = {
text = 'AV0',
symbol = '🎯',
link = 'AV0 abilities',
color = '#33d17a',
class = 'piercing-tagged av0'
},
unblockable = {
text = 'UB',
symbol = '🪨',
link = 'UB abilities',
color = '#33d17a',
class = 'piercing-tagged ub'
}
},
duration = {
instant = {
text = 'Instant',
link = 'Instant duration abilities',
no = true
},
always = {
text = 'Always active',
link = 'Always active duration abilities',
no = true
},
noLimit = {
text = 'No limit',
link = 'No limit duration abilities',
no = true
},
whileUp = {
text = 'While up',
link = 'While up duration abilities',
no = true
},
whileDown = {
text = 'While down',
link = 'While down duration abilities',
no = true
},
whileAlive = {
text = 'While alive',
link = 'While alive duration abilities',
no = true
},
whileDead = {
text = 'While dead',
link = 'While dead duration abilities',
no = true
},
endOfTurn = {
text = 'Until the end of the turn',
link = 'Until end of turn duration abilities',
no = true
},
dawn = {
text = 'Until dawn',
link = 'Until dawn duration abilities',
no = true
},
startOfTargetNextTurn = {
text = 'Until the start of target\'s next turn',
link = 'Until start of target\'s next turn duration abilities',
no = true
},
endOfTargetNextTurn = {
text = 'Until the end of target\'s next turn',
link = 'Until end of target\'s next turn duration abilities',
no = true
},
startOfYourNextTurn = {
text = 'Until the start of your next turn',
link = 'Until start of your next turn duration abilities',
no = true
},
endOfYourNextTurn = {
text = 'Until the end of your next turn',
link = 'Until end of your next turn duration abilities',
no = true
},
endOfCombat = {
text = 'Until the end of combat',
link = 'Until end of combat duration abilities',
no = true
}
},
range = {
melee = {
text = 'Your melee range',
-- link = 'Melee abilities',
no = true
},
weapon = {
text = 'Your weapon\'s range',
-- link = 'Weapon range abilities',
no = true
},
hand = {
text = 'Your hand\'s range',
-- link = 'Hand range abilities',
no = true
},
bite = {
text = 'Your bite\'s range',
-- link = 'Bite range abilities',
no = true
},
item = {
text = 'Your item\'s range',
-- link = 'Item range abilities',
no = true
},
shield = {
text = 'Your shield\'s range',
-- link = 'Shield range abilities',
no = true
},
armor = {
text = 'Your armor\'s range',
-- link = 'Armor range abilities',
no = true
}
},
attribute = {
int = {
text = 'Intelligence',
symbol = 'INT',
link = 'INT save abilities',
class = 'saveAttribute-tagged int'
},
str = {
text = 'Strength',
symbol = 'STR',
link = 'STR save abilities',
class = 'saveAttribute-tagged str'
},
mov = {
text = 'Movement',
symbol = 'MOV',
link = 'MOV save abilities',
class = 'saveAttribute-tagged mov'
},
per = {
text = 'Perception',
symbol = 'PER',
link = 'PER save abilities',
class = 'saveAttribute-tagged per'
},
snk = {
text = 'Sneak',
symbol = 'SNK',
link = 'SNK save abilities',
class = 'saveAttribute-tagged snk'
},
unp = {
text = 'Unused Presence',
symbol = 'UNP',
link = 'UNP save abilities',
class = 'saveAttribute-tagged unp'
}
},
expansionAttribute = {
int = {
text = 'Intelligence',
symbol = 'INT',
link = 'INT save abilities',
class = 'expansionAttribute-tagged int'
},
str = {
text = 'Strength',
symbol = 'STR',
link = 'STR save abilities',
class = 'expansionAttribute-tagged str'
},
mov = {
text = 'Movement',
symbol = 'MOV',
link = 'MOV save abilities',
class = 'expansionAttribute-tagged mov'
},
per = {
text = 'Perception',
symbol = 'PER',
link = 'PER save abilities',
class = 'expansionAttribute-tagged per'
},
snk = {
text = 'Sneak',
symbol = 'SNK',
link = 'SNK save abilities',
class = 'expansionAttribute-tagged snk'
},
unp = {
text = 'Unused Presence',
symbol = 'UNP',
link = 'UNP save abilities',
class = 'expansionAttribute-tagged unp'
}
},
expansion = {
detonate = {
text = 'Detonate',
symbol = '💥',
link = 'Detonate expansion abilities',
class = 'expansion-tagged detonate'
},
ripple = {
text = 'Ripple',
symbol = '🌊',
link = 'Ripple expansion abilities',
class = 'expansion-tagged ripple'
},
cascade = {
text = 'Cascade',
symbol = '➰',
link = 'Cascade expansion abilities',
class = 'expansion-tagged cascade'
},
fork = {
text = 'Fork',
symbol = '🔱',
link = 'Fork expansion abilities',
class = 'expansion-tagged fork'
}
},
sustained = {
sustained = {
text = 'Sustained',
symbol = '⏳️',
link = 'Sustained abilities',
class = 'sustained'
}
}
}
local premades = {
strike = {
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'weapon',
target = 'creature',
duration = 'instant',
range = 'weapon'
},
ray = {
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'missile',
target = 'creature',
duration = 'instant',
range = '60f',
piercing = 'av0'
},
ball = {
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'missile',
target = 'creature',
duration = 'instant',
range = '30f',
piercing = 'ub'
},
aura = {
skip = true,
maneuver = 'active',
executionTime = '1a',
interaction = 'feat',
delivery = 'aura',
target = 'creature',
duration = 'instant',
range = '10f',
attribute = 'mov'
},
ritual = {
maneuver = 'slow',
executionTime = '10m',
interaction = 'manifest',
delivery = 'sight',
target = 'creature',
duration = 'instant',
range = '5f'
},
touch = {
maneuver = 'active',
executionTime = '1a',
interaction = 'attack',
delivery = 'hand',
target = 'creature',
duration = 'instant',
range = 'hand',
piercing = 'ub'
},
triumph = {
skip = true,
maneuver = 'reactive',
executionTime = '0r',
interaction = 'manifest',
delivery = 'self',
target = 'self',
duration = 'instant',
range = 'self'
},
self = {
skip = true,
maneuver = 'active',
executionTime = '1a',
interaction = 'man',
delivery = 'self',
target = 'self',
duration = 'instant',
range = 'self'
},
passive = {
skip = true,
maneuver = 'passive',
interaction = 'man',
delivery = 'self',
target = 'self',
duration = '4',
range = 'self'
},
crown = {
skip = true,
maneuver = 'active',
executionTime = '1a',
interaction = 'man',
delivery = 'self',
target = 'self',
duration = '8h',
range = 'self',
sustained = 'sus'
}
}
function noPlural(word)
-- Common irregular plural forms
local irregulars = {
["children"] = "child",
["men"] = "man",
["women"] = "woman",
["feet"] = "foot",
["teeth"] = "tooth",
["mice"] = "mouse",
["geese"] = "goose"
}
-- Check for irregular forms
if irregulars[word] then return irregulars[word] end
-- Regular pluralization rules
if word:match("ies$") then
-- Change words ending in 'ies' to 'y' (e.g., "parties" -> "party")
return word:sub(1, -4) .. "y"
elseif word:match("ves$") then
-- Change words ending in 'ves' to 'f' or 'fe' (e.g., "wolves" -> "wolf")
return word:sub(1, -4) .. "f"
elseif word:match("s$") and not word:match("ss$") then
-- Remove trailing 's' (e.g., "cats" -> "cat", but keep "boss")
return word:sub(1, -2)
else
-- Return the word unchanged if no pluralization rule applies
return word
end
end
local function addCategory(category, key, val, skill, spell, addCats, noLower)
if addCats then
if not noLower then category = category:lower() end
if tags[key] and tags[key][val] then
if tags[key][val].tags then
out = ''
for _, t in ipairs(tags[key][val].tags) do
out = out ..
addCategory(category, key, t, skill, spell,
addCats, true)
end
return out
else
category = tags[key][val].link
end
end
if skill then
skillCategory = category:gsub('ability', 'skill'):gsub('abilities',
'skills')
skillCategory = skillCategory:gsub("^%l", string.upper)
end
if spell then
spellCategory = category:gsub('ability', 'spell'):gsub('abilities',
'spells')
spellCategory = spellCategory:gsub("^%l", string.upper)
end
category = category:gsub("^%l", string.upper)
local c = '[[Category:' .. tostring(category) .. ']]'
if skill then
c = c .. '[[Category:' .. tostring(skillCategory) .. ']]'
end
if spell then
c = c .. '[[Category:' .. tostring(spellCategory) .. ']]'
end
return c
else
return ''
end
end
local function makeTag(frame, key, value, makeCat, transparent)
if not tags[key] or not tags[key][value] then
if value then
local out =
frame:preprocess("{{ucfirst:" .. tostring(value) .. "}}")
if not ('.' == out:sub(-1)) then out = out .. '.' end
return out
else
return ''
end
end
local tag = tags[key][value]
if tag.no then
local out = frame:preprocess("{{ucfirst:" .. tag.text .. "}}")
if not ('.' == out:sub(-1)) then out = out .. '.' end
return out
end
if tag.tags then
local out = ''
for _, t in ipairs(tag.tags) do
out = out .. makeTag(frame, key, t, makeCat, transparent)
end
return out
end
local tagText = "{{Tag|{{ucfirst:" .. tag.text .. "}}"
if tag.symbol then tagText = tagText .. "|" .. tag.symbol end
if tag.link then
tagText = tagText .. "|l=:Category:{{ucfirst:" .. tag.link .. "}}"
end
if tag.color then tagText = tagText .. "|c=" .. tag.color end
if tag.class then tagText = tagText .. "|class=" .. tag.class end
if transparent then tagText = tagText .. "|o=1" end
tagText = tagText .. "}}"
-- out = frame:preprocess(tagText)
out = tagText
return out
end
local function makeContent(frame, table, keys, makeCat)
local content = ''
local subContent = ''
local hasPre = false
for _, key in ipairs(keys) do
if ('pre' == key and table['pre']) or
('executionTime' == key and table['executionTime']) or
('target' == key) or ('duration' == key) or
('invoked' == key and table['invoked']) then
hasPre = true
content = content ..
frame:preprocess(
makeTag(frame, key, table[key], makeCat))
else
if hasPre then
subContent = subContent ..
makeTag(frame, key, table[key], makeCat)
else
content = content ..
frame:preprocess(
makeTag(frame, key, table[key], makeCat))
end
end
end
if hasPre then
content = content .. frame:preprocess('{{TagSub|' .. subContent .. '}}')
-- content = content .. '{{TagSub|' .. subContent .. '}}'
end
if content == '' then
for _, key in ipairs(keys) do
if table[key] then
content = frame:preprocess(
'{{ucfirst:' .. content .. table[key] .. '}}')
end
end
end
return content
end
local function makeBar(frame, title, content, link, flags, bottom)
if content == '' then return '' end
local barSpace = mw.html.create('span')
barSpace:wikitext(frame:preprocess(' ')):css('display', 'none')
local barTitle = mw.html.create('span')
local barTitleClass = "{{lc:" .. title .. "}}"
barTitleClass = barTitleClass:gsub(' ', '-')
barTitleClass = barTitleClass:gsub('\'', '')
barTitleClass = barTitleClass:gsub('\"', '')
local barText = "{{ucfirst:" .. title .. "}}"
if link then barText = "[[" .. link .. "|" .. barText .. "]]" end
barText = barText .. ":"
barTitle:addClass('ability-bar-title'):wikitext(frame:preprocess(barText))
:css('font-weight', 'bold'):css('margin-right', '0.5em')
local barContent = mw.html.create('span')
barContent:addClass('ability-bar-content'):wikitext(content)
local output = mw.html.create('div')
if bottom then output = mw.html.create('span') end
if not flags then flags = {} end
for k, v in pairs(flags) do
if type(v) == 'string' then
output:addClass('flag-' .. k .. '-' .. v)
end
end
output:addClass('ability-bar'):addClass('ability-bar-' .. barTitleClass)
:attr(flags):attr('test', 'out'):node(barSpace):node(barTitle):node(
barSpace):node(barContent):css('display', 'block')
-- if flags then
-- for k, v in ipairs(flags) do
-- output:attr(k, v)
-- end
-- end
return tostring(output)
end
local function nonempty(v)
if v == nil then return false end
if type(v) ~= 'string' then return true end
return mw.text.trim(v) ~= ''
end
local function resolveAlias(args, aliases)
local resolved = {}
-- Resolve keys
for canonicalKey, keyAliasList in pairs(aliases.keys) do
for _, alias in ipairs(keyAliasList) do
local v = args[alias]
if nonempty(v) then
resolved[canonicalKey] = v
break
end
end
end
-- Resolve values
for canonicalKey, canonicalValueTable in pairs(aliases.values) do
local rawValue = resolved[canonicalKey]
-- Treat empty/whitespace as false
if rawValue ~= nil and not nonempty(rawValue) then
resolved[canonicalKey] = false
elseif rawValue ~= nil then
for canonicalValue, valueAliasList in pairs(canonicalValueTable) do
for _, alias in ipairs(valueAliasList) do
if rawValue == alias then
resolved[canonicalKey] = canonicalValue
break
elseif type(valueAliasList) == "table" and valueAliasList[1] and
type(rawValue) == "string" and
rawValue:match(valueAliasList[1]) then
-- (keep your existing time/range parsing here unchanged)
if canonicalKey == "duration" or canonicalKey ==
"executionTime" then
local num = tonumber(rawValue:match("^(%d+)"))
local unit = rawValue:match("[%a]+$")
local unitMap = {
m = "minute",
h = "hour",
d = "day",
w = "week",
y = "year",
r = "round",
s = "second"
}
resolved[canonicalKey] = unitMap[unit] and
(num .. " " ..
unitMap[unit] ..
(num > 1 and "s" or
"")) or
rawValue
elseif canonicalKey == "range" or canonicalKey ==
"expansionRange" then
local num = tonumber(rawValue:match("^(%d+)"))
local unit = rawValue:match("[%a]+$")
local unitMap = {f = "feet", m = "miles"}
resolved[canonicalKey] = unitMap[unit] and
(num .. " " ..
unitMap[unit]) or
rawValue
end
end
end
end
end
end
return resolved
end
local classFixes = {bar = 'ber', sam = 'due', ama = 'cor'}
local classArchetypes = {
ber = 'warr',
due = 'warr',
vet = 'warr',
kni = 'warr',
pal = 'warr',
ass = 'semi',
cor = 'semi',
arc = 'semi',
thi = 'semi',
ran = 'semi',
fla = 'mage',
sto = 'mage',
lif = 'mage',
nec = 'mage',
nat = 'mage'
}
local className = {
ber = 'Berserker',
due = 'Duelist',
vet = 'Veteran',
kni = 'Knight',
pal = 'Paladin',
ass = 'Assassin',
cor = 'Corsair',
arc = 'Archer',
thi = 'Thief',
ran = 'Ranger',
fla = 'Flame Mage',
sto = 'Storm Mage',
lif = 'Life Mage',
nec = 'Necromancer',
nat = 'Nature Mage'
}
local archetypeName = {warr = 'Warrior', semi = 'Semi', mage = 'Mage'}
function p.a(frame)
makeCat = true
-- Figure out all the default values
-- Prefer parent args if invoked via a template
local parent = frame:getParent()
local rawArgs = parent and parent.args or frame.args
-- Drop empty/whitespace-only values so "" behaves like false/nil
local args = {}
for k, v in pairs(rawArgs) do if nonempty(v) then args[k] = v end end
local resolved = {}
if args['pre'] then
local toResolve = resolveAlias(premades[args['pre']], aliases)
for k, v in pairs(toResolve) do resolved[k] = v end
end
local userResolve = resolveAlias(args, aliases)
for k, v in pairs(userResolve) do resolved[k] = v end
if resolved['pre'] and premades[args['pre']]['skip'] then
resolved['pre'] = nil
end
if not resolved['duration'] then resolved['duration'] = 'instant' end
if resolved['interaction'] == 'attack' then
local dc = "Hit target's {{AC}}"
if resolved['target'] == 'limb' then
dc = "Hit target's {{Var:ACLimb}}"
end
if resolved['target'] == 'arm' then
dc = "Hit target's {{Var:ACLimb}}"
end
if resolved['target'] == 'leg' then
dc = "Hit target's {{Var:ACLimb}}"
end
if resolved['target'] == 'vitals' then
dc = "Hit target's {{Var:ACVitals}}"
end
if resolved['target'] == 'item' then
dc = "Hit DC [[Core:Item Target|depends on item]]"
end
if resolved['target'] == 'shield' then
dc = "Hit user's {{Var:ACWielded}}"
end
if resolved['target'] == 'armor' then
dc = "Hit user's {{Var:ACWorn}}"
end
if resolved['target'] == 'weapon' then
dc = "Hit user's {{Var:ACWielded}}"
end
resolved['hitDC'] = dc
end
if resolved['expansionCount'] then
if resolved['expansionCount'] == '1' then
resolved['expansionCount'] = '{{Space}}' ..
resolved['expansionCount'] ..
' extra execution.'
else
resolved['expansionCount'] = '{{Space}}' ..
resolved['expansionCount'] ..
' extra executions.'
end
end
if resolved['invoked'] then
resolved['verbal'] = 'verbal'
resolved['somatic'] = 'somatic'
resolved['mage'] = 'magelore'
end
local skill = false
local spell = false
local standard = false
local class = nil
local classFull = nil
local archetype = nil
local archetypeFull = nil
local rank = nil
if args['class'] then
class = args['class']
if classFixes[class] then class = classFixes[class] end
end
if args['class'] or args['arch'] then
archetype = classArchetypes[class]
if args['arch'] then archetype = args['arch'] end
classFull = className[class]
archetypeFull = archetypeName[archetype]
standard = true
if archetype == 'warr' or archetype == 'semi' then skill = true end
if archetype == 'mage' then spell = true end
end
local costMP = nil
local costHP = nil
local costGP = nil
if args['pre'] == 'crown' then
spell = true
costMP = '1'
rank = '2'
end
if args['rank'] then rank = args['rank'] end
if args['skill'] then
skill = true
if args['skill'] == '0' or args['skill'] == 'false' then
skill = false
end
end
if args['spell'] then
spell = true
if args['spell'] == '0' or args['spell'] == 'false' then
spell = false
end
end
if args['standard'] then
standard = true
if args['standard'] == '0' or args['standard'] == 'false' then
standard = false
end
end
if args['mp'] then costMP = args['mp'] end
if args['hp'] then costHP = args['hp'] end
if args['gp'] then costGP = args['gp'] end
if args['shatter'] then costShatter = args['shatter'] end
local basic = false
local journeyman = false
if args['basic'] then basic = true end
if args['journeyman'] or args['jm'] then journeyman = true end
-- Category string
local c = ''
local name = args['name']
local page = mw.title.getCurrentTitle().text
local namespace = frame:preprocess('{{NAMESPACE}}')
local addCats = ((namespace == 'Ability') and (page == name))
c = c .. addCategory('Abilities', nil, nil, skill, spell, addCats)
if basic then
c = c ..
addCategory('Basic abilities', 'basic', nil, skill, spell,
addCats)
end
if journeyman then
c = c ..
addCategory('Journeyman abilities', 'journeyman', nil, skill,
spell, addCats)
end
if standard then
c = c ..
addCategory('Standard abilities', nil, nil, false, false,
addCats)
if skill then
c = c ..
addCategory('Semblant skills', nil, nil, skill, spell,
addCats)
end
if spell then
c = c ..
addCategory('Conjured spells', nil, nil, skill, spell,
addCats)
end
else
c = c ..
addCategory('Nonstandard abilities', nil, nil, skill, spell,
addCats)
end
if args['ethereal'] then
c = c ..
addCategory('Ethereal abilities', nil, nil, skill, spell,
addCats)
end
if args['av'] then
c = c ..
addCategory('AV granting abilities', nil, nil, skill, spell,
addCats, true)
c = c ..
addCategory('AV' .. args['av'] .. ' granting abilities', nil,
nil, skill, spell, addCats, true)
end
if (archetype and archetypeFull) then
c = c ..
addCategory(archetypeFull .. ' archetype abilities',
'archetype', archetype, skill, spell, addCats)
end
if (class and classFull) then
c = c ..
addCategory(classFull .. ' class abilities', 'class', class,
skill, spell, addCats, true)
end
if (rank and (class and classFull)) then
if rank == '3' then rank = '3+' end
c = c ..
addCategory('Rank ' .. rank .. ' ' .. classFull .. ' abilities',
'rank', rank, skill, spell, addCats, true)
end
if resolved['pre'] then
c = c ..
addCategory(resolved['pre'] .. 'abilities', 'pre',
resolved['pre'], skill, spell, addCats)
end
if resolved['interaction'] then
c = c ..
addCategory(resolved['interaction'] .. ' interaction abilities',
'interaction', resolved['interaction'], skill,
spell, addCats)
end
if resolved['delivery'] then
c = c ..
addCategory(resolved['delivery'] .. ' delivery abilities',
'delivery', resolved['delivery'], skill, spell,
addCats)
end
if resolved['target'] then
c = c ..
addCategory(resolved['target'] .. ' target abilities', 'target',
resolved['target'], skill, spell, addCats)
end
if resolved['duration'] then
c = c ..
addCategory(
noPlural(resolved['duration']) .. ' duration abilities',
'duration', resolved['duration'], skill, spell, addCats)
end
-- if resolved['range'] then
-- c = c .. addCategory(resolved['range'] .. ' range abilities', 'range', resolved['range'], skill, spell, addCats)
-- end
if resolved['expansion'] then
c = c ..
addCategory(resolved['expansion'] .. ' expansion abilities',
'expansion', resolved['expansion'], skill, spell,
addCats)
end
-- if resolved['expansionRange'] then
-- c = c .. addCategory(resolved['expansionRange'] .. ' expansion range abilities', 'expansionRange', resolved['expansionRange'], skill, spell, addCats)
-- end
if resolved['attribute'] then
c = c ..
addCategory(resolved['attribute'] .. ' save abilities',
'attribute', resolved['attribute'], skill, spell,
addCats)
end
if resolved['piercing'] then
c = c .. addCategory(resolved['piercing'] .. ' abilities', 'piercing',
resolved['piercing'], skill, spell, addCats)
end
if resolved['sustained'] then
c = c ..
addCategory('Sustained abilities', 'sustained',
resolved['sustained'], skill, spell, addCats)
end
if resolved['upgrade'] then
c = c ..
addCategory(resolved['upgrade'] .. ' abilities', 'upgrade',
resolved['upgrade'], skill, spell, addCats)
end
if resolved['executionTime'] then
c = c ..
addCategory(
noPlural(resolved['executionTime']) ..
' execution time abilities', 'executionTime',
resolved['executionTime'], skill, spell, addCats)
end
if resolved['maneuver'] then
c = c .. addCategory(resolved['maneuver'] .. ' abilities', 'maneuver',
resolved['maneuver'], skill, spell, addCats)
end
if resolved['verbal'] then
c = c ..
addCategory('Verbal component abilities', 'verbal',
resolved['verbal'], skill, spell, addCats)
end
if resolved['somatic'] then
c = c ..
addCategory('Somatic component abilities', 'somatic',
resolved['somatic'], skill, spell, addCats)
end
if resolved['material'] then
c = c ..
addCategory('Material component abilities', 'material',
resolved['material'], skill, spell, addCats)
end
if resolved['magelore'] then
c = c ..
addCategory('Magelore component abilities', 'magelore',
resolved['magelore'], skill, spell, addCats)
end
if resolved['invoked'] then
c = c ..
addCategory('Invoke component abilities', 'invoked',
resolved['invoked'], skill, spell, addCats)
end
local flawContent = ''
if args['flaw'] or args['f'] or args['fl'] then
flawContent = flawContent .. makeTag(frame, 'flaw', 'flaw', makeCat)
c = c ..
addCategory('Flaw abilities', 'flaw', 'flaw', skill, spell,
addCats)
end
local specialContent = ''
if args['special'] or args['s'] or args['sp'] then
specialContent = specialContent ..
makeTag(frame, 'special', 'special', makeCat)
c = c ..
addCategory('Special abilities', 'special', 'special', skill,
spell, addCats)
end
local esContent = ''
if args['es'] then
esContent = esContent .. makeTag(frame, 'es', 'es', makeCat)
c = c ..
addCategory('Elder Sorcery abilities', 'es', 'es', skill, spell,
addCats)
end
local wardedContent = ''
if args['warded'] then
wardedContent = wardedContent ..
makeTag(frame, 'warded', 'warded', makeCat)
c = c ..
addCategory('Warded abilities', 'warded', 'warded', skill,
spell, addCats)
end
local elementContent = ''
if args['life'] then
elementContent = elementContent ..
makeTag(frame, 'elements', 'life', makeCat)
c = c ..
addCategory('Life element abilities', 'elements', 'life', skill,
spell, addCats)
end
if args['storm'] then
elementContent = elementContent ..
makeTag(frame, 'elements', 'storm', makeCat)
c = c ..
addCategory('Storm element abilities', 'elements', 'storm',
skill, spell, addCats)
end
if args['necro'] then
elementContent = elementContent ..
makeTag(frame, 'elements', 'necro', makeCat)
c = c ..
addCategory('Necromancy element abilities', 'elements', 'necro',
skill, spell, addCats)
end
if args['flame'] then
elementContent = elementContent ..
makeTag(frame, 'elements', 'flame', makeCat)
c = c ..
addCategory('Flame element abilities', 'elements', 'flame',
skill, spell, addCats)
end
if args['nature'] then
elementContent = elementContent ..
makeTag(frame, 'elements', 'nature', makeCat)
c = c ..
addCategory('Nature element abilities', 'elements', 'nature',
skill, spell, addCats)
end
local powerContent = ''
if args['magic'] then
powerContent = powerContent .. makeTag(frame, 'power', 'magic', makeCat)
c = c ..
addCategory('Magically powered abilities', 'power', 'magic',
skill, spell, addCats) ..
addCategory('Magical effects', nil, nil, false, false, addCats)
end
if args['divine'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'divine', makeCat)
c = c ..
addCategory('Divinely powered abilities', 'power', 'divine',
skill, spell, addCats) ..
addCategory('Divine effects', nil, nil, false, false, addCats)
end
if args['spirit'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'spirit', makeCat)
c = c ..
addCategory('Spiritually powered abilities', 'power', 'spirit',
skill, spell, addCats) ..
addCategory('Spiritual effects', nil, nil, false, false, addCats)
end
if args['primal'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'primal', makeCat)
c = c ..
addCategory('Primally powered abilities', 'power', 'primal',
skill, spell, addCats) ..
addCategory('Primal effects', nil, nil, false, false, addCats)
end
if args['martial'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'martial', makeCat)
c = c ..
addCategory('Martially powered abilities', 'power', 'martial',
skill, spell, addCats)
end
if args['psionic'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'psionic', makeCat)
c = c ..
addCategory('Psionically powered abilities', 'power', 'psionic',
skill, spell, addCats) ..
addCategory('Mental effects', nil, nil, false, false, addCats)
end
if args['techo'] then
powerContent = powerContent .. makeTag(frame, 'power', 'techo', makeCat)
c = c ..
addCategory('Technologically powered abilities', 'power',
'techo', skill, spell, addCats) ..
addCategory('Technological effects', nil, nil, false, false,
addCats)
end
if args['finance'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'finance', makeCat)
c = c ..
addCategory('Financially powered abilities', 'power', 'finance',
skill, spell, addCats) ..
addCategory('Financial effects', nil, nil, false, false, addCats)
end
if args['alchemy'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'alchemy', makeCat)
c = c ..
addCategory('Alchemically powered abilities', 'power',
'alchemy', skill, spell, addCats) ..
addCategory('Alchemical effects', nil, nil, false, false,
addCats)
end
if args['unknown'] then
powerContent = powerContent ..
makeTag(frame, 'power', 'unknown', makeCat)
c = c ..
addCategory('Unknown powered abilities', 'power', 'unknown',
skill, spell, addCats)
end
if class then
classContent = makeContent(frame, resolved, {'class'}, makeCat)
powerContent = powerContent .. classContent
end
if args['rotator'] then
powerContent = powerContent ..
makeTag(frame, 'category', 'rotator', makeCat)
end
powerContent = powerContent .. elementContent
if skill then
powerContent = powerContent ..
makeTag(frame, 'category', 'skill', makeCat)
end
if spell then
powerContent = powerContent ..
makeTag(frame, 'category', 'spell', makeCat)
end
local deliveryContent = ''
if standard and skill then
deliveryContent = deliveryContent ..
makeTag(frame, 'category', 'semblant', makeCat)
end
if standard and spell then
deliveryContent = deliveryContent ..
makeTag(frame, 'category', 'conjure', makeCat)
end
local effectContent = ''
if args['mental'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'mental', makeCat)
c = c ..
addCategory('Mental effects', 'effect', 'mental', skill, spell,
addCats)
end
if args['truth'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'truth', makeCat)
c = c ..
addCategory('Truth detecting effects', 'effect',
'truthDetecting', skill, spell, addCats)
end
if args['duelMod'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'duelModifying', makeCat)
c = c ..
addCategory('Duel modifying effects', 'effect', 'duelModifying',
skill, spell, addCats)
end
if args['movement'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'movement', makeCat)
c = c ..
addCategory('Movement effects', 'effect', 'movement', skill,
spell, addCats)
end
if args['poison'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'poison', makeCat)
c = c ..
addCategory('Poison effects', 'effect', 'poison', skill, spell,
addCats)
end
if args['displacement'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'displacement', makeCat)
c = c ..
addCategory('Displacement effects', 'effect', 'displacement',
skill, spell, addCats)
end
if args['transformation'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'transformation', makeCat)
c = c ..
addCategory('Transformation effects', 'effect',
'transformation', skill, spell, addCats)
end
if args['control'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'control', makeCat)
c = c ..
addCategory('Control effects', 'effect', 'control', skill,
spell, addCats)
end
if args['resist'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'resist', makeCat)
c = c ..
addCategory('Resistance effects', 'effect', 'resist', skill,
spell, addCats)
end
if args['awaken'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'awaken', makeCat)
c = c ..
addCategory('Awakening effects', 'effect', 'awaken', skill,
spell, addCats)
end
if args['immune'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'immune', makeCat)
c = c ..
addCategory('Immunity effects', 'effect', 'immune', skill,
spell, addCats)
end
if args['long'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'long', makeCat)
c = c ..
addCategory('Long range effects', 'effect', 'long', skill,
spell, addCats)
end
if args['sense'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'sense', makeCat)
c = c ..
addCategory('Sensory effects', 'effect', 'sense', skill, spell,
addCats)
end
if args['revive'] or args['rev'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'revive', makeCat)
c = c ..
addCategory('Revival effects', 'effect', 'revive', skill, spell,
addCats)
end
if args['summon'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'summon', makeCat)
c = c ..
addCategory('Summoning effects', 'effect', 'summon', skill,
spell, addCats)
end
if args['heal'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'heal', makeCat)
c = c ..
addCategory('Healing effects', 'effect', 'heal', skill, spell,
addCats)
end
if args['reanimate'] or args['rean'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'reanimate', makeCat)
c = c ..
addCategory('Reanimation effects', 'effect', 'reanimate', skill,
spell, addCats)
end
if args['regenerate'] or args['regen'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'regenerate', makeCat)
c = c ..
addCategory('Regeneration effects', 'effect', 'regenerate',
skill, spell, addCats)
end
if args['revitalize'] or args['revit'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'revitalize', makeCat)
c = c ..
addCategory('Revitalization effects', 'effect', 'revitalize',
skill, spell, addCats)
end
if args['kill'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'kill', makeCat)
c = c ..
addCategory('Killing effects', 'effect', 'kill', skill, spell,
addCats)
end
if args['damage'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'damage', makeCat)
c = c ..
addCategory('Damaging effects', 'effect', 'damage', skill,
spell, addCats)
end
if args['steal'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'steal', makeCat)
c = c ..
addCategory('Stealing effects', 'effect', 'steal', skill, spell,
addCats)
end
if args['loud'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'loud', makeCat)
c = c ..
addCategory('Loud effects', 'effect', 'loud', skill, spell,
addCats)
end
if args['knockout'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'knockout', makeCat)
c = c ..
addCategory('Knockout effects', 'effect', 'knockout', skill,
spell, addCats)
end
if args['time'] then
effectContent = effectContent ..
makeTag(frame, 'effects', 'time', makeCat)
c = c ..
addCategory('Temporal effects', 'effect', 'time', skill, spell,
addCats)
end
local costContent = ''
if costMP then
c = c ..
addCategory('MP cost abilities', 'costMP', costMP, skill, spell,
addCats, true)
if costMP == 'x' then
costContent = costContent .. frame:preprocess(
"{{Tag|X MP|🩵|l=:Category:MP cost abilities|c=#3584e4|class=cost-tagged mpx}}")
c = c ..
addCategory('Variable MP cost abilities', 'costMP', 'x',
skill, spell, addCats, true)
else
costContent = costContent .. frame:preprocess(
"{{Tag|" .. costMP ..
" MP|🩵|l=:Category:MP cost abilities|c=#3584e4|class=cost-tagged mp" ..
costMP .. "}}")
c = c ..
addCategory(costMP .. ' MP cost abilities', 'costMP',
costMP, skill, spell, addCats, true)
end
end
if costHP then
c = c ..
addCategory('HP cost abilities', 'costHP', costHP, skill, spell,
addCats, true)
if costHP == 'x' then
costContent = costContent .. frame:preprocess(
"{{Tag|X HP|❤️|l=:Category:HP cost abilities|c=#e01b24|class=cost-tagged hpx}}")
c = c ..
addCategory('Variable HP cost abilities', 'costHP', 'x',
skill, spell, addCats, true)
else
costContent = costContent .. frame:preprocess(
"{{Tag|" .. costHP ..
" HP|❤️|l=:Category:HP cost abilities|c=#e01b24|class=cost-tagged hp" ..
costHP .. "}}")
c = c ..
addCategory(costHP .. ' HP cost abilities', 'costHP',
costHP, skill, spell, addCats, true)
end
end
if costGP then
c = c ..
addCategory('GP cost abilities', 'costGP', costGP, skill, spell,
addCats, true)
if costGP == 'x' then
costContent = costContent .. frame:preprocess(
"{{Tag|X GP|🪙|l=:Category:GP cost abilities|c=#F6D32D|class=cost-tagged gpx}}")
c = c ..
addCategory('Variable GP cost abilities', 'costGP', 'x',
skill, spell, addCats, true)
else
costContent = costContent .. frame:preprocess(
"{{Tag|" .. costGP ..
" GP|🪙|l=:Category:GP cost abilities|c=#F6D32D|class=cost-tagged gp" ..
costGP .. "}}")
c = c ..
addCategory(costGP .. ' GP cost abilities', 'costGP',
costGP, skill, spell, addCats, true)
end
end
if costShatter then
c = c ..
addCategory('Shatter cost abilities', 'costShatter',
costShatter, skill, spell, addCats)
costContent = costContent .. frame:preprocess(
"{{Tag|Shatter|💥|l=:Category:Shatter cost abilities|class=cost-tagged shatter}}")
end
if args['cost'] then
costContent = costContent .. frame:preprocess(args['cost'])
end
local executionTimeTitle = 'Execution time'
if spell then executionTimeTitle = 'Casting time' end
local expansionContent = 'TEST'
-- if args['ec'] or args['expCount'] or args['expansionCount'] then
-- -- local ec = args['ec'] or args['expCount'] or args['expansionCount']
-- -- ec = tostring(ec)
-- local ec = '1'
-- expansionContent = 'This ability expands ' .. ec .. ' time' .. (tonumber(ec) > 1 and 's' or '') .. '.'
-- end
local heightenedContent = ''
if args['heightened'] then
heightenedContent = heightenedContent ..
'For each additional {{L|Core|MP}} spent, ' ..
args['heightened']
-- heightenedContent = heightenedContent .. ' You can only {{L|Core|Heightening|Heighten}} if you are {{L|Core|Proficiency Bonus|Proficient}} or {{L|Core|Fluency Bonus|Fluent}} in ' .. args['name'] .. ' and only up to the corresponding bonus.'
c = c ..
addCategory('Heightened abilities', 'heightened',
args['heightened'], skill, spell, addCats, true)
end
local proficiencyContent = ''
if args['pro'] then
proficiencyContent = proficiencyContent .. frame:preprocess(args['pro'])
end
local fluencyContent = ''
if args['flu'] then
fluencyContent = fluencyContent .. frame:preprocess(args['flu'])
end
local restrictionContent = ''
if args['restrict'] then
restrictionContent = restrictionContent ..
frame:preprocess(args['restrict'])
end
local statValContent = ''
local statFeatContent = ''
if args['vstat'] and args['val'] then
local vstat = frame:preprocess("{{uc:" .. args['vstat'] .. "}}")
statValContent = 'This ability sets your {{L|Core|' .. vstat .. '}}' ..
' score to a minimum of ' .. args['val'] .. '.'
c = c ..
addCategory('Attribute setting abilities', 'val', args['val'],
skill, spell, addCats, true)
c = c ..
addCategory(vstat .. ' setting abilities', 'vstat',
args['vstat'], skill, spell, addCats, true)
c = c ..
addCategory(
vstat .. ' value of ' .. args['val'] .. ' setting abilities',
'val', args['val'], skill, spell, addCats, true)
end
local f = 'proficiency'
if args['fflu'] then f = 'fluency' end
if args['fstat'] and (args['fflu'] or args['fpro']) then
local fstat = frame:preprocess("{{uc:" .. args['fstat'] .. "}}")
statFeatContent =
'This ability gives {{L|Core|' .. f .. ' Bonus|' .. f ..
'}} in {{L|Core|' .. fstat ..
'}} {{L|Core|Feat Interaction|Feat Saves}}.'
c = c ..
addCategory('Feat save improvement abilities', 'flu',
args['fflu'], skill, spell, addCats)
c = c ..
addCategory('Feat save ' .. f .. ' granting abilities', 'fstat',
args['fstat'], skill, spell, addCats, true)
c = c ..
addCategory(
fstat .. ' feat save ' .. f .. ' granting abilities',
'fstat', args['fstat'], skill, spell, addCats, true)
end
if args['rotator'] then
c = c ..
addCategory('Rotator abilities', 'rotator', args['rotator'],
skill, spell, addCats)
end
if args['style'] then
c = c ..
addCategory('Casting style abilities', 'style', args['style'],
skill, spell, addCats)
end
if args['weapon'] then
c = c ..
addCategory('Weapon fighting style abilities', 'weapon',
args['weapon'], skill, spell, addCats)
end
-- Remove range from self targeted abilities
if resolved['target'] == 'self' or resolved['range'] == 'self' then
resolved['range'] = nil
end
local barsTop = {
-- {
-- title = 'elements',
-- content = frame:preprocess(elementContent)
-- },
{
title = 'power sources',
content = frame:preprocess(esContent .. powerContent),
link = ':Category:Powered abilities'
}, {
title = 'effect types',
content = frame:preprocess(flawContent .. specialContent ..
effectContent),
link = ':Category:Effects'
}, {
title = 'delivery',
content = frame:preprocess(wardedContent .. deliveryContent) ..
makeContent(frame, resolved, {
'expansion', 'pre', 'upgrade', 'piercing', 'delivery',
'interaction'
}, makeCat),
link = ':Category:Delivery abilities'
}, {
title = 'save attribute',
content = makeContent(frame, resolved, {'attribute'}, makeCat),
link = 'Core:Feat Interaction'
}, {
title = 'expansion save attribute',
content = makeContent(frame, resolved, {'expansionAttribute'},
makeCat)
}, {
title = 'target',
content = makeContent(frame, resolved, {'target', 'hitDC'}, makeCat),
link = ':Category:Target abilities'
}, {
title = executionTimeTitle,
content = makeContent(frame, resolved,
{'executionTime', 'maneuver'}, makeCat),
link = 'Core:Maneuvers'
}, {
title = 'trigger',
content = args['trigger'] or '',
link = 'Core:Reactive Maneuvers'
}, {
title = 'cost and components',
content = frame:preprocess(costContent) ..
makeContent(frame, resolved, {
'material', 'invoked', 'verbal', 'somatic', 'magelore'
}, makeCat),
link = ':Category:Cost abilities'
}, {
title = 'Mana cost',
content = args['mpx'] or '',
link = ':Category:MP cost abilities'
}, {
title = 'Hit cost',
content = args['hpx'] or '',
link = ':Category:HP cost abilities'
}, {
title = 'Gold cost',
content = args['gpx'] or '',
link = ':Category:GP cost abilities'
}, {
title = 'Material cost',
content = makeContent(frame, resolved, {'matx'}, makeCat),
link = ':Category:Material component abilities'
}, {
title = 'duration',
content = makeContent(frame, resolved, {'duration', 'sustained'},
makeCat),
link = ':Category:Duration abilities'
}, {
title = 'range',
content = makeContent(frame, resolved, {'range'}, makeCat),
link = 'Core:Range'
}, -- {
-- title = 'expansion',
-- content = makeContent(frame, resolved, {'expansion'}, makeCat)
-- },
{
title = 'expansion range',
content = makeContent(frame, resolved,
{'expansionRange', 'expansionCount'}, makeCat),
link = 'Core:Expansions'
}, -- {
-- title = 'expansion count',
-- content = frame:preprocess('TEST')
-- },
{
title = 'Requirements',
content = makeContent(frame, resolved, {'requirement'}, makeCat)
}
}
local barsBottom = {
{title = 'End condition', content = args['end'] or ''},
{title = 'On critical hit', content = args['crithit'] or ''},
{title = 'On hit', content = args['hit'] or ''},
{title = 'On miss', content = args['miss'] or ''},
{title = 'On critically miss', content = args['critmiss'] or ''},
{title = 'On critical fail', content = args['critfail'] or ''},
{title = 'On fail', content = args['fail'] or ''},
{title = 'On success', content = args['success'] or ''},
{title = 'On critical success', content = args['critsuccess'] or ''}, {
title = 'Heightened',
content = frame:preprocess(heightenedContent),
link = ':Category:Heightened abilities'
}, {
title = 'If proficient',
content = proficiencyContent,
link = 'Core:Proficiency Bonus'
},
{
title = 'If fluent',
content = fluencyContent,
link = 'Core:Fluency Bonus'
}, {
title = 'Attribute improvement',
content = frame:preprocess(statValContent),
link = 'Core:Attributes',
flags = {
attribute = args['vstat'] and
frame:preprocess('{{lc:' .. args['vstat'] .. '}}') or "",
value = args['val']
}
}, {
title = 'Feat save improvement',
content = frame:preprocess(statFeatContent),
link = 'Core:Feat Interaction',
flags = {
attribute = args['fstat'] and
frame:preprocess('{{lc:' .. args['fstat'] .. '}}'),
value = f
}
}
}
local outputTop = ''
for _, bar in ipairs(barsTop) do
outputTop = outputTop ..
makeBar(frame, bar['title'], bar['content'],
bar['link'], bar['flags'], false)
end
local outputBottom = ''
for _, bar in ipairs(barsBottom) do
outputBottom = outputBottom ..
makeBar(frame, bar['title'], bar['content'],
bar['link'], bar['flags'], true)
end
local outputMiddle = ''
if args['e'] then outputMiddle = frame:preprocess(args['e']) end
local output = mw.html.create('span')
output:addClass('ability-variables')
if args['basic'] then output:addClass('ability-basic') end
output:wikitext(outputTop)
if outputMiddle ~= '' then
output:wikitext('<hr>'):wikitext(
'<span class="ability-overview-base">' .. outputMiddle .. '</span>')
end
if outputBottom ~= '' then output:wikitext('<hr>'):wikitext(outputBottom) end
output = tostring(output) .. c
output = output ..
frame:preprocess(
'<templatestyles src="Template:Ability/styles.css" />')
if not name then
output = output ..
'<span style="color: red;>NO NAME PROVIDED VERY BAD EVERY ABILITY NEEDS A NAME OKAY</span>'
end
return output
end
return p