{#snippet head()} Master Data

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 my broader but more sparse notes into a more agreeable, navigable, and consistent form.

master.mdb is an SQLite database that the game downloads to your device. On Windows, you can find it at %USERPROFILE%\AppData\LocalLow\Cygames\Umamusume\master\master.mdb. Hakuraku has a master data explorer that you can use on the website.

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.

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.)

Since I see this question about weekly, allow me to reiterate.

Support card event outcomes are not in master.mdb or any other locally stored file. Not even the list of possible skills.

This document is oriented toward programmers with understanding of SQL databases. Mentions of Gallop:: are references to types visible in decompilations of the game, but no C# knowledge is needed.

{/snippet} text_data

The text_data table contains most non-story strings in the game. Queries look up entries by category and index, i.e. SELECT "text" FROM text_data WHERE category=? AND "index"=?.

Some important categories:

Other categories are usually easy enough to figure out by inspection. Text data categories have proper names given in Gallop::MasterString.Category, but a few categories that have useful strings are missing from there.

Races

First, some terminology, as the game uses it internally. (Some UI phrasing disagrees.)

A race is an organized running competition, typically held annually. A race instance is a single holding of a race at a specific date and time; this includes special race instances like Team Trials races, Aim for the Stars races, &c. Race instances are held on a given race course, which is a fixed-length segment of a physical location called a race track. A win saddle is a given horse's victory of a race or a specific group of races, e.g. Classic Triple Crown or Dual Grand Prix. This section will cover races, race instances, race tracks, race courses, and win saddles.

text_data categories relevant to races include:

Race Info

Races are defined in race, which is quite a direct name innit.

Some races are ostensibly defined twice to account for variant races run during some characters' careers, e.g. Maruzensky's five opponent Spring Stakes, McQueen/Ryan/Rice's Kyoto Takarazuka Kinen, &c.

Race Instances

The table is race_instance.

Similarly to races, some race instances are ostensibly defined twice to account for variant races run during some characters' careers.

Race Tracks

Since race tracks are the physical locations where races are held, there are not many rows in race_track. Most of its purpose is to define appearance characteristics, but some fields are mechanically relevant.

Race Courses

Race courses are physical segments of race tracks. They are defined in race_course_set.

Most tracks have one or two turf loops (the "(Inner)" and "(Outer)" or sometimes "(Outer→Inner)") and one dirt loop. The length of a race course is determined solely by the position of the gates: since the race course is a physical structure with the audience stands in a specific location, and since said audience wants to see the race finish clearly, courses of all lengths end at the same place on the front stretch. The straight opposite the front stretch is called the backstretch. Corners are counted backward from the front stretch in the order 4, 3, 2, 1; all races except Ibis Summer Dash include corners 3 and 4, while long and sometimes medium races run corners multiple times. Some courses start on an extra segment of the track which is neither straight nor corner (which means straight_random==1 skills won't fire there).

Characteristics like straight and corner locations, slopes, lane max changes, &c. are not in the mdb. They are defined as assets instead and must be extracted using special tools.

Win Saddles

single_mode_wins_saddle defines the awards given to the horse (not the player) for winning a race or specific group of races. These are the medals displayed as important wins for a horse at the end of a career. They are now purely aesthetic, but I am documenting them anyway because I have the notes already since they used to determine affinity.

Single Mode Program

The table single_mode_program defines the race instances offered each turn in a career. Confusingly, races that permit both classic and senior year horses are only defined here once.

I was unable to identify whether any of the columns indicate maiden races, despite the UI restrictions on when they can appear.

Skills

Relevant text_data categories include 47 for skill names and 48 for skill descriptions. Otherwise, info for skills lives in skill_data.

skill_data additionally holds skill conditions and effects, described in the next section.

Skill Details

Skills have one or two skill details, also called triggers. The first skill detail has column names with _1 appended, and the second has _2. Each skill detail has:

This SQL query parses all conditions and preconditions to obtain all distinct combinations of skill condition types, operators, and arguments. This may be useful to tool authors.

Skill Abilities

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 _1, _2, or _3 after the skill detail's own number.

Skill Level Scaling

The table skill_level_value defines the coefficients by which each ability's value scales with unique level. Curiously, it defines coefficients up to level = 10 for each ability_type, even though the maximum achievable level is 6.

The float_ability_value_coef column is a multiplier on the corresponding skill ability type's float_ability_value_?_?, expressed in ten thousandths.

Skill Points

The table single_mode_skill_need_point lists the SP cost of each skill.

Sparks

Internally called succession factors. Relevant text_data categories include 147 for spark names and 172 for spark descriptions, both indexed by factor ID.

Spark Data

Queries should join with succession_factor inside.

Spark Effects

succession_factor_effect defines all possible effects that each spark can yield (but not their distributions). Effects are organized by factor_group_id rather than by factor_id, 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.

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.

  1. The server chooses a random effect_id from the hidden distribution for the spark's effect_group_id.
  2. The client (and server) selects all rows matching the spark's factor_group_id and the random rolled effect_id, i.e. 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. There may be several such effects.
  3. For each result row, apply the effect according to the target_type, with value_1 and value_2 as its possible arguments: {#each sparkEffects as [target, name, val1, val2] (target)} {/each}
    target_type Description value_1 Usage value_2 Usage
    {target} {name} {val1} {val2}
    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.

E.g., all succession_factor_effect data for Lovely Spring Breeze (Mejiro Bright's green spark) is:

{#each lovelySpringBreeze as [id, group, effect, typ, val1, val2] (id)} {/each}
succession_factor_effect
id factor_group_id effect_id target_type value_1 value_2
{id} {group} {effect} {typ} {val1} {val2}

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.

Initial Inspiration Effects

succession_initial_factor 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.

{#each successionInitialFactor as [id, typ, val1, val2, add] (id)} {/each}
succession_initial_factor
id factor_type value_1 value_2 add_point
{id} {typ} {val1} {val2} {add}

There are six rows with factor_type = 1, referring to blue sparks. value_1 refers to the star level of each individual spark. value_2 identifies whether the effect applies to starting stats (0) or raised max stats (1). add_point is the amount to add to the respective field.

Pink sparks, i.e. factor_type = 2, have four rows. value_1 is the lower threshold of total star count, and value_2 is the upper threshold. add_point is the number of levels to raise the corresponding aptitude.

factor_type = 3 for unique sparks has three rows. add_point is always 0. The (value_1, value_2) 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.)

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.

Support Cards

Relevant text_data 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.

Support card event outcomes are not in master.mdb or any other locally stored file. Not even the list of possible skills.

Support Card Data

Queries should join with support_card_data inside.

Support Card Effects

support_card_effect_table gives progressions of support card stats. There is one row per stat per support card. Unique effects are not included.

Unique Effects

Unique effect data is in support_card_unique_effect.

Hints

Lastly, the table single_mode_hint_gain lists the effects of hints during career.