Jump to content
Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:A: Difference between revisions

From Teriock
// via Wikitext Extension for VSCode
Tag: Reverted
// via Wikitext Extension for VSCode
 
(52 intermediate revisions by the same user not shown)
Line 3: Line 3:
local aliases = {
local aliases = {
     keys = {
     keys = {
         pre = {'pre', 'premade'},
         pre = {
        maneuver = {'man', 'maneuver', 'm'},
             'pre',
        interaction = {'int', 'interaction', 'i'},
             'premade',
        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'},
             'man',
             reactive = {'re', 'reaction', 'r'},
             'maneuver',
             passive = {'ps', 'passive', 'p'},
             'm'
            slow = {'sl', 'slow', 's'}
         },
         },
         interaction = {
         interaction = {
             attack = {'atk', 'attack', 'a'},
             'int',
             block = {'blk', 'block', 'b'},
             'interaction',
             manifest = {'man', 'manifest', 'm'},
             'i'
            feat = {'fea', 'feat', 'f'}
         },
         },
         delivery = {
         delivery = {
             self = {'sel', 'self', 's'},
             'del',
             missile = {'mis', 'missile', 'm'},
             'delivery',
             hand = {'han', 'hand', 'h', 'claw'},
             'd'
            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'},
             'tar',
            creature = {'cre', 'creature', 'c'},
             'target',
            body = {'bod', 'body', 'b'},
             't'
            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'},
             'dur',
            always = {'always', 'forever', '4', 'inf'},
             'duration',
            noLimit = {'noLimit', '1', 'nl'},
             'dr'
             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'},
             'upg',
             absolute = {'abs', 'absolute', 'a'}
            'upgrade',
             'u'
         },
         },
         executionTime = {
         executionTime = {
             freeAction = {'0a', 'freeAction', 'fa'},
             'executionTime',
            singleAction = {'1a', 'a', 'singleAction', 'sa'},
            'et',
             doubleAction = {'2a', 'doubleAction', 'da'},
            'x'
            tripleAction = {'3a', 'tripleAction', 'ta'},
        },
            freeReaction = {'0r', 'freeReaction', 'fr'},
        piercing = {
            reaction = {'1r', 'reaction', 'r'},
            'prc',
            shortRest = {'sr', 'shortRest', 's'},
            'piercing',
             longRest = {'lr', 'longRest', 'l'},
             'p'
             timeParse = {'^%d+[mhdwy]$'}
        },
        -- nearRange = {
        --    'nearRange',
        --    'nr'
        -- },
        -- farRange = {
        --    'farRange',
        --    'fr'
        -- },
        flaw = {
            'flaw',
            'fl',
            'f'
        },
        special = {
            'special',
             'sp',
             's'
         },
         },
        piercing = {av0 = {'av0', 'a'}, unblockable = {'ub', 'u'}},
         range = {
         range = {
             melee = {'melee', 'm'},
             'range',
            weapon = {'weapon', 'weaponReach', 'w'},
             'rng',
            hand = {'hand', 'handReach', 'h'},
             'r'
            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'},
             'attribute',
            str = {'str', 'STR', 's'},
             'attr',
            mov = {'mov', 'MOV', 'm'},
             'a'
            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'},
             'expansion',
            ripple = {'rip', 'ripple', 'r'},
            'exp',
             cascade = {'cas', 'cascade', 'c'},
        },
            fork = {'for', 'fork', 'f'}
        expansionRange = {
            'expansionRange',
            'er'
        },
        expansionCount = {
            'expansionCount',
            'ec'
        },
        expansionAttribute = {
            'expansionAttribute',
             'ea'
        },
        sustained = {
            'sustained',
            'sus'
        },
        requirement = {
            'req',
            'requirement',
            'rq'
         },
         },
        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',
             'ver',
             link = 'Verbal component abilities',
             'verbal',
            symbol = '🗣️',
         },
            color = '#f9f06b',
            class = 'component-tagged verbal'
         }
    },
    somatic = {
         somatic = {
         somatic = {
             text = 'Somatic',
             'som',
             link = 'Somatic component abilities',
            'somatic',
             symbol = '👐',
        },
             color = '#f9f06b',
        material = {
             class = 'component-tagged somatic'
            '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',
         },
     },
     },
     material = {
     values = {
         material = {
         maneuver = {
             text = 'Material',
             active = {
             link = 'Material component abilities',
                'ac',
             symbol = '💎',
                'active',
             color = '#ff7800',
                'a'
            class = 'component-tagged material'
            },
        }
             reactive = {
    },
                're',
    magelore = {
                'reaction',
        magelore = {
                'r'
             text = 'Magelore',
             },
             link = 'Magelore component abilities',
            passive = {
             symbol = '🔮',
                'ps',
            color = '#f9f06b',
                'passive',
            class = 'component-tagged magelore'
                'p'
        }
            },
    },
             slow = {
    invoked = {
                'sl',
        invoked = {
                'slow',
             text = 'Invoked',
                's'
             link = 'Invoked component abilities',
            }
             symbol = '🪄',
        },
             color = '#f9f06b',
        interaction = {
             class = 'component-tagged invoked'
            attack = {
        }
                'atk',
    },
                'attack',
    flaw = {
                'a'
        flaw = {
            },
             text = 'Flaw',
             block = {
             link = 'Flaw abilities',
                'blk',
             symbol = '',
                'block',
             color = '#e01b24',
                'b'
             class = 'flaw-tagged flaw'
            },
        }
             manifest = {
    },
                'man',
    special = {
                'manifest',
        special = {
                'm'
             text = 'Special',
             },
             link = 'Special abilities',
            feat = {
             symbol = '✴️',
                'fea',
             color = '#9141AC',
                'feat',
             class = 'special-tagged special'
                'f'
        }
            }
    },
        },
    es = {
        delivery = {
        es = {
            self = {
             text = 'Elder Sorcery',
                'sel',
             link = 'Elder Sorcery abilities',
                'self',
             symbol = '🌌',
                's'
             color = '#9141AC',
            },
             class = 'elderSorcery-tagged elderSorcery'
             missile = {
        }
                'mis',
    },
                'missile',
    warded = {
                'm'
        warded = {
             },
             text = 'Warded',
            hand = {
             link = 'Warded abilities',
                'han',
             symbol = '🏮',
                'hand',
             color = '#f9f06b',
                'h',
             class = 'warded-tagged warded'
                'claw'
        }
             },
    },
            bite = {
    elements = {
                'bit',
        life = {
                'bite',
             text = 'Life',
                'b',
             link = 'Life element abilities',
                'mouth'
             symbol = '☀️',
             },
             color = '#ffffff',
            item = {
            class = 'element-tagged life'
                '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'
             },
            as = {
            'areaSpell'
            },
             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',
            },
             ari = {
                'ari',
                'areaItem',
                'itemArea',
             },
            arse = {
            'areaSelf'
            },
             si = {
            'selfItem',
            'itemSelf'
            }
         },
         },
         storm = {
         duration = {
             text = 'Storm',
             instant = {
             link = 'Storm element abilities',
                '0',
             symbol = '💧',
                'in',
             color = '#3584e4',
                'instant',
             class = 'element-tagged storm'
                '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]$'
            }
         },
         },
         necro = {
         upgrade = {
             text = 'Necromancy',
             warded = {
            link = 'Necromancy element abilities',
                'wrd',
             symbol = '💀',
                'warded',
            color = '#3d3846',
                'w'
            class = 'element-tagged necromancy'
            },
             absolute = {
                'abs',
                'absolute',
                'a'
            }
         },
         },
         flame = {
         executionTime = {
             text = 'Flame',
             freeAction = {
             link = 'Flame element abilities',
                '0a',
             symbol = '🔥',
                'freeAction',
             color = '#e01b24',
                'fa'
             class = 'element-tagged flame'
             },
            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]$'
            }
         },
         },
         nature = {
         piercing = {
             text = 'Nature',
             av0 = {
            link = 'Nature element abilities',
                'av0',
            symbol = '🌱',
                'a'
             color = '#33d17a',
             },
             class = 'element-tagged nature'
             unblockable = {
        }
                'ub',
    },
                'u'
    class = {
             }
        ber = {
            text = 'Berserker',
            link = 'Berserker class abilities',
            symbol = '🪓',
             class = 'class-tagged berserker'
         },
         },
         due = {
         range = {
             text = 'Duelist',
             melee = {
             link = 'Duelist class abilities',
                'melee',
             symbol = '🤺',
                'm'
             class = 'class-tagged duelist'
            },
            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'
            }
         },
         },
         vet = {
         attribute = {
             text = 'Veteran',
             int = {
             link = 'Veteran class abilities',
                'int',
             symbol = '🪖',
                'INT',
             class = 'class-tagged veteran'
                'i'
            },
             str = {
                'str',
                'STR',
                's'
             },
            mov = {
                'mov',
                'MOV',
                'm'
             },
            per = {
                'per',
                'PER',
                'p'
            },
            snk = {
                'snk',
                'SNK',
                's'
            },
            unp = {
                'unp',
                'UNP',
                'u'
            },
         },
         },
         kni = {
         expansionAttribute = {
             text = 'Knight',
             int = {
             link = 'Knight class abilities',
                'int',
             symbol = '⚔️',
                'INT',
             class = 'class-tagged knight'
                'i'
            },
             str = {
                'str',
                'STR',
                's'
             },
            mov = {
                'mov',
                'MOV',
                'm'
             },
            per = {
                'per',
                'PER',
                'p'
            },
            snk = {
                'snk',
                'SNK',
                's'
            },
            unp = {
                'unp',
                'UNP',
                'u'
            },
         },
         },
         pal = {
         expansion = {
             text = 'Paladin',
             detonate = {
             link = 'Paladin class abilities',
                'det',
             symbol = '🛡️',
                'detonate',
             class = 'class-tagged paladin'
                'd'
            },
             ripple = {
                'rip',
                'ripple',
                'r'
            },
             cascade = {
                'cas',
                'cascade',
                'c'
            },
             fork = {
                'for',
                'fork',
                'f'
            }
         },
         },
         ass = {
         expansionRange = {
             text = 'Assassin',
             distParse = {
            link = 'Assassin class abilities',
                '^%d+[fm]$'
             symbol = '🗡️',
             }
            class = 'class-tagged assassin'
         },
         },
         cor = {
         expansionCount = {
             text = 'Corsair',
             expansionCount = {
            link = 'Corsair class abilities',
                'expansionCount',
            symbol = '🏴‍☠️',
                'ec',
             class = 'class-tagged corsair'
             }
         },
         },
         arc = {
         sustained = {
             text = 'Archer',
             sustained = {
            link = 'Archer class abilities',
                'sus',
            symbol = '🏹',
                'sustained',
            class = 'class-tagged archer'
                's',
                '1',
            }
         },
         },
         thi = {
         verbal = {
             text = 'Thief',
             verbal = {
            link = 'Thief class abilities',
                'ver',
            symbol = '💰️',
                'verbal',
            class = 'class-tagged thief'
                'v',
                '1',
            }
         },
         },
         ran = {
         somatic = {
             text = 'Ranger',
             somatic = {
            link = 'Ranger class abilities',
                'som',
            symbol = '🐾',
                'somatic',
            class = 'class-tagged ranger'
                's',
                '1',
            }
         },
         },
         fla = {
         material = {
             text = 'Flame Mage',
             material = {
            link = 'Flame Mage class abilities',
                'mat',
            symbol = '🧙',
                'material',
            class = 'class-tagged flameMage'
                'm',
                '1',
            }
         },
         },
         sto = {
         magelore = {
             text = 'Storm Mage',
             magelore = {
            link = 'Storm Mage class abilities',
                'mag',
            symbol = '🧙',
                'magelore',
            class = 'class-tagged stormMage'
                'ml',
                '1',
            }
         },
         },
         lif = {
         invoked = {
             text = 'Life Mage',
             invoked = {
            link = 'Life Mage class abilities',
                'inv',
            symbol = '🧙',
                'invoked',
            class = 'class-tagged lifeMage'
                'i',
                '1',
            }
         },
         },
         nec = {
         class = {
             text = 'Necromancer',
            ber = {
             link = 'Necromancer class abilities',
                'ber',
             symbol = '🧙',
            },
             class = 'class-tagged necromancer'
            due = {
        },
                'due',
        nat = {
            },
             text = 'Nature Mage',
            vet = {
             link = 'Nature Mage class abilities',
                'vet',
             symbol = '🧙',
            },
             class = 'class-tagged natureMage'
            kni = {
                'kni',
             },
            pal = {
                'pal',
             },
            ass = {
                'ass',
            },
            cor = {
                'cor',
            },
            arc = {
                'arc',
             },
            thi = {
                'thi',
             },
            ran = {
                'ran',
            },
            fla = {
                'fla',
            },
             sto = {
                'sto',
             },
            lif = {
                'lif',
             },
            nec = {
                'nec',
             },
            nat = {
                'nat',
            },
         }
         }
     },
     }
     power = {
}
         divine = {
 
             text = 'Divine',
local tags = {
             link = 'Divinely powered abilities',
     verbal = {
             symbol = '🪽',
         verbal = {
             text = 'Verbal',
             link = 'Verbal component abilities',
             symbol = '🗣️',
             color = '#f9f06b',
             color = '#f9f06b',
             class = 'power-tagged divine'
             class = 'component-tagged verbal'
         },
         },
         magic = {
    },
             text = 'Magical',
    somatic = {
             link = 'Magically powered abilities',
         somatic = {
             symbol = '',
             text = 'Somatic',
             color = '#9141ac',
             link = 'Somatic component abilities',
             class = 'power-tagged magical'
             symbol = '👐',
             color = '#f9f06b',
             class = 'component-tagged somatic'
         },
         },
        spirit = {
    },
            text = 'Spiritual',
    material = {
            link = 'Spiritually powered abilities',
         material = {
            symbol = '🪭',
             text = 'Material',
            color = '#9a9996',
             link = 'Material component abilities',
            class = 'power-tagged spiritual'
             symbol = '💎',
        },
         martial = {
             text = 'Martial',
             link = 'Martially powered abilities',
             symbol = '💪',
             color = '#ff7800',
             color = '#ff7800',
             class = 'power-tagged martial'
             class = 'component-tagged material'
         },
         },
         psionic = {
    },
             text = 'Psionic',
    magelore = {
             link = 'Psionically powered abilities',
         magelore = {
             symbol = '🤯',
             text = 'Magelore',
             color = '#3584e4',
             link = 'Magelore component abilities',
             class = 'power-tagged psionic'
             symbol = '🔮',
             color = '#f9f06b',
             class = 'component-tagged magelore'
         },
         },
         primal = {
    },
             text = 'Primal',
    invoked = {
             link = 'Primally powered abilities',
         invoked = {
             symbol = '⛰️',
             text = 'Invoked',
             color = '#986a44',
             link = 'Invoked abilities',
             class = 'power-tagged primal'
             symbol = '🪄',
             color = '#f9f06b',
             class = 'component-tagged invoked'
         },
         },
         techo = {
    },
             text = 'Technological',
    flaw = {
             link = 'Technologically powered abilities',
         flaw = {
             symbol = '⚙️',
             text = 'Flaw',
             link = 'Flaw abilities',
             symbol = '',
             color = '#e01b24',
             color = '#e01b24',
             class = 'power-tagged technological'
             class = 'flaw-tagged flaw'
         },
         },
         finance = {
    },
             text = 'Financial',
    special = {
             link = 'Financially powered abilities',
        special = {
             symbol = '🪙',
            text = 'Special',
             color = '#fcc200',
            link = 'Special abilities',
             class = 'power-tagged financial'
            symbol = '✴️',
            color = '#9141AC',
            class = 'special-tagged special'
        },
    },
    es = {
         es = {
             text = 'Elder Sorcery',
             link = 'Elder Sorcery abilities',
             symbol = '🌌',
             color = '#9141AC',
             class = 'elderSorcery-tagged elderSorcery'
         },
         },
        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 = {
     warded = {
         skill = {
         warded = {
             text = 'Skill',
             text = 'Warded',
             link = 'Skills',
             link = 'Warded abilities',
             symbol = '🤹',
             symbol = '🏮',
             class = 'skill'
            color = '#f9f06b',
             class = 'warded-tagged warded'
         },
         },
         spell = {
    },
             text = 'Spell',
    elements = {
             link = 'Spells',
         life = {
             symbol = '',
             text = 'Life',
             class = 'spell'
             link = 'Life element abilities',
             symbol = '☀️',
            color = '#ffffff',
             class = 'element-tagged life'
         },
         },
         semblant = {
         storm = {
             text = 'Semblant',
             text = 'Storm',
             link = 'Semblant skills',
             link = 'Storm element abilities',
             symbol = '🎭',
             symbol = '💧',
             class = 'standard-tagged semblant'
            color = '#3584e4',
             class = 'element-tagged storm'
         },
         },
         conjure = {
         necromancy = {
             text = 'Conjured',
             text = 'Necromancy',
             link = 'Conjured spells',
             link = 'Necromancy element abilities',
             symbol = '🔮',
             symbol = '💀',
             class = 'standard-tagged conjure'
            color = '#3d3846',
             class = 'element-tagged necromancy'
         },
         },
         standard = {
         necro = {
             text = 'Standard',
             text = 'Necromancy',
             link = 'Standard abilities',
             link = 'Necromancy element abilities',
             symbol = '🏁',
             symbol = '💀',
             class = 'standard-tagged normal'
            color = '#3d3846',
             class = 'element-tagged necromancy'
         },
         },
         rotator = {
         flame = {
             text = 'Rotator',
             text = 'Flame',
             link = 'Rotator abilities',
             link = 'Flame element abilities',
             symbol = '🔄',
             symbol = '🔥',
             class = 'rotator'
             color = '#e01b24',
        }
             class = 'element-tagged flame'
    },
    effects = {
        mental = {
            text = 'Mental',
            link = 'Mental effects',
            symbol = '🧠',
             class = 'effect-tagged mental'
         },
         },
         truth = {
         nature = {
             text = 'Truth detecting',
             text = 'Nature',
             link = 'Truth detecting effects',
             link = 'Nature element abilities',
             symbol = '⚖️',
             symbol = '🌱',
             class = 'effect-tagged truthDetecting'
            color = '#33d17a',
            class = 'element-tagged nature'
        },
    },
    class = {
        ber = {
            text = 'Berserker',
            link = 'Berserker class abilities',
            symbol = '🪓',
             class = 'class-tagged berserker'
         },
         },
         duelMod = {
         due = {
             text = 'Duel modifying',
             text = 'Duelist',
             link = 'Duel modifying effects',
             link = 'Duelist class abilities',
             symbol = '🤺',
             symbol = '🤺',
             class = 'effect-tagged duelModifying'
             class = 'class-tagged duelist'
         },
         },
         movement = {
         vet = {
             text = 'Movement',
             text = 'Veteran',
             link = 'Movement effects',
             link = 'Veteran class abilities',
             symbol = '👣',
             symbol = '🪖',
             class = 'effect-tagged movement'
             class = 'class-tagged veteran'
         },
         },
         poison = {
         kni = {
             text = 'Poison',
             text = 'Knight',
             link = 'Poison effects',
             link = 'Knight class abilities',
             symbol = '☠️',
             symbol = '⚔️',
             class = 'effect-tagged poison'
             class = 'class-tagged knight'
         },
         },
         displacement = {
         pal = {
             text = 'Displacement',
             text = 'Paladin',
             link = 'Displacement effects',
             link = 'Paladin class abilities',
             symbol = '🌀',
             symbol = '🛡️',
             class = 'effect-tagged displacement'
             class = 'class-tagged paladin'
         },
         },
         transformation = {
         ass = {
             text = 'Transformation',
             text = 'Assassin',
             link = 'Transformation effects',
             link = 'Assassin class abilities',
             symbol = '🌳',
             symbol = '🗡️',
             class = 'effect-tagged transformation'
             class = 'class-tagged assassin'
         },
         },
         control = {
         cor = {
             text = 'Control',
             text = 'Corsair',
             link = 'Control effects',
             link = 'Corsair class abilities',
             symbol = '⛓️',
             symbol = '🏴‍☠️',
             class = 'effect-tagged control'
             class = 'class-tagged corsair'
         },
         },
         resist = {
         arc = {
             text = 'Resistance',
             text = 'Archer',
             link = 'Resistance effects',
             link = 'Archer class abilities',
             symbol = '🚫',
             symbol = '🏹',
             class = 'effect-tagged resistance'
             class = 'class-tagged archer'
         },
         },
         awaken = {
         thi = {
             text = 'Awakening',
             text = 'Thief',
             link = 'Awakening effects',
             link = 'Thief class abilities',
             symbol = '🌞',
             symbol = '💰️',
             class = 'effect-tagged awakening'
             class = 'class-tagged thief'
         },
         },
         immune = {
         ran = {
             text = 'Immunity',
             text = 'Ranger',
             link = 'Immunity effects',
             link = 'Ranger class abilities',
             symbol = '🚫',
             symbol = '🐾',
             class = 'effect-tagged immunity'
             class = 'class-tagged ranger'
         },
         },
         long = {
         fla = {
             text = 'Long range',
             text = 'Flame Mage',
             link = 'Long range effects',
             link = 'Flame Mage class abilities',
             symbol = '📏',
             symbol = '🧙',
             class = 'effect-tagged longRange'
             class = 'class-tagged flameMage'
         },
         },
         sense = {
         sto = {
             text = 'Sensory',
             text = 'Storm Mage',
             link = 'Sensory effects',
             link = 'Storm Mage class abilities',
             symbol = '👁️',
             symbol = '🧙',
             class = 'effect-tagged sensory'
             class = 'class-tagged stormMage'
         },
         },
         revive = {
         lif = {
             text = 'Revival',
             text = 'Life Mage',
             link = 'Revival effects',
             link = 'Life Mage class abilities',
             symbol = '🤍',
             symbol = '🧙',
             class = 'effect-tagged revival'
             class = 'class-tagged lifeMage'
         },
         },
         summon = {
         nec = {
             text = 'Summoning',
             text = 'Necromancer',
             link = 'Summoning effects',
             link = 'Necromancer class abilities',
             symbol = '🖤',
             symbol = '🧙',
             class = 'effect-tagged summoning'
             class = 'class-tagged necromancer'
         },
         },
         heal = {
         nat = {
             text = 'Healing',
             text = 'Nature Mage',
             link = 'Healing effects',
             link = 'Nature Mage class abilities',
             symbol = '❤️',
             symbol = '🧙',
             class = 'effect-tagged healing'
             class = 'class-tagged natureMage'
         },
         },
         reanimate = {
    },
             text = 'Reanimation',
    gm = {
             link = 'Reanimation effects',
         warr = {
             symbol = '🩶',
             text = 'Warrior',
             class = 'effect-tagged reanimation'
             link = 'Warrior guildmaster abilities',
             symbol = '⚔️',
             class = 'archetype-tagged warrior'
         },
         },
         regenerate = {
         semi = {
             text = 'Regeneration',
             text = 'Semi',
             link = 'Regeneration effects',
             link = 'Semi guildmaster abilities',
             symbol = '💚',
             symbol = '🤹',
             class = 'effect-tagged regeneration'
             class = 'archetype-tagged semi'
        }
    },
    power = {
        divine = {
            text = 'Divine',
            link = 'Divinely powered abilities',
            symbol = '🪽',
            color = '#f9f06b',
            class = 'power-tagged divine'
         },
         },
         revitalize = {
         magic = {
             text = 'Revitalization',
             text = 'Magical',
             link = 'Revitalization effects',
             link = 'Magically powered abilities',
             symbol = '🩵',
             symbol = '✨',
             class = 'effect-tagged revitalization'
            color = '#9141ac',
             class = 'power-tagged magical'
         },
         },
         kill = {
         spirit = {
             text = 'Killing',
             text = 'Spiritual',
             link = 'Killing effects',
             link = 'Spiritually powered abilities',
             symbol = '☠️',
             symbol = '🪭',
             class = 'effect-tagged killing'
            color = '#9a9996',
             class = 'power-tagged spiritual'
         },
         },
         damage = {
         martial = {
             text = 'Damaging',
             text = 'Martial',
             link = 'Damaging effects',
             link = 'Martially powered abilities',
             symbol = '💢',
             symbol = '💪',
             class = 'effect-tagged damaging'
            color = '#ff7800',
             class = 'power-tagged martial'
         },
         },
         steal = {
         psionic = {
             text = 'Stealing',
             text = 'Psionic',
             link = 'Stealing effects',
             link = 'Psionically powered abilities',
             symbol = '💰',
             symbol = '🤯',
             class = 'effect-tagged stealing'
            color = '#3584e4',
             class = 'power-tagged psionic'
         },
         },
         loud = {
         primal = {
             text = 'Loud',
             text = 'Primal',
             link = 'Loud effects',
             link = 'Primally powered abilities',
             symbol = '🔊',
             symbol = '⛰️',
             class = 'effect-tagged loud'
            color = '#986a44',
             class = 'power-tagged primal'
         },
         },
         knockout = {
         techno = {
             text = 'Knockout',
             text = 'Technological',
             link = 'Knockout effects',
             link = 'Technologically powered abilities',
             symbol = '💤',
             symbol = '⚙️',
             class = 'effect-tagged knockout'
            color = '#e01b24',
             class = 'power-tagged technological'
         },
         },
         time = {
         finance = {
             text = 'Temporal',
             text = 'Financial',
             link = 'Temporal effects',
             link = 'Financially powered abilities',
             symbol = '🕰️',
             symbol = '🪙',
            class = 'effect-tagged temporal'
             color = '#fcc200',
        }
             class = 'power-tagged financial'
    },
    pre = {
        strike = {
            text = 'Strike',
             link = 'Strike delivery abilities',
            symbol = '⚔️',
             class = 'deliveryPackage-tagged strike'
         },
         },
         ray = {
         alchemy = {
             text = 'Ray',
             text = 'Alchemical',
             link = 'Ray delivery abilities',
             link = 'Alchemically powered abilities',
             symbol = '⚡️',
             symbol = '🧪',
             class = 'deliveryPackage-tagged ray'
            color = '#33d17a',
             class = 'power-tagged alchemical'
         },
         },
         ball = {
         unknown = {
             text = 'Ball',
             text = 'Unknown',
             link = 'Ball delivery abilities',
             link = 'Unknown powered abilities',
             symbol = '🔥',
             symbol = '❓',
             class = 'deliveryPackage-tagged ball'
            color = '#77767b',
             class = 'power-tagged unknown'
         },
         },
         aura = {
    },
             text = 'Aura',
    category = {
             link = 'Aura delivery abilities',
         skill = {
             symbol = '🌟',
             text = 'Skill',
             class = 'deliveryPackage-tagged aura'
             link = 'Skills',
             symbol = '🤹',
             class = 'skill'
         },
         },
         ritual = {
         spell = {
             text = 'Ritual',
             text = 'Spell',
             link = 'Ritual delivery abilities',
             link = 'Spells',
             symbol = '🕯️',
             symbol = '',
             class = 'deliveryPackage-tagged ritual'
             class = 'spell'
         },
         },
         touch = {
         semblant = {
             text = 'Touch',
             text = 'Semblant',
             link = 'Touch delivery abilities',
             link = 'Semblant skills',
             symbol = '👉️',
             symbol = '🎭',
             class = 'deliveryPackage-tagged touch'
             class = 'standard-tagged semblant'
        }
    },
    maneuver = {
        active = {
            text = 'Active',
            link = 'Active abilities',
            symbol = '➡️',
            class = 'maneuver-tagged active'
         },
         },
         reactive = {
         conjure = {
             text = 'Reactive',
             text = 'Conjured',
             link = 'Reactive abilities',
             link = 'Conjured spells',
             symbol = '↩️',
            symbol = '🔮',
             class = 'maneuver-tagged reactive'
            class = 'standard-tagged conjure'
        },
        standard = {
            text = 'Standard',
            link = 'Standard abilities',
             symbol = '🏁',
             class = 'standard-tagged normal'
         },
         },
         passive = {
         rotator = {
             text = 'Passive',
             text = 'Rotator',
             link = 'Passive abilities',
             link = 'Rotator abilities',
             symbol = '🔁',
             symbol = '🔄',
             class = 'maneuver-tagged passive'
             class = 'rotator'
         },
         },
         slow = {
         guildmaster = {
             text = 'Slow',
             text = 'Guildmaster',
             link = 'Slow abilities',
             link = 'Guildmaster abilities',
             symbol = '🐢',
             symbol = '🏅',
             class = 'maneuver-tagged slow'
             class = 'guildmaster'
         }
         }
     },
     },
     interaction = {
     effects = {
         attack = {
         mental = {
             text = 'Attack',
             text = 'Mental',
             link = 'Attack abilities',
             link = 'Mental effects',
             symbol = '⚔️',
             symbol = '🧠',
            color = '#ff7800',
             class = 'effect-tagged mental'
             class = 'interaction-tagged attack'
         },
         },
         block = {
         truth = {
             text = 'Block',
             text = 'Truth detecting',
             link = 'Block abilities',
             link = 'Truth detecting effects',
             symbol = '🛡️',
             symbol = '⚖️',
            color = '#ff7800',
             class = 'effect-tagged truthDetecting'
             class = 'interaction-tagged block'
         },
         },
         manifest = {
         duelModifying = {
             text = 'Manifest',
             text = 'Duel modifying',
             link = 'Manifest abilities',
             link = 'Duel modifying effects',
             symbol = '✳️',
             symbol = '🤺',
            color = '#ff7800',
             class = 'effect-tagged duelModifying'
             class = 'interaction-tagged manifest'
         },
         },
         feat = {
         movement = {
             text = 'Feat',
             text = 'Movement',
             link = 'Feat abilities',
             link = 'Movement effects',
             symbol = '🎖️',
             symbol = '👣',
            color = '#ff7800',
             class = 'effect-tagged movement'
            class = 'interaction-tagged feat'
        }
    },
    delivery = {
        self = {
            text = 'Self',
            link = 'Self delivery abilities',
            symbol = '🤲',
            color = '#f6d32d',
             class = 'delivery-tagged self'
         },
         },
         missile = {
         poison = {
             text = 'Missile',
             text = 'Poison',
             link = 'Missile delivery abilities',
             link = 'Poison effects',
             symbol = '🏹',
             symbol = '☠️',
            color = '#f6d32d',
             class = 'effect-tagged poison'
             class = 'delivery-tagged missile'
         },
         },
         hand = {
         displacement = {
             text = 'Hand',
             text = 'Displacement',
             link = 'Hand delivery abilities',
             link = 'Displacement effects',
             symbol = '🤚',
             symbol = '🌀',
            color = '#f6d32d',
             class = 'effect-tagged displacement'
             class = 'delivery-tagged hand'
         },
         },
         bite = {
         transformation = {
             text = 'Bite',
             text = 'Transformation',
             link = 'Bite delivery abilities',
             link = 'Transformation effects',
             symbol = '🦷',
             symbol = '🌳',
            color = '#f6d32d',
             class = 'effect-tagged transformation'
             class = 'delivery-tagged bite'
         },
         },
         item = {
         illusion = {
             text = 'Item',
             text = 'Illusion',
             link = 'Item delivery abilities',
             link = 'Illusion effects',
             symbol = '📦',
             symbol = '🫟',
            color = '#f6d32d',
             class = 'effect-tagged illusion'
             class = 'delivery-tagged item'
         },
         },
         magelore = {
         control = {
             text = 'Magelore',
             text = 'Control',
             link = 'Magelore delivery abilities',
             link = 'Control effects',
             symbol = '🔮',
             symbol = '⛓️',
            color = '#f6d32d',
             class = 'effect-tagged control'
             class = 'delivery-tagged magelore'
         },
         },
         weapon = {
         resist = {
             text = 'Weapon',
             text = 'Resistance',
             link = 'Weapon delivery abilities',
             link = 'Resistance effects',
             symbol = '🗡️',
             symbol = '🚫',
            color = '#f6d32d',
             class = 'effect-tagged resistance'
             class = 'delivery-tagged weapon'
         },
         },
         shield = {
         hexproof = {
             text = 'Shield',
             text = 'Hexproof',
             link = 'Shield delivery abilities',
             link = 'Hexproof effects',
             symbol = '🛡️',
             symbol = '🚫',
            color = '#f6d32d',
             class = 'effect-tagged hexproof'
             class = 'delivery-tagged shield'
         },
         },
         armor = {
         awaken = {
             text = 'Armor',
             text = 'Awakening',
             link = 'Armor delivery abilities',
             link = 'Awakening effects',
             symbol = '🪖',
             symbol = '🌞',
            color = '#f6d32d',
             class = 'effect-tagged awakening'
             class = 'delivery-tagged armor'
         },
         },
         sight = {
         immune = {
             text = 'Sight',
             text = 'Immunity',
             link = 'Sight delivery abilities',
             link = 'Immunity effects',
             symbol = '👁️',
             symbol = '🚫',
            color = '#f6d32d',
             class = 'effect-tagged immunity'
             class = 'delivery-tagged sight'
         },
         },
         aura = {
         hexseal = {
             text = 'Aura',
             text = 'Hexseal',
             link = 'Aura delivery abilities',
             link = 'Hexseal effects',
             symbol = '🌟',
             symbol = '🚫',
            color = '#f6d32d',
             class = 'effect-tagged hexseal'
             class = 'delivery-tagged aura'
         },
         },
         cone = {
         long = {
             text = 'Cone',
             text = 'Long range',
             link = 'Cone delivery abilities',
             link = 'Long range effects',
             symbol = '🐲',
             symbol = '📏',
            color = '#f6d32d',
             class = 'effect-tagged longRange'
             class = 'delivery-tagged cone'
         },
         },
         other = {
         sense = {
             text = 'Other',
             text = 'Sensory',
             link = 'Other delivery abilities',
             link = 'Sensory effects',
             symbol = '❓',
             symbol = '👁️',
            color = '#f6d32d',
             class = 'effect-tagged sensory'
            class = 'delivery-tagged other'
        }
    },
    target = {
        self = {
            text = 'Self',
            link = 'Self target abilities',
            symbol = '🤲',
            color = '#f6d32d',
             class = 'target-tagged self'
         },
         },
         creature = {
         revive = {
             text = 'Creature',
             text = 'Revival',
             link = 'Creature target abilities',
             link = 'Revival effects',
             symbol = '👤',
             symbol = '🤍',
            color = '#f6d32d',
             class = 'effect-tagged revival'
             class = 'target-tagged creature'
         },
         },
         body = {
         summon = {
             text = 'Body',
             text = 'Summoning',
             link = 'Body target abilities',
             link = 'Summoning effects',
             symbol = '🧍',
             symbol = '🖤',
            color = '#f6d32d',
             class = 'effect-tagged summoning'
             class = 'target-tagged body'
         },
         },
         vitals = {
         heal = {
             text = 'Vitals',
             text = 'Healing',
             link = 'Vitals target abilities',
             link = 'Healing effects',
             symbol = '🫀',
             symbol = '❤️',
            color = '#f6d32d',
             class = 'effect-tagged healing'
             class = 'target-tagged vitals'
         },
         },
         limb = {
         reanimate = {
             text = 'Limb',
             text = 'Reanimation',
             link = 'Limb target abilities',
             link = 'Reanimation effects',
             symbol = '🦾',
             symbol = '🩶',
            color = '#f6d32d',
             class = 'effect-tagged reanimation'
             class = 'target-tagged limb'
         },
         },
         arm = {
         regenerate = {
             text = 'Arm',
             text = 'Regeneration',
             link = 'Arm target abilities',
             link = 'Regeneration effects',
             symbol = '💪',
             symbol = '💚',
            color = '#f6d32d',
             class = 'effect-tagged regeneration'
             class = 'target-tagged arm'
         },
         },
         leg = {
         revitalize = {
             text = 'Leg',
             text = 'Revitalization',
             link = 'Leg target abilities',
             link = 'Revitalization effects',
             symbol = '🦵',
             symbol = '🩵',
             color = '#f6d32d',
             class = 'effect-tagged revitalization'
             class = 'target-tagged leg'
        },
        kill = {
            text = 'Killing',
            link = 'Killing effects',
            symbol = '☠️',
            class = 'effect-tagged killing'
        },
        damage = {
            text = 'Damaging',
            link = 'Damaging effects',
            symbol = '💢',
             class = 'effect-tagged damaging'
         },
         },
         item = {
         drain = {
             text = 'Item',
             text = 'Draining',
             link = 'Item target abilities',
             link = 'Draining effects',
             symbol = '📦',
             symbol = '🩸',
            color = '#f6d32d',
             class = 'effect-tagged draining'
             class = 'target-tagged item'
         },
         },
         weapon = {
         destroy = {
             text = 'Weapon',
             text = 'Destruction',
             link = 'Weapon target abilities',
             link = 'Destruction effects',
             symbol = '🗡️',
             symbol = '💥',
            color = '#f6d32d',
             class = 'effect-tagged destruction'
             class = 'target-tagged weapon'
         },
         },
         shield = {
         contract = {
             text = 'Shield',
             text = 'Contract',
             link = 'Shield target abilities',
             link = 'Contract effects',
             symbol = '🛡️',
             symbol = '🤝',
            color = '#f6d32d',
             class = 'effect-tagged contract'
             class = 'target-tagged shield'
         },
         },
         armor = {
         steal = {
             text = 'Armor',
             text = 'Stealing',
             link = 'Armor target abilities',
             link = 'Stealing effects',
             symbol = '🪖',
             symbol = '💰',
            color = '#f6d32d',
             class = 'effect-tagged stealing'
             class = 'target-tagged armor'
         },
         },
         ship = {
         loud = {
             text = 'Ship',
             text = 'Loud',
             link = 'Ship target abilities',
             link = 'Loud effects',
             symbol = '⛵️',
             symbol = '🔊',
            color = '#f6d32d',
             class = 'effect-tagged loud'
             class = 'target-tagged ship'
         },
         },
         attack = {
         knockout = {
             text = 'Attack',
             text = 'Knockout',
             link = 'Attack target abilities',
             link = 'Knockout effects',
             symbol = '⚔️',
             symbol = '💤',
             color = '#f6d32d',
             class = 'effect-tagged knockout'
             class = 'target-tagged attack'
        },
        time = {
            text = 'Temporal',
            link = 'Temporal effects',
            symbol = '🕰️',
             class = 'effect-tagged temporal'
         },
         },
         ability = {
         auto = {
             text = 'Ability',
             text = 'Automatic',
             link = 'Ability target abilities',
             link = 'Automatic effects',
             symbol = '🅰',
             symbol = '❗️',
            color = '#f6d32d',
             class = 'effect-tagged automatic'
             class = 'target-tagged ability'
         },
         },
         spell = {
         lightning = {
             text = 'Spell',
             text = 'Lightning',
             link = 'Spell target abilities',
             link = 'Lightning effects',
             symbol = '💫',
             symbol = '⚡️',
            color = '#f6d32d',
             class = 'effect-tagged lightning'
             class = 'target-tagged spell'
         },
         },
         other = {
         disease = {
             text = 'Other',
             text = 'Disease',
             link = 'Other target abilities',
             link = 'Disease effects',
             symbol = '❓',
             symbol = '🦠',
            color = '#f6d32d',
             class = 'effect-tagged disease'
             class = 'target-tagged other'
         },
         },
         area = {
         vision = {
            text = 'Area',
        text = 'Vision',
            link = 'Area target abilities',
        link = 'Vision effects',
            symbol = '🏕️',
        symbol = '🥠',
            color = '#f6d32d',
        class = 'effect-tagged vision'
            class = 'target-tagged area'
        },
        morganti = {
        text = 'Morganti',
        link = 'Morganti effects',
        symbol = '⚫️',
        class = 'effect-tagged morganti'
         },
         },
         ci = {tags = {'creature', 'item'}},
         construction = {
        ai = {tags = {'attack', 'item'}},
            text = 'Construction',
        aci = {tags = {'area', 'creature', 'item'}},
             link = 'Construction effects',
        ac = {tags = {'area', 'creature'}},
             symbol = '🔧',
        al = {tags = {'arm', 'leg'}},
             class = 'effect-tagged construction'
        cs = {tags = {'creature', 'self'}}
    },
    upgrade = {
        warded = {
             text = 'Warded',
             link = 'Warded abilities',
             class = 'upgrade-tagged warded'
         },
         },
         absolute = {
         weather = {
             text = 'Absolute',
             text = 'Weather',
             link = 'Absolute abilities',
             link = 'Weather effects',
             class = 'upgrade-tagged absolute'
            symbol = '🌧️',
             class = 'effect-tagged weather'
         }
         }
     },
     },
     executionTime = {
     pre = {
         freeAction = {
         strike = {
             text = 'Free action',
             text = 'Strike',
             symbol = '0️⃣',
             link = 'Strike delivery abilities',
             link = 'Free action abilities',
             symbol = '⚔️',
             class = 'executionTime-tagged a0'
             class = 'deliveryPackage-tagged strike'
         },
         },
         singleAction = {
         ray = {
             text = 'Single action',
             text = 'Ray',
             symbol = '1️⃣',
             link = 'Ray delivery abilities',
             link = 'Single action abilities',
             symbol = '⚡️',
             class = 'executionTime-tagged a1'
             class = 'deliveryPackage-tagged ray'
         },
         },
         doubleAction = {
         ball = {
             text = 'Double action',
             text = 'Ball',
             symbol = '2️⃣',
             link = 'Ball delivery abilities',
             link = 'Double action abilities',
             symbol = '🔥',
             class = 'executionTime-tagged a2'
             class = 'deliveryPackage-tagged ball'
         },
         },
         tripleAction = {
         aura = {
             text = 'Triple action',
             text = 'Aura',
             symbol = '3️⃣',
             link = 'Aura delivery abilities',
             link = 'Triple action abilities',
             symbol = '🌟',
             class = 'executionTime-tagged a3'
             class = 'deliveryPackage-tagged aura'
         },
         },
         freeReaction = {
         ritual = {
             text = 'Free reaction',
             text = 'Ritual',
             symbol = '0️⃣',
             link = 'Ritual delivery abilities',
             link = 'Free reaction abilities',
             symbol = '🕯️',
             class = 'executionTime-tagged r0'
             class = 'deliveryPackage-tagged ritual'
         },
         },
         reaction = {
         touch = {
             text = 'Reaction',
             text = 'Touch',
             symbol = '1️⃣',
             link = 'Touch delivery abilities',
             link = 'Reaction abilities',
             symbol = '👉️',
             class = 'executionTime-tagged r1'
             class = 'deliveryPackage-tagged touch'
         },
         },
         shortRest = {
    },
             text = 'Short rest',
    maneuver = {
             symbol = '🌙',
         active = {
             link = 'Short rest abilities',
             text = 'Active',
             class = 'executionTime-tagged shortRest'
             link = 'Active abilities',
             symbol = '➡️',
             class = 'maneuver-tagged active'
         },
         },
         longRest = {
         reactive = {
             text = 'Long rest',
             text = 'Reactive',
             symbol = '🌙',
             link = 'Reactive abilities',
             link = 'Long rest abilities',
             symbol = '↩️',
             class = 'executionTime-tagged longRest'
             class = 'maneuver-tagged reactive'
         }
         },
    },
        passive = {
    piercing = {
            text = 'Passive',
        av0 = {
             link = 'Passive abilities',
             text = 'AV0',
             symbol = '🔁',
             symbol = '🎯',
            class = 'maneuver-tagged passive'
             link = 'AV0 abilities',
        },
             color = '#33d17a',
        slow = {
             class = 'piercing-tagged av0'
            text = 'Slow',
             link = 'Slow abilities',
             symbol = '🐢',
             class = 'maneuver-tagged slow'
         },
         },
        unblockable = {
            text = 'UB',
            symbol = '🪨',
            link = 'UB abilities',
            color = '#33d17a',
            class = 'piercing-tagged ub'
        }
     },
     },
     duration = {
     interaction = {
         instant = {
         attack = {
             text = 'Instant',
             text = 'Attack',
             link = 'Instant duration abilities',
             link = 'Attack abilities',
             no = true
             symbol = '⚔️',
            color = '#ff7800',
            class = 'interaction-tagged attack'
         },
         },
         always = {
         block = {
             text = 'Always active',
             text = 'Block',
             link = 'Always active duration abilities',
             link = 'Block abilities',
             no = true
             symbol = '🛡️',
            color = '#ff7800',
            class = 'interaction-tagged block'
         },
         },
         noLimit = {
         manifest = {
             text = 'No limit',
             text = 'Manifest',
             link = 'No limit duration abilities',
             link = 'Manifest abilities',
             no = true
             symbol = '✳️',
            color = '#ff7800',
            class = 'interaction-tagged manifest'
         },
         },
         whileUp = {
         feat = {
             text = 'While up',
             text = 'Feat',
             link = 'While up duration abilities',
             link = 'Feat abilities',
             no = true
             symbol = '🎖️',
            color = '#ff7800',
            class = 'interaction-tagged feat'
        }
    },
    delivery = {
        self = {
            text = 'Self',
            link = 'Self delivery abilities',
            symbol = '🤲',
            color = '#f6d32d',
            class = 'delivery-tagged self'
         },
         },
         whileDown = {
         missile = {
             text = 'While down',
             text = 'Missile',
             link = 'While down duration abilities',
             link = 'Missile delivery abilities',
             no = true
             symbol = '🏹',
            color = '#f6d32d',
            class = 'delivery-tagged missile'
         },
         },
         whileAlive = {
         hand = {
             text = 'While alive',
             text = 'Hand',
             link = 'While alive duration abilities',
             link = 'Hand delivery abilities',
             no = true
             symbol = '🤚',
            color = '#f6d32d',
            class = 'delivery-tagged hand'
         },
         },
         whileDead = {
         bite = {
             text = 'While dead',
             text = 'Bite',
             link = 'While dead duration abilities',
             link = 'Bite delivery abilities',
             no = true
             symbol = '🦷',
            color = '#f6d32d',
            class = 'delivery-tagged bite'
         },
         },
         endOfTurn = {
         item = {
             text = 'Until the end of the turn',
             text = 'Item',
             link = 'Until end of turn duration abilities',
             link = 'Item delivery abilities',
             no = true
             symbol = '📦',
            color = '#f6d32d',
            class = 'delivery-tagged item'
         },
         },
         dawn = {
         magelore = {
             text = 'Until dawn',
             text = 'Magelore',
             link = 'Until dawn duration abilities',
             link = 'Magelore delivery abilities',
             no = true
             symbol = '🔮',
            color = '#f6d32d',
            class = 'delivery-tagged magelore'
         },
         },
         startOfTargetNextTurn = {
         weapon = {
             text = 'Until the start of target\'s next turn',
             text = 'Weapon',
             link = 'Until start of target\'s next turn duration abilities',
            link = 'Weapon delivery abilities',
             no = true
             symbol = '🗡️',
            color = '#f6d32d',
             class = 'delivery-tagged weapon'
         },
         },
         endOfTargetNextTurn = {
         shield = {
             text = 'Until the end of target\'s next turn',
             text = 'Shield',
             link = 'Until end of target\'s next turn duration abilities',
            link = 'Shield delivery abilities',
             no = true
             symbol = '🛡️',
            color = '#f6d32d',
             class = 'delivery-tagged shield'
         },
         },
         startOfYourNextTurn = {
         armor = {
             text = 'Until the start of your next turn',
             text = 'Armor',
             link = 'Until start of your next turn duration abilities',
             link = 'Armor delivery abilities',
             no = true
             symbol = '🪖',
            color = '#f6d32d',
            class = 'delivery-tagged armor'
         },
         },
         endOfYourNextTurn = {
         sight = {
             text = 'Until the end of your next turn',
             text = 'Sight',
             link = 'Until end of your next turn duration abilities',
             link = 'Sight delivery abilities',
             no = true
             symbol = '👁️',
            color = '#f6d32d',
            class = 'delivery-tagged sight'
         },
         },
         endOfCombat = {
         aura = {
             text = 'Until the end of combat',
             text = 'Aura',
             link = 'Until end of combat duration abilities',
             link = 'Aura delivery abilities',
             no = true
             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'
         }
         }
     },
     },
     range = {
     target = {
         melee = {
         self = {
             text = 'Your melee range',
             text = 'Self',
             -- link = 'Melee abilities',
             link = 'Self target abilities',
             no = true
             symbol = '🤲',
        },
             color = '#f6d32d',
        weapon = {
             class = 'target-tagged self'
             text = 'Your weapon\'s range',
             -- link = 'Weapon range abilities',
            no = true
         },
         },
         hand = {
         creature = {
             text = 'Your hand\'s range',
             text = 'Creature',
             -- link = 'Hand range abilities',
             link = 'Creature target abilities',
             no = true
             symbol = '👤',
            color = '#f6d32d',
            class = 'target-tagged creature'
         },
         },
         bite = {
         body = {
             text = 'Your bite\'s range',
             text = 'Body',
             -- link = 'Bite range abilities',
             link = 'Body target abilities',
             no = true
             symbol = '🧍',
            color = '#f6d32d',
            class = 'target-tagged body'
         },
         },
         item = {
         vitals = {
             text = 'Your item\'s range',
             text = 'Vitals',
             -- link = 'Item range abilities',
            link = 'Vitals target abilities',
             no = true
            symbol = '🫀',
             color = '#f6d32d',
            class = 'target-tagged vitals'
        },
        limb = {
            text = 'Limb',
            link = 'Limb target abilities',
             symbol = '🦾',
            color = '#f6d32d',
            class = 'target-tagged limb'
         },
         },
         shield = {
         arm = {
             text = 'Your shield\'s range',
             text = 'Arm',
             -- link = 'Shield range abilities',
             link = 'Arm target abilities',
             no = true
             symbol = '💪',
            color = '#f6d32d',
            class = 'target-tagged arm'
         },
         },
         armor = {
         leg = {
             text = 'Your armor\'s range',
             text = 'Leg',
             -- link = 'Armor range abilities',
             link = 'Leg target abilities',
            no = true
             symbol = '🦵',
        }
             color = '#f6d32d',
    },
             class = 'target-tagged leg'
    attribute = {
        int = {
            text = 'Intelligence',
             symbol = 'INT',
             link = 'INT save abilities',
             class = 'saveAttribute-tagged int'
         },
         },
         str = {
         item = {
             text = 'Strength',
             text = 'Item',
             symbol = 'STR',
            link = 'Item target abilities',
             link = 'STR save abilities',
             symbol = '📦',
             class = 'saveAttribute-tagged str'
             color = '#f6d32d',
             class = 'target-tagged item'
         },
         },
         mov = {
         weapon = {
             text = 'Movement',
             text = 'Weapon',
             symbol = 'MOV',
            link = 'Weapon target abilities',
             link = 'MOV save abilities',
             symbol = '🗡️',
             class = 'saveAttribute-tagged mov'
             color = '#f6d32d',
             class = 'target-tagged weapon'
         },
         },
         per = {
         shield = {
             text = 'Perception',
             text = 'Shield',
             symbol = 'PER',
            link = 'Shield target abilities',
             link = 'PER save abilities',
             symbol = '🛡️',
             class = 'saveAttribute-tagged per'
             color = '#f6d32d',
             class = 'target-tagged shield'
         },
         },
         snk = {
         armor = {
             text = 'Sneak',
             text = 'Armor',
             symbol = 'SNK',
            link = 'Armor target abilities',
             link = 'SNK save abilities',
             symbol = '🪖',
             class = 'saveAttribute-tagged snk'
             color = '#f6d32d',
             class = 'target-tagged armor'
         },
         },
         unp = {
         ship = {
             text = 'Unused Presence',
             text = 'Ship',
            symbol = 'UNP',
             link = 'Ship target abilities',
             link = 'UNP save abilities',
             symbol = '⛵️',
            class = 'saveAttribute-tagged unp'
             color = '#f6d32d',
        }
             class = 'target-tagged ship'
    },
    expansionAttribute = {
        int = {
            text = 'Intelligence',
             symbol = 'INT',
             link = 'INT save abilities',
             class = 'expansionAttribute-tagged int'
         },
         },
         str = {
         attack = {
             text = 'Strength',
             text = 'Attack',
             symbol = 'STR',
            link = 'Attack target abilities',
             link = 'STR save abilities',
             symbol = '⚔️',
             class = 'expansionAttribute-tagged str'
             color = '#f6d32d',
             class = 'target-tagged attack'
         },
         },
         mov = {
         ability = {
            text = 'Movement',
        text = 'Ability',
            symbol = 'MOV',
        link = 'Ability target abilities',
            link = 'MOV save abilities',
        symbol = '🅰',
             class = 'expansionAttribute-tagged mov'
        color = '#f6d32d',
             class = 'target-tagged ability'
         },
         },
         per = {
         spell = {
             text = 'Perception',
             text = 'Spell',
             symbol = 'PER',
            link = 'Spell target abilities',
             link = 'PER save abilities',
             symbol = '💫',
             class = 'expansionAttribute-tagged per'
             color = '#f6d32d',
             class = 'target-tagged spell'
         },
         },
         snk = {
         other = {
             text = 'Sneak',
             text = 'Other',
             symbol = 'SNK',
            link = 'Other target abilities',
             link = 'SNK save abilities',
             symbol = '',
             class = 'expansionAttribute-tagged snk'
             color = '#f6d32d',
             class = 'target-tagged other'
         },
         },
         unp = {
         area = {
             text = 'Unused Presence',
             text = 'Area',
             symbol = 'UNP',
            link = 'Area target abilities',
             link = 'UNP save abilities',
             symbol = '🏕️',
             class = 'expansionAttribute-tagged unp'
             color = '#f6d32d',
         }
             class = 'target-tagged area'
    },
         },
    expansion = {
        ci = {
         detonate = {
            tags = {
             text = 'Detonate',
                'creature',
            symbol = '💥',
                'item'
             link = 'Detonate expansion abilities',
            }
            class = 'expansion-tagged detonate'
         },
        ai = {
             tags = {
                'attack',
                'item'
            }
        },
        ari = {
             tags = {
                'area',
                'item'
            }
         },
         },
         ripple = {
         as = {
            text = 'Ripple',
        tags = {
            symbol = '🌊',
        'area',
            link = 'Ripple expansion abilities',
        'spell',
            class = 'expansion-tagged ripple'
        }
         },
         },
         cascade = {
         arse = {
            text = 'Cascade',
        tags = {
            symbol = '',
        'area',
            link = 'Cascade expansion abilities',
        'self',
            class = 'expansion-tagged cascade'
        }
         },
         },
         fork = {
         si = {
             text = 'Fork',
        tags = {
             symbol = '🔱',
        'item',
             link = 'Fork expansion abilities',
        'self'
             class = 'expansion-tagged fork'
        }
        },
        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'
         }
         }
     },
     },
     sustained = {
     executionTime = {
         sustained = {
         freeAction = {
             text = 'Sustained',
             text = 'Free action',
             symbol = '⏳️',
             symbol = '0️⃣',
             link = 'Sustained abilities',
             link = 'Free action abilities',
             class = 'sustained'
             class = 'executionTime-tagged a0'
         }
         },
    }
        singleAction = {
}
            text = 'Single action',
 
            symbol = '1️⃣',
local premades = {
            link = 'Single action abilities',
    strike = {
            class = 'executionTime-tagged a1'
        maneuver = 'active',
        },
        executionTime = '1a',
        doubleAction = {
        interaction = 'attack',
            text = 'Double action',
         delivery = 'weapon',
            symbol = '2️⃣',
        target = 'creature',
            link = 'Double action abilities',
        duration = 'instant',
            class = 'executionTime-tagged a2'
        range = 'weapon'
        },
    },
         tripleAction = {
    ray = {
            text = 'Triple action',
        maneuver = 'active',
            symbol = '3️⃣',
        executionTime = '1a',
            link = 'Triple action abilities',
        interaction = 'attack',
            class = 'executionTime-tagged a3'
        delivery = 'missile',
        },
         target = 'creature',
        freeReaction = {
        duration = 'instant',
            text = 'Free reaction',
        range = '60f',
            symbol = '0️⃣',
        piercing = 'av0'
            link = 'Free reaction abilities',
    },
            class = 'executionTime-tagged r0'
    ball = {
        },
        maneuver = 'active',
         reaction = {
        executionTime = '1a',
            text = 'Reaction',
        interaction = 'attack',
            symbol = '1️⃣',
        delivery = 'missile',
            link = 'Reaction abilities',
         target = 'creature',
            class = 'executionTime-tagged r1'
        duration = 'instant',
        },
        range = '30f',
        shortRest = {
        piercing = 'ub'
            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'
        },
     },
     },
     aura = {
     piercing = {
         skip = true,
         av0 = {
        maneuver = 'active',
            text = 'AV0',
        executionTime = '1a',
            symbol = '🎯',
        interaction = 'feat',
            link = 'AV0 abilities',
         delivery = 'aura',
            color = '#33d17a',
        target = 'creature',
            class = 'piercing-tagged av0'
        duration = 'instant',
        },
        range = '10f',
         unblockable = {
        attribute = 'mov'
            text = 'UB',
            symbol = '🪨',
            link = 'UB abilities',
            color = '#33d17a',
            class = 'piercing-tagged ub'
        }
     },
     },
     ritual = {
     duration = {
         maneuver = 'slow',
         instant = {
        executionTime = '10m',
            text = 'Instant',
         interaction = 'manifest',
            link = 'Instant duration abilities',
         delivery = 'sight',
            no = true
        target = 'creature',
         },
        duration = 'instant',
         always = {
        range = '5f'
            text = 'Always active',
    },
            link = 'Always active duration abilities',
    touch = {
            no = true
        maneuver = 'active',
        },
        executionTime = '1a',
        noLimit = {
         interaction = 'attack',
            text = 'No limit',
         delivery = 'hand',
            link = 'No limit duration abilities',
        target = 'creature',
            no = true
         duration = 'instant',
         },
         range = 'hand',
         whileUp = {
        piercing = 'ub'
            text = 'While up',
    },
            link = 'While up duration abilities',
    triumph = {
            no = true
         skip = true,
         },
         maneuver = 'reactive',
         whileDown = {
        executionTime = '0r',
            text = 'While down',
         interaction = 'manifest',
            link = 'While down duration abilities',
         delivery = 'self',
            no = true
        target = 'self',
         },
        duration = 'instant',
         whileAlive = {
        range = 'self'
            text = 'While alive',
    },
            link = 'While alive duration abilities',
    self = {
            no = true
        skip = true,
         },
        maneuver = 'active',
         whileDead = {
         executionTime = '1a',
            text = 'While dead',
         interaction = 'man',
            link = 'While dead duration abilities',
        delivery = 'self',
            no = true
         target = 'self',
        },
         duration = 'instant',
        endOfTurn = {
        range = 'self'
            text = 'Until the end of the turn',
    },
            link = 'Until end of turn duration abilities',
    passive = {
            no = true
         skip = true,
         },
         maneuver = 'passive',
         dawn = {
        interaction = 'man',
            text = 'Until dawn',
         delivery = 'self',
            link = 'Until dawn duration abilities',
         target = 'self',
            no = true
        duration = '4',
         },
        range = 'self'
         startOfTargetNextTurn = {
    },
            text = 'Until the start of target\'s next turn',
    crown = {
            link = 'Until start of target\'s next turn duration abilities',
        skip = true,
            no = true
        maneuver = 'active',
         },
        executionTime = '1a',
         endOfTargetNextTurn = {
        interaction = 'man',
            text = 'Until the end of target\'s next turn',
         delivery = 'self',
            link = 'Until end of target\'s next turn duration abilities',
         target = 'self',
            no = true
        duration = '8h',
         },
        range = 'self',
         startOfYourNextTurn = {
        sustained = 'sus'
            text = 'Until the start of your next turn',
    }
            link = 'Until start of your next turn duration abilities',
}
            no = true
 
        },
function noPlural(word)
        endOfYourNextTurn = {
     -- Common irregular plural forms
            text = 'Until the end of your next turn',
    local irregulars = {
            link = 'Until end of your next turn duration abilities',
         ["children"] = "child",
            no = true
        ["men"] = "man",
         },
        ["women"] = "woman",
         endOfCombat = {
        ["feet"] = "foot",
            text = 'Until the end of combat',
         ["teeth"] = "tooth",
            link = 'Until end of combat duration abilities',
         ["mice"] = "mouse",
            no = true
        ["geese"] = "goose"
        }
    }
    },
 
     range = {
    -- Check for irregular forms
         melee = {
    if irregulars[word] then return irregulars[word] end
            text = 'Your melee range',
 
            -- link = 'Melee abilities',
    -- Regular pluralization rules
            no = true
    if word:match("ies$") then
         },
         -- Change words ending in 'ies' to 'y' (e.g., "parties" -> "party")
         weapon = {
         return word:sub(1, -4) .. "y"
            text = 'Your [[:Category:Weapons|weapon\'s]] range',
    elseif word:match("ves$") then
            -- link = 'Weapon range abilities',
        -- Change words ending in 'ves' to 'f' or 'fe' (e.g., "wolves" -> "wolf")
            no = true
         return word:sub(1, -4) .. "f"
         },
    elseif word:match("s$") and not word:match("ss$") then
         hand = {
        -- Remove trailing 's' (e.g., "cats" -> "cat", but keep "boss")
            text = 'Your [[:Category:Handy equipment|hand\'s]] range',
        return word:sub(1, -2)
            -- link = 'Hand range abilities',
    else
            no = true
        -- Return the word unchanged if no pluralization rule applies
         },
         return word
        bite = {
    end
            text = 'Your [[:Category:Biting equipment|bite\'s]] range',
end
            -- link = 'Bite range abilities',
 
            no = true
local function addCategory(category, key, val, skill, spell, addCats, noLower)
         },
    if addCats then
         item = {
         if not noLower then category = category:lower() end
            text = 'Your [[:Category:Items|item\'s]] range',
        if tags[key] and tags[key][val] then
             -- link = 'Item range abilities',
             if tags[key][val].tags then
            no = true
                out = ''
        },
                for _, t in ipairs(tags[key][val].tags) do
        shield = {
                    out = out ..
             text = 'Your [[:Category:Shields|shield\'s]] range',
                              addCategory(category, key, t, skill, spell,
            -- link = 'Shield range abilities',
                                          addCats, true)
             no = true
                end
         },
                return out
         armor = {
             else
             text = 'Your [[:Category:Armor|armor\'s]] range',
                category = tags[key][val].link
            -- link = 'Armor range abilities',
             end
             no = true
         end
        },
         if skill then
    },
             skillCategory = category:gsub('ability', 'skill'):gsub('abilities',
    attribute = {
                                                                  'skills')
         int = {
             skillCategory = skillCategory:gsub("^%l", string.upper)
             text = 'Intelligence',
        end
            symbol = 'INT',
         if spell then
            link = 'INT save abilities',
             spellCategory = category:gsub('ability', 'spell'):gsub('abilities',
            class = 'saveAttribute-tagged int'
                                                                  'spells')
        },
            spellCategory = spellCategory:gsub("^%l", string.upper)
         str = {
         end
            text = 'Strength',
        category = category:gsub("^%l", string.upper)
            symbol = 'STR',
 
            link = 'STR save abilities',
        local c = '[[Category:' .. tostring(category) .. ']]'
             class = 'saveAttribute-tagged str'
        if skill then
         },
             c = c .. '[[Category:' .. tostring(skillCategory) .. ']]'
         mov = {
         end
             text = 'Movement',
         if spell then
            symbol = 'MOV',
             c = c .. '[[Category:' .. tostring(spellCategory) .. ']]'
            link = 'MOV save abilities',
        end
            class = 'saveAttribute-tagged mov'
        return c
        },
    else
         per = {
        return ''
             text = 'Perception',
    end
            symbol = 'PER',
end
             link = 'PER save abilities',
 
             class = 'saveAttribute-tagged per'
local function makeTag(frame, key, value, makeCat, transparent)
         },
    if not tags[key] or not tags[key][value] then
         snk = {
         if value then
            text = 'Sneak',
            local out =
            symbol = 'SNK',
                frame:preprocess("{{ucfirst:" .. tostring(value) .. "}}")
            link = 'SNK save abilities',
             if not ('.' == out:sub(-1)) then out = out .. '.' end
             class = 'saveAttribute-tagged snk'
             return out
         },
        else
         unp = {
             return ''
            text = 'Unused Presence',
         end
            symbol = 'UNP',
    end
            link = 'UNP save abilities',
    local tag = tags[key][value]
            class = 'saveAttribute-tagged unp'
    if tag.no then
        },
         local out = frame:preprocess("{{ucfirst:" .. tag.text .. "}}")
     },
        if not ('.' == out:sub(-1)) then out = out .. '.' end
     expansionAttribute = {
        return out
        int = {
    end
            text = 'Intelligence',
    if tag.tags then
            symbol = 'INT',
        local out = ''
            link = 'INT save abilities',
        for _, t in ipairs(tag.tags) do
            class = 'expansionAttribute-tagged int'
             out = out .. makeTag(frame, key, t, makeCat, transparent)
        },
         end
         str = {
         return out
            text = 'Strength',
    end
             symbol = 'STR',
    local tagText = "{{Tag|{{ucfirst:" .. tag.text .. "}}"
            link = 'STR save abilities',
    if tag.symbol then tagText = tagText .. "|" .. tag.symbol end
             class = 'expansionAttribute-tagged str'
    if tag.link then
        },
        tagText = tagText .. "|l=:Category:{{ucfirst:" .. tag.link .. "}}"
        mov = {
    end
            text = 'Movement',
    if tag.color then tagText = tagText .. "|c=" .. tag.color end
             symbol = 'MOV',
    if tag.class then tagText = tagText .. "|class=" .. tag.class end
             link = 'MOV save abilities',
    if transparent then tagText = tagText .. "|o=1" end
             class = 'expansionAttribute-tagged mov'
     tagText = tagText .. "}}"
        },
     -- out = frame:preprocess(tagText)
         per = {
    out = tagText
             text = 'Perception',
    return out
            symbol = 'PER',
end
             link = 'PER save abilities',
 
             class = 'expansionAttribute-tagged per'
local function makeContent(frame, table, keys, makeCat)
         },
    local content = ''
         snk = {
    local subContent = ''
            text = 'Sneak',
    local hasPre = false
            symbol = 'SNK',
    for _, key in ipairs(keys) do
            link = 'SNK save abilities',
         if ('pre' == key and table['pre']) or
            class = 'expansionAttribute-tagged snk'
             ('executionTime' == key and table['executionTime']) or
         },
             ('target' == key) or ('duration' == key) or
        unp = {
             ('invoked' == key and table['invoked']) then
             text = 'Unused Presence',
             hasPre = true
            symbol = 'UNP',
             content = content ..
             link = 'UNP save abilities',
                          frame:preprocess(
            class = 'expansionAttribute-tagged unp'
                              makeTag(frame, key, table[key], makeCat))
        },
         else
     },
             if hasPre then
     expansion = {
                subContent = subContent ..
        detonate = {
                                makeTag(frame, key, table[key], makeCat)
            text = 'Detonate',
             else
            symbol = '💥',
                content = content ..
            link = 'Detonate expansion abilities',
                              frame:preprocess(
            class = 'expansion-tagged detonate'
                                  makeTag(frame, key, table[key], makeCat))
        },
             end
        ripple = {
         end
            text = 'Ripple',
    end
            symbol = '🌊',
    if hasPre then
            link = 'Ripple expansion abilities',
         content = content .. frame:preprocess('{{TagSub|' .. subContent .. '}}')
            class = 'expansion-tagged ripple'
        -- content = content .. '{{TagSub|' .. subContent .. '}}'
        },
    end
        cascade = {
    if content == '' then
            text = 'Cascade',
         for _, key in ipairs(keys) do
            symbol = '',
             if table[key] then
            link = 'Cascade expansion abilities',
                content = frame:preprocess(
            class = 'expansion-tagged cascade'
                              '{{ucfirst:' .. content .. table[key] .. '}}')
        },
             end
        fork = {
        end
            text = 'Fork',
    end
            symbol = '🔱',
    return content
             link = 'Fork expansion abilities',
end
            class = 'expansion-tagged fork'
 
         }
local function makeBar(frame, title, content, link, flags, bottom)
     },
    if content == '' then return '' end
     sustained = {
    local barSpace = mw.html.create('span')
         sustained = {
     barSpace:wikitext(frame:preprocess(' ')):css('display', 'none')
            text = 'Sustained',
     local barTitle = mw.html.create('span')
            symbol = '⏳️',
    local barTitleClass = "{{lc:" .. title .. "}}"
             link = 'Sustained abilities',
    barTitleClass = barTitleClass:gsub(' ', '-')
            class = 'sustained'
    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)
local premades = {
     if v == nil then return false end
     strike = {
    if type(v) ~= 'string' then return true end
        maneuver = 'active',
    return mw.text.trim(v) ~= ''
        executionTime = '1a',
end
        interaction = 'attack',
 
         delivery = 'weapon',
local function resolveAlias(args, aliases)
        target = 'creature',
    local resolved = {}
        duration = 'instant',
 
         range = 'weapon',
    -- Resolve keys
     },
    for canonicalKey, keyAliasList in pairs(aliases.keys) do
     ray = {
         for _, alias in ipairs(keyAliasList) do
        maneuver = 'active',
            local v = args[alias]
         executionTime = '1a',
            if nonempty(v) then
        interaction = 'attack',
                resolved[canonicalKey] = v
         delivery = 'missile',
                break
         target = 'creature',
            end
        duration = 'instant',
         end
         range = '60f',
     end
        piercing = 'av0',
 
    },
     -- Resolve values
    ball = {
    for canonicalKey, canonicalValueTable in pairs(aliases.values) do
        maneuver = 'active',
         local rawValue = resolved[canonicalKey]
        executionTime = '1a',
 
        interaction = 'attack',
         -- Treat empty/whitespace as false
        delivery = 'missile',
         if rawValue ~= nil and not nonempty(rawValue) then
        target = 'creature',
            resolved[canonicalKey] = false
        duration = 'instant',
         elseif rawValue ~= nil then
        range = '30f',
            for canonicalValue, valueAliasList in pairs(canonicalValueTable) do
        piercing = 'ub',
                for _, alias in ipairs(valueAliasList) do
    },
                    if rawValue == alias then
    aura = {
                        resolved[canonicalKey] = canonicalValue
        skip = true,
                        break
        maneuver = 'active',
                    elseif type(valueAliasList) == "table" and valueAliasList[1] and
        executionTime = '1a',
                        type(rawValue) == "string" and
        interaction = 'feat',
                        rawValue:match(valueAliasList[1]) then
        delivery = 'aura',
                        -- (keep your existing time/range parsing here unchanged)
        target = 'creature',
                        if canonicalKey == "duration" or canonicalKey ==
        duration = 'instant',
                            "executionTime" then
        range = '10f',
                            local num = tonumber(rawValue:match("^(%d+)"))
        attribute = 'mov',
                            local unit = rawValue:match("[%a]+$")
    },
                            local unitMap = {
    ritual = {
                                m = "minute",
        maneuver = 'slow',
                                h = "hour",
        executionTime = '10m',
                                d = "day",
        interaction = 'manifest',
                                w = "week",
        delivery = 'sight',
                                y = "year",
         target = 'creature',
                                r = "round",
        duration = 'instant',
                                s = "second"
        range = '5f',
                            }
    },
                            resolved[canonicalKey] = unitMap[unit] and
    touch = {
                                                        (num .. " " ..
        maneuver = 'active',
                                                            unitMap[unit] ..
        executionTime = '1a',
                                                            (num > 1 and "s" or
        interaction = 'attack',
                                                                "")) or
        delivery = 'hand',
                                                        rawValue
        target = 'creature',
                        elseif canonicalKey == "range" or canonicalKey ==
        duration = 'instant',
                            "expansionRange" then
        range = 'hand',
                            local num = tonumber(rawValue:match("^(%d+)"))
        piercing = 'ub',
                            local unit = rawValue:match("[%a]+$")
     },
                            local unitMap = {f = "feet", m = "miles"}
    triumph = {
                            resolved[canonicalKey] = unitMap[unit] and
        skip = true,
                                                        (num .. " " ..
        maneuver = 'reactive',
                                                            unitMap[unit]) or
        executionTime = '0r',
                                                        rawValue
        interaction = 'manifest',
                        end
        delivery = 'self',
                    end
        target = 'self',
                end
        duration = 'instant',
            end
        range = 'self',
         end
    },
    end
    self = {
 
        skip = true,
    return resolved
        maneuver = 'active',
end
        executionTime = '1a',
 
        interaction = 'man',
local classFixes = {bar = 'ber', sam = 'due', ama = 'cor'}
        delivery = 'self',
 
        target = 'self',
local classArchetypes = {
        duration = 'instant',
    ber = 'warr',
        range = 'self',
    due = 'warr',
     },
    vet = 'warr',
     passive = {
    kni = 'warr',
        skip = true,
    pal = 'warr',
        maneuver = 'passive',
    ass = 'semi',
        interaction = 'man',
    cor = 'semi',
        delivery = 'self',
    arc = 'semi',
        target = 'self',
     thi = 'semi',
        duration = '4',
    ran = 'semi',
        range = 'self',
    fla = 'mage',
    },
    sto = 'mage',
    crown = {
    lif = 'mage',
        skip = true,
    nec = 'mage',
        maneuver = 'active',
    nat = 'mage'
        executionTime = '1a',
}
        interaction = 'man',
 
        delivery = 'self',
local className = {
        target = 'self',
    ber = 'Berserker',
        duration = '8h',
    due = 'Duelist',
        range = 'self',
    vet = 'Veteran',
        sustained = 'sus',
    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
function noPlural(word)
     local args = {}
     -- Common irregular plural forms
    for k, v in pairs(rawArgs) do if nonempty(v) then args[k] = v end end
     local irregulars = {
    local resolved = {}
        ["children"] = "child",
    if args['pre'] then
        ["men"] = "man",
         local toResolve = resolveAlias(premades[args['pre']], aliases)
        ["women"] = "woman",
         for k, v in pairs(toResolve) do resolved[k] = v end
        ["feet"] = "foot",
     end
         ["teeth"] = "tooth",
     local userResolve = resolveAlias(args, aliases)
        ["mice"] = "mouse",
     for k, v in pairs(userResolve) do resolved[k] = v end
        ["geese"] = "goose"
    if resolved['pre'] and premades[args['pre']]['skip'] then
    }
         resolved['pre'] = nil
 
    -- 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
    if not resolved['duration'] then resolved['duration'] = 'instant' end
end


     if resolved['interaction'] == 'attack' then
local function addCategory(category, key, val, skill, spell, addCats, noLower)
        local dc = "Hit target's {{AC}}"
     if addCats then
         if resolved['target'] == 'limb' then
         if not noLower then
             dc = "Hit target's {{Var:ACLimb}}"
             category = category:lower()
         end
         end
         if resolved['target'] == 'arm' then
         if tags[key] and tags[key][val] then
             dc = "Hit target's {{Var:ACLimb}}"
            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
         end
         if resolved['target'] == 'leg' then
         if skill then
             dc = "Hit target's {{Var:ACLimb}}"
            skillCategory = category:gsub('ability', 'skill'):gsub('abilities', 'skills')
             skillCategory = skillCategory:gsub("^%l", string.upper)
         end
         end
         if resolved['target'] == 'vitals' then
         if spell then
             dc = "Hit target's {{Var:ACVitals}}"
            spellCategory = category:gsub('ability', 'spell'):gsub('abilities', 'spells')
             spellCategory = spellCategory:gsub("^%l", string.upper)
         end
         end
         if resolved['target'] == 'item' then
         category = category:gsub("^%l", string.upper)
             dc = "Hit DC [[Core:Item Target|depends on item]]"
       
        local c = '[[Category:' .. tostring(category) .. ']]'
        if skill then
             c = c .. '[[Category:' .. tostring(skillCategory) .. ']]'
         end
         end
         if resolved['target'] == 'shield' then
         if spell then
             dc = "Hit user's {{Var:ACWielded}}"
             c = c .. '[[Category:' .. tostring(spellCategory) .. ']]'
         end
         end
         if resolved['target'] == 'armor' then
         return c
            dc = "Hit user's {{Var:ACWorn}}"
    else
        end
         return ''
        if resolved['target'] == 'weapon' then
            dc = "Hit user's {{Var:ACWielded}}"
        end
         resolved['hitDC'] = dc
     end
     end
end


     if resolved['expansionCount'] then
local function makeTag(frame, key, value, makeCat, transparent)
         if resolved['expansionCount'] == '1' then
     if not tags[key] or not tags[key][value] then
             resolved['expansionCount'] = '{{Space}}' ..
         if value then
                                            resolved['expansionCount'] ..
             local out = frame:preprocess("{{ucfirst:" .. tostring(value) .. "}}")
                                            ' extra execution.'
            if not ('.' == out:sub(-1)) then
                out = out .. '.'
            end
            return out
         else
         else
             resolved['expansionCount'] = '{{Space}}' ..
             return ''
                                            resolved['expansionCount'] ..
                                            ' extra executions.'
         end
         end
     end
     end
 
    local tag = tags[key][value]
     if resolved['invoked'] then
     if tag.no then
         resolved['verbal'] = 'verbal'
         local out = frame:preprocess("{{ucfirst:" .. tag.text .. "}}")
         resolved['somatic'] = 'somatic'
         if not ('.' == out:sub(-1)) then
         resolved['mage'] = 'magelore'
            out = out .. '.'
         end
        return out
     end
     end
 
     if tag.tags then
     local skill = false
        local out = ''
    local spell = false
        for _, t in ipairs(tag.tags) do
    local standard = false
            out = out .. makeTag(frame, key, t, makeCat, transparent)
 
        end
    local class = nil
        return out
    local classFull = nil
     end
    local archetype = nil
     local tagText = "{{Tag|{{ucfirst:" .. tag.text .. "}}"
     local archetypeFull = nil
     if tag.symbol then
     local rank = nil
         tagText = tagText .. "|" .. tag.symbol
     if args['class'] then
         class = args['class']
        if classFixes[class] then class = classFixes[class] end
     end
     end
     if args['class'] or args['arch'] then
     if tag.link then
         archetype = classArchetypes[class]
         tagText = tagText .. "|l=:Category:{{ucfirst:" .. tag.link .. "}}"
        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
     end
    local costMP = nil
     if tag.color then
    local costHP = nil
         tagText = tagText .. "|c=" .. tag.color
    local costGP = nil
     if args['pre'] == 'crown' then
         spell = true
        costMP = '1'
        rank = '2'
     end
     end
     if args['rank'] then rank = args['rank'] 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


     if args['skill'] then
local function makeContent(frame, table, keys, makeCat)
        skill = true
     local content = ''
         if args['skill'] == '0' or args['skill'] == 'false' then
    local subContent = ''
             skill = false
    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
     end
     end
     if args['spell'] then
     if hasPre then
         spell = true
         content = content .. frame:preprocess('{{TagSub|' .. subContent .. '}}')
        if args['spell'] == '0' or args['spell'] == 'false' then
        -- content = content .. '{{TagSub|' .. subContent .. '}}'
            spell = false
        end
     end
     end
     if args['standard'] then
     if content == '' then
         standard = true
         for _, key in ipairs(keys) do
        if args['standard'] == '0' or args['standard'] == 'false' then
            if table[key] then
             standard = false
                content = frame:preprocess('{{ucfirst:' .. content .. table[key] .. '}}')
             end
         end
         end
     end
     end
     if args['mp'] then costMP = args['mp'] end
     return content
    if args['hp'] then costHP = args['hp'] end
end
    if args['gp'] then costGP = args['gp'] end
    if args['shatter'] then costShatter = args['shatter'] end


    local basic = false
local function makeBar(frame, title, content, link, flags, bottom)
    local journeyman = false
     if content == '' then
    if args['basic'] then basic = true end
         return ''
    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
     end
     if journeyman then
     local barSpace = mw.html.create('span')
        c = c ..
    barSpace
                addCategory('Journeyman abilities', 'journeyman', nil, skill,
        :wikitext(frame:preprocess(' '))
                            spell, addCats)
        :css('display', 'none')
     end
    local barTitle = mw.html.create('span')
     if standard then
     local barTitleClass = title:lower()
        c = c ..
     barTitleClass = barTitleClass:gsub(' ', '-')
                addCategory('Standard abilities', nil, nil, false, false,
    barTitleClass = barTitleClass:gsub('\'', '')
                            addCats)
    barTitleClass = barTitleClass:gsub('\"', '')
        if skill then
    local barText = "{{ucfirst:" .. title .. "}}"
            c = c ..
     if link then
                    addCategory('Semblant skills', nil, nil, skill, spell,
         barText = "[[" .. link .. "|" .. barText .. "]]"
                                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
     end
     if args['ethereal'] then
     barText = barText .. ":"
         c = c ..
    barTitle
                addCategory('Ethereal abilities', nil, nil, skill, spell,
        :addClass('ability-bar-title')
                            addCats)
        :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
     end
     if args['av'] then
     if not flags then
         c = c ..
         flags = {}
                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
     for k, v in pairs(flags) do
        c = c ..
        if type(v) == 'string' then
                addCategory(archetypeFull .. ' archetype abilities',
            output:addClass('flag-' .. k .. '-' .. v)
                            'archetype', archetype, skill, spell, addCats)
        end
     end
     end
     if (class and classFull) then
     output
         c = c ..
        :addClass('ability-bar')
                addCategory(classFull .. ' class abilities', 'class', class,
         :addClass('ability-bar-' .. barTitleClass)
                            skill, spell, addCats, true)
        :attr(flags)
    end
        :attr('test', 'out')
    if (rank and (class and classFull)) then
        :node(barSpace)
         if rank == '3' then rank = '3+' end
        :node(barTitle)
         c = c ..
        :node(barSpace)
                addCategory('Rank ' .. rank .. ' ' .. classFull .. ' abilities',
        :node(barContent)
                            'rank', rank, skill, spell, addCats, true)
         :css('display', 'block')
     end
    -- if flags then
     if resolved['pre'] then
         -- for k, v in ipairs(flags) do
        c = c ..
        --    output:attr(k, v)
                addCategory(resolved['pre'] .. 'abilities', 'pre',
        -- end
                            resolved['pre'], skill, spell, addCats)
     -- end
    end
     return tostring(output)
    if resolved['interaction'] then
end
        c = c ..
 
                 addCategory(resolved['interaction'] .. ' interaction abilities',
local function resolveAlias(args, aliases)
                            'interaction', resolved['interaction'], skill,
    local resolved = {}
                            spell, addCats)
 
    -- Resolve keys
    for canonicalKey, keyAliasList in pairs(aliases.keys) do
        for _, alias in ipairs(keyAliasList) do
            if args[alias] then
                 resolved[canonicalKey] = args[alias]
                break
            end
        end
     end
     end
     if resolved['delivery'] then
 
        c = c ..
     -- Resolve values
                addCategory(resolved['delivery'] .. ' delivery abilities',
    for canonicalKey, canonicalValueTable in pairs(aliases.values) do
                            'delivery', resolved['delivery'], skill, spell,
        local rawValue = resolved[canonicalKey]
                            addCats)
 
    end
        if rawValue then
    if resolved['target'] then
            for canonicalValue, valueAliasList in pairs(canonicalValueTable) do
        c = c ..
                 for _, alias in ipairs(valueAliasList) do
                 addCategory(resolved['target'] .. ' target abilities', 'target',
                    if rawValue == '' then
                            resolved['target'], skill, spell, addCats)
                        resolved[canonicalKey] = false
    end
                        break
    if resolved['duration'] then
                     elseif rawValue == alias then
        c = c ..
                        resolved[canonicalKey] = canonicalValue
                addCategory(
                        break
                     noPlural(resolved['duration']) .. ' duration abilities',
                    -- Handle patterns like timeParse or distParse
                    'duration', resolved['duration'], skill, spell, addCats)
                    elseif rawValue and type(valueAliasList) == "table" and valueAliasList[1] and rawValue:match(valueAliasList[1]) then
    end
                        if canonicalKey == "duration" or canonicalKey == "executionTime" then
    -- if resolved['range'] then
                            -- Parse time duration (e.g., 5d -> "5 days")
    --    c = c .. addCategory(resolved['range'] .. ' range abilities', 'range', resolved['range'], skill, spell, addCats)
                            local num = tonumber(rawValue:match("^(%d+)"))
    -- end
                            local unit = rawValue:match("[%a]+$")
    if resolved['expansion'] then
                             local unitMap = {m = "minute", h = "hour", d = "day", w = "week", y = "year", r = "round", s = "second"}
        c = c ..
                             if unitMap[unit] then
                addCategory(resolved['expansion'] .. ' expansion abilities',
                                local parsedValue = num .. " " .. unitMap[unit] .. (num > 1 and "s" or "")
                            'expansion', resolved['expansion'], skill, spell,
                                resolved[canonicalKey] = parsedValue
                            addCats)
                            else
    end
                                resolved[canonicalKey] = rawValue
    -- if resolved['expansionRange'] then
                             end
    --     c = c .. addCategory(resolved['expansionRange'] .. ' expansion range abilities', 'expansionRange', resolved['expansionRange'], skill, spell, addCats)
                        elseif canonicalKey == "range" or canonicalKey == "expansionRange" then
    -- end
                            -- Parse distance (e.g., 30f -> "30 feet")
    if resolved['attribute'] then
                             local num = tonumber(rawValue:match("^(%d+)"))
        c = c ..
                            local unit = rawValue:match("[%a]+$")
                addCategory(resolved['attribute'] .. ' save abilities',
                            local unitMap = {f = "feet", m = "miles"}
                             'attribute', resolved['attribute'], skill, spell,
                            if unitMap[unit] then
                             addCats)
                                local parsedValue = num .. " " .. unitMap[unit]
    end
                                resolved[canonicalKey] = parsedValue
    if resolved['piercing'] then
                             else
        c = c .. addCategory(resolved['piercing'] .. ' abilities', 'piercing',
                                resolved[canonicalKey] = rawValue
                            resolved['piercing'], skill, spell, addCats)
                             end
    end
                        end
    if resolved['sustained'] then
                    end
        c = c ..
                 end
                addCategory('Sustained abilities', 'sustained',
            end
                             resolved['sustained'], skill, spell, addCats)
         end
    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 = ''
     return resolved
     if args['flaw'] or args['f'] or args['fl'] then
end
        flawContent = flawContent .. makeTag(frame, 'flaw', 'flaw', makeCat)
 
        c = c ..
local function exists(arg)
                addCategory('Flaw abilities', 'flaw', 'flaw', skill, spell,
    return arg ~= nil and arg ~= '' and arg ~= false
                            addCats)
end
     end
 
     local specialContent = ''
local classFixes = {
     if args['special'] or args['s'] or args['sp'] then
     bar = 'ber',
        specialContent = specialContent ..
    sam = 'due',
                            makeTag(frame, 'special', 'special', makeCat)
    ama = 'cor'
        c = c ..
}
                addCategory('Special abilities', 'special', 'special', skill,
 
                            spell, addCats)
local classArchetypes = {
     end
    ber = 'warr',
     local esContent = ''
    due = 'warr',
     if args['es'] then
    vet = 'warr',
        esContent = esContent .. makeTag(frame, 'es', 'es', makeCat)
    kni = 'warr',
        c = c ..
    pal = 'warr',
                addCategory('Elder Sorcery abilities', 'es', 'es', skill, spell,
    ass = 'semi',
                            addCats)
     cor = 'semi',
     end
     arc = 'semi',
     local wardedContent = ''
     thi = 'semi',
     if args['warded'] then
    ran = 'semi',
        wardedContent = wardedContent ..
    fla = 'mage',
                            makeTag(frame, 'warded', 'warded', makeCat)
    sto = 'mage',
        c = c ..
    lif = 'mage',
                addCategory('Warded abilities', 'warded', 'warded', skill,
    nec = 'mage',
                            spell, addCats)
    nat = 'mage'
    end
}
 
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 )


     local elementContent = ''
    makeCat = true
     if args['life'] then
 
         elementContent = elementContent ..
    -- Figure out all the default values
                            makeTag(frame, 'elements', 'life', makeCat)
    local args = frame.args
        c = c ..
     local resolved = {}
                addCategory('Life element abilities', 'elements', 'life', skill,
     if args['pre'] then
                            spell, addCats)
         local toResolve = resolveAlias(premades[args['pre']], aliases)
        for k, v in pairs(toResolve) do
            resolved[k] = v
        end
     end
     end
     if args['storm'] then
     local userResolve = resolveAlias(args, aliases)
        elementContent = elementContent ..
    for k, v in pairs(userResolve) do
                            makeTag(frame, 'elements', 'storm', makeCat)
         resolved[k] = v
         c = c ..
                addCategory('Storm element abilities', 'elements', 'storm',
                            skill, spell, addCats)
     end
     end
     if args['necro'] then
     if resolved['pre'] and premades[args['pre']]['skip'] then
        elementContent = elementContent ..
         resolved['pre'] = nil
                            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
     end
     if args['nature'] then
     if not resolved['duration'] then
         elementContent = elementContent ..
         resolved['duration'] = 'instant'
                            makeTag(frame, 'elements', 'nature', makeCat)
        c = c ..
                addCategory('Nature element abilities', 'elements', 'nature',
                            skill, spell, addCats)
     end
     end


    local powerContent = ''
     if resolved['interaction'] == 'attack' then
     if args['magic'] then
         local dc = "Hit target's {{AC}}"
         powerContent = powerContent .. makeTag(frame, 'power', 'magic', makeCat)
         if resolved['target'] == 'limb' then
         c = c ..
            dc = "Hit target's {{Var:ACLimb}}"
                addCategory('Magically powered abilities', 'power', 'magic',
        end
                            skill, spell, addCats) ..
        if resolved['target'] == 'al' then
                addCategory('Magical effects', nil, nil, false, false, addCats)
        dc = "Hit target's {{Var:ACLimb}}"
    end
    end
    if args['divine'] then
        if resolved['target'] == 'arm' then
        powerContent = powerContent ..
            dc = "Hit target's {{Var:ACLimb}}"
                          makeTag(frame, 'power', 'divine', makeCat)
         end
        c = c ..
        if resolved['target'] == 'leg' then
                addCategory('Divinely powered abilities', 'power', 'divine',
            dc = "Hit target's {{Var:ACLimb}}"
                            skill, spell, addCats) ..
        end
                addCategory('Divine effects', nil, nil, false, false, addCats)
        if resolved['target'] == 'vitals' then
    end
            dc = "Hit target's {{Var:ACVitals}}"
    if args['spirit'] then
        end
        powerContent = powerContent ..
        if resolved['target'] == 'item' or resolved['target'] == 'ari' then
                          makeTag(frame, 'power', 'spirit', makeCat)
            dc = "Hit {{DC}} [[Core:Item Target|depends on item]]"
         c = c ..
        end
                addCategory('Spiritually powered abilities', 'power', 'spirit',
        if resolved['target'] == 'shield' then
                            skill, spell, addCats) ..
            dc = "Hit user's {{Var:ACWielded}}"
                addCategory('Spiritual effects', nil, nil, false, false, addCats)
        end
    end
        if resolved['target'] == 'armor' then
    if args['primal'] then
            dc = "Hit user's {{Var:ACWorn}}"
        powerContent = powerContent ..
        end
                          makeTag(frame, 'power', 'primal', makeCat)
        if resolved['target'] == 'weapon' then
        c = c ..
            dc = "Hit user's {{Var:ACWielded}}"
                addCategory('Primally powered abilities', 'power', 'primal',
        end
                            skill, spell, addCats) ..
        resolved['hitDC'] = dc
                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
     end
     if args['alchemy'] then
 
         powerContent = powerContent ..
     if resolved['expansionCount'] then
                          makeTag(frame, 'power', 'alchemy', makeCat)
         if resolved['expansionCount'] == '1' then
         c = c ..
            resolved['expansionCount'] = '{{Space}}' .. resolved['expansionCount'] .. ' extra execution.'
                addCategory('Alchemically powered abilities', 'power',
         else
                            'alchemy', skill, spell, addCats) ..
            resolved['expansionCount'] = '{{Space}}' .. resolved['expansionCount'] .. ' extra executions.'
                addCategory('Alchemical effects', nil, nil, false, false,
        end
                            addCats)
     end
     end
     if args['unknown'] then
 
         powerContent = powerContent ..
     if resolved['invoked'] then
                          makeTag(frame, 'power', 'unknown', makeCat)
         resolved['verbal'] = 'verbal'
         c = c ..
         resolved['somatic'] = 'somatic'
                addCategory('Unknown powered abilities', 'power', 'unknown',
        resolved['mage'] = 'magelore'
                            skill, spell, addCats)
     end
     end
     if class then
 
         classContent = makeContent(frame, resolved, {'class'}, makeCat)
    local skill = false
         powerContent = powerContent .. classContent
    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
     end
     if args['rotator'] then
     if args['class'] or args['arch'] then
         powerContent = powerContent ..
         archetype = classArchetypes[class]
                          makeTag(frame, 'category', 'rotator', makeCat)
        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
     end
     powerContent = powerContent .. elementContent
     local costMP = nil
     if skill then
    local costHP = nil
         powerContent = powerContent ..
    local costGP = nil
                          makeTag(frame, 'category', 'skill', makeCat)
     if args['pre'] == 'crown' then
         spell = true
        costMP = '1'
        rank = '2'
     end
     end
     if spell then
     if args['rank'] then
         powerContent = powerContent ..
         rank = args['rank']
                          makeTag(frame, 'category', 'spell', makeCat)
     end
     end
 
      
     local deliveryContent = ''
     if args['skill'] then
     if standard and skill then
         skill = true
         deliveryContent = deliveryContent ..
        if args['skill'] == '0' or args['skill'] == 'false' then
                              makeTag(frame, 'category', 'semblant', makeCat)
            skill = false
        end
     end
     end
     if standard and spell then
     if args['spell'] then
         deliveryContent = deliveryContent ..
         spell = true
                              makeTag(frame, 'category', 'conjure', makeCat)
        if args['spell'] == '0' or args['spell'] == 'false' then
            spell = false
        end
     end
     end
 
     if args['standard'] then
    local effectContent = ''
         standard = true
     if args['mental'] then
        if args['standard'] == '0' or args['standard'] == 'false' then
         effectContent = effectContent ..
            standard = false
                            makeTag(frame, 'effects', 'mental', makeCat)
        end
        c = c ..
                addCategory('Mental effects', 'effect', 'mental', skill, spell,
                            addCats)
     end
     end
     if args['truth'] then
     if args['mp'] and args['mp']:len() > 0 then
        effectContent = effectContent ..
         costMP = args['mp']
                            makeTag(frame, 'effects', 'truth', makeCat)
         c = c ..
                addCategory('Truth detecting effects', 'effect',
                            'truthDetecting', skill, spell, addCats)
     end
     end
     if args['duelMod'] then
     if args['hp'] and args['hp']:len() > 0 then
        effectContent = effectContent ..
         costHP = args['hp']
                            makeTag(frame, 'effects', 'duelModifying', makeCat)
         c = c ..
                addCategory('Duel modifying effects', 'effect', 'duelModifying',
                            skill, spell, addCats)
     end
     end
     if args['movement'] then
     if args['gp'] and args['gp']:len() > 0 then
        effectContent = effectContent ..
         costGP = args['gp']
                            makeTag(frame, 'effects', 'movement', makeCat)
         c = c ..
                addCategory('Movement effects', 'effect', 'movement', skill,
                            spell, addCats)
     end
     end
     if args['poison'] then
     if exists(args['shatter']) then
        effectContent = effectContent ..
    costShatter = args['shatter']
                            makeTag(frame, 'effects', 'poison', makeCat)
        c = c ..
                addCategory('Poison effects', 'effect', 'poison', skill, spell,
                            addCats)
     end
     end
     if args['displacement'] then
 
         effectContent = effectContent ..
    local basic = false
                            makeTag(frame, 'effects', 'displacement', makeCat)
    local journeyman = false
        c = c ..
     if args['basic'] then
                addCategory('Displacement effects', 'effect', 'displacement',
         basic = true
                            skill, spell, addCats)
     end
     end
     if args['transformation'] then
     if args['journeyman'] or args['jm'] then
        effectContent = effectContent ..
         journeyman = true
                            makeTag(frame, 'effects', 'transformation', makeCat)
         c = c ..
                addCategory('Transformation effects', 'effect',
                            'transformation', skill, spell, addCats)
     end
     end
     if args['control'] then
 
        effectContent = effectContent ..
     -- Category string
                            makeTag(frame, 'effects', 'control', makeCat)
    local c = ''
        c = c ..
 
                addCategory('Control effects', 'effect', 'control', skill,
     local name = args['name']
                            spell, addCats)
    local page = mw.title.getCurrentTitle().text
     end
    local namespace = frame:preprocess('{{NAMESPACE}}')
    if args['resist'] then
     local addCats = ((namespace == 'Ability') and (page == name))
        effectContent = effectContent ..
    c = c .. addCategory('Abilities', nil, nil, skill, spell, addCats)
                            makeTag(frame, 'effects', 'resist', makeCat)
     if basic then
        c = c ..
         c = c .. addCategory('Basic abilities', 'basic', nil, skill, spell, addCats)
                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
     end
     if args['long'] then
     if journeyman then
        effectContent = effectContent ..
         c = c .. addCategory('Journeyman abilities', 'journeyman', nil, skill, spell, addCats)
                            makeTag(frame, 'effects', 'long', makeCat)
         c = c ..
                addCategory('Long range effects', 'effect', 'long', skill,
                            spell, addCats)
     end
     end
     if args['sense'] then
    local esContent = ''
         effectContent = effectContent ..
     if args['es'] and args['es']:len() > 0 then
                            makeTag(frame, 'effects', 'sense', makeCat)
         esContent = esContent .. makeTag(frame, 'es', 'es', makeCat)
         c = c ..
         c = c .. addCategory('Elder Sorcery abilities', 'es', 'es', skill, spell, addCats)
                addCategory('Sensory effects', 'effect', 'sense', skill, spell,
    else
                            addCats)
    if spell then
    standard = '1'
end
     end
     end
     if args['revive'] or args['rev'] then
     if standard then
         effectContent = effectContent ..
         c = c .. addCategory('Standard abilities', nil, nil, false, false, addCats)
                            makeTag(frame, 'effects', 'revive', makeCat)
        if skill then
         c = c ..
            c = c .. addCategory('Semblant skills', nil, nil, skill, spell, addCats)
                addCategory('Revival effects', 'effect', 'revive', skill, spell,
         end
                            addCats)
        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
     end
     if args['summon'] then
     if args['ethereal'] then
        effectContent = effectContent ..
         c = c .. addCategory('Ethereal abilities', nil, nil, skill, spell, addCats)
                            makeTag(frame, 'effects', 'summon', makeCat)
         c = c ..
                addCategory('Summoning effects', 'effect', 'summon', skill,
                            spell, addCats)
     end
     end
     if args['heal'] then
     if args['av'] then
        effectContent = effectContent ..
    c = c .. addCategory('AV granting abilities', nil, nil, skill, spell, addCats, true)
                            makeTag(frame, 'effects', 'heal', makeCat)
    c = c .. addCategory('AV' .. args['av'] .. ' granting abilities', nil, nil, skill, spell, addCats, true)
        c = c ..
                addCategory('Healing effects', 'effect', 'heal', skill, spell,
                            addCats)
     end
     end
     if args['reanimate'] or args['rean'] then
     if (archetype and archetypeFull) then
        effectContent = effectContent ..
         c = c .. addCategory(archetypeFull .. ' archetype abilities', 'archetype', archetype, skill, spell, addCats)
                            makeTag(frame, 'effects', 'reanimate', makeCat)
         c = c ..
                addCategory('Reanimation effects', 'effect', 'reanimate', skill,
                            spell, addCats)
     end
     end
     if args['regenerate'] or args['regen'] then
     if (class and classFull) then
        effectContent = effectContent ..
         c = c .. addCategory(classFull .. ' class abilities', 'class', class, skill, spell, addCats, true)
                            makeTag(frame, 'effects', 'regenerate', makeCat)
         c = c ..
                addCategory('Regeneration effects', 'effect', 'regenerate',
                            skill, spell, addCats)
     end
     end
     if args['revitalize'] or args['revit'] then
     if (rank and (class and classFull)) then
         effectContent = effectContent ..
         if rank == '3' then
                            makeTag(frame, 'effects', 'revitalize', makeCat)
            rank = '3+'
         c = c ..
        end
                addCategory('Revitalization effects', 'effect', 'revitalize',
         c = c .. addCategory('Rank ' .. rank .. ' ' .. classFull .. ' abilities', 'rank', rank, skill, spell, addCats, true)
                            skill, spell, addCats)
     end
     end
     if args['kill'] then
     if resolved['pre'] then
         effectContent = effectContent ..
         c = c .. addCategory(resolved['pre'] .. 'abilities', 'pre', resolved['pre'], skill, spell, addCats)
                            makeTag(frame, 'effects', 'kill', makeCat)
        c = c ..
                addCategory('Killing effects', 'effect', 'kill', skill, spell,
                            addCats)
     end
     end
     if args['damage'] then
     if resolved['interaction'] then
         effectContent = effectContent ..
         c = c .. addCategory(resolved['interaction'] .. ' interaction abilities', 'interaction', resolved['interaction'], skill, spell, addCats)
                            makeTag(frame, 'effects', 'damage', makeCat)
        c = c ..
                addCategory('Damaging effects', 'effect', 'damage', skill,
                            spell, addCats)
     end
     end
     if args['steal'] then
     if resolved['delivery'] then
         effectContent = effectContent ..
         c = c .. addCategory(resolved['delivery'] .. ' delivery abilities', 'delivery', resolved['delivery'], skill, spell, addCats)
                            makeTag(frame, 'effects', 'steal', makeCat)
        c = c ..
                addCategory('Stealing effects', 'effect', 'steal', skill, spell,
                            addCats)
     end
     end
     if args['loud'] then
     if resolved['target'] then
         effectContent = effectContent ..
         c = c .. addCategory(resolved['target'] .. ' target abilities', 'target', resolved['target'], skill, spell, addCats)
                            makeTag(frame, 'effects', 'loud', makeCat)
        c = c ..
                addCategory('Loud effects', 'effect', 'loud', skill, spell,
                            addCats)
     end
     end
     if args['knockout'] then
     if resolved['duration'] then
         effectContent = effectContent ..
         c = c .. addCategory(noPlural(resolved['duration']) .. ' duration abilities', 'duration', resolved['duration'], skill, spell, addCats)
                            makeTag(frame, 'effects', 'knockout', makeCat)
        c = c ..
                addCategory('Knockout effects', 'effect', 'knockout', skill,
                            spell, addCats)
     end
     end
     if args['time'] then
     -- if resolved['range'] then
        effectContent = effectContent ..
    --    c = c .. addCategory(resolved['range'] .. ' range abilities', 'range', resolved['range'], skill, spell, addCats)
                            makeTag(frame, 'effects', 'time', makeCat)
     -- end
        c = c ..
     if resolved['expansion'] then
                addCategory('Temporal effects', 'effect', 'time', skill, spell,
         c = c .. addCategory(resolved['expansion'] .. ' expansion abilities', 'expansion', resolved['expansion'], skill, spell, addCats)
                            addCats)
    end
     end
    -- if resolved['expansionRange'] then
 
    --     c = c .. addCategory(resolved['expansionRange'] .. ' expansion range abilities', 'expansionRange', resolved['expansionRange'], skill, spell, addCats)
     local costContent = ''
    -- end
    if costMP then
    if resolved['attribute'] then
         c = c ..
        c = c .. addCategory(resolved['attribute'] .. ' save abilities', 'attribute', resolved['attribute'], skill, spell, addCats)
                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
     if costHP then
     if resolved['piercing'] then
         c = c ..
         c = c .. addCategory(resolved['piercing'] .. ' abilities', 'piercing', resolved['piercing'], skill, spell, addCats)
                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 costGP then
     if resolved['sustained'] then
        c = c ..
         c = c .. addCategory('Sustained abilities', 'sustained', resolved['sustained'], skill, spell, addCats)
                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 costShatter then
     if resolved['upgrade'] then
         c = c ..
         c = c .. addCategory(resolved['upgrade'] .. ' abilities', 'upgrade', resolved['upgrade'], skill, spell, addCats)
                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 args['cost'] then
     if resolved['executionTime'] then
         costContent = costContent .. frame:preprocess(args['cost'])
         c = c .. addCategory(noPlural(resolved['executionTime']) .. ' execution time abilities', 'executionTime', resolved['executionTime'], skill, spell, addCats)
     end
     end
 
     if resolved['maneuver'] then
    local executionTimeTitle = 'Execution time'
        c = c .. addCategory(resolved['maneuver'] .. ' abilities', 'maneuver', resolved['maneuver'], skill, spell, addCats)
     if spell then executionTimeTitle = 'Casting time' end
     end
 
     if resolved['verbal'] then
    local expansionContent = 'TEST'
         c = c .. addCategory('Verbal component abilities', 'verbal', resolved['verbal'], skill, spell, addCats)
    -- 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
     end
 
     if resolved['somatic'] then
    local proficiencyContent = ''
         c = c .. addCategory('Somatic component abilities', 'somatic', resolved['somatic'], skill, spell, addCats)
     if args['pro'] then
         proficiencyContent = proficiencyContent .. frame:preprocess(args['pro'])
     end
     end
 
     if resolved['material'] then
    local fluencyContent = ''
         c = c .. addCategory('Material component abilities', 'material', resolved['material'], skill, spell, addCats)
     if args['flu'] then
         fluencyContent = fluencyContent .. frame:preprocess(args['flu'])
     end
     end
 
    if resolved['magelore'] then
    local restrictionContent = ''
        c = c .. addCategory('Magelore component abilities', 'magelore', resolved['magelore'], skill, spell, addCats)
     if args['restrict'] then
    end
         restrictionContent = restrictionContent ..
     if resolved['invoked'] then
                                frame:preprocess(args['restrict'])
         c = c .. addCategory('Invoke abilities', 'invoked', resolved['invoked'], skill, spell, addCats)
     end
     end


     local statValContent = ''
     local flawContent = ''
     local statFeatContent = ''
     if args['flaw'] or args['f'] or args['fl'] then
    if args['vstat'] and args['val'] then
         flawContent = flawContent .. makeTag(frame, 'flaw', 'flaw', makeCat)
         local vstat = frame:preprocess("{{uc:" .. args['vstat'] .. "}}")
        c = c .. addCategory('Flaw abilities', 'flaw', 'flaw', skill, spell, addCats)
        statValContent = 'This ability sets your {{L|Core|' .. vstat .. '}}' ..
    end
                            ' score to a minimum of ' .. args['val'] .. '.'
    local specialContent = ''
         c = c ..
    if args['special'] or args['s'] or args['sp'] and ((args['special']:len() > 0) or (args['s']:len() > 0) or (args['sp']:len() > 0)) then
                addCategory('Attribute setting abilities', 'val', args['val'],
        specialContent = specialContent .. makeTag(frame, 'special', 'special', makeCat)
                            skill, spell, addCats, true)
         c = c .. addCategory('Special abilities', 'special', 'special', skill, spell, addCats)
         c = c ..
    end
                addCategory(vstat .. ' setting abilities', 'vstat',
    local wardedContent = ''
                            args['vstat'], skill, spell, addCats, true)
    if args['warded'] and args['warded']:len() > 0 then
        c = c ..
        wardedContent = wardedContent .. makeTag(frame, 'warded', 'warded', makeCat)
                addCategory(
         c = c .. addCategory('Warded abilities', 'warded', 'warded', skill, spell, addCats)
                    vstat .. ' value of ' .. args['val'] .. ' setting abilities',
    end
                    'val', args['val'], skill, spell, addCats, true)
 
    local elementContent = ''
    if args['life'] and args['life']:len() > 0 then
        elementContent = elementContent .. makeTag(frame, 'elements', 'life', makeCat)
        c = c .. addCategory('Life element abilities', 'elements', 'life', skill, spell, addCats)
     end
     end
    local f = 'proficiency'
     if args['storm'] and args['storm']:len() > 0 then
     if args['fflu'] then f = 'fluency' end
         elementContent = elementContent .. makeTag(frame, 'elements', 'storm', makeCat)
    if args['fstat'] and (args['fflu'] or args['fpro']) then
         c = c .. addCategory('Storm element abilities', 'elements', 'storm', skill, spell, addCats)
        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 args['rotator'] then
     if (args['necro'] and args['necro']:len() > 0) or (args['necromancy'] and args['necromancy']:len() > 0) then
         c = c ..
        elementContent = elementContent .. makeTag(frame, 'elements', 'necro', makeCat)
                addCategory('Rotator abilities', 'rotator', args['rotator'],
         c = c .. addCategory('Necromancy element abilities', 'elements', 'necro', skill, spell, addCats)
                            skill, spell, addCats)
     end
     end
     if args['style'] then
     if args['flame'] and args['flame']:len() > 0 then
         c = c ..
        elementContent = elementContent .. makeTag(frame, 'elements', 'flame', makeCat)
                addCategory('Casting style abilities', 'style', args['style'],
         c = c .. addCategory('Flame element abilities', 'elements', 'flame', skill, spell, addCats)
                            skill, spell, addCats)
     end
     end
     if args['weapon'] then
     if args['nature'] and args['nature']:len() > 0 then
         c = c ..
        elementContent = elementContent .. makeTag(frame, 'elements', 'nature', makeCat)
                addCategory('Weapon fighting style abilities', 'weapon',
         c = c .. addCategory('Nature element abilities', 'elements', 'nature', skill, spell, addCats)
                            args['weapon'], skill, spell, addCats)
     end
     end


     -- Remove range from self targeted abilities
     local powerContent = ''
     if resolved['target'] == 'self' or resolved['range'] == 'self' then
    local martial = true
         resolved['range'] = nil
    if args['magic'] and args['magic']:len() > 0 then
        martial = false
        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'] and args['divine']:len() > 0 then
        martial = false
        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'] and args['spirit']:len() > 0 then
        martial = false
        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'] and args['primal']:len() > 0 then
        martial = false
        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['psionic'] and args['psionic']:len() > 0 then
        martial = false
        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'] and args['techo']:len() > 0 then
        martial = false
        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'] and args['finance']:len() > 0 then
        martial = false
        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'] and args['alchemy']:len() > 0 then
        martial = false
        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'] and args['unknown']:len() > 0 then
        martial = false
        powerContent = powerContent .. makeTag(frame, 'power', 'unknown', makeCat)
        c = c .. addCategory('Unknown powered abilities', 'power', 'unknown', skill, spell, addCats)
    end
    if args['martial'] and args['martial']:len() > 0 then
        martial = true
    end
    if martial then
        powerContent = powerContent .. makeTag(frame, 'power', 'martial', makeCat)
        c = c .. addCategory('Martially powered abilities', 'power', 'martial', skill, spell, addCats)
    end
     if class then
        classContent = makeContent(frame, resolved, {'class'}, makeCat)
        powerContent = powerContent .. classContent
    end
    if args['rotator'] and args['rotator']:len() > 0 then
        powerContent = powerContent .. makeTag(frame, 'category', 'rotator', makeCat)
    end
    if args['gm'] and args['gm']:len() > 0 then
        powerContent = powerContent .. makeTag(frame, 'gm', args['gm'], makeCat)
    end
    if args['guildmaster'] and args['guildmaster']:len() > 0 then
        powerContent = powerContent .. makeTag(frame, 'category', 'guildmaster', 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 exists(args['mental']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'mental', makeCat)
        c = c .. addCategory('Mental effects', 'effect', 'mental', skill, spell, addCats)
    end
    if exists(args['truth']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'truth', makeCat)
        c = c .. addCategory('Truth detecting effects', 'effect', 'truthDetecting', skill, spell, addCats)
    end
    if exists(args['duelMod']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'duelModifying', makeCat)
        c = c .. addCategory('Duel modifying effects', 'effect', 'duelModifying', skill, spell, addCats)
    end
    if exists(args['movement']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'movement', makeCat)
        c = c .. addCategory('Movement effects', 'effect', 'movement', skill, spell, addCats)
    end
    if exists(args['poison']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'poison', makeCat)
        c = c .. addCategory('Poison effects', 'effect', 'poison', skill, spell, addCats)
    end
    if exists(args['illusion']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'illusion', makeCat)
        c = c .. addCategory('Illusion effects', 'effect', 'illusion', skill, spell, addCats)
    end
    if exists(args['displacement']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'displacement', makeCat)
        c = c .. addCategory('Displacement effects', 'effect', 'displacement', skill, spell, addCats)
    end
    if exists(args['transformation']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'transformation', makeCat)
        c = c .. addCategory('Transformation effects', 'effect', 'transformation', skill, spell, addCats)
    end
    if exists(args['control']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'control', makeCat)
        c = c .. addCategory('Control effects', 'effect', 'control', skill, spell, addCats)
    end
    if exists(args['resist']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'resist', makeCat)
        c = c .. addCategory('Resistance effects', 'effect', 'resist', skill, spell, addCats)
    end
    if exists(args['hexproof']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'hexproof', makeCat)
        c = c .. addCategory('Hexproof effects', 'effect', 'hexproof', skill, spell, addCats)
    end
    if exists(args['awaken']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'awaken', makeCat)
        c = c .. addCategory('Awakening effects', 'effect', 'awaken', skill, spell, addCats)
    end
    if exists(args['immune']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'immune', makeCat)
        c = c .. addCategory('Immunity effects', 'effect', 'immune', skill, spell, addCats)
    end
    if exists(args['hexseal']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'hexseal', makeCat)
        c = c .. addCategory('Hexseal effects', 'effect', 'hexseal', skill, spell, addCats)
    end
    if exists(args['long']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'long', makeCat)
        c = c .. addCategory('Long range effects', 'effect', 'long', skill, spell, addCats)
    end
    if exists(args['sense']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'sense', makeCat)
        c = c .. addCategory('Sensory effects', 'effect', 'sense', skill, spell, addCats)
    end
    if exists(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 exists(args['summon']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'summon', makeCat)
        c = c .. addCategory('Summoning effects', 'effect', 'summon', skill, spell, addCats)
    end
    if exists(args['heal']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'heal', makeCat)
        c = c .. addCategory('Healing effects', 'effect', 'heal', skill, spell, addCats)
    end
    if exists(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 exists(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 exists(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 exists(args['kill']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'kill', makeCat)
        c = c .. addCategory('Killing effects', 'effect', 'kill', skill, spell, addCats)
    end
    if exists(args['damage']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'damage', makeCat)
        c = c .. addCategory('Damaging effects', 'effect', 'damage', skill, spell, addCats)
    end
    if exists(args['drain']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'drain', makeCat)
        c = c .. addCategory('Draining effects', 'effect', 'drain', skill, spell, addCats)
    end
    if exists(args['destroy']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'destroy', makeCat)
        c = c .. addCategory('Destruction effects', 'effect', 'destroy', skill, spell, addCats)
    end
    if exists(args['contract']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'contract', makeCat)
        c = c .. addCategory('Contract effects', 'effect', 'contract', skill, spell, addCats)
    end
    if exists(args['steal']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'steal', makeCat)
        c = c .. addCategory('Stealing effects', 'effect', 'steal', skill, spell, addCats)
    end
    if exists(args['loud']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'loud', makeCat)
        c = c .. addCategory('Loud effects', 'effect', 'loud', skill, spell, addCats)
    end
    if exists(args['knockout']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'knockout', makeCat)
        c = c .. addCategory('Knockout effects', 'effect', 'knockout', skill, spell, addCats)
    end
    if exists(args['time']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'time', makeCat)
        c = c .. addCategory('Temporal effects', 'effect', 'time', skill, spell, addCats)
    end
    if exists(args['lightning']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'lightning', makeCat)
        c = c .. addCategory('Lightning effects', 'effect', 'lightning', skill, spell, addCats)
    end
    if exists(args['disease']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'disease', makeCat)
        c = c .. addCategory('Disease effects', 'effect', 'disease', skill, spell, addCats)
    end
    if exists(args['vision']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'vision', makeCat)
        c = c .. addCategory('Vision effects', 'effect', 'vision', skill, spell, addCats)
    end
    if exists(args['morganti']) then
         effectContent = effectContent .. makeTag(frame, 'effects', 'morganti', makeCat)
        c = c .. addCategory('Morganti effects', 'effect', 'morganti', skill, spell, addCats)
    end
    if exists(args['construction']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'construction', makeCat)
        c = c .. addCategory('Construction effects', 'effect', 'construction', skill, spell, addCats)
    end
    if exists(args['weather']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'weather', makeCat)
        c = c .. addCategory('Weather effects', 'effect', 'weather', skill, spell, addCats)
     end
     end


     local barsTop = {
     local autoContent = ''
        -- {
     if exists(args['auto']) then
        --     title = 'elements',
         effectContent = effectContent .. makeTag(frame, 'effects', 'auto', makeCat)
         --    content = frame:preprocess(elementContent)
         c = c .. addCategory('Automatic effects', 'effect', 'auto', skill, spell, addCats)
         -- },
         autoContent = autoContent .. ' This triggers automatically. You cannot choose to not use it if you are able to.'
        {
    end
            title = 'power sources',
 
            content = frame:preprocess(esContent .. powerContent),
    local costContent = ''
            link = ':Category:Powered abilities'
    if costMP then
         }, {
        c = c .. addCategory('MP cost abilities', 'costMP', costMP, skill, spell, addCats, true)
            title = 'effect types',
         if costMP == 'x' then
            content = frame:preprocess(flawContent .. specialContent ..
             costContent = costContent .. frame:preprocess("{{Tag|X MP|🩵|l=:Category:MP cost abilities|c=#3584e4|class=cost-tagged mpx}}")
                                          effectContent),
            c = c .. addCategory('Variable MP cost abilities', 'costMP', 'x', skill, spell, addCats, true)
            link = ':Category:Effects'
        else
         }, {
             costContent = costContent .. frame:preprocess("{{Tag|" .. costMP .. " MP|🩵|l=:Category:MP cost abilities|c=#3584e4|class=cost-tagged mp" .. costMP .. "}}")
            title = 'delivery',
             c = c .. addCategory(costMP .. ' MP cost abilities', 'costMP', costMP, skill, spell, addCats, true)
             content = frame:preprocess(wardedContent .. deliveryContent) ..
        end
                makeContent(frame, resolved, {
    end
                    'expansion', 'pre', 'upgrade', 'piercing', 'delivery',
    if costHP then
                    'interaction'
         c = c .. addCategory('HP cost abilities', 'costHP', costHP, skill, spell, addCats, true)
                }, makeCat),
        if costHP == 'x' then
             link = ':Category:Delivery abilities'
             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)
             title = 'save attribute',
        else
            content = makeContent(frame, resolved, {'attribute'}, makeCat),
             costContent = costContent .. frame:preprocess("{{Tag|" .. costHP .. " HP|❤️|l=:Category:HP cost abilities|c=#e01b24|class=cost-tagged hp" .. costHP .. "}}")
            link = 'Core:Feat Interaction'
             c = c .. addCategory(costHP .. ' HP cost abilities', 'costHP', costHP, skill, spell, addCats, true)
         }, {
        end
            title = 'expansion save attribute',
    end
             content = makeContent(frame, resolved, {'expansionAttribute'},
    if costGP then
                                  makeCat)
        c = c .. addCategory('GP cost abilities', 'costGP', costGP, skill, spell, addCats, true)
        }, {
        if costGP == 'x' then
            title = 'target',
             costContent = costContent .. frame:preprocess("{{Tag|X GP|🪙|l=:Category:GP cost abilities|c=#F6D32D|class=cost-tagged gpx}}")
            content = makeContent(frame, resolved, {'target', 'hitDC'}, makeCat),
             c = c .. addCategory('Variable GP cost abilities', 'costGP', 'x', skill, spell, addCats, true)
             link = ':Category:Target abilities'
        else
        }, {
             costContent = costContent .. frame:preprocess("{{Tag|" .. costGP .. " GP|🪙|l=:Category:GP cost abilities|c=#F6D32D|class=cost-tagged gp" .. costGP .. "}}")
             title = executionTimeTitle,
             c = c .. addCategory(costGP .. ' GP cost abilities', 'costGP', costGP, skill, spell, addCats, true)
            content = makeContent(frame, resolved,
        end
                                  {'executionTime', 'maneuver'}, makeCat),
    end
            link = 'Core:Maneuvers'
    if costShatter then
        }, {
        c = c .. addCategory('Shatter cost abilities', 'costShatter', costShatter, skill, spell, addCats)
            title = 'trigger',
        costContent = costContent .. frame:preprocess("{{Tag|Shatter|💥|l=:Category:Shatter cost abilities|class=cost-tagged shatter}}")
             content = args['trigger'] or '',
    end
            link = 'Core:Reactive Maneuvers'
    if args['cost'] then
        }, {
        costContent = costContent .. frame:preprocess(args['cost'])
            title = 'cost and components',
    end
             content = frame:preprocess(costContent) ..
 
                makeContent(frame, resolved, {
    local executionTimeTitle = 'Execution time'
                    'material', 'invoked', 'verbal', 'somatic', 'magelore'
    if spell then
                }, makeCat),
         executionTimeTitle = 'Casting time'
             link = ':Category:Cost abilities'
    end
        }, {
 
             title = 'Mana cost',
    local expansionContent = 'TEST'
            content = args['mpx'] or '',
    -- if args['ec'] or args['expCount'] or args['expansionCount'] then
            link = ':Category:MP cost abilities'
    --    -- local ec = args['ec'] or args['expCount'] or args['expansionCount']
        }, {
    --    -- ec = tostring(ec)
            title = 'Hit cost',
    --    local ec = '1'
            content = args['hpx'] or '',
    --    expansionContent = 'This ability expands ' .. ec .. ' time' .. (tonumber(ec) > 1 and 's' or '') .. '.'
            link = ':Category:HP cost abilities'
    -- end
        }, {
 
            title = 'Gold cost',
     local heightenedContent = ''
            content = args['gpx'] or '',
     if args['heightened'] and args['heightened']:len() > 0 then
            link = ':Category:GP cost abilities'
         heightenedContent = heightenedContent .. 'For each additional {{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.'
            title = 'Material cost',
         c = c .. addCategory('Heightened abilities', 'heightened', args['heightened'], skill, spell, addCats, true)
            content = makeContent(frame, resolved, {'matx'}, makeCat),
     end
            link = ':Category:Material component abilities'
 
        }, {
     local proficiencyContent = ''
            title = 'duration',
    if args['pro'] then
            content = makeContent(frame, resolved, {'duration', 'sustained'},
        proficiencyContent = proficiencyContent .. frame:preprocess(args['pro'])
                                  makeCat),
    end
            link = ':Category:Duration abilities'
 
        }, {
    local fluencyContent = ''
            title = 'range',
    if args['flu'] then
            content = makeContent(frame, resolved, {'range'}, makeCat),
        fluencyContent = fluencyContent .. frame:preprocess(args['flu'])
            link = 'Core:Range'
    end
        }, -- {
 
        --     title = 'expansion',
    local restrictionContent = ''
        --     content = makeContent(frame, resolved, {'expansion'}, makeCat)
    if args['restrict'] then
         -- },
         restrictionContent = restrictionContent .. frame:preprocess(args['restrict'])
        {
    end
            title = 'expansion range',
 
            content = makeContent(frame, resolved,
    local statValContent = ''
                                  {'expansionRange', 'expansionCount'}, makeCat),
    local statFeatContent = ''
            link = 'Core:Expansions'
    if args['vstat'] and args['val'] then
        }, -- {
         local vstat = frame:preprocess("{{uc:" .. args['vstat'] .. "}}")
        --    title = 'expansion count',
         statValContent = 'This ability sets your {{L|Core|' .. vstat .. '}}' .. ' score to a minimum of ' .. args['val'] .. '.'
         --    content = frame:preprocess('TEST')
        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)
            title = 'Requirements',
    end
            content = makeContent(frame, resolved, {'requirement'}, makeCat)
    local f = 'proficiency'
        }
    if args['fflu'] then
     }
        f = 'fluency'
 
    end
     local barsBottom = {
    if args['fstat'] and (args['fflu'] or args['fpro']) then
        {title = 'End condition', content = args['end'] or ''},
        local fstat = frame:preprocess("{{uc:" .. args['fstat'] .. "}}")
        {title = 'On critical hit', content = args['crithit'] or ''},
        statFeatContent = 'This ability gives {{L|Core|' .. f .. ' Bonus|' .. f .. '}} in {{L|Core|' .. fstat .. '}} {{L|Core|Feat Interaction|Feat Saves}}.'
        {title = 'On hit', content = args['hit'] or ''},
        c = c .. addCategory('Feat save improvement abilities', 'flu', args['fflu'], skill, spell, addCats)
         {title = 'On miss', content = args['miss'] or ''},
        c = c .. addCategory('Feat save ' .. f .. ' granting abilities', 'fstat', args['fstat'], skill, spell, addCats, true)
         {title = 'On critically miss', content = args['critmiss'] or ''},
        c = c .. addCategory(fstat .. ' feat save ' .. f .. ' granting abilities', 'fstat', args['fstat'], skill, spell, addCats, true)
         {title = 'On critical fail', content = args['critfail'] or ''},
    end
         {title = 'On fail', content = args['fail'] or ''},
    if args['rotator'] and args['rotator']:len() > 0 then
        {title = 'On success', content = args['success'] or ''},
        c = c .. addCategory('Rotator abilities', 'rotator', args['rotator'], skill, spell, addCats)
         {title = 'On critical success', content = args['critsuccess'] or ''}, {
    end
             title = 'Heightened',
    if args['gm'] then
             content = frame:preprocess(heightenedContent),
        c = c .. addCategory(tags['gm'][args['gm']]['link'], 'gm', args['gm'], skill, spell, addCats)
             link = ':Category:Heightened abilities'
    end
         }, {
    if args['guildmaster'] then
             title = 'If proficient',
        c = c .. addCategory('Guildmaster abilities', 'guildmaster', args['guildmaster'], skill, spell, addCats)
             content = proficiencyContent,
    end
             link = 'Core:Proficiency Bonus'
    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 '') .. autoContent,
            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'}, makeCat),
            link = 'Core:Expansions'
        },
        {
            title = 'expansion cap',
            content = makeContent(frame, resolved, {'expansionCount'}, makeCat),
            link = 'Core:Expansions'
        },
        {
            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',
             title = 'If fluent',
             content = fluencyContent,
             content = fluencyContent,
             link = 'Core:Fluency Bonus'
             link = 'Core:Fluency Bonus'
         }, {
         },
             title = 'Attribute improvement',
        {
             content = frame:preprocess(statValContent),
             title = 'Attribute improvement',
             link = 'Core:Attributes',
             content = frame:preprocess(statValContent),
             flags = {
             link = 'Core:Attributes',
                 attribute = args['vstat'] and
             flags = {
                    frame:preprocess('{{lc:' .. args['vstat'] .. '}}') or "",
                 attribute = args['vstat'] and frame:preprocess('{{lc:' .. args['vstat'] .. '}}') or "",
                 value = args['val']
                 value = args['val']
             }
             }
         }, {
         },
             title = 'Feat save improvement',
        {
             content = frame:preprocess(statFeatContent),
             title = 'Feat save improvement',
             link = 'Core:Feat Interaction',
             content = frame:preprocess(statFeatContent),
             flags = {
             link = 'Core:Feat Interaction',
                 attribute = args['fstat'] and
             flags = {
                    frame:preprocess('{{lc:' .. args['fstat'] .. '}}'),
                 attribute = args['fstat'] and frame:preprocess('{{lc:' .. args['fstat'] .. '}}'),
                 value = f
                 value = f
             }
             }
         }
         },
     }
     }
 
 
     local outputTop = ''
     local outputTop = ''
     for _, bar in ipairs(barsTop) do
     for _, bar in ipairs(barsTop) do
         outputTop = outputTop ..
         outputTop = outputTop .. makeBar(frame, bar['title'], bar['content'], bar['link'], bar['flags'], false)
                        makeBar(frame, bar['title'], bar['content'],
    end
                                bar['link'], bar['flags'], false)
    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
     end
    local outputBottom = ''


     for _, bar in ipairs(barsBottom) do
     if outputBottom ~= '' then
         outputBottom = outputBottom ..
         output
                          makeBar(frame, bar['title'], bar['content'],
            :wikitext('<hr>')
                                  bar['link'], bar['flags'], true)
            :wikitext(outputBottom)
     end
     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 = tostring(output) .. c
     output = output ..
     output = output .. frame:preprocess('<templatestyles src="Template:Ability/styles.css" />')
                frame:preprocess(
                    '<templatestyles src="Template:Ability/styles.css" />')
     if not name then
     if not name then
         output = output ..
         output = output .. '<span style="color: red;>NO NAME PROVIDED VERY BAD EVERY ABILITY NEEDS A NAME OKAY</span>'
                    '<span style="color: red;>NO NAME PROVIDED VERY BAD EVERY ABILITY NEEDS A NAME OKAY</span>'
     end
     end



Latest revision as of 00:13, 8 August 2026

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 ability
  • trigger - 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 to 0 or false.
  • 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 to 0 or false.
  • 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 to 0 or false.
    • 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.

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 maneuver
  • reactive/re/r - Reactive maneuver
  • passive/ps/p - Passive maneuver
  • slow/sl/s - Slow maneuver
Execution Time (executionTime/time/et/x)
  • 0a/freeAction/fa - Free action
  • 1a/a/singleAction/sa - Single action
  • 2a/doubleAction/da - Double action
  • 3a/tripleAction/ta - Triple action
  • 0r/freeReaction/fr - Free reaction
  • 1r/reaction/r - Reaction
  • sr/shortRest/s - Short rest
  • lr/longRest/l - Long rest
  • Time duration format: XmXhXdXwXy (minutes, hours, days, weeks, years)

Interaction Type (interaction/int/i)

  • attack/atk/a - Attack interaction
  • block/blk/b - Block interaction
  • manifest/man/m - Manifest interaction
  • feat/fea/f - Feat interaction

Delivery Method (delivery/del/d)

  • self/sel/s - Self delivery
  • missile/mis/m - Missile delivery
  • hand/han/h/claw - Hand delivery
  • bite/bit/b/mouth - Bite delivery
  • item/itm/i - Item delivery
  • magelore/mag/ml - Magelore delivery
  • weapon/wep/w - Weapon delivery
  • shield/shl/sh - Shield delivery
  • armor/rmr/r - Armor delivery
  • sight/sit/eye/e - Sight delivery
  • aura/aur/a - Aura delivery
  • cone/con/c - Cone delivery
  • other/oth/o - Other delivery

Target Type (target/tar/t)

  • self/sel/s - Self target
  • creature/cre/c - Creature target
  • body/bod/b - Body target
  • vitals/vit/v - Vitals target
  • limb/lim/l - Limb target
  • arm - Arm target
  • leg - Leg target
  • item/itm/i - Item target
  • weapon/wep/w - Weapon target
  • shield/shl/sh - Shield target
  • armor/rmr/r - Armor target
  • attack/atk/a - Attack target
  • other/oth/o - Other target

Duration (duration/dur/dr)

  • instant/in/i/0 - Instant duration
  • always/forever/4/inf - Always active
    • Note: Use one of the aliases. Entering always is currently bugged.
  • whileUp/up/u - While up
  • whileDown/dn/d - While down
  • whileAlive/al/a - While alive
  • whileDead/dd - While dead
  • endOfTurn/end/e - Until end of turn
  • dawn/d - Until dawn
  • startOfTargetNextTurn/tStart/ts - Until start of target's next turn
  • endOfTargetNextTurn/tEnd/te - Until end of target's next turn
  • startOfYourNextTurn/uStart/us - Until start of your next turn
  • endOfYourNextTurn/uEnd/ue - Until end of your next turn
  • endOfCombat/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 range
  • weapon/w - Weapon range
  • hand/h - Hand range
  • bite/b - Bite range
  • item/i - Item range
  • shield/sh - Shield range
  • armor/a - Armor range
  • sight/eye/e - Sight range
  • self/s - Self range
  • Distance format: Xf or Xm (feet or miles)

Attribute Saves (attribute/attr/a)

  • int/INT/i - Intelligence save
  • str/STR/s - Strength save
  • mov/MOV/m - Movement save
  • per/PER/p - Perception save
  • snk/SNK/s - Sneak save

Expansion Type (expansion/exp)

  • detonate/det/d - Detonate expansion
  • ripple/rip/r - Ripple expansion
  • cascade/cas/c - Cascade expansion
  • fork/for/f - Fork expansion

Piercing (piercing/prc/p)

  • av0/a - AV0 piercing
  • unblockable/ub/u - Unblockable

Component Flags

  • verbal/ver/v - Verbal component
  • somatic/som/s - Somatic component
  • material/mat/m - Material component
  • magelore/mag/ml - Magelore component
  • invoked/inv/i - Invoked component

Resource Costs

  • mp - Mana point cost
  • mpx - Variable mana point cost description
  • hp - Hit point cost
  • hpx - Variable hit point cost description
  • matx - Material component cost description

Element Flags

  • life - Life element
  • storm - Storm element
  • necro - Necro element
  • flame - Flame element
  • nature - Nature element

Power Source Flags

  • magic - Magical power source
  • divine - Divine power source
  • spirit - Spirit power source
  • primal - Primal power source
  • martial - Martial power source
  • psionic - Psionic power source
  • techo - Techno power source

Effect Type Flags

  • mental - Mental effect
  • truth - Truth detection effect
  • duelMod - Duel modification effect
  • movement - Movement effect
  • displacement - Displacement effect
  • transformation - Transformation effect
  • control - Control effect
  • resist - Resistance effect
  • immune - Immunity effect
  • long - Long range effect
  • sense - Sensory effect
  • revive - Revival effect
  • summon - Summoning effect
  • heal - Healing effect

State Parameters

  • end - The condition under which the ability ends

Results Parameters

  • crithit - Critical hit effect
  • hit - Hit effect
  • miss - Miss effect
  • critmiss - Critical miss effect
  • critfail - Critical fail effect
  • fail - Fail effect
  • save - Save effect
  • critsave - Critical save effect

Attribute Modification

  • vstat - Attribute to modify
  • val - New minimum value for the attribute
  • fstat - Feat save attribute to modify
  • flu - Flag for fluency in feat save
  • pro - 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'
            },
            as = {
            	'areaSpell'
            },
            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',
            },
            ari = {
                'ari',
                'areaItem',
                'itemArea',
            },
            arse = {
            	'areaSelf'
            },
            si = {
            	'selfItem',
            	'itemSelf'
            }
        },
        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 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'
        },
        necromancy = {
            text = 'Necromancy',
            link = 'Necromancy element abilities',
            symbol = '💀',
            color = '#3d3846',
            class = 'element-tagged necromancy'
        },
        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'
        },
    },
    gm = {
        warr = {
            text = 'Warrior',
            link = 'Warrior guildmaster abilities',
            symbol = '⚔️',
            class = 'archetype-tagged warrior'
        },
        semi = {
            text = 'Semi',
            link = 'Semi guildmaster abilities',
            symbol = '🤹',
            class = 'archetype-tagged semi'
        }
    },
    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'
        },
        techno = {
            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'
        },
        guildmaster = {
            text = 'Guildmaster',
            link = 'Guildmaster abilities',
            symbol = '🏅',
            class = 'guildmaster'
        }
    },
    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'
        },
        duelModifying = {
            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'
        },
        illusion = {
            text = 'Illusion',
            link = 'Illusion effects',
            symbol = '🫟',
            class = 'effect-tagged illusion'
        },
        control = {
            text = 'Control',
            link = 'Control effects',
            symbol = '⛓️',
            class = 'effect-tagged control'
        },
        resist = {
            text = 'Resistance',
            link = 'Resistance effects',
            symbol = '🚫',
            class = 'effect-tagged resistance'
        },
        hexproof = {
            text = 'Hexproof',
            link = 'Hexproof effects',
            symbol = '🚫',
            class = 'effect-tagged hexproof'
        },
        awaken = {
            text = 'Awakening',
            link = 'Awakening effects',
            symbol = '🌞',
            class = 'effect-tagged awakening'
        },
        immune = {
            text = 'Immunity',
            link = 'Immunity effects',
            symbol = '🚫',
            class = 'effect-tagged immunity'
        },
        hexseal = {
            text = 'Hexseal',
            link = 'Hexseal effects',
            symbol = '🚫',
            class = 'effect-tagged hexseal'
        },
        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'
        },
        drain = {
            text = 'Draining',
            link = 'Draining effects',
            symbol = '🩸',
            class = 'effect-tagged draining'
        },
        destroy = {
            text = 'Destruction',
            link = 'Destruction effects',
            symbol = '💥',
            class = 'effect-tagged destruction'
        },
        contract = {
            text = 'Contract',
            link = 'Contract effects',
            symbol = '🤝',
            class = 'effect-tagged contract'
        },
        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'
        },
        auto = {
            text = 'Automatic',
            link = 'Automatic effects',
            symbol = '❗️',
            class = 'effect-tagged automatic'
        },
        lightning = {
            text = 'Lightning',
            link = 'Lightning effects',
            symbol = '⚡️',
            class = 'effect-tagged lightning'
        },
        disease = {
            text = 'Disease',
            link = 'Disease effects',
            symbol = '🦠',
            class = 'effect-tagged disease'
        },
        vision = {
        	text = 'Vision',
        	link = 'Vision effects',
        	symbol = '🥠',
        	class = 'effect-tagged vision'
        },
        morganti = {
        	text = 'Morganti',
        	link = 'Morganti effects',
        	symbol = '⚫️',
        	class = 'effect-tagged morganti'
        },
        construction = {
            text = 'Construction',
            link = 'Construction effects',
            symbol = '🔧',
            class = 'effect-tagged construction'
        },
        weather = {
            text = 'Weather',
            link = 'Weather effects',
            symbol = '🌧️',
            class = 'effect-tagged weather'
        }
    },
    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'
            }
        },
        ari = {
            tags = {
                'area',
                'item'
            }
        },
        as = {
        	tags = {
        		'area',
        		'spell',
        	}
        },
        arse = {
        	tags = {
        		'area',
        		'self',
        	}
        },
        si = {
        	tags = {
        		'item',
        		'self'
        	}
        },
        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 [[:Category:Weapons|weapon\'s]] range',
            -- link = 'Weapon range abilities',
            no = true
        },
        hand = {
            text = 'Your [[:Category:Handy equipment|hand\'s]] range',
            -- link = 'Hand range abilities',
            no = true
        },
        bite = {
            text = 'Your [[:Category:Biting equipment|bite\'s]] range',
            -- link = 'Bite range abilities',
            no = true
        },
        item = {
            text = 'Your [[:Category:Items|item\'s]] range',
            -- link = 'Item range abilities',
            no = true
        },
        shield = {
            text = 'Your [[:Category:Shields|shield\'s]] range',
            -- link = 'Shield range abilities',
            no = true
        },
        armor = {
            text = 'Your [[:Category:Armor|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('&nbsp;'))
        :css('display', 'none')
    local barTitle = mw.html.create('span')
    local barTitleClass = title:lower()
    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 resolveAlias(args, aliases)
    local resolved = {}

    -- Resolve keys
    for canonicalKey, keyAliasList in pairs(aliases.keys) do
        for _, alias in ipairs(keyAliasList) do
            if args[alias] then
                resolved[canonicalKey] = args[alias]
                break
            end
        end
    end

    -- Resolve values
    for canonicalKey, canonicalValueTable in pairs(aliases.values) do
        local rawValue = resolved[canonicalKey]

        if rawValue then
            for canonicalValue, valueAliasList in pairs(canonicalValueTable) do
                for _, alias in ipairs(valueAliasList) do
                    if rawValue == '' then
                        resolved[canonicalKey] = false
                        break
                    elseif rawValue == alias then
                        resolved[canonicalKey] = canonicalValue
                        break
                    -- Handle patterns like timeParse or distParse
                    elseif rawValue and type(valueAliasList) == "table" and valueAliasList[1] and rawValue:match(valueAliasList[1]) then
                        if canonicalKey == "duration" or canonicalKey == "executionTime" then
                            -- Parse time duration (e.g., 5d -> "5 days")
                            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"}
                            if unitMap[unit] then
                                local parsedValue = num .. " " .. unitMap[unit] .. (num > 1 and "s" or "")
                                resolved[canonicalKey] = parsedValue
                            else
                                resolved[canonicalKey] = rawValue
                            end
                        elseif canonicalKey == "range" or canonicalKey == "expansionRange" then
                            -- Parse distance (e.g., 30f -> "30 feet")
                            local num = tonumber(rawValue:match("^(%d+)"))
                            local unit = rawValue:match("[%a]+$")
                            local unitMap = {f = "feet", m = "miles"}
                            if unitMap[unit] then
                                local parsedValue = num .. " " .. unitMap[unit]
                                resolved[canonicalKey] = parsedValue
                            else
                                resolved[canonicalKey] = rawValue
                            end
                        end
                    end
                end
            end
        end
    end

    return resolved
end

local function exists(arg)
    return arg ~= nil and arg ~= '' and arg ~= false
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
    local args = frame.args
    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'] == 'al' 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' or resolved['target'] == 'ari' 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'] and args['mp']:len() > 0 then
        costMP = args['mp']
    end
    if args['hp'] and args['hp']:len() > 0 then
        costHP = args['hp']
    end
    if args['gp'] and args['gp']:len() > 0 then
        costGP = args['gp']
    end
    if exists(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
    local esContent = ''
    if args['es'] and args['es']:len() > 0 then
        esContent = esContent .. makeTag(frame, 'es', 'es', makeCat)
        c = c .. addCategory('Elder Sorcery abilities', 'es', 'es', skill, spell, addCats)
    else
    	if spell then
    		standard = '1'
		end
    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 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'] and ((args['special']:len() > 0) or (args['s']:len() > 0) or (args['sp']:len() > 0)) then
        specialContent = specialContent .. makeTag(frame, 'special', 'special', makeCat)
        c = c .. addCategory('Special abilities', 'special', 'special', skill, spell, addCats)
    end
    local wardedContent = ''
    if args['warded'] and args['warded']:len() > 0 then
        wardedContent = wardedContent .. makeTag(frame, 'warded', 'warded', makeCat)
        c = c .. addCategory('Warded abilities', 'warded', 'warded', skill, spell, addCats)
    end

    local elementContent = ''
    if args['life'] and args['life']:len() > 0 then
        elementContent = elementContent .. makeTag(frame, 'elements', 'life', makeCat)
        c = c .. addCategory('Life element abilities', 'elements', 'life', skill, spell, addCats)
    end
    if args['storm'] and args['storm']:len() > 0 then
        elementContent = elementContent .. makeTag(frame, 'elements', 'storm', makeCat)
        c = c .. addCategory('Storm element abilities', 'elements', 'storm', skill, spell, addCats)
    end
    if (args['necro'] and args['necro']:len() > 0) or (args['necromancy'] and args['necromancy']:len() > 0) then
        elementContent = elementContent .. makeTag(frame, 'elements', 'necro', makeCat)
        c = c .. addCategory('Necromancy element abilities', 'elements', 'necro', skill, spell, addCats)
    end
    if args['flame'] and args['flame']:len() > 0 then
        elementContent = elementContent .. makeTag(frame, 'elements', 'flame', makeCat)
        c = c .. addCategory('Flame element abilities', 'elements', 'flame', skill, spell, addCats)
    end
    if args['nature'] and args['nature']:len() > 0 then
        elementContent = elementContent .. makeTag(frame, 'elements', 'nature', makeCat)
        c = c .. addCategory('Nature element abilities', 'elements', 'nature', skill, spell, addCats)
    end

    local powerContent = ''
    local martial = true
    if args['magic'] and args['magic']:len() > 0 then
        martial = false
        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'] and args['divine']:len() > 0 then
        martial = false
        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'] and args['spirit']:len() > 0 then
        martial = false
        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'] and args['primal']:len() > 0 then
        martial = false
        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['psionic'] and args['psionic']:len() > 0 then
        martial = false
        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'] and args['techo']:len() > 0 then
        martial = false
        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'] and args['finance']:len() > 0 then
        martial = false
        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'] and args['alchemy']:len() > 0 then
        martial = false
        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'] and args['unknown']:len() > 0 then
        martial = false
        powerContent = powerContent .. makeTag(frame, 'power', 'unknown', makeCat)
        c = c .. addCategory('Unknown powered abilities', 'power', 'unknown', skill, spell, addCats)
    end
    if args['martial'] and args['martial']:len() > 0 then
        martial = true
    end
    if martial then
        powerContent = powerContent .. makeTag(frame, 'power', 'martial', makeCat)
        c = c .. addCategory('Martially powered abilities', 'power', 'martial', skill, spell, addCats)
    end
    if class then
        classContent = makeContent(frame, resolved, {'class'}, makeCat)
        powerContent = powerContent .. classContent
    end
    if args['rotator'] and args['rotator']:len() > 0 then
        powerContent = powerContent .. makeTag(frame, 'category', 'rotator', makeCat)
    end
    if args['gm'] and args['gm']:len() > 0 then
        powerContent = powerContent .. makeTag(frame, 'gm', args['gm'], makeCat)
    end
    if args['guildmaster'] and args['guildmaster']:len() > 0 then
        powerContent = powerContent .. makeTag(frame, 'category', 'guildmaster', 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 exists(args['mental']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'mental', makeCat)
        c = c .. addCategory('Mental effects', 'effect', 'mental', skill, spell, addCats)
    end
    if exists(args['truth']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'truth', makeCat)
        c = c .. addCategory('Truth detecting effects', 'effect', 'truthDetecting', skill, spell, addCats)
    end
    if exists(args['duelMod']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'duelModifying', makeCat)
        c = c .. addCategory('Duel modifying effects', 'effect', 'duelModifying', skill, spell, addCats)
    end
    if exists(args['movement']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'movement', makeCat)
        c = c .. addCategory('Movement effects', 'effect', 'movement', skill, spell, addCats)
    end
    if exists(args['poison']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'poison', makeCat)
        c = c .. addCategory('Poison effects', 'effect', 'poison', skill, spell, addCats)
    end
    if exists(args['illusion']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'illusion', makeCat)
        c = c .. addCategory('Illusion effects', 'effect', 'illusion', skill, spell, addCats)
    end
    if exists(args['displacement']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'displacement', makeCat)
        c = c .. addCategory('Displacement effects', 'effect', 'displacement', skill, spell, addCats)
    end
    if exists(args['transformation']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'transformation', makeCat)
        c = c .. addCategory('Transformation effects', 'effect', 'transformation', skill, spell, addCats)
    end
    if exists(args['control']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'control', makeCat)
        c = c .. addCategory('Control effects', 'effect', 'control', skill, spell, addCats)
    end
    if exists(args['resist']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'resist', makeCat)
        c = c .. addCategory('Resistance effects', 'effect', 'resist', skill, spell, addCats)
    end
    if exists(args['hexproof']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'hexproof', makeCat)
        c = c .. addCategory('Hexproof effects', 'effect', 'hexproof', skill, spell, addCats)
    end
    if exists(args['awaken']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'awaken', makeCat)
        c = c .. addCategory('Awakening effects', 'effect', 'awaken', skill, spell, addCats)
    end
    if exists(args['immune']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'immune', makeCat)
        c = c .. addCategory('Immunity effects', 'effect', 'immune', skill, spell, addCats)
    end
    if exists(args['hexseal']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'hexseal', makeCat)
        c = c .. addCategory('Hexseal effects', 'effect', 'hexseal', skill, spell, addCats)
    end
    if exists(args['long']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'long', makeCat)
        c = c .. addCategory('Long range effects', 'effect', 'long', skill, spell, addCats)
    end
    if exists(args['sense']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'sense', makeCat)
        c = c .. addCategory('Sensory effects', 'effect', 'sense', skill, spell, addCats)
    end
    if exists(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 exists(args['summon']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'summon', makeCat)
        c = c .. addCategory('Summoning effects', 'effect', 'summon', skill, spell, addCats)
    end
    if exists(args['heal']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'heal', makeCat)
        c = c .. addCategory('Healing effects', 'effect', 'heal', skill, spell, addCats)
    end
    if exists(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 exists(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 exists(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 exists(args['kill']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'kill', makeCat)
        c = c .. addCategory('Killing effects', 'effect', 'kill', skill, spell, addCats)
    end
    if exists(args['damage']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'damage', makeCat)
        c = c .. addCategory('Damaging effects', 'effect', 'damage', skill, spell, addCats)
    end
    if exists(args['drain']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'drain', makeCat)
        c = c .. addCategory('Draining effects', 'effect', 'drain', skill, spell, addCats)
    end
    if exists(args['destroy']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'destroy', makeCat)
        c = c .. addCategory('Destruction effects', 'effect', 'destroy', skill, spell, addCats)
    end
    if exists(args['contract']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'contract', makeCat)
        c = c .. addCategory('Contract effects', 'effect', 'contract', skill, spell, addCats)
    end
    if exists(args['steal']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'steal', makeCat)
        c = c .. addCategory('Stealing effects', 'effect', 'steal', skill, spell, addCats)
    end
    if exists(args['loud']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'loud', makeCat)
        c = c .. addCategory('Loud effects', 'effect', 'loud', skill, spell, addCats)
    end
    if exists(args['knockout']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'knockout', makeCat)
        c = c .. addCategory('Knockout effects', 'effect', 'knockout', skill, spell, addCats)
    end
    if exists(args['time']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'time', makeCat)
        c = c .. addCategory('Temporal effects', 'effect', 'time', skill, spell, addCats)
    end
    if exists(args['lightning']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'lightning', makeCat)
        c = c .. addCategory('Lightning effects', 'effect', 'lightning', skill, spell, addCats)
    end
    if exists(args['disease']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'disease', makeCat)
        c = c .. addCategory('Disease effects', 'effect', 'disease', skill, spell, addCats)
    end
    if exists(args['vision']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'vision', makeCat)
        c = c .. addCategory('Vision effects', 'effect', 'vision', skill, spell, addCats)
    end
    if exists(args['morganti']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'morganti', makeCat)
        c = c .. addCategory('Morganti effects', 'effect', 'morganti', skill, spell, addCats)
    end
    if exists(args['construction']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'construction', makeCat)
        c = c .. addCategory('Construction effects', 'effect', 'construction', skill, spell, addCats)
    end
    if exists(args['weather']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'weather', makeCat)
        c = c .. addCategory('Weather effects', 'effect', 'weather', skill, spell, addCats)
    end

    local autoContent = ''
    if exists(args['auto']) then
        effectContent = effectContent .. makeTag(frame, 'effects', 'auto', makeCat)
        c = c .. addCategory('Automatic effects', 'effect', 'auto', skill, spell, addCats)
        autoContent = autoContent .. ' This triggers automatically. You cannot choose to not use it if you are able to.'
    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'] and args['heightened']:len() > 0 then
        heightenedContent = heightenedContent .. 'For each additional {{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'] and args['rotator']:len() > 0 then
        c = c .. addCategory('Rotator abilities', 'rotator', args['rotator'], skill, spell, addCats)
    end
    if args['gm'] then
        c = c .. addCategory(tags['gm'][args['gm']]['link'], 'gm', args['gm'], skill, spell, addCats)
    end
    if args['guildmaster'] then
        c = c .. addCategory('Guildmaster abilities', 'guildmaster', args['guildmaster'], 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 '') .. autoContent,
            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'}, makeCat),
            link = 'Core:Expansions'
        },
        {
            title = 'expansion cap',
            content = makeContent(frame, resolved, {'expansionCount'}, makeCat),
            link = 'Core:Expansions'
        },
        {
            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