Module:AbilityTable/Lists/doc: Difference between revisionsGive feedback
Document Key:Value and dot-path target forms (with help from vergir-bot LLM) |
m update doc |
||
| Line 1: | Line 1: | ||
== Common Scenarios == | |||
= | === How to add a missing ability to a list === | ||
== How to add a missing ability to a list == | |||
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. | 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. | ||
| Line 46: | Line 15: | ||
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]]. | 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 | ==== Example: adding Affliction to the "healreduce" list ==== | ||
Say {{AbilityIcon|Affliction}} is missing from the heal reduction table. First, check the comment above <code>["healreduce"]</code> in the module, it says "Abilities that reduce healing on their targets", so Affliction belongs there. | Say {{AbilityIcon|Affliction}} is missing from the heal reduction table. First, check the comment above <code>["healreduce"]</code> in the module, it says "Abilities that reduce healing on their targets", so Affliction belongs there. | ||
| Line 62: | Line 31: | ||
Save and test the table with <code><nowiki>{{AbilityTable|healreduce}}</nowiki></code>. Affliction now appears, and no unexpected abilities were added, so the property was a good fit. | Save and test the table with <code><nowiki>{{AbilityTable|healreduce}}</nowiki></code>. Affliction now appears, and no unexpected abilities were added, so the property was a good fit. | ||
== How to exclude an ability from a list == | === How to exclude an ability from a list === | ||
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 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. | ||
| Line 74: | Line 43: | ||
</pre> | </pre> | ||
== How to add a new list == | === How to add a new list === | ||
Adding a new list makes a new ability table available via <code><nowiki>{{AbilityTable|listname}}</nowiki></code>. | Adding a new list makes a new ability table available via <code><nowiki>{{AbilityTable|listname}}</nowiki></code>. | ||
| Line 92: | Line 61: | ||
'''Step 4 (optional)''': Add human notes for specific abilities in [[Module:AbilityTable/Notes]]. | '''Step 4 (optional)''': Add human notes for specific abilities in [[Module:AbilityTable/Notes]]. | ||
== Technical == | |||
=== How targets are matched === | |||
Every entry in a list is a ''target'': a string matched against each ability record in [[Data:AbilityData.json]]. There are four forms. | |||
{| class="wikitable" | |||
! Form !! Example !! Matches when | |||
|- | |||
| Plain name | |||
| <code>SilenceDuration</code>, <code>Card Trick</code> | |||
| 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 <code>Name</code> is such a value. | |||
|- | |||
| Name with a value | |||
| <code>Type:spirit</code> | |||
| a property with that name exists anywhere in the record and its own value is <code>spirit</code> | |||
|- | |||
| Nested path | |||
| <code>AbilityDuration.Scale.Type</code> | |||
| that exact chain of properties exists and ends in a non-zero, non-empty value | |||
|- | |||
| Nested path with a value | |||
| <code>Scale.Type:cooldown</code> | |||
| that chain exists and ends in <code>cooldown</code> | |||
|} | |||
A few details worth knowing: | |||
* '''A property's value is its own value, not anything nested inside it.''' Damage is stored as <code>{ "Value": 90, "Scale": { "Type": "spirit" } }</code>, so <code>Damage:90</code> matches it but <code>Damage:spirit</code> does not, the <code>spirit</code> sits on a different property. Use <code>Damage.Scale.Type:spirit</code> for that. | |||
* '''Paths step through lists.''' <code>Upgrades.Damage</code> matches if ''any'' upgrade has a Damage value; <code>Upgrades.1.Damage</code> checks only the first upgrade. | |||
Latest revision as of 00:13, 10 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" } }, soDamage:90matches it butDamage:spiritdoes not, thespiritsits on a different property. UseDamage.Scale.Type:spiritfor that. - Paths step through lists.
Upgrades.Damagematches if any upgrade has a Damage value;Upgrades.1.Damagechecks only the first upgrade.