Module:AbilityTable/Lists: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
Sleuth (talk | contribs)
table for healing tempo triggers
add Abilities that scale with Boons
 
(33 intermediate revisions by 6 users not shown)
Line 1: Line 1:
local lists = {
local lists = {
-- Abilities that give barrier
["barrier"] = {
"AirDropBulletShield",
"CombatBarrier",
},
     -- Abilities that have charges
     -- Abilities that have charges
     ["charges"] = {
     ["charges"] = {
Line 6: Line 12:
      
      
     -- Abilities that get cancelled by Cursed Relic
     -- Abilities that get cancelled by Cursed Relic
    -- BonusMoveSpeed does not get cleansed by cursed relic and must not be here.
     ["cursedrelic"] = {
     ["cursedrelic"] = {
         "AirControlPercent", "AllowDashWhenChanneling", "BehaviorCannotCancelDuringChannel", "BehaviorChannelled", "BehaviorExclusiveUse", "BehaviorStartCooldownOnToggleOff",
         "AirControlPercent", "AllowDashWhenChanneling", "BehaviorCannotCancelDuringChannel", "BehaviorChannelled", "BehaviorExclusiveUse", "BehaviorStartCooldownOnToggleOff",
         "BonusFireRate", "BonusMoveSpeed", "BuffDuration", "BuffModifier", "CombatBarrier", "CasterModifier",
         "BonusFireRate", "BuffDuration", "BulletDamageAmp", "CombatBarrier", "DashModifier", "DashSpeed",
         "DashModifier", "DashSpeed", "HealingPerSecond", "HealInterval", "MovementSpeedBonus", "WeaponDamageBonus",
         "HealingPerSecond", "MovementSpeedBonus", "MoveSpeedBonus", "SpiritResist", "TechArmorGain", "WeaponDamageBonus",
         "Life Drain", "Kinetic Carbine", "Power Slash", "Siphon Life",
         "Dust Devil", "Life Drain", "Kinetic Carbine", "Power Slash", "Power Surge", "Siphon Life",
        "Smoke Bomb", "The Cube",
     },
     },


Line 27: Line 35:
         "VictimStackDuration",
         "VictimStackDuration",
         "Card Trick", "Combo", "Light Eater", "Spirit Lasso", "Stalker's Mark",
         "Card Trick", "Combo", "Light Eater", "Spirit Lasso", "Stalker's Mark",
    },
   
    -- Abilities that give debuff resist.
    ["extradebuffresist"] = {
    "StatusResistancePercent"
     },
     },


Line 40: Line 53:
     },
     },


     -- Abilities whose debuffs are affected by Divine Barrier (combination of debuffresist and dispelmagic)
     -- Abilities whose debuffs can be cleansed by Divine Barrier (combination of debuffresist and dispelmagic)
     ["divinebarrier"] = {
     ["divinebarrier"] = {
         "BuildUpDecayDelay", "BuildUpPerShot", "BulletDamageAmpDuration", "BulletResistReduction", "BurnDuration", "CitadelSilenced",
         "BuildUpDecayDelay", "BuildUpPerShot", "BulletDamageAmpDuration", "BulletResistReduction", "BurnDuration", "CitadelSilenced",
Line 50: Line 63:
         "Card Trick", "Combo", "Light Eater", "Spirit Lasso", "Stalker's Mark",
         "Card Trick", "Combo", "Light Eater", "Spirit Lasso", "Stalker's Mark",
     },
     },
   
    -- Abilities that don't break stealth on cast or recast.
["dontbreakstealth"] = {
"BehaviorDontBreakInvisibility", "DoesNotBreakInvis",
"Spectral Wall"
},


     -- Abilities that restore health, buffed by Heal Amp items
     -- Abilities that restore health, buffed by Heal Amp items
