Compare commits
6
Commits
48118efeeb
...
8faf5cadc7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8faf5cadc7 | ||
|
|
656e155625 | ||
|
|
ff07b90c73 | ||
|
|
d265c81735 | ||
|
|
998156d345 | ||
|
|
aaa7c6d5b5 |
@@ -81,25 +81,28 @@ func (a Ability) String() string {
|
|||||||
case AbilityRushedChance:
|
case AbilityRushedChance:
|
||||||
r = append(r, a.Value.String()...)
|
r = append(r, a.Value.String()...)
|
||||||
r = append(r, '%')
|
r = append(r, '%')
|
||||||
case AbilityGateDelay:
|
case AbilityGateDelay, AbilityActivateRare:
|
||||||
// This skill type in particular should be × instead of +.
|
// These skill types in particular should be × instead of +.
|
||||||
r = append(r[:len(r)-1], "×"...)
|
r = append(r[:len(r)-1], "×"...)
|
||||||
r = append(r, a.Value.String()...)
|
r = append(r, a.Value.String()...)
|
||||||
case AbilityFrenzy, AbilityAddGateDelay:
|
case AbilityFrenzy, AbilityAddGateDelay:
|
||||||
r = append(r, a.Value.String()...)
|
r = append(r, a.Value.String()...)
|
||||||
r = append(r, 's')
|
r = append(r, 's')
|
||||||
case AbilityCurrentSpeed, AbilityCurrentSpeedUp, AbilityTargetSpeed, AbilityLaneSpeed:
|
case AbilityCurrentSpeed, AbilityCurrentSpeedUp, AbilityTargetSpeed:
|
||||||
r = append(r, a.Value.String()...)
|
r = append(r, a.Value.String()...)
|
||||||
r = append(r, " m/s"...)
|
r = append(r, " m/s"...)
|
||||||
|
case AbilityLaneSpeed:
|
||||||
|
r = append(r, a.Value.String()...)
|
||||||
|
r = append(r, " CW/s"...)
|
||||||
case AbilityAccel:
|
case AbilityAccel:
|
||||||
r = append(r, a.Value.String()...)
|
r = append(r, a.Value.String()...)
|
||||||
r = append(r, " m/s²"...)
|
r = append(r, " m/s²"...)
|
||||||
case AbilityLaneChange:
|
case AbilityLaneChange:
|
||||||
// This skill type should be "to 0.5 track widths."
|
// This skill type should be "to 0.5 CW."
|
||||||
// (The only skill that has it is Dodging Danger/Sixth Sense.)
|
// (The only skill that has it is Dodging Danger/Sixth Sense.)
|
||||||
r = append(r[:len(r)-1], "to "...)
|
r = append(r[:len(r)-1], "to "...)
|
||||||
r = append(r, a.Value.String()...)
|
r = append(r, a.Value.String()...)
|
||||||
r = append(r, " track widths"...)
|
r = append(r, " CW"...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch a.Target {
|
switch a.Target {
|
||||||
@@ -119,6 +122,15 @@ func (a Ability) String() string {
|
|||||||
case 4:
|
case 4:
|
||||||
r = append(r, " End Closer"...)
|
r = append(r, " End Closer"...)
|
||||||
}
|
}
|
||||||
|
case TargetAhead, TargetBehind:
|
||||||
|
r = append(r, " to "...)
|
||||||
|
if a.TargetValue == 1 {
|
||||||
|
r = append(r, "the runner"...)
|
||||||
|
} else {
|
||||||
|
r = strconv.AppendInt(r, int64(a.TargetValue), 10)
|
||||||
|
}
|
||||||
|
r = append(r, ' ')
|
||||||
|
r = append(r, a.Target.String()...)
|
||||||
default:
|
default:
|
||||||
// For other targeting types, TargetValue is either irrelevant or limit.
|
// For other targeting types, TargetValue is either irrelevant or limit.
|
||||||
r = append(r, " to "...)
|
r = append(r, " to "...)
|
||||||
@@ -168,7 +180,8 @@ const (
|
|||||||
AbilityLaneSpeed AbilityType = 28 // Lane change speed
|
AbilityLaneSpeed AbilityType = 28 // Lane change speed
|
||||||
AbilityRushedChance AbilityType = 29 // Rushed chance
|
AbilityRushedChance AbilityType = 29 // Rushed chance
|
||||||
AbilityAccel AbilityType = 31 // Acceleration
|
AbilityAccel AbilityType = 31 // Acceleration
|
||||||
AbilityLaneChange AbilityType = 35 // Forced lane change
|
AbilityLaneChange AbilityType = 35 // Set target lane
|
||||||
|
AbilityActivateRare AbilityType = 37 // Activate rare skills
|
||||||
)
|
)
|
||||||
|
|
||||||
type AbilityValueUsage int8
|
type AbilityValueUsage int8
|
||||||
@@ -184,7 +197,8 @@ const (
|
|||||||
ValueUsageTeamWit AbilityValueUsage = 7 // scaling with team Wit
|
ValueUsageTeamWit AbilityValueUsage = 7 // scaling with team Wit
|
||||||
ValueUsageRandom AbilityValueUsage = 8 // with a random 0× to 0.04× multiplier
|
ValueUsageRandom AbilityValueUsage = 8 // with a random 0× to 0.04× multiplier
|
||||||
ValueUsageRandom2 AbilityValueUsage = 9 // with a random 0× to 0.04× multiplier
|
ValueUsageRandom2 AbilityValueUsage = 9 // with a random 0× to 0.04× multiplier
|
||||||
ValueUsageClimax AbilityValueUsage = 10 // scaling with the number of races won in training
|
ValueUsageClimax AbilityValueUsage = 10 // scaling with the number of races won in the career
|
||||||
|
ValueUsageFans AbilityValueUsage = 12 // scaling with the number of fans earned in the career
|
||||||
ValueUsageMaxStat AbilityValueUsage = 13 // scaling with the highest raw stat
|
ValueUsageMaxStat AbilityValueUsage = 13 // scaling with the highest raw stat
|
||||||
ValueUsageGreenCount AbilityValueUsage = 14 // scaling with the number of Passive skills activated
|
ValueUsageGreenCount AbilityValueUsage = 14 // scaling with the number of Passive skills activated
|
||||||
ValueUsageDistAdd AbilityValueUsage = 19 // plus extra when far from the lead
|
ValueUsageDistAdd AbilityValueUsage = 19 // plus extra when far from the lead
|
||||||
@@ -203,8 +217,8 @@ const (
|
|||||||
TargetSympathizers AbilityTarget = 2 // others with Sympathy
|
TargetSympathizers AbilityTarget = 2 // others with Sympathy
|
||||||
TargetInView AbilityTarget = 4 // others in view
|
TargetInView AbilityTarget = 4 // others in view
|
||||||
TargetFrontmost AbilityTarget = 7 // frontmost
|
TargetFrontmost AbilityTarget = 7 // frontmost
|
||||||
TargetAhead AbilityTarget = 9 // others ahead
|
TargetAhead AbilityTarget = 9 // ahead
|
||||||
TargetBehind AbilityTarget = 10 // others behind
|
TargetBehind AbilityTarget = 10 // behind
|
||||||
TargetAllTeammates AbilityTarget = 11 // all teammates
|
TargetAllTeammates AbilityTarget = 11 // all teammates
|
||||||
TargetStyle AbilityTarget = 18 // using style
|
TargetStyle AbilityTarget = 18 // using style
|
||||||
TargetRushingAhead AbilityTarget = 19 // rushing others ahead
|
TargetRushingAhead AbilityTarget = 19 // rushing others ahead
|
||||||
|
|||||||
@@ -74,6 +74,11 @@ export const PAGES = {
|
|||||||
description:
|
description:
|
||||||
"Interactive adaptation of KuromiAK's race mechanics documentation for easier visualization of how mechanics scale.",
|
"Interactive adaptation of KuromiAK's race mechanics documentation for easier visualization of how mechanics scale.",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
route: resolve('/doc/mdb'),
|
||||||
|
name: 'Master Data',
|
||||||
|
description: "Notes on exploration of Umamusume's local database.",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
route: resolve('/doc/spark'),
|
route: resolve('/doc/spark'),
|
||||||
name: 'Spark Explorer',
|
name: 'Spark Explorer',
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ export enum AbilityValueUsage {
|
|||||||
Random1 = 8,
|
Random1 = 8,
|
||||||
Random2 = 9,
|
Random2 = 9,
|
||||||
Climax = 10,
|
Climax = 10,
|
||||||
|
Fans = 12,
|
||||||
MaxStat = 13,
|
MaxStat = 13,
|
||||||
GreenCount = 14,
|
GreenCount = 14,
|
||||||
DistAdd = 19,
|
DistAdd = 19,
|
||||||
@@ -199,7 +200,8 @@ export const ABILITY_SCALE_NAME: Readonly<Record<AbilityValueUsage, string>> = {
|
|||||||
[AbilityValueUsage.TeamWit]: 'scaling with team Wit',
|
[AbilityValueUsage.TeamWit]: 'scaling with team Wit',
|
||||||
[AbilityValueUsage.Random1]: 'with a random 0× to 0.04× multiplier',
|
[AbilityValueUsage.Random1]: 'with a random 0× to 0.04× multiplier',
|
||||||
[AbilityValueUsage.Random2]: 'with a random 0× to 0.04× mulitplier',
|
[AbilityValueUsage.Random2]: 'with a random 0× to 0.04× mulitplier',
|
||||||
[AbilityValueUsage.Climax]: 'scaling with the number of races won in training',
|
[AbilityValueUsage.Climax]: 'scaling with the number of races won in the career',
|
||||||
|
[AbilityValueUsage.Fans]: 'scaling with fans earned in the career',
|
||||||
[AbilityValueUsage.MaxStat]: 'scaling with the highest raw stat',
|
[AbilityValueUsage.MaxStat]: 'scaling with the highest raw stat',
|
||||||
[AbilityValueUsage.GreenCount]: 'scaling with the number of Passive skills activated',
|
[AbilityValueUsage.GreenCount]: 'scaling with the number of Passive skills activated',
|
||||||
[AbilityValueUsage.DistAdd]: 'plus extra when far from the lead',
|
[AbilityValueUsage.DistAdd]: 'plus extra when far from the lead',
|
||||||
@@ -257,8 +259,8 @@ export const TARGET_FORMAT: Readonly<Record<Target, (v?: number) => string>> = {
|
|||||||
[Target.Sympathizers]: () => 'to others with Sympathy',
|
[Target.Sympathizers]: () => 'to others with Sympathy',
|
||||||
[Target.InView]: (v) => targetn(v!, 'in view'),
|
[Target.InView]: (v) => targetn(v!, 'in view'),
|
||||||
[Target.Frontmost]: (v) => targetn(v!, 'at the front', 'the frontmost'),
|
[Target.Frontmost]: (v) => targetn(v!, 'at the front', 'the frontmost'),
|
||||||
[Target.Ahead]: (v) => targetn(v!, 'ahead'),
|
[Target.Ahead]: (v) => targetn(v!, 'ahead', 'to the runner ahead'),
|
||||||
[Target.Behind]: (v) => targetn(v!, 'behind'),
|
[Target.Behind]: (v) => targetn(v!, 'behind', 'to the runner behind'),
|
||||||
[Target.AllTeammates]: () => 'to all teammates',
|
[Target.AllTeammates]: () => 'to all teammates',
|
||||||
[Target.Style]: (v) => stylename(v!, 'all'),
|
[Target.Style]: (v) => stylename(v!, 'all'),
|
||||||
[Target.RushingAhead]: (v) => targetn(v!, 'rushing ahead'),
|
[Target.RushingAhead]: (v) => targetn(v!, 'rushing ahead'),
|
||||||
@@ -379,7 +381,7 @@ export const TAGS = [
|
|||||||
{ name: 'URA', tag: 801 },
|
{ name: 'URA', tag: 801 },
|
||||||
{ name: 'Unity Cup', tag: 802 },
|
{ name: 'Unity Cup', tag: 802 },
|
||||||
{ name: 'Trackblazer', tag: 804 },
|
{ name: 'Trackblazer', tag: 804 },
|
||||||
// { name: 'Our Grand Concert', tag: ? },
|
{ name: 'Our Grand Concert', tag: 803 },
|
||||||
// { name: 'Grand Masters', tag: ? },
|
// { name: 'Grand Masters', tag: ? },
|
||||||
// { name: "Project L'Arc", tag: ? },
|
// { name: "Project L'Arc", tag: ? },
|
||||||
// { name: 'U.A.F.', tag: ? },
|
// { name: 'U.A.F.', tag: ? },
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import type { SvelteHTMLElements } from 'svelte/elements';
|
||||||
|
|
||||||
|
let { children, ...rest }: SvelteHTMLElements['span'] = $props();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<span class="bg-mist-300 font-mono hyphens-none dark:bg-mist-900" {...rest}>
|
||||||
|
{@render children?.()}
|
||||||
|
</span>
|
||||||
@@ -0,0 +1,257 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Article from '../Article.svelte';
|
||||||
|
import Sec from '../Sec.svelte';
|
||||||
|
import Mono from '../Mono.svelte';
|
||||||
|
|
||||||
|
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="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>
|
||||||
|
<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>
|
||||||
|
<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>
|
||||||
|
<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⪙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 20% 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>
|
||||||
|
</Article>
|
||||||
Reference in New Issue
Block a user