Files
horse/zenno/src/routes/doc/mdb/+page.svelte
T

585 lines
24 KiB
Svelte

<script lang="ts">
import Article from '../Article.svelte';
import Sec from '../Sec.svelte';
import Mono from '../Mono.svelte';
const sparkTypes = [
[1, 'Stat', 'spark-color-blue'],
[2, 'Aptitude', 'spark-color-pink'],
[3, 'Unique', 'spark-color-green'],
[4, 'Skill', 'spark-color-white'],
[5, 'Race', 'spark-color-white'],
[6, 'Scenario', 'spark-color-white'],
[7, 'Carnival Bonus', 'spark-color-red'],
[8, 'Distance', 'spark-color-white'],
[9, 'Hidden', 'spark-color-white'],
[10, 'Surface', 'spark-color-white'],
[11, 'Style', 'spark-color-white'],
] as const;
const sparkEffects = [
[1, 'Speed', 'Amount'],
[2, 'Stamina', 'Amount'],
[3, 'Power', 'Amount'],
[4, 'Guts', 'Amount'],
[5, 'Wit', 'Amount'],
[6, 'Skill Points', 'Amount'],
[7, 'Random Stat', 'Amount', '(always 1)'],
[11, 'Turf Aptitude', 'Levels'],
[12, 'Dirt Aptitude', 'Levels'],
[21, 'Front Runner Aptitude', 'Levels'],
[22, 'Pace Chaser Aptitude', 'Levels'],
[23, 'Late Surger Aptitude', 'Levels'],
[24, 'End Closer Aptitude', 'Levels'],
[31, 'Sprint Aptitude', 'Levels'],
[32, 'Mile Aptitude', 'Levels'],
[33, 'Medium Aptitude', 'Levels'],
[34, 'Long Aptitude', 'Levels'],
[41, 'Skill Hint', 'Skill ID', 'Hint Levels'],
[51, 'Carnival Bonus', 'Skill ID', '(always 1)'],
[61, 'Max Speed', 'Amount'],
[62, 'Max Stamina', 'Amount'],
[63, 'Max Power', 'Amount'],
[64, 'Max Guts', 'Amount'],
[65, 'Max Wit', 'Amount'],
] as const;
const lovelySpringBreeze = [
[1469, 107401, 1, 41, 900741, 1],
[2521, 107401, 1, 62, 1, 0],
[2523, 107401, 1, 64, 1, 0],
[2522, 107401, 1, 65, 1, 0],
[1470, 107401, 2, 41, 900741, 2],
[2524, 107401, 2, 62, 2, 0],
[2526, 107401, 2, 64, 1, 0],
[2525, 107401, 2, 65, 1, 0],
[1471, 107401, 3, 41, 900741, 2],
[2528, 107401, 3, 62, 2, 0],
[2530, 107401, 3, 64, 1, 0],
[2529, 107401, 3, 65, 2, 0],
[2527, 107401, 4, 41, 900741, 3],
[2532, 107401, 4, 62, 2, 0],
[2534, 107401, 4, 64, 2, 0],
[2533, 107401, 4, 65, 2, 0],
] as const;
const successionInitialFactor = [
[1, 1, 1, 0, 5],
[2, 1, 2, 0, 12],
[3, 1, 3, 0, 21],
[4, 2, 1, 3, 1],
[5, 2, 4, 6, 2],
[6, 2, 7, 9, 3],
[7, 2, 10, 999, 4],
[8, 1, 1, 1, 4],
[9, 1, 2, 1, 9],
[10, 1, 3, 1, 16],
[11, 3, 1, 1, 0],
[12, 3, 2, 2, 0],
[13, 3, 3, 4, 0],
] as const;
const supportCardEffects = [
[1, 'Friendship Bonus'],
[2, 'Mood Effect'],
[3, 'Speed Bonus'],
[4, 'Stamina Bonus'],
[5, 'Power Bonus'],
[6, 'Guts Bonus'],
[7, 'Wit Bonus'],
[8, 'Training Effectiveness'],
[9, 'Initial Speed'],
[10, 'Initial Stamina'],
[11, 'Initial Power'],
[12, 'Initial Guts'],
[13, 'Initial Wit'],
[14, 'Initial Friendship Gauge'],
[15, 'Race Bonus'],
[16, 'Fan Bonus'],
[17, 'Hint Levels'],
[18, 'Hint Frequency'],
[19, 'Specialty Priority'],
[20, 'Max Speed'],
[21, 'Max Stamina'],
[22, 'Max Power'],
[23, 'Max Guts'],
[24, 'Max Wit'],
[25, 'Event Recovery'],
[26, 'Event Effectiveness'],
[27, 'Failure Protection'],
[28, 'Energy Cost Reduction'],
[29, 'Minigame Effectiveness'],
[30, 'Skill Point Bonus'],
[31, 'Wit Friendship Recovery'],
] as const;
</script>
<Article>
{#snippet head()}
<Sec h={1} id="top" class="text-center">Master Data</Sec>
<p>
This article is my personal notes on Umamusume's master data, a.k.a. master.mdb or just "the mdb." Most of the notes are
oriented toward my work on this website. It is an in-progress translation of <a
href="https://git.sunturtle.xyz/zephyr/horse/src/branch/main/doc">my broader but more sparse notes</a
>
into a more agreeable, navigable, and consistent form.
</p>
<p>
master.mdb is an SQLite database that the game downloads to your device. On Windows, you can find it at <Mono
>%USERPROFILE%\AppData\LocalLow\Cygames\Umamusume\master\master.mdb</Mono
>. Hakuraku has a
<a href="https://hakuraku.moe/masterdata" target="_blank" rel="noopener noreferrer">master data explorer</a> that you can use
on the website.
</p>
<p>
Generally speaking, I am only documenting what I feel is important, both in terms of tables and columns. That does
occasionally include documenting some things as being unimportant.
</p>
<p>
Roughly speaking, master data contains all the numbers needed to display the game's user interface, including during races.
Skill data, support card effects, Grand Concert lesson definitions, and so on are in there. If trying to access some data
in-game shows a "Connecting..." indicator while it loads, it probably isn't in the mdb. Notably, this includes everything
related to career event outcomes. (Event information on sites like GameTora and GameWith are massive crowd-sourced efforts.)
</p>
<p>
This document is oriented toward programmers with understanding of SQL databases. Mentions of <Mono>Gallop::</Mono> are references
to types visible in decompilations of the game, but no C# knowledge is needed.
</p>
{/snippet}
<Sec h={2} id="text_data">text_data</Sec>
<p>
The <Mono>text_data</Mono> table contains most non-story strings in the game. Queries look up entries by <Mono>category</Mono> and
<Mono>index</Mono>, i.e. <Mono>SELECT "text" FROM text_data WHERE category=? AND "index"=?</Mono>.
</p>
<p>Some important categories:</p>
<ul class="ml-4 list-disc pb-4">
<li>6 is character names, 4 is [variant] character name, 5 is [variant], 14 is clothing names.</li>
<li>47 is skill names, 48 is skill descriptions.</li>
<li>75 is support card names including variant, 76 is support card variant, 77 is support card character.</li>
<li>147 is spark names, 172 is spark descriptions.</li>
<li>33 is race name by race ID, 28 is race name by race instance ID, 31 is race courses, 111 is saddle names.</li>
<li>65 is player titles, 66 is title descriptions.</li>
<li>
119 is scenario full titles (e.g. <Mono>The Beginning: URA Finale</Mono>), 120 is scenario descriptions, 237 is scenario
names (e.g. <Mono>URA Finale</Mono>).
</li>
<li>130 is epithet names, 131 is epithet descriptions.</li>
</ul>
<p>
Other categories are usually easy enough to figure out by inspection. Text data categories have proper names given in <Mono
>Gallop::MasterString.Category</Mono
>, but a few categories that have useful strings are missing from there.
</p>
<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,
both indexed by factor ID.
</p>
<Sec h={3} id="succession_factor">Spark Data</Sec>
<p>Queries should join with <Mono>succession_factor</Mono> inside.</p>
<ul class="ml-4 list-disc pb-4">
<li>Spark ID is <Mono>factor_id</Mono>. This identifies the combination of spark variety and its star level.</li>
<li>
<Mono>factor_group_id</Mono> gives the variety. E.g., the star levels of the February S. spark are factor IDs 1000101, 1000102,
and 1000103, but all three have group ID 10001.
</li>
<li><Mono>rarity</Mono> is the star level, 1-indexed.</li>
<li><Mono>grade</Mono> is 2 for unique (green) sparks and 1 otherwise.</li>
<li>
<Mono>factor_type</Mono> is roughly the color type of the spark plus extra subdivisions for white sparks:
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type ID</th>
<th scope="col" class="px-2">Spark Type</th>
<th scope="col" class="px-2">Color</th>
</tr>
</thead>
<tbody>
{#each sparkTypes as [typ, name, cls] (typ)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{typ}</td>
<td>{name}</td>
<td><div class={['bg-spark mx-auto h-4 w-4 border', cls]}></div></td>
</tr>
{/each}
</tbody>
</table>
Types 8 and above should release with 4anni.
</li>
<li>
<Mono>effect_group_id</Mono> may give something like the distribution of spark effects. For current Global data, it's in bijection
with <Mono>factor_type</Mono> &times; <Mono>rarity</Mono>. It doesn't join with anything else in the mdb.
</li>
</ul>
<Sec h={3} id="succession_factor_effect">Spark Effects</Sec>
<p>
<Mono>succession_factor_effect</Mono> defines all possible effects that each spark can yield (but not their distributions). Effects
are organized by <Mono>factor_group_id</Mono> rather than by <Mono>factor_id</Mono>, which implies to some degree that all
star levels of a given spark have the same possible results with different distributions, although it is possible that some
values have zero probability for some star levels.
</p>
<p>
The process by which the game determines the effects of a given spark proc during (Classic and Senior) inspiration is as
follows, or semantically equivalent.
</p>
<ol class="ml-4 list-decimal pb-4">
<li>
The server chooses a random <Mono>effect_id</Mono> from the hidden distribution for the spark's <Mono>effect_group_id</Mono
>.
</li>
<li>
The client (and server) selects <i>all</i> rows matching the spark's <Mono>factor_group_id</Mono> and the random rolled <Mono
>effect_id</Mono
>, i.e. <Mono
>SELECT target_type, value_1, value_2 FROM succession_factor_effect WHERE factor_group_id = $current_spark_factor_group_id
AND effect_id = $random_choice_effect</Mono
>. There may be several such effects.
</li>
<li>
For each result row, apply the effect according to the <Mono>target_type</Mono>, with <Mono>value_1</Mono> and <Mono
>value_2</Mono
> as its possible arguments:
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2"><Mono>target_type</Mono></th>
<th scope="col" class="px-2">Description</th>
<th scope="col" class="px-2"><Mono>value_1</Mono> Usage</th>
<th scope="col" class="px-2"><Mono>value_2</Mono> Usage</th>
</tr>
</thead>
<tbody>
{#each sparkEffects as [target, name, val1, val2] (target)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{target}</td>
<td>{name}</td>
<td>{val1}</td>
<td>{val2}</td>
</tr>
{/each}
</tbody>
</table>
When effect 41 applies to a skill which is already at its maximum hint value (including from previous spark procs in the same
inspiration), a small amount (1-5, perhaps?) of some number (one? two?) of random stats is applied instead, but the details of
this are not known.
</li>
</ol>
<p>
E.g., <a
href="https://hakuraku.moe/masterdata?q=SELECT+*+FROM+%22succession_factor_effect%22+WHERE+factor_group_id+%3D+107401+ORDER+BY+factor_group_id%2C+effect_id%2C+target_type"
target="_blank"
rel="noopener noreferrer">all <Mono>succession_factor_effect</Mono> data for Lovely Spring Breeze</a
> (Mejiro Bright's green spark) is:
</p>
<table class="mb-4 table-fixed border text-center">
<caption><Mono>succession_factor_effect</Mono></caption>
<thead>
<tr>
<th scope="col" class="px-2"><Mono>id</Mono></th>
<th scope="col" class="px-2"><Mono>factor_group_id</Mono></th>
<th scope="col" class="px-2"><Mono>effect_id</Mono></th>
<th scope="col" class="px-2"><Mono>target_type</Mono></th>
<th scope="col" class="px-2"><Mono>value_1</Mono></th>
<th scope="col" class="px-2"><Mono>value_2</Mono></th>
</tr>
</thead>
<tbody>
{#each lovelySpringBreeze as [id, group, effect, typ, val1, val2] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{id}</td>
<td>{group}</td>
<td>{effect}</td>
<td>{typ}</td>
<td>{val1}</td>
<td>{val2}</td>
</tr>
{/each}
</tbody>
</table>
<p>
When the spark procs, the server rolls an effect ID of 1, 2, 3, or 4 according to some hidden distribution, then it applies
all four effects with that effect ID.
</p>
<Sec h={3} id="succession_initial_factor">Initial Inspiration Effects</Sec>
<p>
<Mono>succession_initial_factor</Mono> defines thresholds for initial inspiration, i.e. the immediate effects of sparks upon starting
a run. There is not much consistency to its format, but it has only thirteen rows, reproduced here.
</p>
<table class="mb-4 table-fixed border text-center">
<caption><Mono>succession_initial_factor</Mono></caption>
<thead>
<tr>
<th scope="col" class="px-2"><Mono>id</Mono></th>
<th scope="col" class="px-2"><Mono>factor_type</Mono></th>
<th scope="col" class="px-2"><Mono>value_1</Mono></th>
<th scope="col" class="px-2"><Mono>value_2</Mono></th>
<th scope="col" class="px-2"><Mono>add_point</Mono></th>
</tr>
</thead>
<tbody>
{#each successionInitialFactor as [id, typ, val1, val2, add] (id)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{id}</td>
<td>{typ}</td>
<td>{val1}</td>
<td>{val2}</td>
<td>{add}</td>
</tr>
{/each}
</tbody>
</table>
<p>
There are six rows with <Mono>factor_type = 1</Mono>, referring to blue sparks.
<Mono>value_1</Mono> refers to the star level of each individual spark.
<Mono>value_2</Mono> identifies whether the effect applies to starting stats (0) or raised max stats (1).
<Mono>add_point</Mono> is the amount to add to the respective field.
</p>
<p>
Pink sparks, i.e. <Mono>factor_type = 2</Mono>, have four rows.
<Mono>value_1</Mono> is the lower threshold of total star count, and <Mono>value_2</Mono> is the upper threshold.
<Mono>add_point</Mono> is the number of levels to raise the corresponding aptitude.
</p>
<p>
<Mono>factor_type = 3</Mono> for unique sparks has three rows.
<Mono>add_point</Mono> is always 0. The (<Mono>value_1</Mono>, <Mono>value_2</Mono>) pairs are (1, 1), (2, 2), and (3, 4), but
the meaning is unclear; all rows for this factor type were added in the 1 Jul patch that introduced raised stat caps, so one
would expect it to be related to those. (In particular, it does not appear to be related to the starting skill hints.)
</p>
<p>
In all cases, there is no direct association between the spark and its actual initial effects. They must be derived from the
spark's normal effects instead.
</p>
<Sec h={2} id="supports">Support Cards</Sec>
<p>
Relevant <Mono>text_data</Mono> categories include 75 for name including variant, 76 for variant alone, 77 for character name. Category
151 gives support card effect names, 154 gives effect descriptions, 150 gives unique effect names, and 155 gives unique effect descriptions.
</p>
<Sec h={3} id="support_card_data">Support Card Data</Sec>
<p>
Queries should join with <Mono>support_card_data</Mono> inside.
</p>
<ul class="ml-4 list-disc pb-4">
<li>Support card ID is just <Mono>id</Mono>.</li>
<li>
<Mono>chara_id</Mono> links to character. Implements the "no supporting yourself" and "no duplicated characters" rules.
</li>
<li><Mono>rarity</Mono> is 1 for R, 2 for SR, 3 for SSR.</li>
<li><Mono>exchange_item_id</Mono> is the type of item you get for exchanging duplicates.</li>
<li><Mono>effect_table_id</Mono> joins <Mono>support_card_effect_table</Mono>.</li>
<li><Mono>unique_effect_id</Mono> joins <Mono>support_card_unique_effect</Mono>.</li>
<li>
<Mono>command_type</Mono> is generally 1 for normal support cards and 0 for pals and groups, but Throne is 1 as well. Probably
not important.
</li>
<li>
<Mono>command_id</Mono> gives the specialty type: 101 for speed, 102 for power, 103 for guts, 105 for stamina, 106 for wit, 0
for pal and group. There is no 104.
</li>
<li><Mono>support_card_type</Mono> is 1 for normal cards, 2 for pal, 3 for group.</li>
<li>
<Mono>skill_set_id</Mono> gives the hint list via <Mono
>support_card_data sc JOIN single_mode_hint_gain h ON sc.skill_set_id = h.hint_id AND sc.support_card_id =
h.support_card_id</Mono
>. Given that you have to use the support card ID anyway, this seems redundant.
</li>
<li><Mono>outing_max</Mono> is the number of recreation events with the card, for pals and groups.</li>
<li><Mono>effect_id</Mono> is the specific instance of Pure Passion the card can grant, for groups.</li>
</ul>
<Sec h={3} id="support_card_effect_table">Support Card Effects</Sec>
<p>
<Mono>support_card_effect_table</Mono> gives progressions of support card stats. There is one row per stat per support card. Unique
effects are not included.
</p>
<ul class="ml-4 list-disc pb-4">
<li><Mono>id</Mono> joins with support card ID.</li>
<li>
<Mono>type</Mono> is the stat type (<Mono>text_data</Mono> category 151):
<table class="table-fixed border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Type ID</th>
<th scope="col" class="px-2">Effect</th>
</tr>
</thead>
<tbody>
{#each supportCardEffects as [typ, name] (typ)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td class="px-2">{typ}</td>
<td class="px-2">{name}</td>
</tr>
{/each}
</tbody>
</table>
</li>
<li>
<Mono>init</Mono> is the card's value at level 1, then there are subsequent <Mono>limit_lv5</Mono>, <Mono>limit_lv10</Mono>,
&c. up to <Mono>limit_lv50</Mono>. Each value is either a threshold value for the corresponding level, or -1 to indicate
that the value should interpolate per level between the previous positive value (defaulting to 0) and the next (defaulting
to no interpolation).
</li>
</ul>
<Sec h={3} id="support_card_unique_effect">Unique Effects</Sec>
<p>Unique effect data is in <Mono>support_card_unique_effect</Mono>.</p>
<ul class="ml-4 list-disc pb-4">
<li>
<Mono>id</Mono> joins with <Mono>support_card_data.unique_effect_id</Mono>, but it's also always the same as the support
card ID, never deduplicated or anything. (This ID is also used for unique effect name lookup, after all.)
</li>
<li><Mono>lv</Mono> gives the level at which the unique effect becomes active, one of 25, 30, 35, or 40.</li>
<li>
<Mono>type_0</Mono> and <Mono>type_1</Mono> give the effect type ID with the corresponding magnitude in <Mono>value_0</Mono> or
<Mono>value_1</Mono>, largely same as for <Mono>support_card_effect_table.type</Mono>. However, there are some extra types:
<ul class="ml-8 list-[reset]">
<li>
101 is a friendship gauge check. <Mono>value_0</Mono> is the threshold value, and then <Mono>value_0_1</Mono> and <Mono
>value_0_3</Mono
> give the effects that become active at that threshold with their magnitudes in <Mono>value_0_2</Mono> and <Mono
>value_0_4</Mono
>, respectively.
</li>
<li>
102 is Guts Bakushin's special effect of Training Effectiveness (magnitude in <Mono>value_0_1</Mono>) when both above a
friendship threshold (<Mono>value_0</Mono>) and not on her own specialty.
</li>
<li>
103 is Agnes Ditigal's special effect of Training Effectiveness (magnitude in <Mono>value_0_1</Mono>) when the deck has
at least <Mono>value_0</Mono> different colors.
</li>
<li>
104 is Narita Top Road's special effect of Training Effectiveness of maximum magnitude <Mono>value_0_1</Mono> divided by each
group of <Mono>value_0</Mono> fans.
</li>
<li>
105 is +<Mono>value_0</Mono> initial stat to the specialty of each card in the deck and +<Mono>value_0</Mono> initial all
stats per pal and group card.
</li>
<li>
106 is stacking effect per rainbow training, where <Mono>value_0</Mono> is the maximum number of stacks, <Mono
>value_0_1</Mono
> is the effect type granted by the stack, and <Mono>value_0_2</Mono> is the value per stack.
</li>
<li>
107 is scaling with how low energy is. <Mono>value_0</Mono> is obviously the effect type ID that scales, but the other parameters
are unclear. Currently only Bamboo Memory Guts has this, with <Mono>value_0_1&el;4</Mono> being (10, 30, 15, 5).
</li>
<li>
108 is scaling with maximum energy. Similar to 107, <Mono>value_0</Mono> is the effect type ID that scales, but the rest is
unclear, with values of (100, 75, 5, 20) for Pearl.
</li>
<li>
109 is scaling with total friendship across all cards. <Mono>value_0</Mono> is the effect type ID that scales, <Mono
>value_0_1</Mono
> is the amount of bond required to increase the effect by 1.
</li>
<li>
110 is scaling with the number of cards at the training. <Mono>value_0</Mono> is the effect type ID that scales, <Mono
>value_0_1</Mono
> is the amount per card.
</li>
<li>
110 is scaling with the number of cards at the training. <Mono>value_0</Mono> is the effect type ID that scales, <Mono
>value_0_1</Mono
> is the amount per card.
</li>
<li>
111 is scaling with training facility level. <Mono>value_0</Mono> is the effect type ID that scales, <Mono
>value_0_1</Mono
> is the amount per level.
</li>
<li>112 is Nakayama Festa Wit's <Mono>value_0</Mono>% chance to disable failure chance.</li>
<li>
113 is an additional effect active for rainbow training. <Mono>value_0</Mono> is the additional effect ID, <Mono
>value_0_1</Mono
> is its value.
</li>
</ul>
Certainly more types will follow.
</li>
<li>
<Mono>idle_mode_sub_rate</Mono> is uncertain, but it is likely related to Independent Training (called idle single mode internally,
where "single mode" is in turn the internal name for career). It takes only a few values:
<ul class="ml-8 list-[reset]">
<li>For unique effects that don't vary, it is always 0.</li>
<li>For those that vary with the deck composition (Agnes Digital, Satono Diamond Wit), it is 10.</li>
<li>For effects that activate with 80+ friendship, it has a value of 20.</li>
<li>
For 100+ friendship effects, fan count scaling, rainbow training stacking effects, effects scaling with energy or max
energy, scaling with number of cards trained with, scaling with training level, and scaling with total deck friendship,
it has a value of 30.
</li>
</ul>
</li>
</ul>
<Sec h={3} id="single_mode_hint_gain">Hints</Sec>
<p>
Lastly, the table <Mono>single_mode_hint_gain</Mono> lists the effects of hints during career.
</p>
<ul class="ml-4 list-disc pb-4">
<li>
<Mono>hint_id</Mono> joins with <Mono>support_card_data.skill_set_id</Mono>, but it isn't unique; e.g., Seiun Sky SR has the
same <Mono>hint_id</Mono> as prior Seiun Sky cards, despite having a different hint list. Unclear what it actually does. Doesn't
seem useful for my purposes.
</li>
<li>
<Mono>support_card_id</Mono> is effectively the lookup key.
</li>
<li>
<Mono>hint_group</Mono> ties together the results of one hint. Skill hints are generally one each, but stat hints have two or
three rows with matching hint groups.
</li>
<li>
<Mono>hint_gain_type</Mono> is 0 for skill hints and 1 for stat hints.
</li>
<li>
For skill hints, <Mono>hint_value_1</Mono> is the skill ID, and <Mono>hint_value_2</Mono> is always 1; presumably the latter could
serve as the base value of hint levels. For stat hints, <Mono>hint_value_1</Mono> is the stat ID &ndash; 1 for speed through 5
for wit, or 30 for skill points &ndash; and <Mono>hint_value_2</Mono> is the amount to add.
</li>
<li>
<Mono>group_id</Mono>, <Mono>condition_set_id</Mono>, and <Mono>priority</Mono> are only nonzero for Haru Urara Power, whose unique
effect includes "hint event effectiveness" and who has upgraded stat hints. It's unclear exactly how it works or why it takes
three columns to implement.
</li>
</ul>
</Article>
<style>
.spark-color-white {
--spark-color: #e1e2e1;
}
.spark-color-blue {
--spark-color: #37b9f4;
}
.spark-color-pink {
--spark-color: #ff78b2;
}
.spark-color-green {
--spark-color: #91d02e;
}
.spark-color-red {
--spark-color: #f46052;
}
.bg-spark {
background-color: var(--spark-color);
}
.fg-spark {
color: var(--spark-color);
}
</style>