Line 58: Line 77:
         "MaxHealthRegen", "MissingHealthBurstPct", "MissingHealthPercentHeal", "MissingHPHeal", "RegenIncomingDamagePercent", "TechLifestealPercent",
         "MaxHealthRegen", "MissingHealthBurstPct", "MissingHealthPercentHeal", "MissingHPHeal", "RegenIncomingDamagePercent", "TechLifestealPercent",
         "TotalHealthRegen",
         "TotalHealthRegen",
         "Card Trick", "Bloodletting", "Rake", "Soul Exchange",
         "Card Trick", "Rake", "Soul Exchange",
     },
     },


     -- Abilities with healing that can apply the Healing Tempo Passive
     -- Abilities that trigger Healing Tempo Passive
     ["healingtempotriggers"] = {
     ["healingtempo"] = {
         "BonusHealthRegen", "DamageHealMult", "ExternalBonusHealthRegen", "FlatHealthHealing",
         "BonusHealthRegen", "DamageHealMult", "ExternalBonusHealthRegen", "FlatHealthHealing", "HealAmount", "HealFixedHealth",
        "HealAmount", "HealFixedHealth", "HealingFactor", "HealingPerSecond", "HealMaxHealth", "HealMaxHealthPercent",
        "HealingFactor", "HealingPerSecond", "HealMaxHealth", "HealMaxHealthPercent", "HealOnKillPct", "HealPctVsHeroes",
        "HealOnKillPct", "HealPctVsHeroes", "HealthStealPctHero", "InfestHeal", "LifeDrainPerSecond",
        "HealthStealPctHero", "InfestHeal", "LifeDrainPerSecond", "MaxHealthRegen", "MeleeLifesteal", "MissingHealthBurstPct",
        "MaxHealthRegen", "MeleeLifesteal", "MissingHealthBurstPct", "MissingHealthPercentHeal", "MissingHPHeal",  
        "MissingHealthPercentHeal", "MissingHPHeal", "TetherSharedHealPct", "TotalHealthRegen",
        "TetherSharedHealPct", "TotalHealthRegen",
         "Card Trick", "Fire Scarabs", "Rake", "Soul Exchange",
         "Card Trick", "Soul Exchange"
     },
     },


Line 86: Line 104:
         "Immobilize", "ImmobilizeDuration", "LiftDuration", "PetrifyDuration", "RestrictionDuration", "Silenced",
         "Immobilize", "ImmobilizeDuration", "LiftDuration", "PetrifyDuration", "RestrictionDuration", "Silenced",
         "SilenceDuration", "SleepDuration", "StunDuration", "Tether",
         "SilenceDuration", "SleepDuration", "StunDuration", "Tether",
         "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
         "Combo", "Hotel Guest", "Paradoxical Swap", "Spirit Lasso",
     },
     },


Line 97: Line 115:
     ["movementbased"] = {
     ["movementbased"] = {
     "BehaviorMovement",
     "BehaviorMovement",
    "Flying Cloak", "Spectral Assistant", "Stalker's Mark",
     },
     },


Line 115: Line 132:
     -- Abilities that trigger Reactive Barrier
     -- Abilities that trigger Reactive Barrier
     ["reactivebarrier"] = {
     ["reactivebarrier"] = {
         "ChainLength", "CitadelRoot", "CitadelSilenced", "DragModifier", "HexDuration", "HoldInPlaceDuration",
         "ChainLength", "ChargeDragEnemy", "CitadelRoot", "CitadelSilenced", "HexDuration", "HoldInPlaceDuration",
         "Immobilize", "ImmobilizeDuration", "LiftDuration", "PetrifyDuration", "RestrictionDuration", "Silenced",
         "Immobilize", "ImmobilizeDuration", "LiftDuration", "PetrifyDuration", "RestrictionDuration", "Silenced",
         "SilenceDuration", "SleepDuration", "StunDuration", "Tether",
         "SilenceDuration", "SleepDuration", "StunDuration", "Tether",
         "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
         "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
     },
     },
 
   
     -- Abilities that restore health that can be reduced
     -- Abilities that scale with Boons
    ["reducibleheal"] = {
["scalingboon"] = {
        "AbilityLifestealPercentHero", "BonusHealthRegen", "BulletLifestealPercent", "DamageHealMult", "ExternalBonusHealthRegen", "FlatHealthHealing",
    "Scale.Type:power_increase",
         "HealAmount", "HealFixedHealth", "HealingFactor", "HealingPerSecond", "HealMaxHealth", "HealMaxHealthPercent",
},
         "HealOnKillPct", "HealPctVsHeroes", "HealthStealPctHero", "InfestHeal", "LifestealPercentHero", "LifeStealPercentOnHit",  "LifeDrainPerSecond",
   
         "MaxHealthRegen", "MissingHealthBurstPct", "MissingHealthPercentHeal", "MissingHPHeal", "RegenIncomingDamagePercent", "TechLifestealPercent",
    -- Abilities that scale with ability duration
        "TotalHealthRegen",
    ["scalingduration"] = {
         "Card Trick", "Bloodletting", "Rake", "Soul Exchange",
         "Scale.Type:duration",
    },
   
    -- Abilities that scale with ability range
    ["scalingrange"] = {
         "Scale.Type:range", "Scale.Type:radius",
    },
   
    -- Abilities that scale with ability cooldown
    ["scalingcooldown"] = {
         "Scale.Type:cooldown",
    },
   
    -- Abilities that scale with spirit
    ["scalingspirit"] = {
         "Scale.Type:spirit",
     },
     },


     -- for testing purposes. Feel free to change however you wish
     -- for testing purposes. Feel free to change however you wish
     ["test"] = {
     ["test"] = {
         "BonusHealthRegen", "DamageHealMult", "ExternalBonusHealthRegen", "FlatHealthHealing",
         "BehaviorChannelled"
        "HealAmount", "HealFixedHealth", "HealingFactor", "HealingPerSecond", "HealMaxHealth", "HealMaxHealthPercent",
        "HealOnKillPct", "HealPctVsHeroes", "HealthStealPctHero", "InfestHeal", "LifeDrainPerSecond",
        "MaxHealthRegen", "MissingHealthBurstPct", "MissingHealthPercentHeal", "MissingHPHeal",
        "TetherSharedHealPct", "TotalHealthRegen",
        "Card Trick", "Soul Exchange"
     },
     },


