10 Commits
Author SHA1 Message Date
zephyr cf00bb54c5 zenno/doc/fans: margin is displayed margin
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-10-17 21:17:42 -04:00
zephyr cdda88181f zenno/doc/fans: missed placement base fan permilles
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-10-17 14:40:55 -04:00
zephyr 57a967978b zenno: link up doc/fans
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-10-17 14:32:05 -04:00
zephyr 939012b511 doc/fans: new article for career fan gain formula
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-10-17 14:25:57 -04:00
zephyr 888a6dbf3c zenno: format 2026-10-16 23:17:29 -04:00
zephyr fb27817038 zenno: fix course tests 2026-10-16 19:06:08 -04:00
zephyr f27b9dcaa5 mdb: fix duplicated carnival bonus skill 2026-10-16 17:53:09 -04:00
zephyr 645abb2f66 mdb: exclude all unused race courses 2026-10-12 16:49:55 -04:00
zephyr cf301745f1 zenno: use a real last spurt phase 2026-10-10 13:37:12 -04:00
zephyr 3a39794312 horse: use straight front type in racecourse api 2026-10-10 13:37:12 -04:00
20 changed files with 666 additions and 1104 deletions
-188
View File
@@ -1,188 +0,0 @@
package main
import (
"context"
_ "embed"
"errors"
"fmt"
"log/slog"
"zombiezen.com/go/sqlite"
"zombiezen.com/go/sqlite/sqlitemigration"
"zombiezen.com/go/sqlite/sqlitex"
"git.sunturtle.xyz/zephyr/horse/umadump/ism"
)
const appID int32 = 0x4acedb
//go:embed schema-00.sql
var schema0 string
//go:embed schema-final.sql
var schemaFinal string
func opendb(uri, journalMode string) *sqlitemigration.Pool {
schema := sqlitemigration.Schema{
Migrations: []string{
schema0,
},
AppID: appID,
RepeatableMigration: schemaFinal,
}
j := "PRAGMA journal_mode=" + journalMode
opts := sqlitemigration.Options{
Flags: sqlite.OpenReadWrite | sqlite.OpenCreate | sqlite.OpenURI,
PrepareConn: func(conn *sqlite.Conn) error {
if journalMode == "" {
return nil
}
stmt, _, err := conn.PrepareTransient(j)
if err != nil {
return err
}
_, err = stmt.Step()
return errors.Join(err, stmt.Finalize())
},
}
db := sqlitemigration.NewPool(uri, schema, opts)
return db
}
func insert(ctx context.Context, db *sqlitemigration.Pool, log *slog.Logger, career *ism.WorkIdleSingleMode, trainerID int64) (err error) {
conn, err := db.Take(ctx)
if err != nil {
return err
}
defer db.Put(conn)
defer sqlitex.Transaction(conn)(&err)
}
//go:embed insert-career.sql
var insertCareerSQL string
func insertCareer(conn *sqlite.Conn, career *ism.WorkIdleSingleMode, trainerID int64) error {
stmt := conn.Prep(insertCareerSQL)
stmt.SetInt64("$trainer_id", trainerID)
stmt.SetInt64("$trained_chara_id", int64(career.End.Chara.SingleModeCharaID))
stmt.SetInt64("$card_id", int64(career.End.Chara.CardID))
stmt.SetInt64("$scenario_id", int64(career.End.Chara.ScenarioID))
stmt.SetInt64("$route_id", int64(career.End.Chara.RouteID))
stmt.SetText("$start_time", career.ProgressInfo.StartTime)
stmt.SetText("$end_time", career.ProgressInfo.EndTime)
stmt.SetInt64("$chara_grade", int64(career.End.Chara.CharaGrade))
stmt.SetInt64("$star_level", int64(career.End.Chara.Rarity))
stmt.SetInt64("$potential_level", int64(career.End.Chara.TalentLevel))
stmt.SetInt64("$speed", int64(career.End.Chara.Speed))
stmt.SetInt64("$stamina", int64(career.End.Chara.Stamina))
stmt.SetInt64("$power", int64(career.End.Chara.Power))
stmt.SetInt64("$guts", int64(career.End.Chara.Guts))
stmt.SetInt64("$wit", int64(career.End.Chara.Wiz))
stmt.SetInt64("$energy", int64(career.End.Chara.Vital))
stmt.SetInt64("$max_speed", int64(career.End.Chara.MaxSpeed))
stmt.SetInt64("$max_stamina", int64(career.End.Chara.MaxStamina))
stmt.SetInt64("$max_power", int64(career.End.Chara.MaxPower))
stmt.SetInt64("$max_guts", int64(career.End.Chara.MaxGuts))
stmt.SetInt64("$max_wit", int64(career.End.Chara.MaxWiz))
stmt.SetInt64("$max_energy", int64(career.End.Chara.MaxVital))
stmt.SetInt64("$skill_point", int64(career.ProgressLog.TotalSkillPoint))
stmt.SetInt64("$mood", int64(career.End.Chara.Motivation))
stmt.SetInt64("$turf", int64(career.End.Chara.ProperGroundTurf))
stmt.SetInt64("$dirt", int64(career.End.Chara.ProperGroundDirt))
stmt.SetInt64("$sprint", int64(career.End.Chara.ProperDistanceShort))
stmt.SetInt64("$mile", int64(career.End.Chara.ProperDistanceMile))
stmt.SetInt64("$medium", int64(career.End.Chara.ProperDistanceMiddle))
stmt.SetInt64("$long", int64(career.End.Chara.ProperDistanceLong))
stmt.SetInt64("$front_runner", int64(career.End.Chara.ProperRunningStyleNige))
stmt.SetInt64("$pace_chaser", int64(career.End.Chara.ProperRunningStyleSenko))
stmt.SetInt64("$late_surger", int64(career.End.Chara.ProperRunningStyleSashi))
stmt.SetInt64("$end_closer", int64(career.End.Chara.ProperRunningStyleOikomi))
stmt.SetInt64("$start_speed", int64(career.ProgressInfo.Chara.Speed))
stmt.SetInt64("$start_stamina", int64(career.ProgressInfo.Chara.Stamina))
stmt.SetInt64("$start_power", int64(career.ProgressInfo.Chara.Power))
stmt.SetInt64("$start_guts", int64(career.ProgressInfo.Chara.Guts))
stmt.SetInt64("$start_wit", int64(career.ProgressInfo.Chara.Wiz))
stmt.SetInt64("$start_max_speed", int64(career.ProgressInfo.Chara.MaxSpeed))
stmt.SetInt64("$start_max_stamina", int64(career.ProgressInfo.Chara.MaxStamina))
stmt.SetInt64("$start_max_power", int64(career.ProgressInfo.Chara.MaxPower))
stmt.SetInt64("$start_max_guts", int64(career.ProgressInfo.Chara.MaxGuts))
stmt.SetInt64("$start_max_wit", int64(career.ProgressInfo.Chara.MaxWiz))
stmt.SetInt64("$start_turf", int64(career.ProgressInfo.Chara.ProperGroundTurf))
stmt.SetInt64("$start_dirt", int64(career.ProgressInfo.Chara.ProperGroundDirt))
stmt.SetInt64("$start_sprint", int64(career.ProgressInfo.Chara.ProperDistanceShort))
stmt.SetInt64("$start_mile", int64(career.ProgressInfo.Chara.ProperDistanceMile))
stmt.SetInt64("$start_medium", int64(career.ProgressInfo.Chara.ProperDistanceMiddle))
stmt.SetInt64("$start_long", int64(career.ProgressInfo.Chara.ProperDistanceLong))
stmt.SetInt64("$start_front_runner", int64(career.ProgressInfo.Chara.ProperRunningStyleNige))
stmt.SetInt64("$start_pace_chaser", int64(career.ProgressInfo.Chara.ProperRunningStyleSenko))
stmt.SetInt64("$start_late_surger", int64(career.ProgressInfo.Chara.ProperRunningStyleSashi))
stmt.SetInt64("$start_end_closer", int64(career.ProgressInfo.Chara.ProperRunningStyleOikomi))
stmt.SetInt64("$fans", int64(career.End.Chara.Fans))
stmt.SetInt64("$race_program_id", int64(career.End.Chara.RaceProgramID))
stmt.SetInt64("$reserve_race_program_id", int64(career.End.Chara.ReserveRaceProgramID))
stmt.SetInt64("$race_running_style", int64(career.End.Chara.RaceRunningStyle))
stmt.SetInt64("$is_short_race", int64(career.End.Chara.IsShortRace))
stmt.SetInt64("$succession_trained_chara_id_1", int64(career.OldChara.SuccessionTrainedCharaID1))
stmt.SetInt64("$succession_trained_chara_id_2", int64(career.OldChara.SuccessionTrainedCharaID2))
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting race course: %w", err)
}
return nil
}
func insertConditions(conn *sqlite.Conn, cs []ism.CharaEffectLog, trainerID int64, trainedChara int32) error {
const sql = `INSERT INTO condition VALUES (?, ?, ?, ?)`
stmt := conn.Prep(sql)
stmt.BindInt64(1, trainerID)
stmt.BindInt64(2, int64(trainedChara))
for _, c := range cs {
stmt.BindInt64(3, int64(c.CharaEffectID))
stmt.BindBool(4, c.IsActive)
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting condition: %w", err)
}
}
return nil
}
//go:embed insert-gain.sql
var insertGainSQL string
func insertGain(conn *sqlite.Conn, gain *ism.IdleSingleModeGainInfo, trainerID int64, trainedChara int32, source int32) error {
stmt := conn.Prep(insertGainSQL)
stmt.SetInt64("$trainer_id", trainerID)
stmt.SetInt64("$trained_chara_id", int64(trainedChara))
stmt.SetInt64("$source", int64(source))
stmt.SetInt64("$gain_speed", int64(gain.Speed.Value))
stmt.SetInt64("$gain_stamina", int64(gain.Stamina.Value))
stmt.SetInt64("$gain_power", int64(gain.Power.Value))
stmt.SetInt64("$gain_guts", int64(gain.Guts.Value))
stmt.SetInt64("$gain_wit", int64(gain.Wiz.Value))
stmt.SetInt64("$gain_skill_point", int64(gain.SkillPoint))
stmt.SetInt64("$gain_max_speed", int64(gain.MaxSpeed))
stmt.SetInt64("$gain_max_stamina", int64(gain.MaxStamina))
stmt.SetInt64("$gain_max_power", int64(gain.MaxPower))
stmt.SetInt64("$gain_max_guts", int64(gain.MaxGuts))
stmt.SetInt64("$gain_max_wit", int64(gain.MaxWiz))
stmt.SetInt64("$gain_turf", int64(gain.ProperGroundTurf))
stmt.SetInt64("$gain_dirt", int64(gain.ProperGroundDirt))
stmt.SetInt64("$gain_sprint", int64(gain.ProperDistanceShort))
stmt.SetInt64("$gain_mile", int64(gain.ProperDistanceMile))
stmt.SetInt64("$gain_medium", int64(gain.ProperDistanceMiddle))
stmt.SetInt64("$gain_long", int64(gain.ProperDistanceLong))
stmt.SetInt64("$gain_front_runner", int64(gain.ProperRunningStyleNige))
stmt.SetInt64("$gain_pace_chaser", int64(gain.ProperRunningStyleSenko))
stmt.SetInt64("$gain_late_surger", int64(gain.ProperRunningStyleSashi))
stmt.SetInt64("$gain_end_closer", int64(gain.ProperRunningStyleOikomi))
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting gain info: %w", err)
}
return nil
}
-69
View File
@@ -1,69 +0,0 @@
INSERT INTO career VALUES (
$trainer_id,
$trained_chara_id,
$card_id,
$scenario_id,
$route_id,
$start_time,
$end_time,
$chara_grade,
$star_level,
$potential_level,
$speed,
$stamina,
$power,
$guts,
$wit,
$energy,
$max_speed,
$max_stamina,
$max_power,
$max_guts,
$max_wit,
$max_energy,
$skill_point,
$mood,
$turf,
$dirt,
$sprint,
$mile,
$medium,
$long,
$front_runner,
$pace_chaser,
$late_surger,
$end_closer,
$start_speed,
$start_stamina,
$start_power,
$start_guts,
$start_wit,
$start_max_speed,
$start_max_stamina,
$start_max_power,
$start_max_guts,
$start_max_wit,
$start_turf,
$start_dirt,
$start_sprint,
$start_mile,
$start_medium,
$start_long,
$start_front_runner,
$start_pace_chaser,
$start_late_surger,
$start_end_closer,
$fans,
$race_program_id,
$reserve_race_program_id,
$race_running_style,
$is_short_race,
$succession_trained_chara_id_1,
$succession_trained_chara_id_2
)
-31
View File
@@ -1,31 +0,0 @@
INSERT INTO gain VALUES (
$trainer_id,
$trained_chara_id,
$source,
$gain_speed,
$gain_stamina,
$gain_power,
$gain_guts,
$gain_wit,
$gain_skill_point,
$gain_max_speed,
$gain_max_stamina,
$gain_max_power,
$gain_max_guts,
$gain_max_wit,
$gain_turf,
$gain_dirt,
$gain_sprint,
$gain_mile,
$gain_medium,
$gain_long,
$gain_front_runner,
$gain_pace_chaser,
$gain_late_surger,
$gain_end_closer
)
-251
View File
@@ -1,251 +0,0 @@
CREATE TABLE IF NOT EXISTS career (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
card_id INTEGER NOT NULL,
scenario_id INTEGER NOT NULL,
route_id INTEGER NOT NULL,
start_time TEXT NOT NULL,
end_time TEXT NOT NULL,
chara_grade INTEGER NOT NULL,
star_level INTEGER NOT NULL,
potential_level INTEGER NOT NULL,
speed INTEGER NOT NULL,
stamina INTEGER NOT NULL,
power INTEGER NOT NULL,
guts INTEGER NOT NULL,
wit INTEGER NOT NULL,
energy INTEGER NOT NULL,
max_speed INTEGER NOT NULL,
max_stamina INTEGER NOT NULL,
max_power INTEGER NOT NULL,
max_guts INTEGER NOT NULL,
max_wit INTEGER NOT NULL,
max_energy INTEGER NOT NULL,
skill_point INTEGER NOT NULL,
mood INTEGER NOT NULL,
turf INTEGER NOT NULL,
dirt INTEGER NOT NULL,
sprint INTEGER NOT NULL,
mile INTEGER NOT NULL,
medium INTEGER NOT NULL,
long INTEGER NOT NULL,
front_runner INTEGER NOT NULL,
pace_chaser INTEGER NOT NULL,
late_surger INTEGER NOT NULL,
end_closer INTEGER NOT NULL,
-- These fields are 0 if the career finished while it was not actively
-- displayed on the client used to dump it.
start_speed INTEGER NOT NULL,
start_stamina INTEGER NOT NULL,
start_power INTEGER NOT NULL,
start_guts INTEGER NOT NULL,
start_wit INTEGER NOT NULL,
start_max_speed INTEGER NOT NULL,
start_max_stamina INTEGER NOT NULL,
start_max_power INTEGER NOT NULL,
start_max_guts INTEGER NOT NULL,
start_max_wit INTEGER NOT NULL,
start_turf INTEGER NOT NULL,
start_dirt INTEGER NOT NULL,
start_sprint INTEGER NOT NULL,
start_mile INTEGER NOT NULL,
start_medium INTEGER NOT NULL,
start_long INTEGER NOT NULL,
start_front_runner INTEGER NOT NULL,
start_pace_chaser INTEGER NOT NULL,
start_late_surger INTEGER NOT NULL,
start_end_closer INTEGER NOT NULL,
fans INTEGER NOT NULL,
race_program_id INTEGER NOT NULL,
reserve_race_program_id INTEGER NOT NULL,
race_running_style INTEGER NOT NULL,
is_short_race INTEGER NOT NULL,
succession_trained_chara_id_1 INTEGER NOT NULL,
succession_trained_chara_id_2 INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id)
) STRICT;
CREATE INDEX IF NOT EXISTS career_by_scenario ON career (scenario_id);
CREATE INDEX IF NOT EXISTS career_by_start_time ON career (start_time);
CREATE TABLE IF NOT EXISTS condition (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
condition INTEGER NOT NULL,
is_active INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, condition),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS gain (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
source INTEGER NOT NULL, -- 0 for events, 1 for inspiration, otherwise support card id
gain_speed INTEGER NOT NULL,
gain_stamina INTEGER NOT NULL,
gain_power INTEGER NOT NULL,
gain_guts INTEGER NOT NULL,
gain_wit INTEGER NOT NULL,
gain_skill_point INTEGER NOT NULL,
gain_max_speed INTEGER NOT NULL,
gain_max_stamina INTEGER NOT NULL,
gain_max_power INTEGER NOT NULL,
gain_max_guts INTEGER NOT NULL,
gain_max_wit INTEGER NOT NULL,
gain_turf INTEGER NOT NULL,
gain_dirt INTEGER NOT NULL,
gain_sprint INTEGER NOT NULL,
gain_mile INTEGER NOT NULL,
gain_medium INTEGER NOT NULL,
gain_long INTEGER NOT NULL,
gain_front_runner INTEGER NOT NULL,
gain_pace_chaser INTEGER NOT NULL,
gain_late_surger INTEGER NOT NULL,
gain_end_closer INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, source),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE INDEX IF NOT EXISTS gain_by_source ON gain (source);
CREATE TABLE IF NOT EXISTS gain_skill_hint (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
source INTEGER NOT NULL,
group_id INTEGER NOT NULL,
rarity INTEGER NOT NULL,
level INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, source, group_id, rarity),
FOREIGN KEY (trainer_id, trained_chara_id, source) REFERENCES gain ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS inspiration (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
year INTEGER NOT NULL,
factor_id INTEGER NOT NULL,
level INTEGER NOT NULL, -- always 0 but just in case we get it in the future
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE INDEX IF NOT EXISTS inspiration_by_career ON inspiration (trainer_id, trained_chara_id);
CREATE INDEX IF NOT EXISTS inspiration_by_factor_id ON inspiration (factor_id);
CREATE TABLE IF NOT EXISTS race_history (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
turn INTEGER NOT NULL,
program_id INTEGER NOT NULL,
weather INTEGER NOT NULL,
ground_condition INTEGER NOT NULL,
running_style INTEGER NOT NULL,
result_rank INTEGER NOT NULL,
frame_order INTEGER NOT NULL,
gained_fans INTEGER NOT NULL,
lose_tips_id INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, turn),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS race_reward (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
turn INTEGER NOT NULL,
item_type INTEGER NOT NULL,
item_id INTEGER NOT NULL,
item_num INTEGER NOT NULL,
is_bonus INTEGER NOT NULL,
is_plus_bonus INTEGER NOT NULL,
is_bonus_win INTEGER NOT NULL,
FOREIGN KEY (trainer_id, trained_chara_id, turn) REFERENCES race_history ON DELETE CASCADE
) STRICT;
CREATE INDEX IF NOT EXISTS race_reward_by_career_turn ON race_reward (trainer_id, trained_chara_id, turn);
CREATE INDEX IF NOT EXISTS race_reward_by_item ON race_reward (item_id);
CREATE TABLE IF NOT EXISTS gain_skill (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
source INTEGER NOT NULL,
skill_id INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, source, skill_id),
FOREIGN KEY (trainer_id, trained_chara_id, source) REFERENCES gain ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS career_skill (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
skill_id INTEGER NOT NULL,
level INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, skill_id),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS career_skill_hint (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
group_id INTEGER NOT NULL,
rarity INTEGER NOT NULL,
level INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, group_id, rarity),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS career_support_card (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
position INTEGER NOT NULL,
support_card_id INTEGER NOT NULL,
limit_break_count INTEGER NOT NULL,
exp INTEGER NOT NULL,
owner_viewer_id INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, position),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE,
UNIQUE (trainer_id, trained_chara_id, support_card_id)
) STRICT;
CREATE INDEX IF NOT EXISTS career_support_card_by_card ON career_support_card (support_card_id, exp);
CREATE TABLE IF NOT EXISTS start_skill (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
skill_id INTEGER NOT NULL,
level INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, skill_id),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
CREATE TABLE IF NOT EXISTS start_skill_hint (
trainer_id INTEGER NOT NULL DEFAULT 0,
trained_chara_id INTEGER NOT NULL,
group_id INTEGER NOT NULL,
rarity INTEGER NOT NULL,
level INTEGER NOT NULL,
PRIMARY KEY (trainer_id, trained_chara_id, group_id, rarity),
FOREIGN KEY (trainer_id, trained_chara_id) REFERENCES career ON DELETE CASCADE
) STRICT;
-88
View File
@@ -1,88 +0,0 @@
DROP VIEW IF EXISTS gain_event;
DROP VIEW IF EXISTS gain_inspiration;
DROP VIEW IF EXISTS gain_support_card;
CREATE VIEW gain_event AS
SELECT
trainer_id,
trained_chara_id,
gain_speed,
gain_stamina,
gain_power,
gain_guts,
gain_wit,
gain_skill_point,
gain_max_speed,
gain_max_stamina,
gain_max_power,
gain_max_guts,
gain_max_wit,
gain_turf,
gain_dirt,
gain_sprint,
gain_mile,
gain_medium,
gain_long,
gain_front_runner,
gain_pace_chaser,
gain_late_surger,
gain_end_closer
FROM gain
WHERE source = 0;
CREATE VIEW gain_inspiration AS
SELECT
trainer_id,
trained_chara_id,
gain_speed,
gain_stamina,
gain_power,
gain_guts,
gain_wit,
gain_skill_point,
gain_max_speed,
gain_max_stamina,
gain_max_power,
gain_max_guts,
gain_max_wit,
gain_turf,
gain_dirt,
gain_sprint,
gain_mile,
gain_medium,
gain_long,
gain_front_runner,
gain_pace_chaser,
gain_late_surger,
gain_end_closer
FROM gain
WHERE source = 1;
CREATE VIEW gain_support_card AS
SELECT
trainer_id,
trained_chara_id,
source AS support_card_id,
gain_speed,
gain_stamina,
gain_power,
gain_guts,
gain_wit,
gain_skill_point,
gain_max_speed,
gain_max_stamina,
gain_max_power,
gain_max_guts,
gain_max_wit,
gain_turf,
gain_dirt,
gain_sprint,
gain_mile,
gain_medium,
gain_long,
gain_front_runner,
gain_pace_chaser,
gain_late_surger,
gain_end_closer
FROM gain
WHERE source > 1;
+3 -4
View File
@@ -139,9 +139,8 @@ func spansslopes(id horse.RacecourseID, evts []courseEvent, length float32) ([]h
}
// Start of the straight.
span = horse.RacecourseSpan{
Start: evt.Distance,
Straight: true,
FarStraight: evt.Values[1] == 2,
Start: evt.Distance,
Straight: int8(evt.Values[1]),
}
// Continue out of the switch.
}
@@ -154,7 +153,7 @@ func spansslopes(id horse.RacecourseID, evts []courseEvent, length float32) ([]h
// Longchamp 1000 (which doesn't appear to actually be used but w/e)
// defines straights by their start positions only, so check for the
// previous event being a straight with no end.
if prev.Straight && prev.End == 0 {
if prev.Straight != 0 && prev.End == 0 {
spans[len(spans)-1].End = span.Start
} else {
// Otherwise, insert a new span which is neither straight nor corner.
+20 -66
View File
@@ -35,7 +35,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 0,
End: 649.9000244140625,
Straight: true,
Straight: 1,
},
{
Start: 649.9000244140625,
@@ -44,7 +44,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 650,
End: 1000,
Straight: true,
Straight: 1,
},
},
Slopes: []horse.Slope{},
@@ -64,10 +64,9 @@ func TestRacecourses(t *testing.T) {
LaneStart: [18]horse.TenThousandths{0, 555, 1111, 1666, 2222, 2777, 3333, 3888, 4444, 5333, 5888, 6444, 7000, 7555, 8111, 8666, 9222, 9777},
Spans: []horse.RacecourseSpan{
{
Start: 0,
End: 458,
Straight: true,
FarStraight: true,
Start: 0,
End: 458,
Straight: 2,
},
{
Start: 458,
@@ -82,7 +81,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 958,
End: 1450,
Straight: true,
Straight: 1,
},
{
Start: 1450,
@@ -95,10 +94,9 @@ func TestRacecourses(t *testing.T) {
Corner: 2,
},
{
Start: 1850,
End: 2300,
Straight: true,
FarStraight: true,
Start: 1850,
End: 2300,
Straight: 2,
},
{
Start: 2300,
@@ -113,7 +111,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 2797,
End: 3200,
Straight: true,
Straight: 1,
},
},
Slopes: []horse.Slope{
@@ -166,7 +164,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 0,
End: 500,
Straight: true,
Straight: 1,
},
{
Start: 500,
@@ -179,10 +177,9 @@ func TestRacecourses(t *testing.T) {
Corner: 2,
},
{
Start: 800,
End: 1300,
Straight: true,
FarStraight: true,
Start: 800,
End: 1300,
Straight: 2,
},
{
Start: 1300,
@@ -197,54 +194,12 @@ func TestRacecourses(t *testing.T) {
{
Start: 1614,
End: 2000,
Straight: true,
Straight: 1,
},
},
Slopes: []horse.Slope{},
MoveLanePoint: 500,
},
{
ID: 11203,
TrackID: 10201,
TrackName: "Longchamp",
Distance: 2400,
Ground: 1,
InOut: 1,
Turn: 1,
LaneMax: 12000,
Threshold1: 3,
Threshold2: 0,
LaneStart: [18]horse.TenThousandths{0, 555, 1111, 1666, 2222, 2777, 3333, 3888, 4444, 5000, 5555, 6111, 6666, 7222, 8811, 9366, 9922, 10477},
Spans: []horse.RacecourseSpan{
{
Start: 0,
End: 798,
Straight: true,
FarStraight: true,
},
{
Start: 798,
End: 800,
},
{
Start: 800,
End: 1200,
Corner: 3,
},
{
Start: 1200,
End: 1600,
Corner: 4,
},
{
Start: 1600,
End: 2400,
Straight: true,
},
},
Slopes: []horse.Slope{},
MoveLanePoint: 800,
},
{
ID: 11504,
TrackID: 10105,
@@ -265,7 +220,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 100,
End: 500,
Straight: true,
Straight: 1,
},
{
Start: 500,
@@ -278,10 +233,9 @@ func TestRacecourses(t *testing.T) {
Corner: 2,
},
{
Start: 900,
End: 1300,
Straight: true,
FarStraight: true,
Start: 900,
End: 1300,
Straight: 2,
},
{
Start: 1300,
@@ -296,7 +250,7 @@ func TestRacecourses(t *testing.T) {
{
Start: 1700,
End: 2000,
Straight: true,
Straight: 1,
},
},
Slopes: []horse.Slope{
+3 -2
View File
@@ -17,6 +17,7 @@ FROM race_course_set c
JOIN track ON c.race_track_id = track.id
JOIN race_track t ON c.race_track_id = t.id
LEFT JOIN race_course_set_status ss ON c.course_set_status_id = ss.course_set_status_id
-- Exclude unused Longchamp courses with busted data.
WHERE c.id NOT IN (11201, 11202)
-- Only include courses that can be selected for room matches.
-- Some other courses exist in the game files but have busted data.
WHERE c.id IN (SELECT course_set FROM race WHERE "group" = 12)
ORDER BY c.id
+1 -1
View File
@@ -6,7 +6,7 @@ WITH skill_names AS (
FROM text_data n
JOIN text_data d ON n."index" = d."index" AND n."category" = 47 AND d."category" = 48
), skill_groups AS (
SELECT
SELECT DISTINCT
group_id,
name
FROM skill_data d
+61
View File
@@ -40,3 +40,64 @@ INSERT INTO race_track (id, initial_lane_type, enable_half_gate, horse_num_gate_
INSERT INTO race_track (id, initial_lane_type, enable_half_gate, horse_num_gate_variation, turf_vision_type, footsmoke_color_type, area, flag_type, gate_panel_type, gate_lamp_type, board_condition_type, result_board_type) VALUES (10101, 2, 0, 1, 2, 2, 2, 1, 1, 1, 3, 0);
INSERT INTO race_track (id, initial_lane_type, enable_half_gate, horse_num_gate_variation, turf_vision_type, footsmoke_color_type, area, flag_type, gate_panel_type, gate_lamp_type, board_condition_type, result_board_type) VALUES (10105, 4, 1, 0, 2, 2, 1, 1, 1, 1, 4, 0);
INSERT INTO race_track (id, initial_lane_type, enable_half_gate, horse_num_gate_variation, turf_vision_type, footsmoke_color_type, area, flag_type, gate_panel_type, gate_lamp_type, board_condition_type, result_board_type) VALUES (10201, 3, 1, 0, 1, 1, 5, 0, 2, 2, 1, 0);
CREATE TABLE IF NOT EXISTS 'race' ('id' INTEGER NOT NULL, 'group' INTEGER NOT NULL, 'grade' INTEGER NOT NULL, 'course_set' INTEGER NOT NULL, 'thumbnail_id' INTEGER NOT NULL, 'ff_cue_name' TEXT NOT NULL, 'ff_cuesheet_name' TEXT NOT NULL, 'real_ff_cue_name' TEXT NOT NULL, 'real_ff_cuesheet_name' TEXT NOT NULL, 'ff_anim' INTEGER NOT NULL, 'ff_camera' INTEGER NOT NULL, 'ff_camera_sub' INTEGER NOT NULL, 'ff_sub' INTEGER NOT NULL, 'start_gate' INTEGER NOT NULL, 'start_gate_panel' INTEGER NOT NULL, 'goal_gate' INTEGER NOT NULL, 'goal_flower' INTEGER NOT NULL, 'result_podium' INTEGER NOT NULL, 'audience_group_id' INTEGER NOT NULL, 'paddock_bg_id' INTEGER NOT NULL, 'audience' INTEGER NOT NULL, 'entry_num' INTEGER NOT NULL, 'change_full_gate' INTEGER NOT NULL, 'is_dirtgrade' INTEGER NOT NULL, 'start_date' INTEGER NOT NULL, PRIMARY KEY('id'));
-- SELECT * FROM race WHERE course_set IN (10301, 10811, 11103, 11203, 11504);
INSERT INTO race VALUES(3042,1,300,10301,3042,'snd_mfx_1007_CL','snd_mfx_1007_CL','snd_mfx_r_1007_CL','snd_mfx_r_1007_CL',3042,207,0,0,0,0,0,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(4055,1,400,10301,4055,'snd_mfx_1012_CL','snd_mfx_1012_CL','snd_mfx_r_1012_CL','snd_mfx_r_1012_CL',4055,312,0,0,0,0,0,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(4101,1,400,10301,4101,'snd_mfx_1012_CL','snd_mfx_1012_CL','snd_mfx_r_1012_CL','snd_mfx_r_1012_CL',4101,312,0,0,0,0,0,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(5032,6,900,10301,5002,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',5002,312,0,0,0,0,0,0,-1,0,0,1,18,0,0,1636977600);
INSERT INTO race VALUES(5226,12,999,10301,5200,'snd_mfx_2008_CL','snd_mfx_2008_CL','','',5200,121,0,0,0,0,0,0,-1,0,0,0,18,0,0,1627560000);
INSERT INTO race VALUES(6136,9,100,10301,6100,'snd_mfx_2004_CL','snd_mfx_2004_CL','','',6100,121,0,0,0,0,0,0,-1,0,0,0,12,0,0,1498870800);
INSERT INTO race VALUES(6137,9,100,10301,6101,'snd_mfx_2004_CL','snd_mfx_2004_CL','','',6101,121,0,0,0,0,0,0,-1,0,0,0,12,0,0,1498870800);
INSERT INTO race VALUES(6138,9,100,10301,6102,'snd_mfx_2004_CL','snd_mfx_2004_CL','','',6102,121,0,0,0,0,0,0,-1,0,0,0,12,0,0,1498870800);
INSERT INTO race VALUES(9307,7,800,10301,9005,'snd_mfx_1012_CL','snd_mfx_1012_CL','snd_mfx_r_1012_CL','snd_mfx_r_1012_CL',9005,312,0,0,0,0,0,0,-1,0,0,0,9,0,0,1498870800);
INSERT INTO race VALUES(9323,7,800,10301,9003,'snd_mfx_1012_CL','snd_mfx_1012_CL','snd_mfx_r_1012_CL','snd_mfx_r_1012_CL',9003,312,0,0,0,0,0,0,-1,0,0,0,9,0,0,1498870800);
INSERT INTO race VALUES(1006,1,100,10811,1006,'snd_mfx_1002_CL','snd_mfx_1002_CL','snd_mfx_r_1002_CL','snd_mfx_r_1002_CL',1006,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(4905,61,100,10811,1006,'snd_mfx_1002_CL','snd_mfx_1002_CL','','',1006,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(5070,6,900,10811,5002,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',5002,313,0,0,0,0,0,0,-1,0,0,1,18,0,0,1636977600);
INSERT INTO race VALUES(5113,6,100,10811,1006,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',1006,313,0,0,0,0,1,1,-1,0,0,1,18,0,0,1636977600);
INSERT INTO race VALUES(5257,12,999,10811,5200,'snd_mfx_2008_CL','snd_mfx_2008_CL','','',5200,121,0,0,0,0,0,0,-1,0,0,0,18,0,0,1627560000);
INSERT INTO race VALUES(5930,8,100,10811,5930,'snd_mfx_2003_CL','snd_mfx_2003_CL','','',5930,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1623931200);
INSERT INTO race VALUES(5931,8,100,10811,5930,'snd_mfx_2003_CL','snd_mfx_2003_CL','','',5930,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1623931200);
INSERT INTO race VALUES(5932,8,100,10811,5930,'snd_mfx_2003_CL','snd_mfx_2003_CL','','',5930,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1623931200);
INSERT INTO race VALUES(5933,8,100,10811,5930,'snd_mfx_2003_CL','snd_mfx_2003_CL','','',5930,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1623931200);
INSERT INTO race VALUES(6006,11,100,10811,6006,'snd_mfx_2005_CL','snd_mfx_2005_CL','','',6006,122,0,0,0,0,0,0,-1,0,0,0,9,0,0,1623326400);
INSERT INTO race VALUES(6018,11,100,10811,6006,'snd_mfx_2006_CL','snd_mfx_2006_CL','','',6006,123,0,0,0,0,0,0,-1,0,0,0,9,0,0,1623326400);
INSERT INTO race VALUES(6283,9,100,10811,6100,'snd_mfx_2004_CL','snd_mfx_2004_CL','','',6100,121,0,0,0,0,0,0,-1,0,0,0,12,0,0,1498870800);
INSERT INTO race VALUES(6284,9,100,10811,6101,'snd_mfx_2004_CL','snd_mfx_2004_CL','','',6101,121,0,0,0,0,0,0,-1,0,0,0,12,0,0,1498870800);
INSERT INTO race VALUES(6285,9,100,10811,6102,'snd_mfx_2004_CL','snd_mfx_2004_CL','','',6102,121,0,0,0,0,0,0,-1,0,0,0,12,0,0,1498870800);
INSERT INTO race VALUES(7004,4,0,10811,7004,'snd_mfx_1013_CL','snd_mfx_1013_CL','','',7004,313,0,0,0,0,0,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(7018,4,0,10811,7018,'snd_mfx_1013_CL','snd_mfx_1013_CL','','',7018,313,0,0,0,0,0,0,-1,0,0,0,12,0,0,1647777600);
INSERT INTO race VALUES(9530,7,100,10811,9020,'snd_mfx_3002_CL','snd_mfx_3002_CL','','',9020,208,0,0,0,0,302,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(9630,7,100,10811,9010,'snd_mfx_3002_CL','snd_mfx_3002_CL','','',9010,208,0,0,0,0,303,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(9730,7,100,10811,9001,'snd_mfx_3001_CL','snd_mfx_3001_CL','','',9001,119,0,0,0,0,301,0,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(9826,7,100,10811,9031,'snd_mfx_3005_CL','snd_mfx_3005_CL','','',9030,119,0,0,0,0,304,0,-1,0,0,0,16,0,0,1645704000);
INSERT INTO race VALUES(9867,7,100,10811,9032,'snd_mfx_3005_CL','snd_mfx_3005_CL','','',9030,119,0,0,0,0,304,0,-1,0,0,0,16,0,0,1645704000);
INSERT INTO race VALUES(9908,7,100,10811,9033,'snd_mfx_3005_CL','snd_mfx_3005_CL','','',9030,119,0,0,0,0,304,0,-1,0,0,0,16,0,0,1645704000);
INSERT INTO race VALUES(10165,12,100,10811,1006,'snd_mfx_1002_CL','snd_mfx_1002_CL','snd_mfx_r_1002_CL','snd_mfx_r_1002_CL',1006,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1623326400);
INSERT INTO race VALUES(12000,8,100,10811,5930,'snd_mfx_2003_CL','snd_mfx_2003_CL','','',5930,102,0,0,0,0,1,1,-1,0,0,0,18,0,0,1652184000);
INSERT INTO race VALUES(16305,10,1000,10811,6101,'snd_mfx_3003_CL','snd_mfx_3003_CL','','',6100,121,0,0,0,0,0,0,-1,0,0,3,12,0,0,1783029600);
INSERT INTO race VALUES(1101,1,100,11103,1101,'snd_mfx_1015_CL','snd_mfx_1015_CL','snd_mfx_r_1015_CL','snd_mfx_r_1015_CL',1101,313,0,0,100,0,1,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(1102,1,100,11103,1102,'snd_mfx_1015_CL','snd_mfx_1015_CL','snd_mfx_r_1015_CL','snd_mfx_r_1015_CL',1102,313,0,0,100,0,2,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(1105,1,100,11103,1105,'snd_mfx_1015_CL','snd_mfx_1015_CL','snd_mfx_r_1015_CL','snd_mfx_r_1015_CL',1105,313,0,0,100,0,5,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(1106,1,100,11103,1106,'snd_mfx_1014_CL','snd_mfx_1014_CL','snd_mfx_r_1014_CL','snd_mfx_r_1014_CL',1106,313,0,0,100,0,6,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(4924,61,100,11103,1101,'snd_mfx_1015_CL','snd_mfx_1015_CL','','',1101,313,0,0,100,0,1,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(4925,61,100,11103,1102,'snd_mfx_1015_CL','snd_mfx_1015_CL','','',1102,313,0,0,100,0,2,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(4928,61,100,11103,1105,'snd_mfx_1015_CL','snd_mfx_1015_CL','','',1105,313,0,0,100,0,5,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(4929,61,100,11103,1106,'snd_mfx_1014_CL','snd_mfx_1014_CL','','',1106,313,0,0,100,0,6,0,-1,0,0,0,16,0,1,1498870800);
INSERT INTO race VALUES(5105,6,900,11103,5002,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',5002,315,0,0,100,0,0,0,-1,0,0,1,16,0,1,1636977600);
INSERT INTO race VALUES(5132,6,100,11103,1101,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',1101,315,0,0,100,0,1,0,-1,0,0,1,16,0,1,1636977600);
INSERT INTO race VALUES(5133,6,100,11103,1102,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',1102,315,0,0,100,0,2,0,-1,0,0,1,16,0,1,1636977600);
INSERT INTO race VALUES(5136,6,100,11103,1105,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',1105,315,0,0,100,0,5,0,-1,0,0,1,16,0,1,1636977600);
INSERT INTO race VALUES(5137,6,100,11103,1106,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',1106,315,0,0,100,0,6,0,-1,0,0,1,16,0,1,1636977600);
INSERT INTO race VALUES(5290,12,999,11103,5200,'snd_mfx_2008_CL','snd_mfx_2008_CL','','',5200,121,0,0,100,0,0,0,-1,0,0,0,16,0,1,1627560000);
INSERT INTO race VALUES(10184,12,100,11103,1101,'snd_mfx_1015_CL','snd_mfx_1015_CL','snd_mfx_r_1015_CL','snd_mfx_r_1015_CL',1101,313,0,0,100,0,1,0,-1,0,0,0,16,0,1,1623326400);
INSERT INTO race VALUES(10185,12,100,11103,1102,'snd_mfx_1015_CL','snd_mfx_1015_CL','snd_mfx_r_1015_CL','snd_mfx_r_1015_CL',1102,313,0,0,100,0,2,0,-1,0,0,0,16,0,1,1623326400);
INSERT INTO race VALUES(10188,12,100,11103,1105,'snd_mfx_1015_CL','snd_mfx_1015_CL','snd_mfx_r_1015_CL','snd_mfx_r_1015_CL',1105,313,0,0,100,0,5,0,-1,0,0,0,16,0,1,1623326400);
INSERT INTO race VALUES(10189,12,100,11103,1106,'snd_mfx_1014_CL','snd_mfx_1014_CL','snd_mfx_r_1014_CL','snd_mfx_r_1014_CL',1106,313,0,0,100,0,6,0,-1,0,0,0,16,0,1,1623326400);
INSERT INTO race VALUES(1201,1,100,11203,1023,'snd_mfx_1001_CL','snd_mfx_1001_CL','','',1023,101,0,0,201,101,1,1,-1,0,0,0,18,0,0,1498870800);
INSERT INTO race VALUES(1119,1,100,11504,1105,'snd_mfx_1018_CL','snd_mfx_1018_CL','snd_mfx_r_1018_CL','snd_mfx_r_1018_CL',1119,133,0,0,105,0,2,0,-1,0,0,0,16,0,1,1660910400);
INSERT INTO race VALUES(3076,1,300,11504,3076,'snd_mfx_1019_CL','snd_mfx_1019_CL','snd_mfx_r_1019_CL','snd_mfx_r_1019_CL',3076,234,0,0,105,0,0,0,-1,0,0,0,14,0,1,1660910400);
INSERT INTO race VALUES(5149,6,900,11504,5002,'snd_mfx_2009_CL','snd_mfx_2009_CL','','',5002,234,0,0,105,0,0,0,-1,0,0,1,16,0,1,1660910400);
INSERT INTO race VALUES(5300,12,999,11504,5200,'snd_mfx_2008_CL','snd_mfx_2008_CL','','',5200,121,0,0,105,0,0,0,-1,0,0,0,16,0,1,1660910400);
+3 -5
View File
@@ -46,11 +46,9 @@ type RacecourseSpan struct {
Start float32 `json:"start"`
// End is the distance in meters along the track at which the span ends.
End float32 `json:"end"`
// Straight is whether the span is formally a straight.
Straight bool `json:"straight,omitzero"`
// FarStraight is whether the span is the backstretch.
// If true, then Straight is also true.
FarStraight bool `json:"far_straight,omitzero"`
// Straight is the straight type if the span is formally a straight.
// 1 indicates the front stretch and 2 the backstretch.
Straight int8 `json:"straight,omitzero"`
// Corner is the corner number of the span, or zero if not a corner.
Corner int8 `json:"corner,omitzero"`
}
+5
View File
@@ -106,6 +106,11 @@ export const PAGES = {
name: 'Tagged Skills Explorer',
description: 'View skills matching the tags internal to the game.',
},
{
route: resolve('/doc/fans'),
name: 'Career Fan Gain Is Solved',
description: 'The exact formula for fan gain from career races – nothing "random" about it.'
},
] satisfies Page[],
} as const;
File diff suppressed because it is too large Load Diff
+23 -23
View File
@@ -76,36 +76,36 @@ export interface SectionInfo {
section: number;
phase: Phase;
endRate: number;
posKeep: boolean;
rush: boolean;
spotStruggleEnter: boolean;
posKeep?: boolean;
rush?: boolean;
spotStruggleEnter?: boolean;
}
export const SECTIONS: ReadonlyArray<SectionInfo> = [
{ section: 1, phase: Phase.EarlyRace, endRate: 1 / 24, posKeep: true, rush: false, spotStruggleEnter: false },
{ section: 1, phase: Phase.EarlyRace, endRate: 1 / 24, posKeep: true },
{ section: 2, phase: Phase.EarlyRace, endRate: 2 / 24, posKeep: true, rush: true, spotStruggleEnter: true },
{ section: 3, phase: Phase.EarlyRace, endRate: 3 / 24, posKeep: true, rush: true, spotStruggleEnter: true },
{ section: 4, phase: Phase.EarlyRace, endRate: 4 / 24, posKeep: true, rush: true, spotStruggleEnter: true },
{ section: 5, phase: Phase.MidRace, endRate: 5 / 24, posKeep: true, rush: true, spotStruggleEnter: true },
{ section: 6, phase: Phase.MidRace, endRate: 6 / 24, posKeep: true, rush: true, spotStruggleEnter: false },
{ section: 7, phase: Phase.MidRace, endRate: 7 / 24, posKeep: true, rush: true, spotStruggleEnter: false },
{ section: 8, phase: Phase.MidRace, endRate: 8 / 24, posKeep: true, rush: true, spotStruggleEnter: false },
{ section: 9, phase: Phase.MidRace, endRate: 9 / 24, posKeep: true, rush: true, spotStruggleEnter: false },
{ section: 10, phase: Phase.MidRace, endRate: 10 / 24, posKeep: true, rush: false, spotStruggleEnter: false },
{ section: 11, phase: Phase.MidRace, endRate: 11 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 12, phase: Phase.MidRace, endRate: 12 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 13, phase: Phase.MidRace, endRate: 13 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 14, phase: Phase.MidRace, endRate: 14 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 15, phase: Phase.MidRace, endRate: 15 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 16, phase: Phase.MidRace, endRate: 16 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 17, phase: Phase.LateRace, endRate: 17 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 18, phase: Phase.LateRace, endRate: 18 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 19, phase: Phase.LateRace, endRate: 19 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 20, phase: Phase.LateRace, endRate: 20 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 21, phase: Phase.LateRace, endRate: 21 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 22, phase: Phase.LateRace, endRate: 22 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 23, phase: Phase.LateRace, endRate: 23 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 24, phase: Phase.LateRace, endRate: 24 / 24, posKeep: false, rush: false, spotStruggleEnter: false },
{ section: 6, phase: Phase.MidRace, endRate: 6 / 24, posKeep: true, rush: true },
{ section: 7, phase: Phase.MidRace, endRate: 7 / 24, posKeep: true, rush: true },
{ section: 8, phase: Phase.MidRace, endRate: 8 / 24, posKeep: true, rush: true },
{ section: 9, phase: Phase.MidRace, endRate: 9 / 24, posKeep: true, rush: true },
{ section: 10, phase: Phase.MidRace, endRate: 10 / 24, posKeep: true },
{ section: 11, phase: Phase.MidRace, endRate: 11 / 24 },
{ section: 12, phase: Phase.MidRace, endRate: 12 / 24 },
{ section: 13, phase: Phase.MidRace, endRate: 13 / 24 },
{ section: 14, phase: Phase.MidRace, endRate: 14 / 24 },
{ section: 15, phase: Phase.MidRace, endRate: 15 / 24 },
{ section: 16, phase: Phase.MidRace, endRate: 16 / 24 },
{ section: 17, phase: Phase.LateRace, endRate: 17 / 24 },
{ section: 18, phase: Phase.LateRace, endRate: 18 / 24 },
{ section: 19, phase: Phase.LateRace, endRate: 19 / 24 },
{ section: 20, phase: Phase.LateRace, endRate: 20 / 24 },
{ section: 21, phase: Phase.LastSpurt, endRate: 21 / 24 },
{ section: 22, phase: Phase.LastSpurt, endRate: 22 / 24 },
{ section: 23, phase: Phase.LastSpurt, endRate: 23 / 24 },
{ section: 24, phase: Phase.LastSpurt, endRate: 24 / 24 },
];
export interface SectionSlopeSegment extends SectionInfo {
+42 -38
View File
@@ -8,11 +8,11 @@ import { binomPMF } from './prob';
* Fundamental stats of umas.
*/
export enum Stat {
Speed,
Stamina,
Power,
Guts,
Wit,
Speed = 1,
Stamina = 2,
Power = 3,
Guts = 4,
Wit = 5,
}
/**
@@ -118,14 +118,15 @@ export function distance(raceLen: number): Distance {
/**
* Get the distances at which each phase of a race ends.
* @param raceLen Length of the race in meters
* @returns Ends of each phase in meters
* @returns Ends of each phase in meters, including separate late and spurt phases
*/
export function phases(raceLen: number) {
const sixth = raceLen / 6;
return {
[Phase.EarlyRace]: sixth,
[Phase.MidRace]: 4 * sixth,
[Phase.LateRace]: raceLen,
[Phase.LateRace]: 5 * sixth,
[Phase.LastSpurt]: raceLen,
};
}
@@ -133,18 +134,18 @@ export function phases(raceLen: number) {
* Race surfaces.
*/
export enum Surface {
Turf,
Dirt,
Turf = 1,
Dirt = 2,
}
/**
* Race ground condition types.
*/
export enum GroundConditions {
Firm,
Good,
Soft,
Heavy,
Firm = 1,
Good = 2,
Soft = 3,
Heavy = 4,
}
/**
@@ -327,12 +328,12 @@ export const RUNNING_STYLES = [
/**
* Race phases.
* While last spurt phase is also a phase, it is not distinguished here.
*/
export enum Phase {
EarlyRace,
MidRace,
LateRace,
EarlyRace = 0,
MidRace = 1,
LateRace = 2,
LastSpurt = 3,
}
const hpStrategyCoeff = {
@@ -407,7 +408,7 @@ export function hpPerSecond(
const pdmMod = pdm ? 0.6 : 1;
const damMod = dam ? 0.4 : 1;
const groundMod = groundHPRateMod[surface][conditions];
const gutsMod = phase === Phase.LateRace ? 1 + 200 / (math.sqrt(600 * gutsStat) as number) : 1;
const gutsMod = phase >= Phase.LateRace ? 1 + 200 / (math.sqrt(600 * gutsStat) as number) : 1;
const sp = currentSpeed - baseSpeed(raceLen) + 12;
return (20 / 144) * sp * sp * rushedMod * pdmMod * damMod * groundMod * gutsMod;
}
@@ -447,11 +448,11 @@ export function baseSpeed(raceLen: number): number {
}
const speedStrategyPhaseCoeff = [
[1.0, 0.98, 0.962],
[0.978, 0.991, 0.975],
[0.938, 0.998, 0.994],
[0.931, 1.0, 1.0],
[1.063, 0.962, 0.95],
[1.0, 0.98, 0.962, 0.962],
[0.978, 0.991, 0.975, 0.975],
[0.938, 0.998, 0.994, 0.994],
[0.931, 1.0, 1.0, 1.0],
[1.063, 0.962, 0.95, 0.95],
] as const;
const distanceProficiencyMod: Readonly<Record<AptitudeLevel, number>> = {
@@ -471,7 +472,11 @@ const distanceProficiencyMod: Readonly<Record<AptitudeLevel, number>> = {
* @param style Horse's running style
* @param phase Phase to calculate for
*/
export function baseTargetSpeed(raceLen: number, style: RunningStyle, phase: Exclude<Phase, Phase.LateRace>): number;
export function baseTargetSpeed(
raceLen: number,
style: RunningStyle,
phase: Exclude<Phase, Phase.LateRace | Phase.LastSpurt>,
): number;
/**
* Get a horse's base target speed when not spurting during late race.
* @param raceLen Length of the race in meters
@@ -483,7 +488,7 @@ export function baseTargetSpeed(raceLen: number, style: RunningStyle, phase: Exc
export function baseTargetSpeed(
raceLen: number,
style: RunningStyle,
phase: Phase.LateRace,
phase: Phase.LateRace | Phase.LastSpurt,
speedStat: number,
distanceApt: AptitudeLevel,
): number;
@@ -497,7 +502,7 @@ export function baseTargetSpeed(
const base = baseSpeed(raceLen);
const baseTarget = base * speedStrategyPhaseCoeff[style][phase];
const late =
phase === Phase.LateRace ? (math.sqrt(500 * speedStat!) as number) * distanceProficiencyMod[distanceApt!] * 0.002 : 0;
phase >= Phase.LateRace ? (math.sqrt(500 * speedStat!) as number) * distanceProficiencyMod[distanceApt!] * 0.002 : 0;
return baseTarget + late;
}
@@ -512,7 +517,7 @@ export function sectionSpeed(
raceLen: number,
witStat: number,
style: RunningStyle,
phase: Exclude<Phase, Phase.LateRace>,
phase: Exclude<Phase, Phase.LateRace | Phase.LastSpurt>,
): [number, number];
/**
* Calculate the range of section speed values for a horse not spurting during late race.
@@ -529,7 +534,7 @@ export function sectionSpeed(
witStat: number,
style: RunningStyle,
distance: AptitudeLevel,
phase: Phase.LateRace,
phase: Phase.LateRace | Phase.LastSpurt,
): [number, number];
export function sectionSpeed(
raceLen: number,
@@ -537,7 +542,7 @@ export function sectionSpeed(
witStatOrStyle: number | RunningStyle,
styleOrPhase: RunningStyle | Phase,
distance?: AptitudeLevel,
lateRace?: Phase.LateRace,
lateRace?: Phase.LateRace | Phase.LastSpurt,
): [number, number] {
const speedStat = lateRace !== undefined ? speedStatOrWitStat : 0;
const witStat = lateRace !== undefined ? witStatOrStyle : speedStatOrWitStat;
@@ -546,7 +551,7 @@ export function sectionSpeed(
const base = baseSpeed(raceLen);
const baseTarget = base * speedStrategyPhaseCoeff[style][phase];
const late =
phase === Phase.LateRace
phase >= Phase.LateRace
? (math.sqrt(500 * speedStat) as number) * distanceProficiencyMod[distance ?? AptitudeLevel.A] * 0.002
: 0;
const u = (witStat / 550000) * math.log10(witStat * 0.1);
@@ -620,11 +625,11 @@ export const COURSE_WIDTH = 11.25;
export const LANE_WIDTH = COURSE_WIDTH / 18;
const accelStrategyPhaseCoeff = {
[RunningStyle.FrontRunner]: [1.0, 1.0, 0.996],
[RunningStyle.PaceChaser]: [0.985, 1.0, 0.996],
[RunningStyle.LateSurger]: [0.975, 1.0, 1.0],
[RunningStyle.EndCloser]: [0.945, 1.0, 0.997],
[RunningStyle.Runaway]: [1.17, 0.94, 0.956],
[RunningStyle.FrontRunner]: [1.0, 1.0, 0.996, 0.996],
[RunningStyle.PaceChaser]: [0.985, 1.0, 0.996, 0.996],
[RunningStyle.LateSurger]: [0.975, 1.0, 1.0, 1.0],
[RunningStyle.EndCloser]: [0.945, 1.0, 0.997, 0.997],
[RunningStyle.Runaway]: [1.17, 0.94, 0.956, 0.956],
} as const;
const surfaceProficiencyMod: Readonly<Record<AptitudeLevel, number>> = {
@@ -681,6 +686,7 @@ const phaseDecel = {
[Phase.EarlyRace]: -1.2,
[Phase.MidRace]: -0.8,
[Phase.LateRace]: -1.0,
[Phase.LastSpurt]: -1.0,
} as const;
/**
@@ -695,9 +701,7 @@ export function deceleration(phase: Phase, pdm?: boolean, dead?: boolean): numbe
return -1.2;
}
if (pdm) {
// This isn't until 1.5anni.
// return -0.5;
return phaseDecel[phase];
return -0.5;
}
return phaseDecel[phase];
}
+223
View File
@@ -0,0 +1,223 @@
<script lang="ts">
import { asset, resolve } from '$app/paths';
import CalcInfo from '../../race/CalcInfo.svelte';
import Article from '../Article.svelte';
import Sec from '../Sec.svelte';
import * as fans from './fans';
let baseFans = $state(700);
let fanBonus = $state(0);
let finishOrder = $state(1);
let margin = $state(0);
let skills = $state(0);
let glowsticks = $state(false);
const marginFans = $derived(fans.marginFans(baseFans, finishOrder, margin));
const skillFans = $derived(fans.skillFans(baseFans, skills));
const glowstickBonus = $derived(glowsticks ? 50 : 0);
const gainedFans = $derived(fans.gained(baseFans, marginFans, skillFans, fanBonus, glowstickBonus));
const marginType = $derived(finishOrder === 1 ? 'Win Margin' : 'Margin vs. Winner');
const orderPct = [
[1, 100],
[2, 40],
[3, 25],
[4, 15],
[5, 10],
[6, 9],
[7, 8],
[8, 7],
[9, 6],
[10, 5],
[11, 4],
[12, 3],
[13, 2.5],
[14, 2],
[15, 1.5],
[16, 1],
[17, 1],
[18, 1],
] as const;
const marginBonus = [
['Nose – 3/4 L', 0, 9],
['1 L – 2.5 L', 2, 6],
['3 L – 4 L', 4, 4],
['5 L – 6 L', 6, 2],
['7L – distance', 9, 0],
] as const;
const skillBonus = [
['0', 0],
['1-3', 2],
['4-6', 3],
['7-9', 5],
['10+', 8],
] as const;
</script>
<Article>
{#snippet head()}
<Sec h={1} id="top" class="text-center pointer-coarse:mb-8">Career Fan Gain Is Solved</Sec>
<p>
Thanks to work by Moxa and Werseter on the Hakuraku Discord, a precise formula for fans gained from career races has been
found.
</p>
<p>
There is no random component to fan gain, except insofar as the race itself is random. It is now known to be entirely
determined by five factors:
</p>
<ul class="mb-4 list-disc pl-4">
<li>Base fans, according to the race and finish placement.</li>
<li>Fan bonus from support cards.</li>
<li>Margin of the win, or margin behind the winner if the player's trainee did not win.</li>
<li>Number of skills the trainee activated during the race.</li>
<li>In Trackblazer/MANT, use of glowsticks.</li>
</ul>
<p>
The identified formula perfectly fits hundreds of recorded career race gains, including losses. Some questions remain, but
the results so far have important implications both for fan runs and for low fan bonus decks for which debut can fall short
of fan requirements for early career goals.
</p>
{/snippet}
<Sec h={2} id="calc-fans">Calculate Fans</Sec>
<p>This tool will calculate your exact fan gain from a race.</p>
<form class="mx-auto mb-4 grid grid-cols-1 gap-2 rounded-md p-4 text-center shadow-md ring md:max-w-2xl md:grid-cols-3">
<div>
<label for="calc-base-fans">Base Fans</label>
<input id="calc-base-fans" class="max-w-32" type="number" min="0" max="30000" step="100" bind:value={baseFans} />
</div>
<div>
<label for="calc-fan-bonus">Fan Bonus</label>
<input id="calc-fan-bonus" class="max-w-32" type="number" min="0" max="150" step="5" bind:value={fanBonus} />
</div>
<div>
<label for="calc-finish-order">Finish Order</label>
<input id="calc-finish-order" class="max-w-32" type="number" min="1" max="18" step="1" bind:value={finishOrder} />
</div>
<div>
<label for="calc-margin">{marginType} (L)</label>
<input id="calc-margin" class="max-w-32" type="number" min="0" step="0.25" bind:value={margin} />
</div>
<div>
<label for="calc-skills">Activated Skills</label>
<input id="calc-skills" class="max-w-32" type="number" min="0" step="1" bind:value={skills} />
</div>
<div class="my-auto">
<input id="calc-glowsticks" class="min-h-6 min-w-6 align-middle" type="checkbox" bind:checked={glowsticks} />
<label for="calc-glowsticks">Glowsticks</label>
</div>
</form>
<div class="grid grid-cols-1 md:grid-cols-12">
<CalcInfo title="Fans from Margin" class="md:col-span-4 md:col-start-3">{marginFans}</CalcInfo>
<CalcInfo title="Fans from Skills" class="md:col-span-4">{skillFans}</CalcInfo>
<CalcInfo title="Fans Gained" class="md:col-span-4 md:col-start-5">{gainedFans}</CalcInfo>
</div>
<Sec h={2} id="base-fans">Base Fans</Sec>
<p>
Base fans is a parameter per race and finish placement, defined in <a href={resolve('/doc/mdb')}>master data</a>. The number
shown in the career race selection menu is the base fans for first place. While it is defined separately for each race and
finish order, every race currently follows the same curve for all placements.
</p>
<table class="mx-auto mb-4 border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Placement</th>
<th scope="col" class="px-2">Fan Ratio</th>
</tr>
</thead>
<tbody>
{#each orderPct as [o, p] (o)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{o}</td>
<td>{p}%</td>
</tr>
{/each}
</tbody>
</table>
<Sec h={2} id="margin">Fans from Margin</Sec>
<p>
When the trainee places in the top three (top five?), she receives a bonus percentage of base fans according to the finish
margin.
</p>
<p>
The bonus depends on whether the trainee won the race. If so, it is calculated by her margin versus second place. Otherwise,
her total margin behind the winner is used. If she did not place in the top three (top five?), then she gains no fans from
margin.
</p>
<table class="mx-auto mb-4 border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Actual<br />Margin Within</th>
<th scope="col" class="px-2">Bonus for Winner</th>
<th scope="col" class="px-2">Bonus for Podium</th>
</tr>
</thead>
<tbody>
{#each marginBonus as [m, w, l] (m)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{m}</td>
<td>{w}%</td>
<td>{l}%</td>
</tr>
{/each}
</tbody>
</table>
<Sec h={2} id="skills">Fans from Skill Activations</Sec>
<p>The trainee receives a bonus percentage of base fans according to the number of skills she activated during the race.</p>
<table class="mx-auto mb-4 border text-center">
<thead>
<tr>
<th scope="col" class="px-2">Activated Skills</th>
<th scope="col" class="px-2">Bonus</th>
</tr>
</thead>
<tbody>
{#each skillBonus as [n, b] (n)}
<tr class="even:bg-mist-300 dark:even:bg-mist-900">
<td>{n}</td>
<td>{b}%</td>
</tr>
{/each}
</tbody>
</table>
<Sec h={2} id="rounding">Calculation Order and Rounding</Sec>
<p>The calculation is perfomed as if in the following order.</p>
<ol class="mb-4 list-decimal pl-4">
<li>Calculate fans from win margin and round down.</li>
<li>Calculate fans from skill activation count and round down.</li>
<li>Calculate the sum of base fans, win margin fans, and skill activation fans.</li>
<li>Apply fan bonus to the sum and round to the nearest integer with halfway cases away from zero.</li>
<li>(Trackblazer/MANT) If glowsticks were used for the race, apply their multiplier and round down.</li>
</ol>
<Sec h={2} id="data">Data and Limitations</Sec>
<p>
The data for this research comes from 193 races and fan results dumped using <a
href="https://werseter.github.io/umadump/"
target="_blank"
rel="noopener noreferrer">Umadump</a
>. The races come from sixteen careers run between 19 Aug and 11 Oct 2026. These careers include five different values of race
bonus ranging from 55 to 105. The identified formula predicts the actual fan gain perfectly for all of the races. You can
<a
href="https://docs.google.com/spreadsheets/d/1_jtOv6qk9dP4jJTagJqG53Pvj48IVd6gl2zKpyT6Kvs/edit?gid=463816108#gid=463816108"
target="_blank"
rel="noopener noreferrer">view the data</a
>.
</p>
<p>
There are some gaps in the data. No collected race had a finish placement of 4th or 5th, nor lower than 6th, so the exact
details of the win margin fan bonus remain open. Similarly, no race featured a trainee who activated more than ten skills, so
it is unknown whether there are further tiers of skill activation count fan bonus.
</p>
<p>
Once these edge cases are covered, this article will be updated. If you'd like to contribute, please contact me
(@zephyrtronium) via Discord on the Hakuraku, uma.moe, GameTora, or EoG servers.
</p>
</Article>
+58
View File
@@ -0,0 +1,58 @@
const margins = [
[0.75, 0.0, 0.09],
[2.5, 0.02, 0.06],
[4, 0.04, 0.04],
[6, 0.06, 0.02],
[Infinity, 0.09, 0.0],
] as const;
/**
* Calculate fans gained from a career race due to the margin of the finish.
* @param baseFans Base fans from the race and finish order
* @param finishOrder Placement of the trainee
* @param margin Margin in lengths between the trainee and second if a win, or the winner and trainee if a loss
* @returns Fans gained due to finish margin
*/
export function marginFans(baseFans: number, finishOrder: number, margin: number): number {
if (finishOrder > 3) {
return 0;
}
const [, wb, lb] = margins.find(([m]) => margin < m)!;
const b = finishOrder === 1 ? wb : lb;
return Math.floor(baseFans * b);
}
const skills = [
[0, 0.0],
[3, 0.02],
[6, 0.03],
[9, 0.05],
[Infinity, 0.08],
] as const;
/**
* Calculate the fans gained from a career race due to skills activated.
* @param baseFans Base fans from the race and finish order
* @param skillsActivated Number of skills the trainee activated during the race
* @returns Fans gained due to skill activations
*/
export function skillFans(baseFans: number, skillsActivated: number): number {
const [, b] = skills.find(([n]) => skillsActivated <= n)!;
return Math.floor(baseFans * b);
}
/**
* Calculate fan gain from a career race.
* @param baseFans Base fans from the race and finish order
* @param marginFans Fans gained due to finish margin
* @param skillFans Fans gained due to skill activations
* @param fanBonus Total fan bonus from support cards
* @param itemBonus Fan bonus from items (MANT glowsticks)
* @returns Total fans gained
*/
export function gained(baseFans: number, marginFans: number, skillFans: number, fanBonus: number, itemBonus?: number): number {
const f = baseFans + marginFans + skillFans;
const d = Math.round(f * (1 + fanBonus / 100));
const b = itemBonus ?? 0;
return Math.floor(d * (1 + b / 100));
}
+2 -2
View File
@@ -99,8 +99,8 @@
const distance = $derived([last(seggs[0]).end.x, last(seggs[1]).end.x] as const);
const time = $derived([last(seggs[0]).end.t, last(seggs[1]).end.t] as const);
const finishTime = $derived([
time[0] + (phases[race.Phase.LateRace] - distance[0]) / spurtSpeed,
time[1] + (phases[race.Phase.LateRace] - distance[1]) / spurtSpeed,
time[0] + (raceLen - distance[0]) / spurtSpeed,
time[1] + (raceLen - distance[1]) / spurtSpeed,
] as const);
function gainLengths(fast: accel.Instant, slow: accel.Instant): number {
const m = fast.v * (slow.t - fast.t) + fast.x - slow.x;
+4
View File
@@ -103,6 +103,10 @@
race.spurtSpeed(stats[race.Stat.Speed], stats[race.Stat.Guts], style, distanceApt, raceLen),
race.spurtSpeed(stats[race.Stat.Speed], stats[race.Stat.Guts], style, distanceApt, raceLen),
] as [number, number],
[race.Phase.LastSpurt]: [
race.spurtSpeed(stats[race.Stat.Speed], stats[race.Stat.Guts], style, distanceApt, raceLen),
race.spurtSpeed(stats[race.Stat.Speed], stats[race.Stat.Guts], style, distanceApt, raceLen),
] as [number, number],
});
// const isFront = $derived(style === race.RunningStyle.FrontRunner || style === race.RunningStyle.Runaway);
@@ -0,0 +1,194 @@
career,turn,scenario,character,race,program_id,place,base_fans,deck_bonus_pct,margin_lengths,skill_activations,margin_bonus_pct,skill_bonus_pct,item_bonus_pct,deck_only_fans,actual_fans,extra_fans,extra_pct,predicted_fans,residual_fans
2026-08-19 20:37:27,12,3,[Ashen Miracle] Oguri Cap,Junior Make Debut,1070,1,700,55,4.4727,0,6,0,0,1085.0,1150,65.0,5.9908,1150,0
2026-08-19 20:37:27,23,3,[Ashen Miracle] Oguri Cap,Hanshin Juvenile Fillies,623,6,585,55,1.2941,0,0,0,0,906.75,906,-0.75,-0.0827,906,0
2026-08-19 20:37:27,24,3,[Ashen Miracle] Oguri Cap,Hopeful Stakes,625,1,7000,55,1.1495,0,2,0,0,10850.0,11067,217.0,2.0,11067,0
2026-08-19 20:37:27,33,3,[Ashen Miracle] Oguri Cap,NHK Mile Cup,164,1,10500,55,1.6165,0,2,0,0,16275.0,16601,326.0,2.0031,16601,0
2026-08-19 20:37:27,46,3,[Ashen Miracle] Oguri Cap,Mile Championship,78,1,11000,55,5.3966,5,6,3,0,17050.0,18585,1535.0,9.0029,18585,0
2026-08-19 20:37:27,48,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,55,8.8065,6,9,3,0,46500.0,52080,5580.0,12.0,52080,0
2026-08-19 20:37:27,54,3,[Ashen Miracle] Oguri Cap,Osaka Hai,3,1,13500,55,3.3853,4,4,3,0,20925.0,22390,1465.0,7.0012,22390,0
2026-08-19 20:37:27,57,3,[Ashen Miracle] Oguri Cap,Victoria Mile,5,1,10500,55,4.8613,2,6,2,0,16275.0,17577,1302.0,8.0,17577,0
2026-08-19 20:37:27,68,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Autumn),76,1,15000,55,14.0515,6,9,3,0,23250.0,26040,2790.0,12.0,26040,0
2026-08-19 20:37:27,72,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,55,10.5066,7,9,5,0,46500.0,53010,6510.0,14.0,53010,0
2026-08-19 20:37:27,74,3,[Ashen Miracle] Oguri Cap,URA Finale Qualifier,2015,1,7000,55,6.1557,6,9,3,0,10850.0,12152,1302.0,12.0,12152,0
2026-08-19 20:37:27,76,3,[Ashen Miracle] Oguri Cap,URA Finale Semifinal,2112,1,10000,55,6.906,7,9,5,0,15500.0,17670,2170.0,14.0,17670,0
2026-08-19 20:37:27,78,3,[Ashen Miracle] Oguri Cap,URA Finale Finals,2213,1,30000,55,7.8077,8,9,5,0,46500.0,53010,6510.0,14.0,53010,0
2026-09-08 21:05:53,12,3,[Ashen Miracle] Oguri Cap,Junior Make Debut,1070,1,700,70,2.4747,0,2,0,0,1190.0,1213,23.0,1.9328,1213,0
2026-09-08 21:05:53,23,3,[Ashen Miracle] Oguri Cap,Hanshin Juvenile Fillies,623,3,1625,70,2.5458,0,4,0,0,2762.5,2873,110.5,4.0,2873,0
2026-09-08 21:05:53,32,3,[Ashen Miracle] Oguri Cap,Flora Stakes,173,1,5200,70,0.166,0,0,0,0,8840.0,8840,0.0,0.0,8840,0
2026-09-08 21:05:53,33,3,[Ashen Miracle] Oguri Cap,NHK Mile Cup,164,1,10500,70,0.6636,0,0,0,0,17850.0,17850,0.0,0.0,17850,0
2026-09-08 21:05:53,46,3,[Ashen Miracle] Oguri Cap,Mile Championship,78,1,11000,70,0.3634,0,0,0,0,18700.0,18700,0.0,0.0,18700,0
2026-09-08 21:05:53,48,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,3.9924,0,4,0,0,51000.0,53040,2040.0,4.0,53040,0
2026-09-08 21:05:53,54,3,[Ashen Miracle] Oguri Cap,Osaka Hai,3,1,13500,70,3.7863,0,4,0,0,22950.0,23868,918.0,4.0,23868,0
2026-09-08 21:05:53,57,3,[Ashen Miracle] Oguri Cap,Victoria Mile,5,1,10500,70,1.4385,0,2,0,0,17850.0,18207,357.0,2.0,18207,0
2026-09-08 21:05:53,68,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Autumn),76,1,15000,70,3.9784,0,4,0,0,25500.0,26520,1020.0,4.0,26520,0
2026-09-08 21:05:53,72,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,7.8092,0,9,0,0,51000.0,55590,4590.0,9.0,55590,0
2026-09-08 21:05:53,74,3,[Ashen Miracle] Oguri Cap,URA Finale Qualifier,2011,1,7000,70,4.2694,0,6,0,0,11900.0,12614,714.0,6.0,12614,0
2026-09-08 21:05:53,76,3,[Ashen Miracle] Oguri Cap,URA Finale Semifinal,2108,1,10000,70,1.7312,0,2,0,0,17000.0,17340,340.0,2.0,17340,0
2026-09-08 21:05:53,78,3,[Ashen Miracle] Oguri Cap,URA Finale Finals,2209,1,30000,70,2.9177,0,4,0,0,51000.0,53040,2040.0,4.0,53040,0
2026-09-16 13:24:41,12,3,[Ashen Miracle] Oguri Cap,Junior Make Debut,1070,1,700,70,6.3564,0,9,0,0,1190.0,1297,107.0,8.9916,1297,0
2026-09-16 13:24:41,23,3,[Ashen Miracle] Oguri Cap,Hanshin Juvenile Fillies,623,1,6500,70,0.5447,0,0,0,0,11050.0,11050,0.0,0.0,11050,0
2026-09-16 13:24:41,33,3,[Ashen Miracle] Oguri Cap,NHK Mile Cup,164,1,10500,70,1.2208,0,2,0,0,17850.0,18207,357.0,2.0,18207,0
2026-09-16 13:24:41,46,3,[Ashen Miracle] Oguri Cap,Mile Championship,78,1,11000,70,1.8764,0,2,0,0,18700.0,19074,374.0,2.0,19074,0
2026-09-16 13:24:41,48,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,7.2065,0,9,0,0,51000.0,55590,4590.0,9.0,55590,0
2026-09-16 13:24:41,54,3,[Ashen Miracle] Oguri Cap,Osaka Hai,3,1,13500,70,9.1057,0,9,0,0,22950.0,25016,2066.0,9.0022,25016,0
2026-09-16 13:24:41,59,3,[Ashen Miracle] Oguri Cap,Yasuda Kinen,73,1,13000,70,4.3705,0,6,0,0,22100.0,23426,1326.0,6.0,23426,0
2026-09-16 13:24:41,68,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Autumn),76,1,15000,70,7.933,0,9,0,0,25500.0,27795,2295.0,9.0,27795,0
2026-09-16 13:24:41,72,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,5.7931,0,6,0,0,51000.0,54060,3060.0,6.0,54060,0
2026-09-16 13:24:41,74,3,[Ashen Miracle] Oguri Cap,URA Finale Qualifier,2010,1,7000,70,5.7824,0,6,0,0,11900.0,12614,714.0,6.0,12614,0
2026-09-16 13:24:41,76,3,[Ashen Miracle] Oguri Cap,URA Finale Semifinal,2112,1,10000,70,2.7856,0,4,0,0,17000.0,17680,680.0,4.0,17680,0
2026-09-16 13:24:41,78,3,[Ashen Miracle] Oguri Cap,URA Finale Finals,2208,1,30000,70,5.4409,0,6,0,0,51000.0,54060,3060.0,6.0,54060,0
2026-09-17 20:23:11,12,3,[Ashen Miracle] Oguri Cap,Junior Make Debut,1070,1,700,70,5.3797,0,6,0,0,1190.0,1261,71.0,5.9664,1261,0
2026-09-17 20:23:11,24,3,[Ashen Miracle] Oguri Cap,Hopeful Stakes,625,1,7000,70,4.8411,2,6,2,0,11900.0,12852,952.0,8.0,12852,0
2026-09-17 20:23:11,33,3,[Ashen Miracle] Oguri Cap,NHK Mile Cup,164,1,10500,70,3.0921,1,4,2,0,17850.0,18921,1071.0,6.0,18921,0
2026-09-17 20:23:11,46,3,[Ashen Miracle] Oguri Cap,Mile Championship,78,1,11000,70,3.4861,1,4,2,0,18700.0,19822,1122.0,6.0,19822,0
2026-09-17 20:23:11,48,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,8.0058,1,9,2,0,51000.0,56610,5610.0,11.0,56610,0
2026-09-17 20:23:11,51,3,[Ashen Miracle] Oguri Cap,Kawasaki Kinen,1106,1,6000,70,5.6972,1,6,2,0,10200.0,11016,816.0,8.0,11016,0
2026-09-17 20:23:11,52,3,[Ashen Miracle] Oguri Cap,February Stakes,1,1,10000,70,0.5589,1,0,2,0,17000.0,17340,340.0,2.0,17340,0
2026-09-17 20:23:11,68,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Autumn),76,1,15000,70,4.6895,2,6,2,0,25500.0,27540,2040.0,8.0,27540,0
2026-09-17 20:23:11,72,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,9.0895,1,9,2,0,51000.0,56610,5610.0,11.0,56610,0
2026-09-17 20:23:11,74,3,[Ashen Miracle] Oguri Cap,URA Finale Qualifier,2014,1,7000,70,6.1828,1,9,2,0,11900.0,13209,1309.0,11.0,13209,0
2026-09-17 20:23:11,76,3,[Ashen Miracle] Oguri Cap,URA Finale Semifinal,2111,1,10000,70,2.8136,1,4,2,0,17000.0,18020,1020.0,6.0,18020,0
2026-09-17 20:23:11,78,3,[Ashen Miracle] Oguri Cap,URA Finale Finals,2212,1,30000,70,1.061,1,2,2,0,51000.0,53040,2040.0,4.0,53040,0
2026-09-17 22:45:31,12,3,[Ashen Miracle] Oguri Cap,Junior Make Debut,1070,1,700,70,2.2776,1,2,2,0,1190.0,1237,47.0,3.9496,1237,0
2026-09-17 22:45:31,23,3,[Ashen Miracle] Oguri Cap,Hanshin Juvenile Fillies,623,2,2600,70,0.0231,0,9,0,0,4420.0,4817,397.0,8.9819,4817,0
2026-09-17 22:45:31,33,3,[Ashen Miracle] Oguri Cap,NHK Mile Cup,164,1,10500,70,2.7073,2,4,2,0,17850.0,18921,1071.0,6.0,18921,0
2026-09-17 22:45:31,46,3,[Ashen Miracle] Oguri Cap,Mile Championship,78,1,11000,70,1.9154,2,2,2,0,18700.0,19448,748.0,4.0,19448,0
2026-09-17 22:45:31,48,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,4.8206,2,6,2,0,51000.0,55080,4080.0,8.0,55080,0
2026-09-17 22:45:31,56,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Spring),4,1,15000,70,14.398,5,9,3,0,25500.0,28560,3060.0,12.0,28560,0
2026-09-17 22:45:31,57,3,[Ashen Miracle] Oguri Cap,Victoria Mile,5,1,10500,70,2.1273,3,2,2,0,17850.0,18564,714.0,4.0,18564,0
2026-09-17 22:45:31,68,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Autumn),76,1,15000,70,7.6906,5,9,3,0,25500.0,28560,3060.0,12.0,28560,0
2026-09-17 22:45:31,72,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,7.549,6,9,3,0,51000.0,57120,6120.0,12.0,57120,0
2026-09-17 22:45:31,74,3,[Ashen Miracle] Oguri Cap,URA Finale Qualifier,2014,1,7000,70,6.4801,3,9,2,0,11900.0,13209,1309.0,11.0,13209,0
2026-09-17 22:45:31,76,3,[Ashen Miracle] Oguri Cap,URA Finale Semifinal,2109,1,10000,70,5.9469,7,6,5,0,17000.0,18870,1870.0,11.0,18870,0
2026-09-17 22:45:31,78,3,[Ashen Miracle] Oguri Cap,URA Finale Finals,2212,1,30000,70,7.2892,5,9,3,0,51000.0,57120,6120.0,12.0,57120,0
2026-09-19 20:01:05,12,3,[Ashen Miracle] Oguri Cap,Junior Make Debut,1070,1,700,70,6.6525,0,9,0,0,1190.0,1297,107.0,8.9916,1297,0
2026-09-19 20:01:05,23,3,[Ashen Miracle] Oguri Cap,Asahi Hai Futurity Stakes,624,3,1750,70,1.5022,0,6,0,0,2975.0,3153,178.0,5.9832,3153,0
2026-09-19 20:01:05,24,3,[Ashen Miracle] Oguri Cap,Hopeful Stakes,625,1,7000,70,5.6931,0,6,0,0,11900.0,12614,714.0,6.0,12614,0
2026-09-19 20:01:05,33,3,[Ashen Miracle] Oguri Cap,NHK Mile Cup,164,1,10500,70,1.488,0,2,0,0,17850.0,18207,357.0,2.0,18207,0
2026-09-19 20:01:05,46,3,[Ashen Miracle] Oguri Cap,Mile Championship,78,1,11000,70,3.8134,0,4,0,0,18700.0,19448,748.0,4.0,19448,0
2026-09-19 20:01:05,48,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,2.6633,0,4,0,0,51000.0,53040,2040.0,4.0,53040,0
2026-09-19 20:01:05,52,3,[Ashen Miracle] Oguri Cap,February Stakes,1,1,10000,70,0.6637,0,0,0,0,17000.0,17000,0.0,0.0,17000,0
2026-09-19 20:01:05,59,3,[Ashen Miracle] Oguri Cap,Yasuda Kinen,73,1,13000,70,5.9364,0,6,0,0,22100.0,23426,1326.0,6.0,23426,0
2026-09-19 20:01:05,68,3,[Ashen Miracle] Oguri Cap,Tenno Sho (Autumn),76,1,15000,70,6.0564,0,9,0,0,25500.0,27795,2295.0,9.0,27795,0
2026-09-19 20:01:05,72,3,[Ashen Miracle] Oguri Cap,Arima Kinen,81,1,30000,70,7.8703,0,9,0,0,51000.0,55590,4590.0,9.0,55590,0
2026-09-19 20:01:05,74,3,[Ashen Miracle] Oguri Cap,URA Finale Qualifier,2015,1,7000,70,5.8192,0,6,0,0,11900.0,12614,714.0,6.0,12614,0
2026-09-19 20:01:05,76,3,[Ashen Miracle] Oguri Cap,URA Finale Semifinal,2111,1,10000,70,5.2726,0,6,0,0,17000.0,18020,1020.0,6.0,18020,0
2026-09-19 20:01:05,78,3,[Ashen Miracle] Oguri Cap,URA Finale Finals,2213,1,30000,70,5.6513,0,6,0,0,51000.0,54060,3060.0,6.0,54060,0
2026-09-19 21:45:59,12,2,[Blossom in Learning] Sakura Bakushin O,Junior Make Debut,676,1,700,65,1.7631,0,2,0,0,1155.0,1178,23.0,1.9913,1178,0
2026-09-19 21:45:59,21,2,[Blossom in Learning] Sakura Bakushin O,Keio Hai Junior Stakes,626,1,3800,65,0.917,0,2,0,0,6270.0,6395,125.0,1.9936,6395,0
2026-09-19 21:45:59,30,2,[Blossom in Learning] Sakura Bakushin O,Spring Stakes,171,2,2160,65,0.7907,1,6,2,0,3564.0,3847,283.0,7.9405,3847,0
2026-09-19 21:45:59,34,2,[Blossom in Learning] Sakura Bakushin O,Aoi Stakes,210,2,1520,65,1.5851,0,6,0,0,2508.0,2658,150.0,5.9809,2658,0
2026-09-19 21:45:59,35,2,[Blossom in Learning] Sakura Bakushin O,Epsom Cup,95,1,4100,65,1.3364,1,2,2,0,6765.0,7035,270.0,3.9911,7035,0
2026-09-19 21:45:59,42,2,[Blossom in Learning] Sakura Bakushin O,Sprinters Stakes,75,3,3250,65,0.8705,0,6,0,0,5362.5,5684,321.5,5.9953,5684,0
2026-09-19 21:45:59,54,2,[Blossom in Learning] Sakura Bakushin O,Takamatsunomiya Kinen,2,2,5200,65,0.451,0,9,0,0,8580.0,9352,772.0,8.9977,9352,0
2026-09-19 21:45:59,60,2,[Blossom in Learning] Sakura Bakushin O,Hakodate Sprint Stakes,96,1,3900,65,0.9971,0,2,0,0,6435.0,6563,128.0,1.9891,6563,0
2026-09-19 21:45:59,61,2,[Blossom in Learning] Sakura Bakushin O,CBC Sho,97,1,3900,65,2.3483,0,2,0,0,6435.0,6563,128.0,1.9891,6563,0
2026-09-19 21:45:59,65,2,[Blossom in Learning] Sakura Bakushin O,Centaur Stakes,83,1,5900,65,1.5096,0,2,0,0,9735.0,9929,194.0,1.9928,9929,0
2026-09-19 21:45:59,66,2,[Blossom in Learning] Sakura Bakushin O,Sprinters Stakes,75,6,1170,65,2.5098,1,0,2,0,1930.5,1968,37.5,1.9425,1968,0
2026-09-23 23:41:07,12,1,[Blossom in Learning] Sakura Bakushin O,Junior Make Debut,676,1,700,65,2.7319,0,4,0,0,1155.0,1201,46.0,3.9827,1201,0
2026-09-23 23:41:07,21,1,[Blossom in Learning] Sakura Bakushin O,Keio Hai Junior Stakes,626,1,3800,65,0.5164,0,0,0,0,6270.0,6270,0.0,0.0,6270,0
2026-09-23 23:41:07,30,1,[Blossom in Learning] Sakura Bakushin O,Spring Stakes,171,1,5400,65,2.4521,1,2,2,0,8910.0,9266,356.0,3.9955,9266,0
2026-09-23 23:41:07,34,1,[Blossom in Learning] Sakura Bakushin O,Aoi Stakes,210,1,3800,65,0.4297,0,0,0,0,6270.0,6270,0.0,0.0,6270,0
2026-09-23 23:41:07,42,1,[Blossom in Learning] Sakura Bakushin O,Sprinters Stakes,75,6,1170,65,3.8513,0,0,0,0,1930.5,1930,-0.5,-0.0259,1930,0
2026-09-28 14:22:08,12,1,[Hot☆Summer Night] Maruzensky,Junior Make Debut,676,1,700,65,0.2547,0,0,0,0,1155.0,1155,0.0,0.0,1155,0
2026-10-01 09:39:24,12,2,[Wild Frontier] Taiki Shuttle,Junior Make Debut,846,1,700,80,2.9274,1,4,2,0,1260.0,1335,75.0,5.9524,1335,0
2026-10-01 09:39:24,25,2,[Wild Frontier] Taiki Shuttle,Shinzan Kinen,178,1,3800,80,3.297,0,4,0,0,6840.0,7113,273.0,3.9912,7113,0
2026-10-01 09:39:24,33,2,[Wild Frontier] Taiki Shuttle,NHK Mile Cup,164,1,10500,80,1.5041,0,2,0,0,18900.0,19278,378.0,2.0,19278,0
2026-10-01 09:39:24,36,2,[Wild Frontier] Taiki Shuttle,Unicorn Stakes,189,1,3500,80,0.0829,0,0,0,0,6300.0,6300,0.0,0.0,6300,0
2026-10-01 09:39:24,46,2,[Wild Frontier] Taiki Shuttle,Mile Championship,78,1,11000,80,1.3511,1,2,2,0,19800.0,20592,792.0,4.0,20592,0
2026-10-01 09:39:24,59,2,[Wild Frontier] Taiki Shuttle,Yasuda Kinen,73,1,13000,80,4.4812,0,6,0,0,23400.0,24804,1404.0,6.0,24804,0
2026-10-01 09:39:24,66,2,[Wild Frontier] Taiki Shuttle,Sprinters Stakes,75,1,13000,80,3.6966,1,4,2,0,23400.0,24804,1404.0,6.0,24804,0
2026-10-01 09:39:24,70,2,[Wild Frontier] Taiki Shuttle,Mile Championship,78,1,11000,80,3.6774,0,4,0,0,19800.0,20592,792.0,4.0,20592,0
2026-10-01 09:39:24,74,2,[Wild Frontier] Taiki Shuttle,URA Finale Qualifier,2013,1,7000,80,4.0671,0,6,0,0,12600.0,13356,756.0,6.0,13356,0
2026-10-01 09:39:24,76,2,[Wild Frontier] Taiki Shuttle,URA Finale Semifinal,2109,1,10000,80,4.9632,1,6,2,0,18000.0,19440,1440.0,8.0,19440,0
2026-10-01 09:39:24,78,2,[Wild Frontier] Taiki Shuttle,URA Finale Finals,2214,1,30000,80,1.1329,0,2,0,0,54000.0,55080,1080.0,2.0,55080,0
2026-10-04 14:36:48,12,4,[Wild Frontier] Taiki Shuttle,Junior Make Debut,846,1,700,105,2.6127,1,4,2,0,1435.0,1521,86.0,5.993,1521,0
2026-10-04 14:36:48,14,4,[Wild Frontier] Taiki Shuttle,Hakodate Junior Stakes,628,1,3100,105,4.3676,0,6,0,0,6355.0,6736,381.0,5.9953,6736,0
2026-10-04 14:36:48,16,4,[Wild Frontier] Taiki Shuttle,Niigata Junior Stakes,629,1,3100,105,2.8947,0,4,0,0,6355.0,6609,254.0,3.9969,6609,0
2026-10-04 14:36:48,17,4,[Wild Frontier] Taiki Shuttle,Sapporo Junior Stakes,630,1,3100,105,2.2675,1,2,2,0,6355.0,6609,254.0,3.9969,6609,0
2026-10-04 14:36:48,21,4,[Wild Frontier] Taiki Shuttle,Keio Hai Junior Stakes,626,1,3800,105,1.8215,1,2,2,0,7790.0,8101,311.0,3.9923,8101,0
2026-10-04 14:36:48,22,4,[Wild Frontier] Taiki Shuttle,Tokyo Sports Hai Junior Stakes,635,1,3300,105,4.1972,0,6,0,0,6765.0,7170,405.0,5.9867,7170,0
2026-10-04 14:36:48,23,4,[Wild Frontier] Taiki Shuttle,Hanshin Juvenile Fillies,623,1,6500,105,4.4133,1,6,2,0,13325.0,14391,1066.0,8.0,14391,0
2026-10-04 14:36:48,24,4,[Wild Frontier] Taiki Shuttle,Zen-Nippon Junior Yushun,1107,2,1680,105,0.6647,1,9,2,0,3444.0,3821,377.0,10.9466,3821,0
2026-10-04 14:36:48,27,4,[Wild Frontier] Taiki Shuttle,Kyodo News Hai,183,1,3800,105,3.9819,1,4,2,0,7790.0,8257,467.0,5.9949,8257,0
2026-10-04 14:36:48,29,4,[Wild Frontier] Taiki Shuttle,Fillies' Revue,170,2,2080,105,0.056,1,9,2,0,4264.0,4731,467.0,10.9522,4731,0
2026-10-04 14:36:48,30,4,[Wild Frontier] Taiki Shuttle,Spring Stakes,171,1,5400,105,1.5715,1,2,2,0,11070.0,11513,443.0,4.0018,11513,0
2026-10-04 14:36:48,31,4,[Wild Frontier] Taiki Shuttle,Oka Sho,162,1,10500,105,2.0067,0,2,0,0,21525.0,21956,431.0,2.0023,21956,0
2026-10-04 14:36:48,33,4,[Wild Frontier] Taiki Shuttle,NHK Mile Cup,164,1,10500,105,1.3928,0,2,0,0,21525.0,21956,431.0,2.0023,21956,0
2026-10-04 14:36:48,35,4,[Wild Frontier] Taiki Shuttle,Yasuda Kinen,73,1,13000,105,1.2662,1,2,2,0,26650.0,27716,1066.0,4.0,27716,0
2026-10-04 14:36:48,39,4,[Wild Frontier] Taiki Shuttle,Sekiya Kinen,105,1,3900,105,3.8619,0,4,0,0,7995.0,8314,319.0,3.99,8314,0
2026-10-04 14:36:48,41,4,[Wild Frontier] Taiki Shuttle,Rose Stakes,176,1,5200,105,3.3191,1,4,2,0,10660.0,11300,640.0,6.0038,11300,0
2026-10-04 14:36:48,42,4,[Wild Frontier] Taiki Shuttle,Sprinters Stakes,75,1,13000,105,3.2007,1,4,2,0,26650.0,28249,1599.0,6.0,28249,0
2026-10-04 14:36:48,43,4,[Wild Frontier] Taiki Shuttle,M.C. Nambu Hai,1109,1,6000,105,2.7546,0,4,0,0,12300.0,12792,492.0,4.0,12792,0
2026-10-04 14:36:48,45,4,[Wild Frontier] Taiki Shuttle,JBC Sprint,1111,1,6000,105,1.5294,1,2,2,0,12300.0,12792,492.0,4.0,12792,0
2026-10-04 14:36:48,46,4,[Wild Frontier] Taiki Shuttle,Mile Championship,78,1,11000,105,2.2484,0,2,0,0,22550.0,23001,451.0,2.0,23001,0
2026-10-04 14:36:48,47,4,[Wild Frontier] Taiki Shuttle,Champions Cup,80,1,10000,105,2.5859,0,4,0,0,20500.0,21320,820.0,4.0,21320,0
2026-10-04 14:36:48,50,4,[Wild Frontier] Taiki Shuttle,Negishi Stakes,22,2,1520,105,1.4117,0,6,0,0,3116.0,3302,186.0,5.9692,3302,0
2026-10-04 14:36:48,52,4,[Wild Frontier] Taiki Shuttle,February Stakes,1,1,10000,105,0.0968,0,0,0,0,20500.0,20500,0.0,0.0,20500,0
2026-10-04 14:36:48,54,4,[Wild Frontier] Taiki Shuttle,Takamatsunomiya Kinen,2,1,13000,105,3.2402,0,4,0,0,26650.0,27716,1066.0,4.0,27716,0
2026-10-04 14:36:48,55,4,[Wild Frontier] Taiki Shuttle,Marine Cup,1128,1,2500,105,2.6992,0,4,0,0,5125.0,5330,205.0,4.0,5330,0
2026-10-04 14:36:48,57,4,[Wild Frontier] Taiki Shuttle,Victoria Mile,5,1,10500,105,1.5024,0,2,0,0,21525.0,21956,431.0,2.0023,21956,0
2026-10-04 14:36:48,58,4,[Wild Frontier] Taiki Shuttle,Keyaki Stakes,71,1,2200,105,3.8244,1,4,2,0,4510.0,4780,270.0,5.9867,4780,0
2026-10-04 14:36:48,59,4,[Wild Frontier] Taiki Shuttle,Yasuda Kinen,73,1,13000,105,1.4361,1,2,2,0,26650.0,27716,1066.0,4.0,27716,0
2026-10-04 14:36:48,62,4,[Wild Frontier] Taiki Shuttle,Queen Stakes,103,1,3600,105,5.0515,0,6,0,0,7380.0,7822,442.0,5.9892,7822,0
2026-10-04 14:36:48,65,4,[Wild Frontier] Taiki Shuttle,Keisei Hai Autumn Handicap,110,1,3900,105,5.633,0,6,0,0,7995.0,8474,479.0,5.9912,8474,0
2026-10-04 14:36:48,66,4,[Wild Frontier] Taiki Shuttle,Sprinters Stakes,75,1,13000,105,2.6328,0,4,0,0,26650.0,27716,1066.0,4.0,27716,0
2026-10-04 14:36:48,67,4,[Wild Frontier] Taiki Shuttle,M.C. Nambu Hai,1109,1,6000,105,4.184,0,6,0,0,12300.0,13038,738.0,6.0,13038,0
2026-10-04 14:36:48,69,4,[Wild Frontier] Taiki Shuttle,JBC Sprint,1025,1,6000,105,2.1263,1,2,2,0,12300.0,12792,492.0,4.0,12792,0
2026-10-04 14:36:48,70,4,[Wild Frontier] Taiki Shuttle,Mile Championship,78,1,11000,105,2.1798,0,2,0,0,22550.0,23001,451.0,2.0,23001,0
2026-10-04 14:36:48,71,4,[Wild Frontier] Taiki Shuttle,Champions Cup,80,1,10000,105,0.8076,1,2,2,0,20500.0,21320,820.0,4.0,21320,0
2026-10-04 14:36:48,74,4,[Wild Frontier] Taiki Shuttle,Twinkle Star Climax Race 1,2313,1,7000,105,4.0466,1,6,2,0,14350.0,15498,1148.0,8.0,15498,0
2026-10-04 14:36:48,76,4,[Wild Frontier] Taiki Shuttle,Twinkle Star Climax Race 2,2410,1,10000,105,1.8345,1,2,2,0,20500.0,21320,820.0,4.0,21320,0
2026-10-04 14:36:48,78,4,[Wild Frontier] Taiki Shuttle,Twinkle Star Climax Race 3,2515,1,30000,105,5.1406,1,6,2,50,61500.0,99630,38130.0,62.0,99630,0
2026-10-08 10:00:27,12,3,[CODE: ICING] Mihono Bourbon,Junior Make Debut,1075,1,700,70,3.126,1,4,2,0,1190.0,1261,71.0,5.9664,1261,0
2026-10-08 10:00:27,23,3,[CODE: ICING] Mihono Bourbon,Asahi Hai Futurity Stakes,624,1,7000,70,3.0099,2,4,2,0,11900.0,12614,714.0,6.0,12614,0
2026-10-08 10:00:27,30,3,[CODE: ICING] Mihono Bourbon,Spring Stakes,171,1,5400,70,1.4594,1,2,2,0,9180.0,9547,367.0,3.9978,9547,0
2026-10-08 10:00:27,31,3,[CODE: ICING] Mihono Bourbon,Satsuki Sho,163,1,11000,70,6.1843,2,9,2,0,18700.0,20757,2057.0,11.0,20757,0
2026-10-08 10:00:27,34,3,[CODE: ICING] Mihono Bourbon,Tokyo Yushun (Japanese Derby),166,1,20000,70,4.682,2,6,2,0,34000.0,36720,2720.0,8.0,36720,0
2026-10-08 10:00:27,44,3,[CODE: ICING] Mihono Bourbon,Kikuka Sho,168,1,12000,70,3.5273,1,4,2,0,20400.0,21624,1224.0,6.0,21624,0
2026-10-08 10:00:27,56,3,[CODE: ICING] Mihono Bourbon,Tenno Sho (Spring),4,1,15000,70,10.0374,2,9,2,0,25500.0,28305,2805.0,11.0,28305,0
2026-10-08 10:00:27,70,3,[CODE: ICING] Mihono Bourbon,Japan Cup,79,1,30000,70,10.1623,2,9,2,0,51000.0,56610,5610.0,11.0,56610,0
2026-10-08 10:00:27,72,3,[CODE: ICING] Mihono Bourbon,Arima Kinen,81,1,30000,70,10.4669,3,9,2,0,51000.0,56610,5610.0,11.0,56610,0
2026-10-08 10:00:27,74,3,[CODE: ICING] Mihono Bourbon,URA Finale Qualifier,2010,1,7000,70,5.7274,3,6,2,0,11900.0,12852,952.0,8.0,12852,0
2026-10-08 10:00:27,76,3,[CODE: ICING] Mihono Bourbon,URA Finale Semifinal,2113,1,10000,70,3.7223,3,4,2,0,17000.0,18020,1020.0,6.0,18020,0
2026-10-08 10:00:27,78,3,[CODE: ICING] Mihono Bourbon,URA Finale Finals,2209,1,30000,70,3.873,3,4,2,0,51000.0,54060,3060.0,6.0,54060,0
2026-10-10 03:12:29,12,3,[Soirée des Chatons] Seiun Sky,Junior Make Debut,689,1,700,70,3.0303,1,4,2,0,1190.0,1261,71.0,5.9664,1261,0
2026-10-10 03:12:29,24,3,[Soirée des Chatons] Seiun Sky,Hopeful Stakes,625,1,7000,70,2.1576,1,2,2,0,11900.0,12376,476.0,4.0,12376,0
2026-10-10 03:12:29,31,3,[Soirée des Chatons] Seiun Sky,Satsuki Sho,163,1,11000,70,2.5681,2,4,2,0,18700.0,19822,1122.0,6.0,19822,0
2026-10-10 03:12:29,34,3,[Soirée des Chatons] Seiun Sky,Tokyo Yushun (Japanese Derby),166,1,20000,70,2.4678,2,2,2,0,34000.0,35360,1360.0,4.0,35360,0
2026-10-10 03:12:29,44,3,[Soirée des Chatons] Seiun Sky,Kikuka Sho,168,1,12000,70,0.6938,2,0,2,0,20400.0,20808,408.0,2.0,20808,0
2026-10-10 03:12:29,48,3,[Soirée des Chatons] Seiun Sky,Arima Kinen,81,1,30000,70,3.3828,2,4,2,0,51000.0,54060,3060.0,6.0,54060,0
2026-10-10 03:12:29,56,3,[Soirée des Chatons] Seiun Sky,Tenno Sho (Spring),4,1,15000,70,20.5803,10,9,8,0,25500.0,29835,4335.0,17.0,29835,0
2026-10-10 03:12:29,60,3,[Soirée des Chatons] Seiun Sky,Takarazuka Kinen,74,1,15000,70,6.4095,10,9,8,0,25500.0,29835,4335.0,17.0,29835,0
2026-10-10 03:12:29,68,3,[Soirée des Chatons] Seiun Sky,Tenno Sho (Autumn),76,1,15000,70,9.3985,9,9,5,0,25500.0,29070,3570.0,14.0,29070,0
2026-10-10 03:12:29,72,3,[Soirée des Chatons] Seiun Sky,Arima Kinen,81,1,30000,70,11.7606,10,9,8,0,51000.0,59670,8670.0,17.0,59670,0
2026-10-10 03:12:29,74,3,[Soirée des Chatons] Seiun Sky,URA Finale Qualifier,2018,1,7000,70,11.2054,9,9,5,0,11900.0,13566,1666.0,14.0,13566,0
2026-10-10 03:12:29,76,3,[Soirée des Chatons] Seiun Sky,URA Finale Semifinal,2123,1,10000,70,8.0601,7,9,5,0,17000.0,19380,2380.0,14.0,19380,0
2026-10-10 03:12:29,78,3,[Soirée des Chatons] Seiun Sky,URA Finale Finals,2222,1,30000,70,5.7947,8,6,5,0,51000.0,56610,5610.0,11.0,56610,0
2026-10-10 15:53:30,12,3,[Soirée des Chatons] Seiun Sky,Junior Make Debut,689,1,700,70,3.7946,2,4,2,0,1190.0,1261,71.0,5.9664,1261,0
2026-10-10 15:53:30,24,3,[Soirée des Chatons] Seiun Sky,Hopeful Stakes,625,1,7000,70,5.3394,1,6,2,0,11900.0,12852,952.0,8.0,12852,0
2026-10-10 15:53:30,31,3,[Soirée des Chatons] Seiun Sky,Satsuki Sho,163,1,11000,70,7.5947,2,9,2,0,18700.0,20757,2057.0,11.0,20757,0
2026-10-10 15:53:30,34,3,[Soirée des Chatons] Seiun Sky,Tokyo Yushun (Japanese Derby),166,1,20000,70,2.1677,4,2,3,0,34000.0,35700,1700.0,5.0,35700,0
2026-10-10 15:53:30,44,3,[Soirée des Chatons] Seiun Sky,Kikuka Sho,168,3,3000,70,3.8191,4,4,3,0,5100.0,5457,357.0,7.0,5457,0
2026-10-10 15:53:30,48,3,[Soirée des Chatons] Seiun Sky,Arima Kinen,81,1,30000,70,12.6422,3,9,2,0,51000.0,56610,5610.0,11.0,56610,0
2026-10-10 15:53:30,56,3,[Soirée des Chatons] Seiun Sky,Tenno Sho (Spring),4,1,15000,70,1.11,7,2,5,0,25500.0,27285,1785.0,7.0,27285,0
2026-10-10 15:53:30,60,3,[Soirée des Chatons] Seiun Sky,Takarazuka Kinen,74,1,15000,70,13.7279,7,9,5,0,25500.0,29070,3570.0,14.0,29070,0
2026-10-10 15:53:30,68,3,[Soirée des Chatons] Seiun Sky,Tenno Sho (Autumn),76,1,15000,70,3.6698,6,4,3,0,25500.0,27285,1785.0,7.0,27285,0
2026-10-10 15:53:30,72,3,[Soirée des Chatons] Seiun Sky,Arima Kinen,81,1,30000,70,13.5919,8,9,5,0,51000.0,58140,7140.0,14.0,58140,0
2026-10-10 15:53:30,74,3,[Soirée des Chatons] Seiun Sky,URA Finale Qualifier,2025,1,7000,70,13.045,7,9,5,0,11900.0,13566,1666.0,14.0,13566,0
2026-10-10 15:53:30,76,3,[Soirée des Chatons] Seiun Sky,URA Finale Semifinal,2122,1,10000,70,12.4002,7,9,5,0,17000.0,19380,2380.0,14.0,19380,0
2026-10-10 15:53:30,78,3,[Soirée des Chatons] Seiun Sky,URA Finale Finals,2217,1,30000,70,12.3247,7,9,5,0,51000.0,58140,7140.0,14.0,58140,0
2026-10-11 18:47:03,12,3,[Soirée des Chatons] Seiun Sky,Junior Make Debut,689,1,700,80,3.2149,2,4,2,0,1260.0,1335,75.0,5.9524,1335,0
2026-10-11 18:47:03,24,3,[Soirée des Chatons] Seiun Sky,Hopeful Stakes,625,1,7000,80,2.4816,2,2,2,0,12600.0,13104,504.0,4.0,13104,0
2026-10-11 19:13:35,12,3,[Soirée des Chatons] Seiun Sky,Junior Make Debut,689,1,700,80,4.1512,1,6,2,0,1260.0,1360,100.0,7.9365,1360,0
2026-10-11 19:13:35,24,3,[Soirée des Chatons] Seiun Sky,Hopeful Stakes,625,1,7000,80,2.8651,2,4,2,0,12600.0,13356,756.0,6.0,13356,0
2026-10-11 19:13:35,31,3,[Soirée des Chatons] Seiun Sky,Satsuki Sho,163,1,11000,80,4.6012,2,6,2,0,19800.0,21384,1584.0,8.0,21384,0
2026-10-11 19:13:35,34,3,[Soirée des Chatons] Seiun Sky,Tokyo Yushun (Japanese Derby),166,1,20000,80,4.1483,2,6,2,0,36000.0,38880,2880.0,8.0,38880,0
2026-10-11 19:13:35,44,3,[Soirée des Chatons] Seiun Sky,Kikuka Sho,168,2,4800,80,4.218,2,2,2,0,8640.0,8985,345.0,3.9931,8985,0
2026-10-11 19:13:35,48,3,[Soirée des Chatons] Seiun Sky,Arima Kinen,81,1,30000,80,10.0709,3,9,2,0,54000.0,59940,5940.0,11.0,59940,0
2026-10-11 19:13:35,56,3,[Soirée des Chatons] Seiun Sky,Tenno Sho (Spring),4,1,15000,80,6.5113,8,9,5,0,27000.0,30780,3780.0,14.0,30780,0
2026-10-11 19:13:35,60,3,[Soirée des Chatons] Seiun Sky,Takarazuka Kinen,74,1,15000,80,6.7601,6,9,3,0,27000.0,30240,3240.0,12.0,30240,0
2026-10-11 19:13:35,72,3,[Soirée des Chatons] Seiun Sky,Arima Kinen,81,1,30000,80,14.0565,7,9,5,0,54000.0,61560,7560.0,14.0,61560,0
2026-10-11 19:13:35,74,3,[Soirée des Chatons] Seiun Sky,URA Finale Qualifier,2018,1,7000,80,10.2344,7,9,5,0,12600.0,14364,1764.0,14.0,14364,0
2026-10-11 19:13:35,76,3,[Soirée des Chatons] Seiun Sky,URA Finale Semifinal,2121,1,10000,80,5.3797,5,6,3,0,18000.0,19620,1620.0,9.0,19620,0
2026-10-11 19:13:35,78,3,[Soirée des Chatons] Seiun Sky,URA Finale Finals,2222,1,30000,80,7.7281,7,9,5,0,54000.0,61560,7560.0,14.0,61560,0
1 career turn scenario character race program_id place base_fans deck_bonus_pct margin_lengths skill_activations margin_bonus_pct skill_bonus_pct item_bonus_pct deck_only_fans actual_fans extra_fans extra_pct predicted_fans residual_fans
2 2026-08-19 20:37:27 12 3 [Ashen Miracle] Oguri Cap Junior Make Debut 1070 1 700 55 4.4727 0 6 0 0 1085.0 1150 65.0 5.9908 1150 0
3 2026-08-19 20:37:27 23 3 [Ashen Miracle] Oguri Cap Hanshin Juvenile Fillies 623 6 585 55 1.2941 0 0 0 0 906.75 906 -0.75 -0.0827 906 0
4 2026-08-19 20:37:27 24 3 [Ashen Miracle] Oguri Cap Hopeful Stakes 625 1 7000 55 1.1495 0 2 0 0 10850.0 11067 217.0 2.0 11067 0
5 2026-08-19 20:37:27 33 3 [Ashen Miracle] Oguri Cap NHK Mile Cup 164 1 10500 55 1.6165 0 2 0 0 16275.0 16601 326.0 2.0031 16601 0
6 2026-08-19 20:37:27 46 3 [Ashen Miracle] Oguri Cap Mile Championship 78 1 11000 55 5.3966 5 6 3 0 17050.0 18585 1535.0 9.0029 18585 0
7 2026-08-19 20:37:27 48 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 55 8.8065 6 9 3 0 46500.0 52080 5580.0 12.0 52080 0
8 2026-08-19 20:37:27 54 3 [Ashen Miracle] Oguri Cap Osaka Hai 3 1 13500 55 3.3853 4 4 3 0 20925.0 22390 1465.0 7.0012 22390 0
9 2026-08-19 20:37:27 57 3 [Ashen Miracle] Oguri Cap Victoria Mile 5 1 10500 55 4.8613 2 6 2 0 16275.0 17577 1302.0 8.0 17577 0
10 2026-08-19 20:37:27 68 3 [Ashen Miracle] Oguri Cap Tenno Sho (Autumn) 76 1 15000 55 14.0515 6 9 3 0 23250.0 26040 2790.0 12.0 26040 0
11 2026-08-19 20:37:27 72 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 55 10.5066 7 9 5 0 46500.0 53010 6510.0 14.0 53010 0
12 2026-08-19 20:37:27 74 3 [Ashen Miracle] Oguri Cap URA Finale Qualifier 2015 1 7000 55 6.1557 6 9 3 0 10850.0 12152 1302.0 12.0 12152 0
13 2026-08-19 20:37:27 76 3 [Ashen Miracle] Oguri Cap URA Finale Semifinal 2112 1 10000 55 6.906 7 9 5 0 15500.0 17670 2170.0 14.0 17670 0
14 2026-08-19 20:37:27 78 3 [Ashen Miracle] Oguri Cap URA Finale Finals 2213 1 30000 55 7.8077 8 9 5 0 46500.0 53010 6510.0 14.0 53010 0
15 2026-09-08 21:05:53 12 3 [Ashen Miracle] Oguri Cap Junior Make Debut 1070 1 700 70 2.4747 0 2 0 0 1190.0 1213 23.0 1.9328 1213 0
16 2026-09-08 21:05:53 23 3 [Ashen Miracle] Oguri Cap Hanshin Juvenile Fillies 623 3 1625 70 2.5458 0 4 0 0 2762.5 2873 110.5 4.0 2873 0
17 2026-09-08 21:05:53 32 3 [Ashen Miracle] Oguri Cap Flora Stakes 173 1 5200 70 0.166 0 0 0 0 8840.0 8840 0.0 0.0 8840 0
18 2026-09-08 21:05:53 33 3 [Ashen Miracle] Oguri Cap NHK Mile Cup 164 1 10500 70 0.6636 0 0 0 0 17850.0 17850 0.0 0.0 17850 0
19 2026-09-08 21:05:53 46 3 [Ashen Miracle] Oguri Cap Mile Championship 78 1 11000 70 0.3634 0 0 0 0 18700.0 18700 0.0 0.0 18700 0
20 2026-09-08 21:05:53 48 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 3.9924 0 4 0 0 51000.0 53040 2040.0 4.0 53040 0
21 2026-09-08 21:05:53 54 3 [Ashen Miracle] Oguri Cap Osaka Hai 3 1 13500 70 3.7863 0 4 0 0 22950.0 23868 918.0 4.0 23868 0
22 2026-09-08 21:05:53 57 3 [Ashen Miracle] Oguri Cap Victoria Mile 5 1 10500 70 1.4385 0 2 0 0 17850.0 18207 357.0 2.0 18207 0
23 2026-09-08 21:05:53 68 3 [Ashen Miracle] Oguri Cap Tenno Sho (Autumn) 76 1 15000 70 3.9784 0 4 0 0 25500.0 26520 1020.0 4.0 26520 0
24 2026-09-08 21:05:53 72 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 7.8092 0 9 0 0 51000.0 55590 4590.0 9.0 55590 0
25 2026-09-08 21:05:53 74 3 [Ashen Miracle] Oguri Cap URA Finale Qualifier 2011 1 7000 70 4.2694 0 6 0 0 11900.0 12614 714.0 6.0 12614 0
26 2026-09-08 21:05:53 76 3 [Ashen Miracle] Oguri Cap URA Finale Semifinal 2108 1 10000 70 1.7312 0 2 0 0 17000.0 17340 340.0 2.0 17340 0
27 2026-09-08 21:05:53 78 3 [Ashen Miracle] Oguri Cap URA Finale Finals 2209 1 30000 70 2.9177 0 4 0 0 51000.0 53040 2040.0 4.0 53040 0
28 2026-09-16 13:24:41 12 3 [Ashen Miracle] Oguri Cap Junior Make Debut 1070 1 700 70 6.3564 0 9 0 0 1190.0 1297 107.0 8.9916 1297 0
29 2026-09-16 13:24:41 23 3 [Ashen Miracle] Oguri Cap Hanshin Juvenile Fillies 623 1 6500 70 0.5447 0 0 0 0 11050.0 11050 0.0 0.0 11050 0
30 2026-09-16 13:24:41 33 3 [Ashen Miracle] Oguri Cap NHK Mile Cup 164 1 10500 70 1.2208 0 2 0 0 17850.0 18207 357.0 2.0 18207 0
31 2026-09-16 13:24:41 46 3 [Ashen Miracle] Oguri Cap Mile Championship 78 1 11000 70 1.8764 0 2 0 0 18700.0 19074 374.0 2.0 19074 0
32 2026-09-16 13:24:41 48 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 7.2065 0 9 0 0 51000.0 55590 4590.0 9.0 55590 0
33 2026-09-16 13:24:41 54 3 [Ashen Miracle] Oguri Cap Osaka Hai 3 1 13500 70 9.1057 0 9 0 0 22950.0 25016 2066.0 9.0022 25016 0
34 2026-09-16 13:24:41 59 3 [Ashen Miracle] Oguri Cap Yasuda Kinen 73 1 13000 70 4.3705 0 6 0 0 22100.0 23426 1326.0 6.0 23426 0
35 2026-09-16 13:24:41 68 3 [Ashen Miracle] Oguri Cap Tenno Sho (Autumn) 76 1 15000 70 7.933 0 9 0 0 25500.0 27795 2295.0 9.0 27795 0
36 2026-09-16 13:24:41 72 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 5.7931 0 6 0 0 51000.0 54060 3060.0 6.0 54060 0
37 2026-09-16 13:24:41 74 3 [Ashen Miracle] Oguri Cap URA Finale Qualifier 2010 1 7000 70 5.7824 0 6 0 0 11900.0 12614 714.0 6.0 12614 0
38 2026-09-16 13:24:41 76 3 [Ashen Miracle] Oguri Cap URA Finale Semifinal 2112 1 10000 70 2.7856 0 4 0 0 17000.0 17680 680.0 4.0 17680 0
39 2026-09-16 13:24:41 78 3 [Ashen Miracle] Oguri Cap URA Finale Finals 2208 1 30000 70 5.4409 0 6 0 0 51000.0 54060 3060.0 6.0 54060 0
40 2026-09-17 20:23:11 12 3 [Ashen Miracle] Oguri Cap Junior Make Debut 1070 1 700 70 5.3797 0 6 0 0 1190.0 1261 71.0 5.9664 1261 0
41 2026-09-17 20:23:11 24 3 [Ashen Miracle] Oguri Cap Hopeful Stakes 625 1 7000 70 4.8411 2 6 2 0 11900.0 12852 952.0 8.0 12852 0
42 2026-09-17 20:23:11 33 3 [Ashen Miracle] Oguri Cap NHK Mile Cup 164 1 10500 70 3.0921 1 4 2 0 17850.0 18921 1071.0 6.0 18921 0
43 2026-09-17 20:23:11 46 3 [Ashen Miracle] Oguri Cap Mile Championship 78 1 11000 70 3.4861 1 4 2 0 18700.0 19822 1122.0 6.0 19822 0
44 2026-09-17 20:23:11 48 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 8.0058 1 9 2 0 51000.0 56610 5610.0 11.0 56610 0
45 2026-09-17 20:23:11 51 3 [Ashen Miracle] Oguri Cap Kawasaki Kinen 1106 1 6000 70 5.6972 1 6 2 0 10200.0 11016 816.0 8.0 11016 0
46 2026-09-17 20:23:11 52 3 [Ashen Miracle] Oguri Cap February Stakes 1 1 10000 70 0.5589 1 0 2 0 17000.0 17340 340.0 2.0 17340 0
47 2026-09-17 20:23:11 68 3 [Ashen Miracle] Oguri Cap Tenno Sho (Autumn) 76 1 15000 70 4.6895 2 6 2 0 25500.0 27540 2040.0 8.0 27540 0
48 2026-09-17 20:23:11 72 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 9.0895 1 9 2 0 51000.0 56610 5610.0 11.0 56610 0
49 2026-09-17 20:23:11 74 3 [Ashen Miracle] Oguri Cap URA Finale Qualifier 2014 1 7000 70 6.1828 1 9 2 0 11900.0 13209 1309.0 11.0 13209 0
50 2026-09-17 20:23:11 76 3 [Ashen Miracle] Oguri Cap URA Finale Semifinal 2111 1 10000 70 2.8136 1 4 2 0 17000.0 18020 1020.0 6.0 18020 0
51 2026-09-17 20:23:11 78 3 [Ashen Miracle] Oguri Cap URA Finale Finals 2212 1 30000 70 1.061 1 2 2 0 51000.0 53040 2040.0 4.0 53040 0
52 2026-09-17 22:45:31 12 3 [Ashen Miracle] Oguri Cap Junior Make Debut 1070 1 700 70 2.2776 1 2 2 0 1190.0 1237 47.0 3.9496 1237 0
53 2026-09-17 22:45:31 23 3 [Ashen Miracle] Oguri Cap Hanshin Juvenile Fillies 623 2 2600 70 0.0231 0 9 0 0 4420.0 4817 397.0 8.9819 4817 0
54 2026-09-17 22:45:31 33 3 [Ashen Miracle] Oguri Cap NHK Mile Cup 164 1 10500 70 2.7073 2 4 2 0 17850.0 18921 1071.0 6.0 18921 0
55 2026-09-17 22:45:31 46 3 [Ashen Miracle] Oguri Cap Mile Championship 78 1 11000 70 1.9154 2 2 2 0 18700.0 19448 748.0 4.0 19448 0
56 2026-09-17 22:45:31 48 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 4.8206 2 6 2 0 51000.0 55080 4080.0 8.0 55080 0
57 2026-09-17 22:45:31 56 3 [Ashen Miracle] Oguri Cap Tenno Sho (Spring) 4 1 15000 70 14.398 5 9 3 0 25500.0 28560 3060.0 12.0 28560 0
58 2026-09-17 22:45:31 57 3 [Ashen Miracle] Oguri Cap Victoria Mile 5 1 10500 70 2.1273 3 2 2 0 17850.0 18564 714.0 4.0 18564 0
59 2026-09-17 22:45:31 68 3 [Ashen Miracle] Oguri Cap Tenno Sho (Autumn) 76 1 15000 70 7.6906 5 9 3 0 25500.0 28560 3060.0 12.0 28560 0
60 2026-09-17 22:45:31 72 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 7.549 6 9 3 0 51000.0 57120 6120.0 12.0 57120 0
61 2026-09-17 22:45:31 74 3 [Ashen Miracle] Oguri Cap URA Finale Qualifier 2014 1 7000 70 6.4801 3 9 2 0 11900.0 13209 1309.0 11.0 13209 0
62 2026-09-17 22:45:31 76 3 [Ashen Miracle] Oguri Cap URA Finale Semifinal 2109 1 10000 70 5.9469 7 6 5 0 17000.0 18870 1870.0 11.0 18870 0
63 2026-09-17 22:45:31 78 3 [Ashen Miracle] Oguri Cap URA Finale Finals 2212 1 30000 70 7.2892 5 9 3 0 51000.0 57120 6120.0 12.0 57120 0
64 2026-09-19 20:01:05 12 3 [Ashen Miracle] Oguri Cap Junior Make Debut 1070 1 700 70 6.6525 0 9 0 0 1190.0 1297 107.0 8.9916 1297 0
65 2026-09-19 20:01:05 23 3 [Ashen Miracle] Oguri Cap Asahi Hai Futurity Stakes 624 3 1750 70 1.5022 0 6 0 0 2975.0 3153 178.0 5.9832 3153 0
66 2026-09-19 20:01:05 24 3 [Ashen Miracle] Oguri Cap Hopeful Stakes 625 1 7000 70 5.6931 0 6 0 0 11900.0 12614 714.0 6.0 12614 0
67 2026-09-19 20:01:05 33 3 [Ashen Miracle] Oguri Cap NHK Mile Cup 164 1 10500 70 1.488 0 2 0 0 17850.0 18207 357.0 2.0 18207 0
68 2026-09-19 20:01:05 46 3 [Ashen Miracle] Oguri Cap Mile Championship 78 1 11000 70 3.8134 0 4 0 0 18700.0 19448 748.0 4.0 19448 0
69 2026-09-19 20:01:05 48 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 2.6633 0 4 0 0 51000.0 53040 2040.0 4.0 53040 0
70 2026-09-19 20:01:05 52 3 [Ashen Miracle] Oguri Cap February Stakes 1 1 10000 70 0.6637 0 0 0 0 17000.0 17000 0.0 0.0 17000 0
71 2026-09-19 20:01:05 59 3 [Ashen Miracle] Oguri Cap Yasuda Kinen 73 1 13000 70 5.9364 0 6 0 0 22100.0 23426 1326.0 6.0 23426 0
72 2026-09-19 20:01:05 68 3 [Ashen Miracle] Oguri Cap Tenno Sho (Autumn) 76 1 15000 70 6.0564 0 9 0 0 25500.0 27795 2295.0 9.0 27795 0
73 2026-09-19 20:01:05 72 3 [Ashen Miracle] Oguri Cap Arima Kinen 81 1 30000 70 7.8703 0 9 0 0 51000.0 55590 4590.0 9.0 55590 0
74 2026-09-19 20:01:05 74 3 [Ashen Miracle] Oguri Cap URA Finale Qualifier 2015 1 7000 70 5.8192 0 6 0 0 11900.0 12614 714.0 6.0 12614 0
75 2026-09-19 20:01:05 76 3 [Ashen Miracle] Oguri Cap URA Finale Semifinal 2111 1 10000 70 5.2726 0 6 0 0 17000.0 18020 1020.0 6.0 18020 0
76 2026-09-19 20:01:05 78 3 [Ashen Miracle] Oguri Cap URA Finale Finals 2213 1 30000 70 5.6513 0 6 0 0 51000.0 54060 3060.0 6.0 54060 0
77 2026-09-19 21:45:59 12 2 [Blossom in Learning] Sakura Bakushin O Junior Make Debut 676 1 700 65 1.7631 0 2 0 0 1155.0 1178 23.0 1.9913 1178 0
78 2026-09-19 21:45:59 21 2 [Blossom in Learning] Sakura Bakushin O Keio Hai Junior Stakes 626 1 3800 65 0.917 0 2 0 0 6270.0 6395 125.0 1.9936 6395 0
79 2026-09-19 21:45:59 30 2 [Blossom in Learning] Sakura Bakushin O Spring Stakes 171 2 2160 65 0.7907 1 6 2 0 3564.0 3847 283.0 7.9405 3847 0
80 2026-09-19 21:45:59 34 2 [Blossom in Learning] Sakura Bakushin O Aoi Stakes 210 2 1520 65 1.5851 0 6 0 0 2508.0 2658 150.0 5.9809 2658 0
81 2026-09-19 21:45:59 35 2 [Blossom in Learning] Sakura Bakushin O Epsom Cup 95 1 4100 65 1.3364 1 2 2 0 6765.0 7035 270.0 3.9911 7035 0
82 2026-09-19 21:45:59 42 2 [Blossom in Learning] Sakura Bakushin O Sprinters Stakes 75 3 3250 65 0.8705 0 6 0 0 5362.5 5684 321.5 5.9953 5684 0
83 2026-09-19 21:45:59 54 2 [Blossom in Learning] Sakura Bakushin O Takamatsunomiya Kinen 2 2 5200 65 0.451 0 9 0 0 8580.0 9352 772.0 8.9977 9352 0
84 2026-09-19 21:45:59 60 2 [Blossom in Learning] Sakura Bakushin O Hakodate Sprint Stakes 96 1 3900 65 0.9971 0 2 0 0 6435.0 6563 128.0 1.9891 6563 0
85 2026-09-19 21:45:59 61 2 [Blossom in Learning] Sakura Bakushin O CBC Sho 97 1 3900 65 2.3483 0 2 0 0 6435.0 6563 128.0 1.9891 6563 0
86 2026-09-19 21:45:59 65 2 [Blossom in Learning] Sakura Bakushin O Centaur Stakes 83 1 5900 65 1.5096 0 2 0 0 9735.0 9929 194.0 1.9928 9929 0
87 2026-09-19 21:45:59 66 2 [Blossom in Learning] Sakura Bakushin O Sprinters Stakes 75 6 1170 65 2.5098 1 0 2 0 1930.5 1968 37.5 1.9425 1968 0
88 2026-09-23 23:41:07 12 1 [Blossom in Learning] Sakura Bakushin O Junior Make Debut 676 1 700 65 2.7319 0 4 0 0 1155.0 1201 46.0 3.9827 1201 0
89 2026-09-23 23:41:07 21 1 [Blossom in Learning] Sakura Bakushin O Keio Hai Junior Stakes 626 1 3800 65 0.5164 0 0 0 0 6270.0 6270 0.0 0.0 6270 0
90 2026-09-23 23:41:07 30 1 [Blossom in Learning] Sakura Bakushin O Spring Stakes 171 1 5400 65 2.4521 1 2 2 0 8910.0 9266 356.0 3.9955 9266 0
91 2026-09-23 23:41:07 34 1 [Blossom in Learning] Sakura Bakushin O Aoi Stakes 210 1 3800 65 0.4297 0 0 0 0 6270.0 6270 0.0 0.0 6270 0
92 2026-09-23 23:41:07 42 1 [Blossom in Learning] Sakura Bakushin O Sprinters Stakes 75 6 1170 65 3.8513 0 0 0 0 1930.5 1930 -0.5 -0.0259 1930 0
93 2026-09-28 14:22:08 12 1 [Hot☆Summer Night] Maruzensky Junior Make Debut 676 1 700 65 0.2547 0 0 0 0 1155.0 1155 0.0 0.0 1155 0
94 2026-10-01 09:39:24 12 2 [Wild Frontier] Taiki Shuttle Junior Make Debut 846 1 700 80 2.9274 1 4 2 0 1260.0 1335 75.0 5.9524 1335 0
95 2026-10-01 09:39:24 25 2 [Wild Frontier] Taiki Shuttle Shinzan Kinen 178 1 3800 80 3.297 0 4 0 0 6840.0 7113 273.0 3.9912 7113 0
96 2026-10-01 09:39:24 33 2 [Wild Frontier] Taiki Shuttle NHK Mile Cup 164 1 10500 80 1.5041 0 2 0 0 18900.0 19278 378.0 2.0 19278 0
97 2026-10-01 09:39:24 36 2 [Wild Frontier] Taiki Shuttle Unicorn Stakes 189 1 3500 80 0.0829 0 0 0 0 6300.0 6300 0.0 0.0 6300 0
98 2026-10-01 09:39:24 46 2 [Wild Frontier] Taiki Shuttle Mile Championship 78 1 11000 80 1.3511 1 2 2 0 19800.0 20592 792.0 4.0 20592 0
99 2026-10-01 09:39:24 59 2 [Wild Frontier] Taiki Shuttle Yasuda Kinen 73 1 13000 80 4.4812 0 6 0 0 23400.0 24804 1404.0 6.0 24804 0
100 2026-10-01 09:39:24 66 2 [Wild Frontier] Taiki Shuttle Sprinters Stakes 75 1 13000 80 3.6966 1 4 2 0 23400.0 24804 1404.0 6.0 24804 0
101 2026-10-01 09:39:24 70 2 [Wild Frontier] Taiki Shuttle Mile Championship 78 1 11000 80 3.6774 0 4 0 0 19800.0 20592 792.0 4.0 20592 0
102 2026-10-01 09:39:24 74 2 [Wild Frontier] Taiki Shuttle URA Finale Qualifier 2013 1 7000 80 4.0671 0 6 0 0 12600.0 13356 756.0 6.0 13356 0
103 2026-10-01 09:39:24 76 2 [Wild Frontier] Taiki Shuttle URA Finale Semifinal 2109 1 10000 80 4.9632 1 6 2 0 18000.0 19440 1440.0 8.0 19440 0
104 2026-10-01 09:39:24 78 2 [Wild Frontier] Taiki Shuttle URA Finale Finals 2214 1 30000 80 1.1329 0 2 0 0 54000.0 55080 1080.0 2.0 55080 0
105 2026-10-04 14:36:48 12 4 [Wild Frontier] Taiki Shuttle Junior Make Debut 846 1 700 105 2.6127 1 4 2 0 1435.0 1521 86.0 5.993 1521 0
106 2026-10-04 14:36:48 14 4 [Wild Frontier] Taiki Shuttle Hakodate Junior Stakes 628 1 3100 105 4.3676 0 6 0 0 6355.0 6736 381.0 5.9953 6736 0
107 2026-10-04 14:36:48 16 4 [Wild Frontier] Taiki Shuttle Niigata Junior Stakes 629 1 3100 105 2.8947 0 4 0 0 6355.0 6609 254.0 3.9969 6609 0
108 2026-10-04 14:36:48 17 4 [Wild Frontier] Taiki Shuttle Sapporo Junior Stakes 630 1 3100 105 2.2675 1 2 2 0 6355.0 6609 254.0 3.9969 6609 0
109 2026-10-04 14:36:48 21 4 [Wild Frontier] Taiki Shuttle Keio Hai Junior Stakes 626 1 3800 105 1.8215 1 2 2 0 7790.0 8101 311.0 3.9923 8101 0
110 2026-10-04 14:36:48 22 4 [Wild Frontier] Taiki Shuttle Tokyo Sports Hai Junior Stakes 635 1 3300 105 4.1972 0 6 0 0 6765.0 7170 405.0 5.9867 7170 0
111 2026-10-04 14:36:48 23 4 [Wild Frontier] Taiki Shuttle Hanshin Juvenile Fillies 623 1 6500 105 4.4133 1 6 2 0 13325.0 14391 1066.0 8.0 14391 0
112 2026-10-04 14:36:48 24 4 [Wild Frontier] Taiki Shuttle Zen-Nippon Junior Yushun 1107 2 1680 105 0.6647 1 9 2 0 3444.0 3821 377.0 10.9466 3821 0
113 2026-10-04 14:36:48 27 4 [Wild Frontier] Taiki Shuttle Kyodo News Hai 183 1 3800 105 3.9819 1 4 2 0 7790.0 8257 467.0 5.9949 8257 0
114 2026-10-04 14:36:48 29 4 [Wild Frontier] Taiki Shuttle Fillies' Revue 170 2 2080 105 0.056 1 9 2 0 4264.0 4731 467.0 10.9522 4731 0
115 2026-10-04 14:36:48 30 4 [Wild Frontier] Taiki Shuttle Spring Stakes 171 1 5400 105 1.5715 1 2 2 0 11070.0 11513 443.0 4.0018 11513 0
116 2026-10-04 14:36:48 31 4 [Wild Frontier] Taiki Shuttle Oka Sho 162 1 10500 105 2.0067 0 2 0 0 21525.0 21956 431.0 2.0023 21956 0
117 2026-10-04 14:36:48 33 4 [Wild Frontier] Taiki Shuttle NHK Mile Cup 164 1 10500 105 1.3928 0 2 0 0 21525.0 21956 431.0 2.0023 21956 0
118 2026-10-04 14:36:48 35 4 [Wild Frontier] Taiki Shuttle Yasuda Kinen 73 1 13000 105 1.2662 1 2 2 0 26650.0 27716 1066.0 4.0 27716 0
119 2026-10-04 14:36:48 39 4 [Wild Frontier] Taiki Shuttle Sekiya Kinen 105 1 3900 105 3.8619 0 4 0 0 7995.0 8314 319.0 3.99 8314 0
120 2026-10-04 14:36:48 41 4 [Wild Frontier] Taiki Shuttle Rose Stakes 176 1 5200 105 3.3191 1 4 2 0 10660.0 11300 640.0 6.0038 11300 0
121 2026-10-04 14:36:48 42 4 [Wild Frontier] Taiki Shuttle Sprinters Stakes 75 1 13000 105 3.2007 1 4 2 0 26650.0 28249 1599.0 6.0 28249 0
122 2026-10-04 14:36:48 43 4 [Wild Frontier] Taiki Shuttle M.C. Nambu Hai 1109 1 6000 105 2.7546 0 4 0 0 12300.0 12792 492.0 4.0 12792 0
123 2026-10-04 14:36:48 45 4 [Wild Frontier] Taiki Shuttle JBC Sprint 1111 1 6000 105 1.5294 1 2 2 0 12300.0 12792 492.0 4.0 12792 0
124 2026-10-04 14:36:48 46 4 [Wild Frontier] Taiki Shuttle Mile Championship 78 1 11000 105 2.2484 0 2 0 0 22550.0 23001 451.0 2.0 23001 0
125 2026-10-04 14:36:48 47 4 [Wild Frontier] Taiki Shuttle Champions Cup 80 1 10000 105 2.5859 0 4 0 0 20500.0 21320 820.0 4.0 21320 0
126 2026-10-04 14:36:48 50 4 [Wild Frontier] Taiki Shuttle Negishi Stakes 22 2 1520 105 1.4117 0 6 0 0 3116.0 3302 186.0 5.9692 3302 0
127 2026-10-04 14:36:48 52 4 [Wild Frontier] Taiki Shuttle February Stakes 1 1 10000 105 0.0968 0 0 0 0 20500.0 20500 0.0 0.0 20500 0
128 2026-10-04 14:36:48 54 4 [Wild Frontier] Taiki Shuttle Takamatsunomiya Kinen 2 1 13000 105 3.2402 0 4 0 0 26650.0 27716 1066.0 4.0 27716 0
129 2026-10-04 14:36:48 55 4 [Wild Frontier] Taiki Shuttle Marine Cup 1128 1 2500 105 2.6992 0 4 0 0 5125.0 5330 205.0 4.0 5330 0
130 2026-10-04 14:36:48 57 4 [Wild Frontier] Taiki Shuttle Victoria Mile 5 1 10500 105 1.5024 0 2 0 0 21525.0 21956 431.0 2.0023 21956 0
131 2026-10-04 14:36:48 58 4 [Wild Frontier] Taiki Shuttle Keyaki Stakes 71 1 2200 105 3.8244 1 4 2 0 4510.0 4780 270.0 5.9867 4780 0
132 2026-10-04 14:36:48 59 4 [Wild Frontier] Taiki Shuttle Yasuda Kinen 73 1 13000 105 1.4361 1 2 2 0 26650.0 27716 1066.0 4.0 27716 0
133 2026-10-04 14:36:48 62 4 [Wild Frontier] Taiki Shuttle Queen Stakes 103 1 3600 105 5.0515 0 6 0 0 7380.0 7822 442.0 5.9892 7822 0
134 2026-10-04 14:36:48 65 4 [Wild Frontier] Taiki Shuttle Keisei Hai Autumn Handicap 110 1 3900 105 5.633 0 6 0 0 7995.0 8474 479.0 5.9912 8474 0
135 2026-10-04 14:36:48 66 4 [Wild Frontier] Taiki Shuttle Sprinters Stakes 75 1 13000 105 2.6328 0 4 0 0 26650.0 27716 1066.0 4.0 27716 0
136 2026-10-04 14:36:48 67 4 [Wild Frontier] Taiki Shuttle M.C. Nambu Hai 1109 1 6000 105 4.184 0 6 0 0 12300.0 13038 738.0 6.0 13038 0
137 2026-10-04 14:36:48 69 4 [Wild Frontier] Taiki Shuttle JBC Sprint 1025 1 6000 105 2.1263 1 2 2 0 12300.0 12792 492.0 4.0 12792 0
138 2026-10-04 14:36:48 70 4 [Wild Frontier] Taiki Shuttle Mile Championship 78 1 11000 105 2.1798 0 2 0 0 22550.0 23001 451.0 2.0 23001 0
139 2026-10-04 14:36:48 71 4 [Wild Frontier] Taiki Shuttle Champions Cup 80 1 10000 105 0.8076 1 2 2 0 20500.0 21320 820.0 4.0 21320 0
140 2026-10-04 14:36:48 74 4 [Wild Frontier] Taiki Shuttle Twinkle Star Climax Race 1 2313 1 7000 105 4.0466 1 6 2 0 14350.0 15498 1148.0 8.0 15498 0
141 2026-10-04 14:36:48 76 4 [Wild Frontier] Taiki Shuttle Twinkle Star Climax Race 2 2410 1 10000 105 1.8345 1 2 2 0 20500.0 21320 820.0 4.0 21320 0
142 2026-10-04 14:36:48 78 4 [Wild Frontier] Taiki Shuttle Twinkle Star Climax Race 3 2515 1 30000 105 5.1406 1 6 2 50 61500.0 99630 38130.0 62.0 99630 0
143 2026-10-08 10:00:27 12 3 [CODE: ICING] Mihono Bourbon Junior Make Debut 1075 1 700 70 3.126 1 4 2 0 1190.0 1261 71.0 5.9664 1261 0
144 2026-10-08 10:00:27 23 3 [CODE: ICING] Mihono Bourbon Asahi Hai Futurity Stakes 624 1 7000 70 3.0099 2 4 2 0 11900.0 12614 714.0 6.0 12614 0
145 2026-10-08 10:00:27 30 3 [CODE: ICING] Mihono Bourbon Spring Stakes 171 1 5400 70 1.4594 1 2 2 0 9180.0 9547 367.0 3.9978 9547 0
146 2026-10-08 10:00:27 31 3 [CODE: ICING] Mihono Bourbon Satsuki Sho 163 1 11000 70 6.1843 2 9 2 0 18700.0 20757 2057.0 11.0 20757 0
147 2026-10-08 10:00:27 34 3 [CODE: ICING] Mihono Bourbon Tokyo Yushun (Japanese Derby) 166 1 20000 70 4.682 2 6 2 0 34000.0 36720 2720.0 8.0 36720 0
148 2026-10-08 10:00:27 44 3 [CODE: ICING] Mihono Bourbon Kikuka Sho 168 1 12000 70 3.5273 1 4 2 0 20400.0 21624 1224.0 6.0 21624 0
149 2026-10-08 10:00:27 56 3 [CODE: ICING] Mihono Bourbon Tenno Sho (Spring) 4 1 15000 70 10.0374 2 9 2 0 25500.0 28305 2805.0 11.0 28305 0
150 2026-10-08 10:00:27 70 3 [CODE: ICING] Mihono Bourbon Japan Cup 79 1 30000 70 10.1623 2 9 2 0 51000.0 56610 5610.0 11.0 56610 0
151 2026-10-08 10:00:27 72 3 [CODE: ICING] Mihono Bourbon Arima Kinen 81 1 30000 70 10.4669 3 9 2 0 51000.0 56610 5610.0 11.0 56610 0
152 2026-10-08 10:00:27 74 3 [CODE: ICING] Mihono Bourbon URA Finale Qualifier 2010 1 7000 70 5.7274 3 6 2 0 11900.0 12852 952.0 8.0 12852 0
153 2026-10-08 10:00:27 76 3 [CODE: ICING] Mihono Bourbon URA Finale Semifinal 2113 1 10000 70 3.7223 3 4 2 0 17000.0 18020 1020.0 6.0 18020 0
154 2026-10-08 10:00:27 78 3 [CODE: ICING] Mihono Bourbon URA Finale Finals 2209 1 30000 70 3.873 3 4 2 0 51000.0 54060 3060.0 6.0 54060 0
155 2026-10-10 03:12:29 12 3 [Soirée des Chatons] Seiun Sky Junior Make Debut 689 1 700 70 3.0303 1 4 2 0 1190.0 1261 71.0 5.9664 1261 0
156 2026-10-10 03:12:29 24 3 [Soirée des Chatons] Seiun Sky Hopeful Stakes 625 1 7000 70 2.1576 1 2 2 0 11900.0 12376 476.0 4.0 12376 0
157 2026-10-10 03:12:29 31 3 [Soirée des Chatons] Seiun Sky Satsuki Sho 163 1 11000 70 2.5681 2 4 2 0 18700.0 19822 1122.0 6.0 19822 0
158 2026-10-10 03:12:29 34 3 [Soirée des Chatons] Seiun Sky Tokyo Yushun (Japanese Derby) 166 1 20000 70 2.4678 2 2 2 0 34000.0 35360 1360.0 4.0 35360 0
159 2026-10-10 03:12:29 44 3 [Soirée des Chatons] Seiun Sky Kikuka Sho 168 1 12000 70 0.6938 2 0 2 0 20400.0 20808 408.0 2.0 20808 0
160 2026-10-10 03:12:29 48 3 [Soirée des Chatons] Seiun Sky Arima Kinen 81 1 30000 70 3.3828 2 4 2 0 51000.0 54060 3060.0 6.0 54060 0
161 2026-10-10 03:12:29 56 3 [Soirée des Chatons] Seiun Sky Tenno Sho (Spring) 4 1 15000 70 20.5803 10 9 8 0 25500.0 29835 4335.0 17.0 29835 0
162 2026-10-10 03:12:29 60 3 [Soirée des Chatons] Seiun Sky Takarazuka Kinen 74 1 15000 70 6.4095 10 9 8 0 25500.0 29835 4335.0 17.0 29835 0
163 2026-10-10 03:12:29 68 3 [Soirée des Chatons] Seiun Sky Tenno Sho (Autumn) 76 1 15000 70 9.3985 9 9 5 0 25500.0 29070 3570.0 14.0 29070 0
164 2026-10-10 03:12:29 72 3 [Soirée des Chatons] Seiun Sky Arima Kinen 81 1 30000 70 11.7606 10 9 8 0 51000.0 59670 8670.0 17.0 59670 0
165 2026-10-10 03:12:29 74 3 [Soirée des Chatons] Seiun Sky URA Finale Qualifier 2018 1 7000 70 11.2054 9 9 5 0 11900.0 13566 1666.0 14.0 13566 0
166 2026-10-10 03:12:29 76 3 [Soirée des Chatons] Seiun Sky URA Finale Semifinal 2123 1 10000 70 8.0601 7 9 5 0 17000.0 19380 2380.0 14.0 19380 0
167 2026-10-10 03:12:29 78 3 [Soirée des Chatons] Seiun Sky URA Finale Finals 2222 1 30000 70 5.7947 8 6 5 0 51000.0 56610 5610.0 11.0 56610 0
168 2026-10-10 15:53:30 12 3 [Soirée des Chatons] Seiun Sky Junior Make Debut 689 1 700 70 3.7946 2 4 2 0 1190.0 1261 71.0 5.9664 1261 0
169 2026-10-10 15:53:30 24 3 [Soirée des Chatons] Seiun Sky Hopeful Stakes 625 1 7000 70 5.3394 1 6 2 0 11900.0 12852 952.0 8.0 12852 0
170 2026-10-10 15:53:30 31 3 [Soirée des Chatons] Seiun Sky Satsuki Sho 163 1 11000 70 7.5947 2 9 2 0 18700.0 20757 2057.0 11.0 20757 0
171 2026-10-10 15:53:30 34 3 [Soirée des Chatons] Seiun Sky Tokyo Yushun (Japanese Derby) 166 1 20000 70 2.1677 4 2 3 0 34000.0 35700 1700.0 5.0 35700 0
172 2026-10-10 15:53:30 44 3 [Soirée des Chatons] Seiun Sky Kikuka Sho 168 3 3000 70 3.8191 4 4 3 0 5100.0 5457 357.0 7.0 5457 0
173 2026-10-10 15:53:30 48 3 [Soirée des Chatons] Seiun Sky Arima Kinen 81 1 30000 70 12.6422 3 9 2 0 51000.0 56610 5610.0 11.0 56610 0
174 2026-10-10 15:53:30 56 3 [Soirée des Chatons] Seiun Sky Tenno Sho (Spring) 4 1 15000 70 1.11 7 2 5 0 25500.0 27285 1785.0 7.0 27285 0
175 2026-10-10 15:53:30 60 3 [Soirée des Chatons] Seiun Sky Takarazuka Kinen 74 1 15000 70 13.7279 7 9 5 0 25500.0 29070 3570.0 14.0 29070 0
176 2026-10-10 15:53:30 68 3 [Soirée des Chatons] Seiun Sky Tenno Sho (Autumn) 76 1 15000 70 3.6698 6 4 3 0 25500.0 27285 1785.0 7.0 27285 0
177 2026-10-10 15:53:30 72 3 [Soirée des Chatons] Seiun Sky Arima Kinen 81 1 30000 70 13.5919 8 9 5 0 51000.0 58140 7140.0 14.0 58140 0
178 2026-10-10 15:53:30 74 3 [Soirée des Chatons] Seiun Sky URA Finale Qualifier 2025 1 7000 70 13.045 7 9 5 0 11900.0 13566 1666.0 14.0 13566 0
179 2026-10-10 15:53:30 76 3 [Soirée des Chatons] Seiun Sky URA Finale Semifinal 2122 1 10000 70 12.4002 7 9 5 0 17000.0 19380 2380.0 14.0 19380 0
180 2026-10-10 15:53:30 78 3 [Soirée des Chatons] Seiun Sky URA Finale Finals 2217 1 30000 70 12.3247 7 9 5 0 51000.0 58140 7140.0 14.0 58140 0
181 2026-10-11 18:47:03 12 3 [Soirée des Chatons] Seiun Sky Junior Make Debut 689 1 700 80 3.2149 2 4 2 0 1260.0 1335 75.0 5.9524 1335 0
182 2026-10-11 18:47:03 24 3 [Soirée des Chatons] Seiun Sky Hopeful Stakes 625 1 7000 80 2.4816 2 2 2 0 12600.0 13104 504.0 4.0 13104 0
183 2026-10-11 19:13:35 12 3 [Soirée des Chatons] Seiun Sky Junior Make Debut 689 1 700 80 4.1512 1 6 2 0 1260.0 1360 100.0 7.9365 1360 0
184 2026-10-11 19:13:35 24 3 [Soirée des Chatons] Seiun Sky Hopeful Stakes 625 1 7000 80 2.8651 2 4 2 0 12600.0 13356 756.0 6.0 13356 0
185 2026-10-11 19:13:35 31 3 [Soirée des Chatons] Seiun Sky Satsuki Sho 163 1 11000 80 4.6012 2 6 2 0 19800.0 21384 1584.0 8.0 21384 0
186 2026-10-11 19:13:35 34 3 [Soirée des Chatons] Seiun Sky Tokyo Yushun (Japanese Derby) 166 1 20000 80 4.1483 2 6 2 0 36000.0 38880 2880.0 8.0 38880 0
187 2026-10-11 19:13:35 44 3 [Soirée des Chatons] Seiun Sky Kikuka Sho 168 2 4800 80 4.218 2 2 2 0 8640.0 8985 345.0 3.9931 8985 0
188 2026-10-11 19:13:35 48 3 [Soirée des Chatons] Seiun Sky Arima Kinen 81 1 30000 80 10.0709 3 9 2 0 54000.0 59940 5940.0 11.0 59940 0
189 2026-10-11 19:13:35 56 3 [Soirée des Chatons] Seiun Sky Tenno Sho (Spring) 4 1 15000 80 6.5113 8 9 5 0 27000.0 30780 3780.0 14.0 30780 0
190 2026-10-11 19:13:35 60 3 [Soirée des Chatons] Seiun Sky Takarazuka Kinen 74 1 15000 80 6.7601 6 9 3 0 27000.0 30240 3240.0 12.0 30240 0
191 2026-10-11 19:13:35 72 3 [Soirée des Chatons] Seiun Sky Arima Kinen 81 1 30000 80 14.0565 7 9 5 0 54000.0 61560 7560.0 14.0 61560 0
192 2026-10-11 19:13:35 74 3 [Soirée des Chatons] Seiun Sky URA Finale Qualifier 2018 1 7000 80 10.2344 7 9 5 0 12600.0 14364 1764.0 14.0 14364 0
193 2026-10-11 19:13:35 76 3 [Soirée des Chatons] Seiun Sky URA Finale Semifinal 2121 1 10000 80 5.3797 5 6 3 0 18000.0 19620 1620.0 9.0 19620 0
194 2026-10-11 19:13:35 78 3 [Soirée des Chatons] Seiun Sky URA Finale Finals 2222 1 30000 80 7.7281 7 9 5 0 54000.0 61560 7560.0 14.0 61560 0