zenno/doc/mdb: document skills
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed

This commit is contained in:
2026-09-07 16:09:10 -04:00
parent 8946091b93
commit 8850dd4a08
+456
View File
@@ -1,7 +1,139 @@
<script lang="ts">
import * as skill from '$lib/data/skill';
import Article from '../Article.svelte';
import Sec from '../Sec.svelte';
import Mono from '../Mono.svelte';
import { onMount } from 'svelte';
import { SvelteMap } from 'svelte/reactivity';
import Skill from '$lib/Skill.svelte';
import { resolve } from '$app/paths';
let skillMap = new SvelteMap<number, skill.Skill>();
onMount(async () => {
const sk = await skill.skills();
skillMap.clear();
for (const s of sk) {
skillMap.set(s.skill_id, s);
}
});
const skills = $derived({
rickey: skillMap.get(100981),
fall2: skillMap.get(200191),
fall1: skillMap.get(200192),
fallX: skillMap.get(200193),
fallR: skillMap.get(200194),
g1Averse: skillMap.get(200311),
focus: skillMap.get(200432),
restraint: skillMap.get(202161),
oppression: skillMap.get(202362),
});
const fallGroup = $derived(skills.fall1?.group);
const skillCategories = [
[5, 'Unique'],
[0, 'Passive'],
[1, 'Early-Race'],
[2, 'Mid-Race'],
[3, 'Late-Race'],
[4, 'Anytime'],
] as const;
const tagMeanings: [number, string][] = [
[101, 'Front Runner'],
[102, 'Pace Chaser'],
[103, 'Late Surger'],
[104, 'End Closer'],
[201, 'Sprint'],
[202, 'Mile'],
[203, 'Medium'],
[204, 'Long'],
[301, 'Early-Race'],
[302, 'Mid-Race'],
[303, 'Late-Race'],
[401, 'Affects speed stat or velocity'],
[402, 'Affects stamina stat or HP'],
[403, 'Affects power stat, acceleration, or lane movement speed'],
[404, 'Affects guts stat'],
[405, 'Affects wit stat or vision'],
[406, "Debuff of any type, or a main story self-debuff, or Behold Thine Emperor's Divine Might"],
[407, 'Modifies gate delay'],
[501, 'Turf'],
[502, 'Dirt'],
[601, 'Ground condition passive'],
[602, 'Weather passive'],
[603, 'Season passive'],
[604, 'Race track passive'],
[605, 'Time of day passive'],
[606, 'Exchange race passive'],
[607, 'Distance passive'],
[608, 'Corner-based passive'],
[609, 'Gate position passive'],
[610, 'Ground type passive'],
[611, 'Popularity passive'],
[612, 'Running style passive'],
[613, "Passive depending on other horses' styles or skills"],
[614, 'Base stat threshold passive'],
[615, 'Mood passive'],
[801, 'URA Finale scenario skill'],
[802, 'Unity Cup scenario skill'],
[803, 'Grand Concert scenario skill'],
[804, 'Trackblazer scenario skill'],
];
const durScalingTypes = Object.entries(skill.DURATION_SCALE_NAME).map(([id, name]) => [id, name || 'direct (no scaling)']);
const abilityTypes = [
[skill.AbilityType.Speed, 'Speed stat', '+n'],
[skill.AbilityType.Stamina, 'Stamina stat', '+n'],
[skill.AbilityType.Power, 'Power stat', '+n'],
[skill.AbilityType.Guts, 'Guts stat', '+n'],
[skill.AbilityType.Wit, 'Wit stat', '+n'],
[skill.AbilityType.Runaway, 'Become Runaway'],
[7, 'HpDecRate (unused)'],
[skill.AbilityType.Vision, 'Vision range', '+m'],
[skill.AbilityType.HP, 'HP', '+ proportion of max HP'],
[skill.AbilityType.GateDelay, 'Adjust gate delay', '×'],
[11, 'ForceOvertakeIn (unused)'],
[12, 'ForceOvertakeOut (unused)'],
[skill.AbilityType.Frenzy, 'Set Rushed duration', 's'],
[skill.AbilityType.AddGateDelay, 'Set gate delay', 's'],
[skill.AbilityType.CurrentSpeed, 'Current speed (debuffs)', '+m/s'],
[skill.AbilityType.CurrentSpeedWithDecel, 'Current speed (buffs)', '+m/s'],
[skill.AbilityType.TargetSpeed, 'Target speed', '+m/s'],
[skill.AbilityType.LaneSpeed, 'Lane change speed', '+CW/s'],
[skill.AbilityType.RushedChance, 'Rushed chance', '+ flat%'],
[30, 'PushPer (unused)'],
[skill.AbilityType.Accel, 'Acceleration', '+m/s²'],
[skill.AbilityType.AllStatus, 'All stats', '+n'],
[skill.AbilityType.LaneChange, 'Set target lane', 'CW'],
[36, 'ActivateRandomNormalAndRareSkill (unused)'],
[skill.AbilityType.ActivateRare, 'Activate rare skills', 'count'],
[38, 'Gain immunity to debuffs'],
[41, 'Activate Sympathy (?)'],
[42, 'Evolved Skill duration (?)', '× (?)'],
[48, 'Zenkai Spurt acceleration (?)', '+m/s² (?)'],
[49, 'Reactivate Unique Skill (?)'],
[501, 'Carnival Bonus effect (old)'],
[502, 'Carnival Bonus stats up'],
[503, 'Carnival Bonus mood up'],
] as const;
const valScalingTypes = Object.entries(skill.ABILITY_SCALE_NAME).map(([id, name]) => [id, name || 'direct (no scaling)']);
const addlActivateTypes = [
[0, 'none'],
[1, 'upon pass, up to three times'],
[2, 'upon activating other skills, up to three times'],
[3, 'upon activating other skills, up to twice'],
] as const;
const levelUsageTypes = [
[0, 'none', 'Hokko Tarumae and Halloween Digitan (on empty abilities)'],
[1, 'default', 'almost all abilities'],
[2, 'ignored', 'Chrono Genesis (on evo duration scaling)'],
[3, 'inverse', 'unused'],
] as const;
const sparkTypes = [
[1, 'Stat', 'spark-color-blue'],
@@ -17,6 +149,32 @@
[11, 'Style', 'spark-color-white'],
] as const;
const targetTypes = [
[skill.Target.Self, 'self'],
[skill.Target.Sympathizers, 'everyone'],
[3, 'AllOtherSelf (unused)'],
[skill.Target.InView, 'visible', 'maximum targets'],
[5, 'RandomOtherSelf (unused)'],
[6, 'Order (unused)'],
[skill.Target.Frontmost, 'frontmost', 'maximum targets'],
[8, 'furthest back (unused)'],
[skill.Target.Ahead, 'ahead of the user', 'maximum targets'],
[skill.Target.Behind, 'behind the user', 'maximum targets'],
[skill.Target.AllTeammates, 'all teammates'],
[12, 'Near (unused)'],
[13, 'SelfAndBlockFront (unused)'],
[14, 'BlockSide (unused)'],
[15, 'NearInfront (unused)'],
[16, 'NearBehind (unused)'],
[17, 'RunningStyle (unused)'],
[skill.Target.Style, 'others using the given running style', 'running style ID'],
[skill.Target.RushingAhead, 'those ahead who are Rushed'],
[skill.Target.RushingBehind, 'those behind who are Rushed'],
[skill.Target.RushingStyle, 'those using the given running style who are Rushed', 'running style ID'],
[skill.Target.Character, 'specific character', 'character ID'],
[skill.Target.Triggering, 'whosoever triggered the skill'],
] as const;
const sparkEffects = [
[1, 'Speed', 'Amount'],
[2, 'Stamina', 'Amount'],
@@ -172,6 +330,304 @@
>, but a few categories that have useful strings are missing from there.
</p>
<Sec h={2} id="skills">Skills</Sec>
<p>
Relevant <Mono>text_data</Mono> categories include 47 for skill names and 48 for skill descriptions. Otherwise, info for skills
lives in <Mono>skill_data</Mono>.
</p>
<ul class="ml-4 list-disc pb-4">
<li>Skill ID is just <Mono>id</Mono>.</li>
<li>
<Mono>rarity</Mono> is 1 for common (white) skills, 2 for rare (gold) skills, 3 for 1&star;/2&star; uniques, 4 for 3&star; uniques
of horses upgraded from 1&star; or 2&star;, and 5 for full 3&star; uniques.
</li>
<li>
<Mono>group_id</Mono> groups skills that replace each other when purchased. E.g., <Skill skill={skills.fall1} />, <Skill
skill={skills.fall2}
/>, <Skill skill={skills.fallX} />, and <Skill skill={skills.fallR} />
all have a <Mono>group_id</Mono> of {fallGroup}. Unique skills are generally alone in their groups.
</li>
<li>
<Mono>group_rate</Mono> gives the relative strength of a skill within its group. Negative (purple) skills always have a <Mono
>group_rate</Mono
> of -1. For skills that have non-purple versions (i.e. not skills like <Skill skill={skills.g1Averse} />), the base version
has a <Mono>group_rate</Mono> of 1 and each successive upgrade is 1 higher. E.g., <Skill skill={skills.fall1} /> is 1, <Skill
skill={skills.fall2}
/> is 2, <Skill skill={skills.fallR} />, and <Skill skill={skills.fallX} /> is -1. Skills that have only common and rare versions
instead assign a <Mono>group_rate</Mono> of 2 to the rare.
</li>
<li>
<Mono>grade_value</Mono> is the amount the skill adds to a horse's rating when owned. Higher tiers of skills within a group replace
the lower ones rather than adding to them, so <Skill skill={skills.fall2} /> is worth its listed grade value of 174, not <Skill
skill={skills.fall1}
/>'s 129 plus 174.
</li>
<li>
<Mono>skill_category</Mono> gives the category where the skill is listed in the skills tab at the paddock:
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Category ID</th>
<th scope="col" class="px-2">Category</th>
</tr>
</thead>
<tbody>
{#each skillCategories as [cat, name] (cat)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{cat}</td>
<td class="px-2">{name}</td>
</tr>
{/each}
</tbody>
</table>
</li>
<li>
<Mono>tag_id</Mono> gives a slash-separated list of three-digit tag values that various other mechanics can match against. E.g.,
Copano Rickey's unique skill <Skill skill={skills.rickey} /> counts the number of skills activated with tag values between 601
and 615 to determine the multiplier on its extra effects; mechanics like GL shop skills and MANT rivals match tags for running
style (101 to 104), distance (201 to 204), and/or surface (501 and 502); and I expect that support card unique effects like Mejiro
Ramonu will count "speed-increasing skills" by looking for tag 401.
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Tag ID</th>
<th scope="col" class="px-2">Inferred Meaning</th>
</tr>
</thead>
<tbody>
{#each tagMeanings as [tag, name] (tag)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{tag}</td>
<td class="px-2">{name}</td>
</tr>
{/each}
</tbody>
</table>
E.g., <Skill skill={skills.fallR} /> has a <Mono>tag_id</Mono> of <Mono>401/403/603</Mono> (as text, including the slashes). The
<a href={resolve('/doc/tagged-skills')}>tagged skills explorer</a> allows you to see skills by their tags.
</li>
<li>
For inherited unique skills, <Mono>unique_skill_id_1</Mono> holds the ID of the non-inherited version. When it is the inherited
unique from an upgraded 1&star;/2&star; horse, <Mono>unique_skill_id_2</Mono> holds the ID of the 1&star;/2&star; version of the
unique.
</li>
<li><Mono>exp_type</Mono> appears to be 1 when the skill is able to gain levels, i.e. is a unique skill.</li>
<li><Mono>activate_lot</Mono> is 1 if the skill uses a wit check.</li>
<li><Mono>disp_order</Mono> is the sort order used in the skill purchase menu.</li>
<li><Mono>icon_id</Mono> is the resource ID of the skill's icon.</li>
<li>There are quite a few other columns which may be useful but which I have not bothered to figure out.</li>
</ul>
<p>
<Mono>skill_data</Mono> additionally holds skill conditions and effects, described in the next section.
</p>
<Sec h={3} id="skill-details">Skill Details</Sec>
<p>
Skills have one or two <i>skill details</i>, also called <i>triggers</i>. The first skill detail has column names with <Mono
>_1</Mono
> appended, and the second has <Mono>_2</Mono>. Each skill detail has:
</p>
<ul class="ml-4 list-disc pb-4">
<li>
<Mono>precondition_1</Mono> (resp. <Mono>precondition_2</Mono>): Precondition text, if the skill has one, otherwise empty.
</li>
<li>
<Mono>condition_1</Mono>: Condition text. (Skills like <Skill skill={skills.restraint} /> which always activate have <Mono
>always==1</Mono
>.) If the skill has only one detail, then <Mono>condition_2</Mono> is empty.
</li>
<li>
<Mono>float_ability_time_1</Mono>: Base duration expressed in ten thousandths of a second, or -1 for passives, or 0 for
instantaneous skills (recoveries, <Skill skill={skills.focus} />).
</li>
<li>
<Mono>ability_time_usage_1</Mono>: Scaling type for the skill duration.
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type</th>
<th scope="col" class="px-2">Duration Scaling</th>
</tr>
</thead>
<tbody>
{#each durScalingTypes as [id, name] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{id}</td>
<td class="px-2">{name}</td>
</tr>
{/each}
</tbody>
</table>
GameTora and the race mechanics doc describe duration scaling types in more detail.
</li>
<li>
<Mono>float_cooldown_time_1</Mono>: Base cooldown duration expressed in ten thousandths of a second, or 5000000 (500s) for
skills with no cooldown, or 0 for passives.
</li>
<li>Columns for three <i>abilities</i>, described in the next section.</li>
</ul>
<p>
<a
href="https://hakuraku.moe/masterdata?q=WITH+RECURSIVE+condition+AS+%28%0A++++SELECT+DISTINCT+precondition_1+AS+c+FROM+skill_data%0A++++UNION%0A++++SELECT+DISTINCT+condition_1+AS+c+FROM+skill_data%0A++++UNION%0A++++SELECT+DISTINCT+precondition_2+AS+c+FROM+skill_data%0A++++UNION%0A++++SELECT+DISTINCT+condition_2+AS+c+FROM+skill_data%0A%29%2C+disj+AS+%28%0A++++SELECT%0A++++++++IIF%28INSTR%28c%2C+%27%40%27%29+%21%3D+0%2C+SUBSTR%28c%2C+1%2C+INSTR%28c%2C+%27%40%27%29-1%29%2C+c%29+AS+c%2C%0A++++++++IIF%28INSTR%28c%2C+%27%40%27%29+%21%3D+0%2C+SUBSTR%28c%2C+1+%2B+INSTR%28c%2C+%27%40%27%29%29%2C+%27%27%29+AS+rest%0A++++FROM+condition%0A++++UNION%0A++++SELECT%0A++++++++IIF%28INSTR%28rest%2C+%27%40%27%29+%21%3D+0%2C+SUBSTR%28rest%2C+1%2C+INSTR%28rest%2C+%27%40%27%29-1%29%2C+rest%29+AS+c%2C%0A++++++++IIF%28INSTR%28rest%2C+%27%40%27%29+%21%3D+0%2C+SUBSTR%28rest%2C+1+%2B+INSTR%28rest%2C+%27%40%27%29%29%2C+%27%27%29+AS+rest%0A++++FROM+disj%0A++++WHERE+rest+%21%3D+%27%27%0A%29%2C+term+AS+%28%0A++++SELECT%0A++++++++IIF%28INSTR%28c%2C+%27%26%27%29+%21%3D+0%2C+SUBSTR%28c%2C+1%2C+INSTR%28c%2C+%27%26%27%29-1%29%2C+c%29+AS+term%2C%0A++++++++IIF%28INSTR%28c%2C+%27%26%27%29+%21%3D+0%2C+SUBSTR%28c%2C+1+%2B+INSTR%28c%2C+%27%26%27%29%29%2C+%27%27%29+AS+rest%0A++++FROM+disj%0A++++UNION%0A++++SELECT%0A++++++++IIF%28INSTR%28rest%2C+%27%26%27%29+%21%3D+0%2C+SUBSTR%28rest%2C+1%2C+INSTR%28rest%2C+%27%26%27%29-1%29%2C+rest%29+AS+term%2C%0A++++++++IIF%28INSTR%28rest%2C+%27%26%27%29+%21%3D+0%2C+SUBSTR%28rest%2C+1+%2B+INSTR%28rest%2C+%27%26%27%29%29%2C+%27%27%29+AS+rest%0A++++FROM+term%0A++++WHERE+rest+%21%3D+%27%27%0A%29%2C+op+AS+%28%0A++++SELECT%0A++++++++term%2C%0A++++++++CASE%0A++++++++++++WHEN+INSTR%28term%2C+%27%3D%3D%27%29+%21%3D+0+THEN+%27%3D%3D%27%0A++++++++++++WHEN+INSTR%28term%2C+%27%21%3D%27%29+%21%3D+0+THEN+%27%21%3D%27%0A++++++++++++WHEN+INSTR%28term%2C+%27%3C%3D%27%29+%21%3D+0+THEN+%27%3C%3D%27%0A++++++++++++WHEN+INSTR%28term%2C+%27%3E%3D%27%29+%21%3D+0+THEN+%27%3E%3D%27%0A++++++++++++WHEN+INSTR%28term%2C+%27%3C%27%29+%21%3D+0+THEN+%27%3C%27%0A++++++++++++WHEN+INSTR%28term%2C+%27%3E%27%29+%21%3D+0+THEN+%27%3E%27%0A++++++++END+AS+op%0A++++FROM+term+WHERE+term+%21%3D+%27%27%0A%29%2C+type_op_arg+AS+%28%0A++++SELECT+DISTINCT%0A++++++++term%2C%0A++++++++SUBSTR%28term%2C+1%2C+INSTR%28term%2C+op%29+-+1%29+AS+%22type%22%2C%0A++++++++op%2C%0A++++++++CAST%28SUBSTR%28term%2C+INSTR%28term%2C+op%29+%2B+LENGTH%28op%29%29+AS+INTEGER%29+AS+arg%0A++++FROM+op%0A%29%0ASELECT+DISTINCT+type%2C+op%2C+arg+FROM+type_op_arg%0AORDER+BY+type%2C+op%2C+arg"
target="_blank"
rel="noopener noreferrer"
>
This SQL query
</a>
parses all conditions and preconditions to obtain all distinct combinations of skill condition types, operators, and arguments.
This may be useful to tool authors.
</p>
<Sec h={3} id="skill-abilities">Skill Abilities</Sec>
<p>
Each skill detail has up to three abilities, all of which apply for as long as the skill detail is active (except for
AdditionalActivate abilities). Column names append <Mono>_1</Mono>, <Mono>_2</Mono>, or <Mono>_3</Mono> after the skill detail's
own number.
</p>
<ul class="ml-4 list-disc pb-4">
<li>
<Mono>ability_type_1_1</Mono> (resp. <Mono>ability_type_1_2</Mono>, <Mono>ability_type_1_3</Mono>, <Mono
>ability_type_2_1</Mono
>, <Mono>ability_type_2_2</Mono>, <Mono>ability_type_2_3</Mono>) define what simulation parameter the ability affects.
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type</th>
<th scope="col" class="px-2">Effect</th>
<th scope="col" class="px-2">Value Units</th>
</tr>
</thead>
<tbody>
{#each abilityTypes as [typ, name, units] (typ)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{typ}</td>
<td class="px-2">{name}</td>
<td class="px-2">{units}</td>
</tr>
{/each}
</tbody>
</table>
Types with (?) don't exist in my decomp but are used on skills in the copy of the JP mdb that I have, which I'm told is "from
like 3 weeks ago" at the time of writing. Those marked (unused) do exist in the decomp, but are not used for skills even on JP.
</li>
<li>
<Mono>ability_value_usage_1_1</Mono> defines special scaling for the ability's value.
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type</th>
<th scope="col" class="px-2">Value Scaling</th>
</tr>
</thead>
<tbody>
{#each valScalingTypes as [id, name] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{id}</td>
<td class="px-2">{name}</td>
</tr>
{/each}
</tbody>
</table>
GameTora describes value scaling types in more detail. (The race mechanics doc is missing most of them.)
</li>
<li>
<Mono>additional_activate_type_1_1</Mono> indicates abilities that only activate on additional events while the skill detail is
active.
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type</th>
<th scope="col" class="px-2">Meaning</th>
</tr>
</thead>
<tbody>
{#each addlActivateTypes as [id, name] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{id}</td>
<td class="px-2">{name}</td>
</tr>
{/each}
</tbody>
</table>
</li>
<li>
<Mono>ability_value_level_usage_1_1</Mono> indicates how the ability scales with skill level (i.e. unique level, not double circle
vs single circle).
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type</th>
<th scope="col" class="px-2">Meaning</th>
<th scope="col" class="px-2">Instances</th>
</tr>
</thead>
<tbody>
{#each levelUsageTypes as [id, name, inst] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{id}</td>
<td class="px-2">{name}</td>
<td class="px-2">{inst}</td>
</tr>
{/each}
</tbody>
</table>
</li>
<li>
<Mono>float_ability_value_1_1</Mono> is the base magnitude of the ability's effect, expressed in ten thousandths.
</li>
<li>
<Mono>target_type_1_1</Mono> describes which umas the skill targets. It takes <Mono>target_value_1_1</Mono> as an argument.
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type</th>
<th scope="col" class="px-2">Meaning</th>
<th scope="col" class="px-2">Argument</th>
</tr>
</thead>
<tbody>
{#each targetTypes as [id, name, arg] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{id}</td>
<td class="px-2">{name}</td>
<td class="px-2">{arg}</td>
</tr>
{/each}
</tbody>
</table>
Skills that take maximum targets as an argument use a <Mono>target_value_1_1</Mono> of 18 to mean unlimited. Type 23 is internally
named <Mono>ActivateHealSkill</Mono>, so it may instead mean something like "horses who activated a heal skill this frame."
It is only used for <Skill skill={skills.oppression} /> and its gold.
</li>
</ul>
<Sec h={3} id="skill-scaling">Skill Level Scaling</Sec>
<p>
The table <Mono>skill_level_value</Mono> defines the coefficients by which each ability's value scales with unique level. Curiously,
it defines coefficients up to <Mono>level = 10</Mono> for each <Mono>ability_type</Mono>, even though the maximum achievable
level is 6.
</p>
<p>
The <Mono>float_ability_value_coef</Mono> column is a multiplier on the corresponding skill ability type's <Mono
>float_ability_value_?_?</Mono
>, expressed in ten thousandths.
</p>
<Sec h={3} id="skill-sp">Skill Points</Sec>
<p>
The table <Mono>single_mode_skill_need_point</Mono> lists the SP cost of each skill.
</p>
<ul class="ml-4 list-disc pb-4">
<li><Mono>id</Mono> is the skill ID.</li>
<li><Mono>need_skill_point</Mono> is the SP cost.</li>
<li><Mono>status_type</Mono> and <Mono>status_value</Mono> are always zero.</li>
<li>
<Mono>solvable_type</Mono> is nonzero for some negative (purple) skills that are applied and later healed during careers, for
Sweep Tosho, Air Shakur, and Daitaku Helios. Some other JP negative skills that GameTora has no source information for also have
it.
</li>
</ul>
<Sec h={2} id="sparks">Sparks</Sec>
<p>
Internally called succession factors. Relevant <Mono>text_data</Mono> categories include 147 for spark names and 172 for spark descriptions,