Line 146: Line 173:
         "DragModifier", "EnemySlowPct", "FadingSlowPercent", "GroundDashReductionPercent", "HexDuration", "HoldInPlaceDuration",
         "DragModifier", "EnemySlowPct", "FadingSlowPercent", "GroundDashReductionPercent", "HexDuration", "HoldInPlaceDuration",
         "Immobilize", "ImmobilizeDuration", "LiftDuration", "MaxSlowDuration", "MovementSlow", "MovementSlowPct",
         "Immobilize", "ImmobilizeDuration", "LiftDuration", "MaxSlowDuration", "MovementSlow", "MovementSlowPct",
         "MovementSpeedSlow", "MoveSlowPercent", "PetrifyDuration", "RestrictionDuration", "Silenced", "SilenceDuration",
         "MovementSpeedSlow", "MoveSlowPercent", "OutgoingTechDamagePercent", "PetrifyDuration", "RestrictionDuration", "Silenced",
        "SleepDuration", "SlowDuration", "SlowPercent", "StunDuration", "Tether", "TimeSlowDuration",
        "SilenceDuration", "SleepDuration", "SlowDuration", "SlowPercent", "StunDuration", "Tether",
        "TossDuration",
        "TimeSlowDuration", "TossDuration",
         "Card Trick", "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
         "Card Trick", "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
     },
     },
Line 155: Line 182:
     ["weapondamage"] = {
     ["weapondamage"] = {
         "weapon_damage_increase",
         "weapon_damage_increase",
        "Crackshot",
    },
   
    -- Abilities that scale with weapon damage
    ["weaponscaling"] = {
        "weapon_damage_increase", "weapon_power"
    },
   
    -- Abilities that summons NPCs
    ["summons"] = {
        "TurretLifeTime", "SkullLifetime", "SummonCount", "SummonHealth", "TurretLifetime", "HelperCount"
     },
     },
}
}
Line 166: Line 204:
    "Grasping Hands", -- has BuffModifier that does nothing
    "Grasping Hands", -- has BuffModifier that does nothing
    "Ira Domini", -- has BehaviorCannotCancelDuringChannel but does not dispelled
    "Ira Domini", -- has BehaviorCannotCancelDuringChannel but does not dispelled
    "Lycan Curse", -- has BonusFireRate that does not get dispelled
    "Return to Shadows", -- has BehaviorChannelled but is untargetable during the channel
    "Serrated Knives", -- has BehaviorChannelled for some reason
    "Serrated Knives", -- has BehaviorChannelled for some reason
    "Shadow Transformation", -- has BehaviorCannotCancelDuringChannel but it gives invulnerability and then unstoppable.
    "Shadow Transformation", -- has BehaviorCannotCancelDuringChannel but it gives invulnerability and then unstoppable.
    "Shocking Reanimation", -- Has BehaviorChannelled, BonusFireRate, BuffModifier but none get any effective treatment
    "Vexing Bolt", -- has BehaviorChannelled but does not get cancelled
    "Vexing Bolt", -- has BehaviorChannelled but does not get cancelled
},
},
Line 188: Line 229:
         "Slam Fire",      -- has DebuffDuration for some reason
         "Slam Fire",      -- has DebuffDuration for some reason
         "Splatter",      -- has SlowPercent but no duration to shave off
         "Splatter",      -- has SlowPercent but no duration to shave off
    },
    ["dontbreakstealth"] = {
    --"Riposte",
     },
     },
     ["heal"] = {
     ["heal"] = {
         "Riposte", -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
         "Riposte", -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
     },
     },
     ["healingtempotriggers"] = {
     ["healingtempo"] = {
     "Riposte", -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
     "Riposte", -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
     },
     },
Line 200: Line 244:
         "Life Drain",      -- has CitadelSilenced but doesn't apply any silence
         "Life Drain",      -- has CitadelSilenced but doesn't apply any silence
         "Singularity",    -- has stun, just doesn't trigger Indomitable (bug?),
         "Singularity",    -- has stun, just doesn't trigger Indomitable (bug?),
    },
    ["movementbased"] = {
    "Slither", -- has BehaviorMovement but doesn't get disabled (because is passive?)
     },
     },
     ["moveslow"] = {
     ["moveslow"] = {
Line 211: Line 258:
         "Entangling Bola", -- has CitadelRoot that never gets applied,
         "Entangling Bola", -- has CitadelRoot that never gets applied,
         "Life Drain",      -- has CitadelSilenced but doesn't apply any silence
         "Life Drain",      -- has CitadelSilenced but doesn't apply any silence
    },
    ["reducibleheal"] = {
        "Riposte",              -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
        "Shadow Transformation", -- gives immunity to debuffs so heal can't be reduced
     },
     },
     ["unstoppable"] = {
     ["unstoppable"] = {

Latest revision as of 03:06, 22 August 2026

Common Scenarios

[edit source]

How to add a missing ability to a list

[edit source]

If an ability should appear in a table but doesn't, it means none of its data properties match the list's property keys. The recommended fix is to find a matching property in Data:AbilityData.json and add it to the list. Only use a raw ability name as a fallback if no suitable property exists.

Before editing, read the comment above the list you want to change, it describes what kind of abilities belong there.

Finding the right property: Open Data:AbilityData.json and search for the ability. Look through its properties for one that represents the relevant mechanic, for example, a silence ability might have SilenceDuration. A good property is one shared by many abilities with the same mechanic, not something unique to one ability.

If a property is shared by many abilities but only some of them have the value you care about, use the Key:Value form to narrow it down. Ability scaling is the usual case: nearly every ability has a Scale, so Scale.Type:cooldown is what separates the ones that scale with Ability Cooldown from the rest.

After adding the property or ability name, test the table to make sure no unwanted extra abilities appeared. If they did, the property is too broad, consider using a raw ability name instead, or adding the extras to exclude_abilities.

If your new ability has special column values, you may also want to update Module:AbilityTable/ComplexRenderers. And if it needs a descriptive note, add it in Module:AbilityTable/Notes.

Example: adding Affliction to the "healreduce" list

[edit source]

Say Affliction is missing from the heal reduction table. First, check the comment above ["healreduce"] in the module, it says "Abilities that reduce healing on their targets", so Affliction belongs there.

Open Data:AbilityData.json and search for affliction. Looking through its properties, you find "DisableHealing": 1, that looks like exactly what we need.

Check if DisableHealing is already in the ["healreduce"] list. It isn't, so add it:

["healreduce"] = {
    "DisableHealing", "HealAmpReceivePenaltyPercent", "HealAmpRegenPenaltyPercent",
},

Save and test the table with {{AbilityTable|healreduce}}. Affliction now appears, and no unexpected abilities were added, so the property was a good fit.

How to exclude an ability from a list

[edit source]

If an ability appears in a table but shouldn't, first check whether the property causing the match actually belongs in the list. If several unrelated abilities are showing up as false positives, it's likely that a prop was added to the list by mistake, inspect the list carefully and consider removing it. Make sure to test after removing a prop to confirm you didn't accidentally drop any legitimate abilities.

If the false positive is a genuine exception, the prop belongs in the list but this one ability happens to match it incorrectly, then add the ability to exclude_abilities under the relevant list name with a comment explaining why:

["healreduce"] = {
    "My Ability", -- has DisableHealing for some reason but doesn't actually reduce healing
},

How to add a new list

[edit source]

Adding a new list makes a new ability table available via {{AbilityTable|listname}}.

Step 1: Find matching properties in Data:AbilityData.json. Look at several abilities that should appear in the list and identify properties they share. Prefer broad reusable properties over raw ability names.

Step 2: Add a new entry to the lists table with a descriptive comment above it:

-- Brief description of what this list represents
["mylist"] = { "PropertyOne", "PropertyTwo" },

Test the result with {{AbilityTable|mylist}} and adjust until the list looks right, adding missing abilities and excluding false positives as described above.

Step 3 (optional): If the table should have extra columns beyond Notes, register a renderer in Module:AbilityTable and implement it in Module:AbilityTable/ComplexRenderers.

Step 4 (optional): Add human notes for specific abilities in Module:AbilityTable/Notes.


Technical

[edit source]

How targets are matched

[edit source]

Every entry in a list is a target: a string matched against each ability record in Data:AbilityData.json. There are four forms.

Form Example Matches when
Plain name SilenceDuration, Card Trick a property with that name exists anywhere in the record and holds a non-zero, non-empty value, or the string appears as a value anywhere in the record. Raw ability names work because the ability's Name is such a value.
Name with a value Type:spirit a property with that name exists anywhere in the record and its own value is spirit
Nested path AbilityDuration.Scale.Type that exact chain of properties exists and ends in a non-zero, non-empty value
Nested path with a value Scale.Type:cooldown that chain exists and ends in cooldown

A few details worth knowing:

  • A property's value is its own value, not anything nested inside it. Damage is stored as { "Value": 90, "Scale": { "Type": "spirit" } }, so Damage:90 matches it but Damage:spirit does not, the spirit sits on a different property. Use Damage.Scale.Type:spirit for that.
  • Paths step through lists. Upgrades.Damage matches if any upgrade has a Damage value; Upgrades.1.Damage checks only the first upgrade.

local lists = {
	-- Abilities that give barrier
	["barrier"] = {
		"AirDropBulletShield",
		"CombatBarrier",
	},
	
    -- Abilities that have charges
    ["charges"] = {
        "AbilityCharges",
    },
    
    -- Abilities that get cancelled by Cursed Relic
    -- BonusMoveSpeed does not get cleansed by cursed relic and must not be here.
    ["cursedrelic"] = {
        "AirControlPercent", "AllowDashWhenChanneling", "BehaviorCannotCancelDuringChannel", "BehaviorChannelled", "BehaviorExclusiveUse", "BehaviorStartCooldownOnToggleOff",
        "BonusFireRate", "BuffDuration", "BulletDamageAmp", "CombatBarrier", "DashModifier", "DashSpeed",
        "HealingPerSecond", "MovementSpeedBonus", "MoveSpeedBonus", "SpiritResist", "TechArmorGain", "WeaponDamageBonus",
        "Dust Devil", "Life Drain", "Kinetic Carbine", "Power Slash", "Power Surge", "Siphon Life",
        "Smoke Bomb", "The Cube",
    },

    -- Abilities that apply a dash slow to their targets
    ["dashslow"] = {
        "EnemyDashSlowPercent", "GroundDashReductionPercent", "MaxGroundDashReductionPercent", "MoveSpeedAndDashSlowPct",
    },

    -- Abilities whose duration is reduced by Debuff Resist (Debuff Reducer etc.)
    ["debuffresist"] = {
        "BuildUpPerShot", "BulletDamageAmpDuration", "BulletResistReduction", "BurnDuration", "CitadelSilenced", "DamageAmpPercentage",
        "DebuffAccuracy", "DebuffDuration", "EnemySlowPct", "FadingSlowPercent", "GroundDashReductionPercent", "HealAmpReceivePenaltyPercent",
        "HoldInPlaceDuration", "ImmobilizeDuration", "MaxSlowDuration", "MovementSlow", "MovementSlowPct", "MovementSpeedSlow",
        "MoveSlowPercent", "PetrifyDuration", "ProcDamage", "Silenced", "SilenceDuration", "SleepDuration",
        "SlowPercent", "StealDuration", "StunDuration", "TimeSlowDuration", "TossDuration", "VenomDuration",
        "VictimStackDuration",
        "Card Trick", "Combo", "Light Eater", "Spirit Lasso", "Stalker's Mark",
    },
    
    -- Abilities that give debuff resist.
    ["extradebuffresist"] = {
    	"StatusResistancePercent"	
    },

    -- Abilities whose effects can be cleansed by Dispel Magic
    ["dispelmagic"] = {
        "BuildUpDecayDelay", "BuildUpPerShot", "BulletDamageAmpDuration", "BulletResistReduction", "BurnDuration", "CitadelSilenced",
        "DebuffAccuracy", "DebuffDuration", "DotHealthPercent", "Drag", "EnemySlowPct", "FadingSlowPercent",
        "FuseTime", "GroundAuraModifier", "GroundDashReductionPercent", "HealAmpReceivePenaltyPercent", "HoldInPlaceDuration", "ImmobilizeDuration",
        "MaxSlowDuration", "MovementSlow", "MovementSlowPct", "MovementSpeedSlow", "MoveSlowPercent", "ProcDamage",
        "Silenced", "SlowDuration", "SlowPercent", "StealDuration", "TimeSlowDuration", "TossDuration",
        "VenomDuration", "VictimStackDuration",
        "Card Trick", "Light Eater", "Stalker's Mark", "Static Charge",
    },

    -- Abilities whose debuffs can be cleansed by Divine Barrier (combination of debuffresist and dispelmagic)
    ["divinebarrier"] = {
        "BuildUpDecayDelay", "BuildUpPerShot", "BulletDamageAmpDuration", "BulletResistReduction", "BurnDuration", "CitadelSilenced",
        "DamageAmpPercentage", "DebuffAccuracy", "DebuffDuration", "DotHealthPercent", "EnemySlowPct", "FadingSlowPercent",
        "FuseTime", "GroundAuraModifier", "GroundDashReductionPercent", "HealAmpReceivePenaltyPercent", "HoldInPlaceDuration", "ImmobilizeDuration",
        "MaxSlowDuration", "MovementSlow", "MovementSlowPct", "MovementSpeedSlow", "MoveSlowPercent", "PetrifyDuration",
        "ProcDamage", "Silenced", "SilenceDuration", "SleepDuration", "SlowDuration", "SlowPercent",
        "StealDuration", "StunDuration", "TimeSlowDuration", "TossDuration", "VenomDuration", "VictimStackDuration",
        "Card Trick", "Combo", "Light Eater", "Spirit Lasso", "Stalker's Mark",
    },
    
    -- Abilities that don't break stealth on cast or recast.
	["dontbreakstealth"] = {
		"BehaviorDontBreakInvisibility", "DoesNotBreakInvis",
		"Spectral Wall"
	},

    -- Abilities that restore health, buffed by Heal Amp items
    ["heal"] = {
        "AbilityLifestealPercentHero", "BonusHealthRegen", "BulletLifestealPercent", "DamageHealMult", "ExternalBonusHealthRegen", "FlatHealthHealing",
        "HealAmount", "HealFixedHealth", "HealingFactor", "HealingPerSecond", "HealMaxHealth", "HealMaxHealthPercent",
        "HealOnKillPct", "HealPctVsHeroes", "HealthStealPctHero", "InfestHeal", "LifestealPercentHero", "LifeStealPercentOnHit",  "LifeDrainPerSecond",
        "MaxHealthRegen", "MissingHealthBurstPct", "MissingHealthPercentHeal", "MissingHPHeal", "RegenIncomingDamagePercent", "TechLifestealPercent",
        "TotalHealthRegen",
        "Card Trick", "Rake", "Soul Exchange",
    },

    -- Abilities that trigger Healing Tempo Passive
    ["healingtempo"] = {
        "BonusHealthRegen", "DamageHealMult", "ExternalBonusHealthRegen", "FlatHealthHealing", "HealAmount", "HealFixedHealth",
        "HealingFactor", "HealingPerSecond", "HealMaxHealth", "HealMaxHealthPercent", "HealOnKillPct", "HealPctVsHeroes",
        "HealthStealPctHero", "InfestHeal", "LifeDrainPerSecond", "MaxHealthRegen", "MeleeLifesteal", "MissingHealthBurstPct",
        "MissingHealthPercentHeal", "MissingHPHeal", "TetherSharedHealPct", "TotalHealthRegen",
        "Card Trick", "Fire Scarabs", "Rake", "Soul Exchange", 
    },

    -- Abilities that reduce healing on their targets
    ["healreduce"] = {
        "DisableHealing", "HealAmpReceivePenaltyPercent", "HealAmpRegenPenaltyPercent",
    },

    -- Abilities that deal melee damage but scale with heavy melee
    ["heavymelee"] = {
        "heavy_melee",
    },

    -- Abilities that trigger Indomitable. Should be mostly same as reactivebarrier.
    ["indomitable"] = {
        "ChainLength", "ChargeDragEnemy", "CitadelRoot", "CitadelSilenced", "HexDuration", "HoldInPlaceDuration",
        "Immobilize", "ImmobilizeDuration", "LiftDuration", "PetrifyDuration", "RestrictionDuration", "Silenced",
        "SilenceDuration", "SleepDuration", "StunDuration", "Tether",
        "Combo", "Hotel Guest", "Paradoxical Swap", "Spirit Lasso",
    },

    -- Abilities that deal melee damage
    ["melee"] = {
        "heavy_melee", "melee",
    },
    
    -- Abilities that are considered "movement-based". They get disabled by Slowing Hex and some other things.
    ["movementbased"] = {
    	"BehaviorMovement",
    },

    -- Abilities that apply a move slow to their targets
    ["moveslow"] = {
        "EnemySlowPct", "MaxSlowPercent", "MovementSlow", "MovementSlowPct", "MovementSpeedSlow", "MoveSlowPercent",
        "MoveSpeedPenaltyPerStack", "MoveSpeedSlowPct", "SlowPercent",
    },

    -- Abilities that apply some effect on a bullet hit that can be mitigated with Plated Armor
    ["platedarmor"] = {
        "BonusDamagePerBullet", "BuildUpDecayDelay", "BuildUpDuration",
        "Blasted", "Card Trick", "Crackshot", "Fixation", "Ira Domini", "Light Eater",
        "Power Surge",
    },

    -- Abilities that trigger Reactive Barrier
    ["reactivebarrier"] = {
        "ChainLength", "ChargeDragEnemy", "CitadelRoot", "CitadelSilenced", "HexDuration", "HoldInPlaceDuration",
        "Immobilize", "ImmobilizeDuration", "LiftDuration", "PetrifyDuration", "RestrictionDuration", "Silenced",
        "SilenceDuration", "SleepDuration", "StunDuration", "Tether",
        "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
    },
    
    -- Abilities that scale with Boons
	["scalingboon"] = {
	    "Scale.Type:power_increase",
	},
    
    -- Abilities that scale with ability duration
    ["scalingduration"] = {
        "Scale.Type:duration",
    },
    
    -- Abilities that scale with ability range
    ["scalingrange"] = {
        "Scale.Type:range", "Scale.Type:radius",
    },
    
    -- Abilities that scale with ability cooldown
    ["scalingcooldown"] = {
        "Scale.Type:cooldown",
    },
    
    -- Abilities that scale with spirit
    ["scalingspirit"] = {
        "Scale.Type:spirit",
    },

    -- for testing purposes. Feel free to change however you wish
    ["test"] = {
        "BehaviorChannelled"
    },

    -- Abilities whose negative effects are prevented by Unstoppable
    ["unstoppable"] = {
        "ChainLength", "ChargeDragEnemy", "CitadelRoot", "CitadelSilenced", "DisarmDuration", "Drag",
        "DragModifier", "EnemySlowPct", "FadingSlowPercent", "GroundDashReductionPercent", "HexDuration", "HoldInPlaceDuration",
        "Immobilize", "ImmobilizeDuration", "LiftDuration", "MaxSlowDuration", "MovementSlow", "MovementSlowPct",
        "MovementSpeedSlow", "MoveSlowPercent", "OutgoingTechDamagePercent", "PetrifyDuration", "RestrictionDuration", "Silenced",
        "SilenceDuration", "SleepDuration", "SlowDuration", "SlowPercent", "StunDuration", "Tether",
        "TimeSlowDuration", "TossDuration",
        "Card Trick", "Combo", "Hotel Guest", "Paradoxical Swap", "Singularity", "Spirit Lasso",
    },

    -- Abilities that deal weapon damage
    ["weapondamage"] = {
        "weapon_damage_increase",
        "Crackshot",
    },
    
    -- Abilities that scale with weapon damage
    ["weaponscaling"] = {
        "weapon_damage_increase", "weapon_power"
    },
    
    -- Abilities that summons NPCs
    ["summons"] = {
        "TurretLifeTime", "SkullLifetime", "SummonCount", "SummonHealth", "TurretLifetime", "HelperCount"
    },
}

-- Abilities that should be excluded from automatic lists
-- If adding here please add a comment with a reason
local exclude_abilities = {
	["cursedrelic"] = {
		"Concussive Combustion", -- has BuffModifier that does nothing
	    "Enchanter's Satchel", -- has BehaviorChannelled but Pocket can't be targeted in it.
	    "Grasping Hands", -- has BuffModifier that does nothing
	    "Ira Domini", -- has BehaviorCannotCancelDuringChannel but does not dispelled
	    "Lycan Curse", -- has BonusFireRate that does not get dispelled
	    "Return to Shadows", -- has BehaviorChannelled but is untargetable during the channel
	    "Serrated Knives", -- has BehaviorChannelled for some reason
	    "Shadow Transformation", -- has BehaviorCannotCancelDuringChannel but it gives invulnerability and then unstoppable.
	    "Shocking Reanimation", -- Has BehaviorChannelled, BonusFireRate, BuffModifier but none get any effective treatment
	    "Vexing Bolt", -- has BehaviorChannelled but does not get cancelled
	},
    ["dashslow"] = {
        "Itani Lo Sahn", -- has GroundDashReductionPercent but also disables stamina
    },
    ["debuffresist"] = {
        "Bookwyrm",       -- has DebuffDuration for some reason
        "Frozen Shelter", -- has SlowPercent but no duration to shave off
        "Itani Lo Sahn",  -- has lots of debuffs but none are affected by debuffresist
        "Slam Fire",      -- has DebuffDuration for some reason
        "Splatter",       -- has SlowPercent but no duration to shave off
    },
    ["dispelmagic"] = {
        "Slam Fire", -- has DebuffDuration for some reason
    },
    ["divinebarrier"] = {
        "Bookwyrm",       -- has DebuffDuration for some reason
        "Frozen Shelter", -- has SlowPercent but no duration to shave off
        "Slam Fire",      -- has DebuffDuration for some reason
        "Splatter",       -- has SlowPercent but no duration to shave off
    },
    ["dontbreakstealth"] = {
    	--"Riposte",
    },
    ["heal"] = {
        "Riposte", -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
    },
    ["healingtempo"] = {
    	"Riposte", -- has AbilityLifestealPercentHero but doesn't deal damage to heal off of
    },
    ["indomitable"] = {
        "Entangling Bola", -- has CitadelRoot that never gets applied,
        "Itani Lo Sahn",   -- has silence, just doesn't trigger Indomitable (bug?),
        "Life Drain",      -- has CitadelSilenced but doesn't apply any silence
        "Singularity",     -- has stun, just doesn't trigger Indomitable (bug?),
    },
    ["movementbased"] = {
    	"Slither", -- has BehaviorMovement but doesn't get disabled (because is passive?)
    },
    ["moveslow"] = {
        "Grasping Hands", -- has SlowPercent
        "Riposte",        -- has a 40% 4s slow somehow? (SlowPercent + SlowDuration)
    },
    ["platedarmor"] = {
        "Arctic Beam", -- has BuildUpDuration but doesn't get applied with bullets.
    },
    ["reactivebarrier"] = {
        "Entangling Bola", -- has CitadelRoot that never gets applied,
        "Life Drain",      -- has CitadelSilenced but doesn't apply any silence
    },
    ["unstoppable"] = {
        "Life Drain", -- has CitadelSilenced but doesn't apply any silence
    },
}

return {
    lists             = lists,
    exclude_abilities = exclude_abilities,
}