71 Commits
Author SHA1 Message Date
zephyr 2d14919f6a cmd/ismdb: start work 2026-10-16 12:30:28 -04:00
zephyr 381df5bd35 umadump/ism: new end info fields
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-10-07 16:35:31 -04:00
zephyr e5ebd1894c umadump/ism: new reward summary fields
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-10-07 13:13:30 -04:00
zephyr c43f6b8292 cmd/racedb: program to load races into an sqlite db
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-10-06 21:00:37 -04:00
zephyr cccf0cc838 umadump/replay: allow fan count in race horse data 2026-10-06 21:00:18 -04:00
zephyr 64f82136cb umadump/replay: trainer name is null for npcs 2026-10-04 09:08:25 -04:00
zephyr 53c7079f46 umadump/replay: decode race replays
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-10-03 22:34:02 -04:00
zephyr 1cfabb18f5 zenno: fix type error on fake data
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-09-22 22:31:12 -04:00
zephyr bf4e750825 zenno/chara/convo: hyperlink to umadump 2026-09-22 22:30:00 -04:00
zephyr 57ffadb06a zenno/chara/convo: integrate umadump talk gallery
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
Fixes #47.
2026-09-22 22:25:43 -04:00
zephyr 86583e68d1 zenno: wrapper component for race length inputs
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-09-22 10:59:29 -04:00
zephyr fde5b4fd20 zenno: update types for new api fields 2026-09-21 10:31:14 -04:00
zephyr 1cf3af5f79 zenno: update full charge info with new knowledge
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-09-21 09:48:56 -04:00
zephyr 0ffd2c099a horse, mdb: include id in lobby conversations
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-09-17 12:59:28 -04:00
zephyr 6828b1bd88 horse, mdb: put skill groups in skills
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
Fixes #13.
2026-09-15 11:00:10 -04:00
zephyr 78aee43e5f zenno: format
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
why the h*ck does vscode not format my .ts files on save even though i
have it configured to always format on save!!!!!!
2026-09-14 17:21:51 -04:00
zephyr 745c9d01dd zenno/doc/frbm: delete jbc sprint
Fixes #46.
2026-09-14 17:20:40 -04:00
zephyr e00fe0965a zenno/doc/mdb: emphasize that support card event outcomes are not in the mdb
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-09-14 17:07:25 -04:00
zephyr caa19dd85a zenno/doc/mdb: document races
ci/woodpecker/push/horsebot Pipeline failed
ci/woodpecker/push/zenno Pipeline failed
2026-09-11 18:14:14 -04:00
zephyr 3bf17944b3 horse, mdb, cmd/horsebot: racecourses
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-09-08 15:56:01 -04:00
zephyr 30f89e86f0 doc: add a recent dump 2026-09-08 15:56:01 -04:00
zephyr 8850dd4a08 zenno/doc/mdb: document skills
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-09-07 16:12:32 -04:00
zephyr 8946091b93 zenno: add ability type for all stats up 2026-09-07 16:08:52 -04:00
zephyr 9e3e06f0a0 zenno: rename missed Greate Escape -> Runaway 2026-09-07 12:28:49 -04:00
zephyr 12fea4c37e zenno/doc/tagged-skills: tag 403 is lane movement too 2026-09-06 22:08:37 -04:00
zephyr ad02e0711d zenno/chara/convo: include character icons
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-09-06 14:21:09 -04:00
zephyr 869235a8c2 zenno/chara/convo: use condition_type
Fixes #8.
2026-09-06 11:56:50 -04:00
zephyr 15f6d2c59a zenno/doc/frbm: update for GL
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-09-04 21:47:32 -04:00
zephyr d0c11aa527 zenno: section speed does not use base wit
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
Per analysis by Aya, only final wit is used for section speed.

Fixes #40.
2026-09-03 15:30:29 -04:00
zephyr c7a847f677 zenno/race/stam: add disclaimers
Also minor adjustments to chart size and how effective HP is calculated.
2026-09-03 15:10:47 -04:00
zephyr 0791fdd3d4 zenno: stamina calculator first pass
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-09-03 06:51:47 -04:00
zephyr e5f18d3c78 zenno/race/stam: remove the hard parts for now 2026-08-30 16:08:58 -04:00
zephyr 0d3cf24714 zenno: rebase stamina calculator & format 2026-08-30 15:45:42 -04:00
zephyr a8ed0dbbe0 zenno/race/stam: start showing outputs 2026-08-30 15:45:42 -04:00
zephyr 84f4f8e358 zenno/race/stam: beginning of stamina calculator 2026-08-30 15:45:42 -04:00
zephyr 7085fea1b7 umadump/replay: implement race sim decoding
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-08-30 01:56:43 -04:00
zephyr 1f195024e1 umadump/ism: idle single mode model 2026-08-26 21:08:46 -04:00
zephyr a91980e603 doc: mention race_course_set
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-08-26 20:29:14 -04:00
zephyr 8de957b59b zenno: allow both stats in threshold modifier to be null
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-08-26 18:57:31 -04:00
zephyr 206fee797c zenno/race/carryover: stat threshold modifier 2026-08-26 18:54:25 -04:00
zephyr 6ef2a190cd zenno: format
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-08-26 18:22:03 -04:00
zephyr 9a7028a44f zenno/race/carryover: add tables and disclaimers
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-26 18:01:10 -04:00
zephyr a7218c68ed zenno/race/carryover: calculator for late race carrover and accel
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-26 17:46:14 -04:00
zephyr 1f31ef223d zenno/racelib: allow accel skills to be delayed 2026-08-26 17:12:56 -04:00
zephyr 444fea85f0 zenno: lint fixes
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-08-21 15:45:53 -04:00
zephyr e92ce64b17 zenno: fix aptitude level type for umas
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-21 15:34:39 -04:00
zephyr 8d2a0e6c0d zenno/doc/mdb: include succession_initial_factor 2026-08-21 15:31:22 -04:00
zephyr 6b8b494739 zenno/doc/mdb: divide support card docs into sections 2026-08-21 15:12:42 -04:00
zephyr d8d9ec6543 zenno/doc/mdb: document sparks 2026-08-21 15:02:57 -04:00
zephyr cb48e238a8 zenno: account for ism data with no start stats
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-19 16:30:49 -04:00
zephyr 2bf229b5da zenno/career/ismdata: start visualization
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-19 16:10:54 -04:00
zephyr bde080eadd zenno: add support card level and effect functonality
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-13 17:39:23 -04:00
zephyr 1fe397ca81 zenno/career/ismdata: start of auto career analysis
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-07 17:01:33 -04:00
zephyr 5a13519189 zenno: scenario data 2026-08-05 16:00:59 -04:00
zephyr 9f4574e176 cmd/horsebot: also download support type icons 2026-08-04 17:14:57 -04:00
zephyr eaee64dca4 cmd/horsebot: download support card icons
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline failed
2026-08-02 23:36:32 -04:00
zephyr a232f78ac7 zenno: support card type definitions 2026-08-02 23:27:43 -04:00
zephyr 061fe89b7f remove vestiges of an ancient past 2026-08-02 22:48:02 -04:00
zephyr c0ddc32997 horse, mdb, cmd/horsebot: support cards
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
Fixes #37.
2026-08-02 22:45:34 -04:00
zephyr 9521b5e7c5 horse: go generate 2026-08-02 02:37:24 -04:00
zephyr efcdf5d525 zenno/doc/mdb: document support card hints 2026-08-02 02:37:10 -04:00
zephyr 8faf5cadc7 horse: improve single target ahead/behind skills wording
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
Fixes #28.
2026-07-31 22:33:59 -04:00
zephyr 656e155625 zenno: improve single target ahead/behind skills wording
For #28.
2026-07-31 22:30:44 -04:00
zephyr ff07b90c73 horse, zenno: fans ability value scaling
Fixes #30.
2026-07-31 22:27:52 -04:00
zephyr d265c81735 horse: add 564 ability type
While we're here adding the formatting, also adjust DD's wording and fix
the units on lane change speed skills.

Fixes #25.
2026-07-31 22:24:03 -04:00
zephyr 998156d345 zenno: gl skills are tag 803
Fixes #32.
2026-07-31 22:14:25 -04:00
zephyr aaa7c6d5b5 zenno/doc/mdb: start the mdb doc
For #12.
2026-07-31 22:12:38 -04:00
zephyr 48118efeeb doc: document grand live mechanics
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-07-28 00:19:14 -04:00
zephyr 79d4e76090 mdb: sort scenarios by sort id
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
Fixes #33.
2026-07-25 11:57:24 -04:00
zephyr ea39be0510 zenno: include character icons in character picks
ci/woodpecker/push/horsebot Pipeline was successful
ci/woodpecker/push/zenno Pipeline was successful
2026-07-24 23:09:24 -04:00
zephyr 7bac55ca43 zenno: show icons on skills 2026-07-24 22:56:31 -04:00
247 changed files with 249483 additions and 1292 deletions
+2 -2
View File
@@ -27,13 +27,13 @@ const (
_AbilityTarget_name_0 = "selfothers with Sympathy" _AbilityTarget_name_0 = "selfothers with Sympathy"
_AbilityTarget_name_1 = "others in view" _AbilityTarget_name_1 = "others in view"
_AbilityTarget_name_2 = "frontmost" _AbilityTarget_name_2 = "frontmost"
_AbilityTarget_name_3 = "others aheadothers behindall teammates" _AbilityTarget_name_3 = "aheadbehindall teammates"
_AbilityTarget_name_4 = "using stylerushing others aheadrushing others behindrushing using stylespecific characterwhosoever triggered this skill" _AbilityTarget_name_4 = "using stylerushing others aheadrushing others behindrushing using stylespecific characterwhosoever triggered this skill"
) )
var ( var (
_AbilityTarget_index_0 = [...]uint8{0, 4, 24} _AbilityTarget_index_0 = [...]uint8{0, 4, 24}
_AbilityTarget_index_3 = [...]uint8{0, 12, 25, 38} _AbilityTarget_index_3 = [...]uint8{0, 5, 11, 24}
_AbilityTarget_index_4 = [...]uint8{0, 11, 31, 52, 71, 89, 119} _AbilityTarget_index_4 = [...]uint8{0, 11, 31, 52, 71, 89, 119}
) )
+5 -1
View File
@@ -26,6 +26,7 @@ func _() {
_ = x[AbilityRushedChance-29] _ = x[AbilityRushedChance-29]
_ = x[AbilityAccel-31] _ = x[AbilityAccel-31]
_ = x[AbilityLaneChange-35] _ = x[AbilityLaneChange-35]
_ = x[AbilityActivateRare-37]
} }
const ( const (
@@ -35,7 +36,8 @@ const (
_AbilityType_name_3 = "Current speedCurrent speed" _AbilityType_name_3 = "Current speedCurrent speed"
_AbilityType_name_4 = "Target speedLane change speedRushed chance" _AbilityType_name_4 = "Target speedLane change speedRushed chance"
_AbilityType_name_5 = "Acceleration" _AbilityType_name_5 = "Acceleration"
_AbilityType_name_6 = "Forced lane change" _AbilityType_name_6 = "Set target lane"
_AbilityType_name_7 = "Activate rare skills"
) )
var ( var (
@@ -67,6 +69,8 @@ func (i AbilityType) String() string {
return _AbilityType_name_5 return _AbilityType_name_5
case i == 35: case i == 35:
return _AbilityType_name_6 return _AbilityType_name_6
case i == 37:
return _AbilityType_name_7
default: default:
return "AbilityType(" + strconv.FormatInt(int64(i), 10) + ")" return "AbilityType(" + strconv.FormatInt(int64(i), 10) + ")"
} }
+7 -6
View File
@@ -18,6 +18,7 @@ func _() {
_ = x[ValueUsageRandom-8] _ = x[ValueUsageRandom-8]
_ = x[ValueUsageRandom2-9] _ = x[ValueUsageRandom2-9]
_ = x[ValueUsageClimax-10] _ = x[ValueUsageClimax-10]
_ = x[ValueUsageFans-12]
_ = x[ValueUsageMaxStat-13] _ = x[ValueUsageMaxStat-13]
_ = x[ValueUsageGreenCount-14] _ = x[ValueUsageGreenCount-14]
_ = x[ValueUsageDistAdd-19] _ = x[ValueUsageDistAdd-19]
@@ -29,15 +30,15 @@ func _() {
} }
const ( const (
_AbilityValueUsage_name_0 = "directlyscaling with the number of skillsscaling with team Speedscaling with team Staminascaling with team Powerscaling with team Gutsscaling with team Witwith a random 0× to 0.04× multiplierwith a random 0× to 0.04× multiplierscaling with the number of races won in training" _AbilityValueUsage_name_0 = "directlyscaling with the number of skillsscaling with team Speedscaling with team Staminascaling with team Powerscaling with team Gutsscaling with team Witwith a random 0× to 0.04× multiplierwith a random 0× to 0.04× multiplierscaling with the number of races won in the career"
_AbilityValueUsage_name_1 = "scaling with the highest raw statscaling with the number of Passive skills activated" _AbilityValueUsage_name_1 = "scaling with the number of fans earned in the careerscaling with the highest raw statscaling with the number of Passive skills activated"
_AbilityValueUsage_name_2 = "plus extra when far from the leadscaling with mid-race phase blocked side time" _AbilityValueUsage_name_2 = "plus extra when far from the leadscaling with mid-race phase blocked side time"
_AbilityValueUsage_name_3 = "scaling with overall speedscaling with overall speedscaling with L'Arc global potentialscaling with the longest lead obtained in the first ⅔" _AbilityValueUsage_name_3 = "scaling with overall speedscaling with overall speedscaling with L'Arc global potentialscaling with the longest lead obtained in the first ⅔"
) )
var ( var (
_AbilityValueUsage_index_0 = [...]uint16{0, 8, 41, 64, 89, 112, 134, 155, 193, 231, 279} _AbilityValueUsage_index_0 = [...]uint16{0, 8, 41, 64, 89, 112, 134, 155, 193, 231, 281}
_AbilityValueUsage_index_1 = [...]uint8{0, 33, 84} _AbilityValueUsage_index_1 = [...]uint8{0, 52, 85, 136}
_AbilityValueUsage_index_2 = [...]uint8{0, 33, 78} _AbilityValueUsage_index_2 = [...]uint8{0, 33, 78}
_AbilityValueUsage_index_3 = [...]uint8{0, 26, 52, 87, 142} _AbilityValueUsage_index_3 = [...]uint8{0, 26, 52, 87, 142}
) )
@@ -47,8 +48,8 @@ func (i AbilityValueUsage) String() string {
case 1 <= i && i <= 10: case 1 <= i && i <= 10:
i -= 1 i -= 1
return _AbilityValueUsage_name_0[_AbilityValueUsage_index_0[i]:_AbilityValueUsage_index_0[i+1]] return _AbilityValueUsage_name_0[_AbilityValueUsage_index_0[i]:_AbilityValueUsage_index_0[i+1]]
case 13 <= i && i <= 14: case 12 <= i && i <= 14:
i -= 13 i -= 12
return _AbilityValueUsage_name_1[_AbilityValueUsage_index_1[i]:_AbilityValueUsage_index_1[i+1]] return _AbilityValueUsage_name_1[_AbilityValueUsage_index_1[i]:_AbilityValueUsage_index_1[i+1]]
case 19 <= i && i <= 20: case 19 <= i && i <= 20:
i -= 19 i -= 19
+2
View File
@@ -28,6 +28,8 @@ type AffinityDetail struct {
// Conversation describes a lobby conversation. // Conversation describes a lobby conversation.
type Conversation struct { type Conversation struct {
// ID is the conversation ID.
ID int32 `json:"id"`
// CharacterID is the ID of the character who has the conversation as // CharacterID is the ID of the character who has the conversation as
// a gallery entry. // a gallery entry.
CharacterID CharacterID `json:"chara_id"` CharacterID CharacterID `json:"chara_id"`
+2
View File
@@ -149,11 +149,13 @@ func main() {
mux.Handle("GET /api/global/character", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Characters))) mux.Handle("GET /api/global/character", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Characters)))
mux.Handle("GET /api/global/conversation", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Conversations))) mux.Handle("GET /api/global/conversation", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Conversations)))
mux.Handle("GET /api/global/race", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Races))) mux.Handle("GET /api/global/race", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Races)))
mux.Handle("GET /api/global/racecourse", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Racecourses)))
mux.Handle("GET /api/global/saddle", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Saddles))) mux.Handle("GET /api/global/saddle", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Saddles)))
mux.Handle("GET /api/global/scenario", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Scenarios))) mux.Handle("GET /api/global/scenario", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Scenarios)))
mux.Handle("GET /api/global/skill", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Skills))) mux.Handle("GET /api/global/skill", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Skills)))
mux.Handle("GET /api/global/skill-group", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.SkillGroups))) mux.Handle("GET /api/global/skill-group", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.SkillGroups)))
mux.Handle("GET /api/global/spark", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Sparks))) mux.Handle("GET /api/global/spark", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Sparks)))
mux.Handle("GET /api/global/support", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.SupportCards)))
mux.Handle("GET /api/global/uma", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Umas))) mux.Handle("GET /api/global/uma", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.Umas)))
if pubkey != "" { if pubkey != "" {
pk, err := hex.DecodeString(pubkey) pk, err := hex.DecodeString(pubkey)
+12
View File
@@ -33,6 +33,10 @@ func saveImgs(ctx context.Context, db *sqlitex.Pool, out string) {
if err != nil { if err != nil {
slog.Error("ranks", slog.Any("err", err)) slog.Error("ranks", slog.Any("err", err))
} }
supps, err := suppIDs(ctx, db)
if err != nil {
slog.Error("supports", slog.Any("err", err))
}
g, ctx := errgroup.WithContext(ctx) g, ctx := errgroup.WithContext(ctx)
tick := time.NewTicker(250 * time.Millisecond) tick := time.NewTicker(250 * time.Millisecond)
@@ -40,6 +44,8 @@ func saveImgs(ctx context.Context, db *sqlitex.Pool, out string) {
idouts(ctx, g, tick, chara, filepath.Join(out, "chara"), "https://gametora.com/images/umamusume/characters/icons/chr_icon_%d.png", image.Pt(256, 256), image.Pt(64, 64), image.Pt(32, 32), image.Pt(16, 16)) idouts(ctx, g, tick, chara, filepath.Join(out, "chara"), "https://gametora.com/images/umamusume/characters/icons/chr_icon_%d.png", image.Pt(256, 256), image.Pt(64, 64), image.Pt(32, 32), image.Pt(16, 16))
idouts(ctx, g, tick, rank, filepath.Join(out, "rank"), "https://media.gametora.com/umamusume/ui/rank/%02d.png", image.Pt(128, 128), image.Pt(64, 64), image.Pt(32, 32), image.Pt(16, 16)) idouts(ctx, g, tick, rank, filepath.Join(out, "rank"), "https://media.gametora.com/umamusume/ui/rank/%02d.png", image.Pt(128, 128), image.Pt(64, 64), image.Pt(32, 32), image.Pt(16, 16))
idouts(ctx, g, tick, rank, filepath.Join(out, "rank", "simple"), "https://media.gametora.com/umamusume/ui/rank/simple/%02d.png", image.Pt(50, 50), image.Pt(32, 32), image.Pt(16, 16)) idouts(ctx, g, tick, rank, filepath.Join(out, "rank", "simple"), "https://media.gametora.com/umamusume/ui/rank/simple/%02d.png", image.Pt(50, 50), image.Pt(32, 32), image.Pt(16, 16))
idouts(ctx, g, tick, supps, filepath.Join(out, "support"), "https://gametora.com/images/umamusume/supports/support_card_s_%d.png", image.Pt(128, 128), image.Pt(64, 64), image.Pt(32, 32))
idouts(ctx, g, tick, []int32{0, 1, 2, 3, 4, 5, 6}, filepath.Join(out, "support", "type"), "https://gametora.com/images/umamusume/icons/utx_ico_obtain_%02d.png", image.Pt(70, 70), image.Pt(35, 35), image.Pt(16, 16))
if err := g.Wait(); err != nil { if err := g.Wait(); err != nil {
slog.Error("output", slog.Any("err", err)) slog.Error("output", slog.Any("err", err))
} }
@@ -88,6 +94,12 @@ func rankIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) {
}) })
} }
func suppIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) {
return load(ctx, db, nil, "SELECT id FROM support_card_data", func(s *sqlite.Stmt) int32 {
return s.ColumnInt32(0)
})
}
var pngenc = &png.Encoder{CompressionLevel: png.BestCompression} var pngenc = &png.Encoder{CompressionLevel: png.BestCompression}
func idouts(ctx context.Context, g *errgroup.Group, tick *time.Ticker, ids []int32, p, urlf string, sizes ...image.Point) { func idouts(ctx context.Context, g *errgroup.Group, tick *time.Ticker, ids []int32, p, urlf string, sizes ...image.Point) {
+188
View File
@@ -0,0 +1,188 @@
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
@@ -0,0 +1,69 @@
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
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,251 @@
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
@@ -0,0 +1,88 @@
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;
+325
View File
@@ -0,0 +1,325 @@
package main
import (
"cmp"
"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/replay"
)
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, race *replay.Race, simdata *replay.RaceSimulateData) (err error) {
conn, err := db.Take(ctx)
if err != nil {
return err
}
defer db.Put(conn)
defer sqlitex.Transaction(conn)(&err)
log.DebugContext(ctx, "horses",
slog.Int("num", int(race.NumRaceHorses)),
slog.Int("actual", len(race.RaceHorse)),
)
var trainedCharas [18]int64
for i := range race.RaceHorse {
c := &race.RaceHorse[i]
id, err := insertTrainedChara(conn, c)
if err != nil {
return err
}
trainedCharas[i] = id
if err := insertTrainedCharaSkill(conn, c, id); err != nil {
return err
}
log.DebugContext(ctx, "horse",
slog.String("trainer", c.TrainerName),
slog.Int("trained", int(c.ResponseHorseData.TrainedCharaID)),
slog.Int("card", int(c.ResponseHorseData.CardID)),
slog.Int64("id", id),
)
}
if err = insertRaceCourseSet(conn, race); err != nil {
return err
}
log.DebugContext(ctx, "course", slog.Int("id", int(race.RaceCourseSet.ID)))
configID, err := insertRaceConfig(conn, race)
if err != nil {
return err
}
log.DebugContext(ctx, "config", slog.Int64("id", configID))
raceID, err := insertRace(conn, race, simdata, &trainedCharas, configID)
if err != nil {
code := sqlite.ErrCode(err)
if code == sqlite.ResultConstraintUnique {
log.InfoContext(ctx, "already loaded")
return nil
}
return err
}
log.DebugContext(ctx, "race", slog.Int64("id", raceID))
err = errors.Join(
insertRaceHorses(ctx, log, conn, race, simdata, &trainedCharas, raceID),
insertRaceFrames(ctx, log, conn, simdata, raceID),
insertRaceEvents(ctx, log, conn, simdata, raceID),
)
return err
}
//go:embed insert-trained_chara.sql
var insertTrainedCharaSQL string
func insertTrainedChara(conn *sqlite.Conn, c *replay.HorseData) (int64, error) {
stmt := conn.Prep(insertTrainedCharaSQL)
trainer := cmp.Or(c.ResponseHorseData.ViewerID, c.ResponseHorseData.OwnerViewerID)
stmt.SetText("$trainer", c.TrainerName)
stmt.SetInt64("$trainer_id", trainer)
stmt.SetInt64("$trained_chara_id", int64(c.ResponseHorseData.TrainedCharaID))
stmt.SetInt64("$chara_id", int64(c.CharaID))
stmt.SetText("$chara_name", c.CharaName)
stmt.SetInt64("$card_id", int64(c.ResponseHorseData.CardID))
stmt.SetInt64("$rarity", int64(c.Rarity))
stmt.SetInt64("$mob_id", int64(c.MobID))
stmt.SetInt64("$raw_speed", int64(c.ResponseHorseData.Speed))
stmt.SetInt64("$raw_stamina", int64(c.ResponseHorseData.Stamina))
stmt.SetInt64("$raw_power", int64(c.ResponseHorseData.Pow))
stmt.SetInt64("$raw_guts", int64(c.ResponseHorseData.Guts))
stmt.SetInt64("$raw_wit", int64(c.ResponseHorseData.Wiz))
stmt.SetInt64("$turf", int64(c.ResponseHorseData.ProperGroundTurf))
stmt.SetInt64("$dirt", int64(c.ResponseHorseData.ProperGroundDirt))
stmt.SetInt64("$sprint", int64(c.ResponseHorseData.ProperDistanceShort))
stmt.SetInt64("$mile", int64(c.ResponseHorseData.ProperDistanceMile))
stmt.SetInt64("$medium", int64(c.ResponseHorseData.ProperDistanceMiddle))
stmt.SetInt64("$long", int64(c.ResponseHorseData.ProperDistanceLong))
stmt.SetInt64("$front_runner", int64(c.ResponseHorseData.ProperRunningStyleNige))
stmt.SetInt64("$pace_chaser", int64(c.ResponseHorseData.ProperRunningStyleSenko))
stmt.SetInt64("$late_surger", int64(c.ResponseHorseData.ProperRunningStyleSashi))
stmt.SetInt64("$end_closer", int64(c.ResponseHorseData.ProperRunningStyleOikomi))
stmt.SetInt64("$fans", int64(c.TrainedCharaData.Fans))
stmt.SetInt64("$rank", int64(c.TrainedCharaData.Rank))
stmt.SetInt64("$rank_score", int64(c.TrainedCharaData.RankScore))
r, err := sqlitex.ResultInt64(stmt)
err = errors.Join(err, stmt.Reset())
if err != nil {
err = fmt.Errorf("inserting trained chara: %w", err)
}
return r, err
}
func insertTrainedCharaSkill(conn *sqlite.Conn, c *replay.HorseData, id int64) error {
const sql = `INSERT OR IGNORE INTO trained_chara_skill VALUES (?, ?, ?)`
stmt := conn.Prep(sql)
stmt.BindInt64(1, id)
for _, sk := range c.ResponseHorseData.SkillArray {
stmt.BindInt64(2, int64(sk.SkillID))
stmt.BindInt64(3, int64(sk.Level))
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting trained chara id %d skill %d: %w", id, sk.SkillID, err)
}
}
return nil
}
func insertRaceCourseSet(conn *sqlite.Conn, race *replay.Race) error {
const sql = `INSERT OR IGNORE INTO race_course_set VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
stmt := conn.Prep(sql)
stmt.BindInt64(1, int64(race.RaceCourseSet.ID))
stmt.BindInt64(2, int64(race.RaceCourseSet.RaceTrackID))
stmt.BindInt64(3, int64(race.RaceCourseSet.Distance))
stmt.BindInt64(4, int64(race.RaceCourseSet.Ground))
stmt.BindInt64(5, int64(race.RaceCourseSet.Inout))
stmt.BindInt64(6, int64(race.RaceCourseSet.Turn))
stmt.BindInt64(7, int64(race.RaceCourseSet.FenceSet))
stmt.BindInt64(8, int64(race.RaceCourseSet.FloatLaneMax))
stmt.BindInt64(9, int64(race.RaceCourseSet.CourseSetStatusID))
stmt.BindInt64(10, int64(race.RaceCourseSet.FinishTimeMin))
stmt.BindInt64(11, int64(race.RaceCourseSet.FinishTimeMinRandomRange))
stmt.BindInt64(12, int64(race.RaceCourseSet.FinishTimeMax))
stmt.BindInt64(13, int64(race.RaceCourseSet.FinishTimeMaxRandomRange))
stmt.BindFloat(14, float64(race.CourseSectionDistance))
stmt.BindInt64(15, int64(race.CourseDistanceType))
stmt.BindInt64(16, int64(race.CourseFurlongNum))
stmt.BindFloat(17, float64(race.BaseSpeed))
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting race course: %w", err)
}
return nil
}
//go:embed insert-race_config.sql
var insertRaceConfigSQL string
func insertRaceConfig(conn *sqlite.Conn, race *replay.Race) (int64, error) {
stmt := conn.Prep(insertRaceConfigSQL)
stmt.SetInt64("$type", int64(race.RaceType))
stmt.SetInt64("$course_set_id", int64(race.RaceCourseSet.ID))
stmt.SetInt64("$ground_condition", int64(race.GroundCondition))
stmt.SetInt64("$weather", int64(race.Weather))
stmt.SetInt64("$season", int64(race.Season))
stmt.SetInt64("$time", int64(race.Time))
stmt.SetInt64("$num_horse", int64(race.NumRaceHorses))
r, err := sqlitex.ResultInt64(stmt)
err = errors.Join(err, stmt.Reset())
if err != nil {
err = fmt.Errorf("inserting race config: %w", err)
}
return r, err
}
//go:embed insert-race.sql
var insertRaceSQL string
func insertRace(conn *sqlite.Conn, race *replay.Race, simdata *replay.RaceSimulateData, trainedCharas *[18]int64, configID int64) (int64, error) {
stmt := conn.Prep(insertRaceSQL)
stmt.SetInt64("$config_id", configID)
stmt.SetInt64("$seed", int64(race.RandomSeed))
stmt.SetFloat("$distance_diff_max", float64(simdata.DistanceDiffMax))
stmt.SetInt64("$frame_count", int64(simdata.FrameCount))
// zombiezen/sqlite doesn't seem to expose an API to find the index of a
// named parameter, so even though we were using names before, we switch
// to indices for trained chara IDs.
for i, id := range trainedCharas {
stmt.BindInt64(5+i, id)
}
r, err := sqlitex.ResultInt64(stmt)
err = errors.Join(err, stmt.Reset())
if err != nil {
err = fmt.Errorf("inserting race: %w", err)
}
return r, err
}
//go:embed insert-race_horse.sql
var insertRaceHorseSQL string
func insertRaceHorses(ctx context.Context, log *slog.Logger, conn *sqlite.Conn, race *replay.Race, simdata *replay.RaceSimulateData, trainedCharas *[18]int64, raceID int64) error {
stmt := conn.Prep(insertRaceHorseSQL)
stmt.SetInt64("$race", raceID)
for i, c := range race.RaceHorse {
log.DebugContext(ctx, "race horse", slog.Int64("trained", trainedCharas[i]), slog.Int("index", int(c.HorseIndex)))
stmt.SetInt64("$horse", trainedCharas[i])
stmt.SetInt64("$horse_index", int64(c.HorseIndex))
stmt.SetInt64("$post", int64(c.PostNumber))
stmt.SetInt64("$finish_order", int64(c.FinishOrder))
stmt.SetFloat("$finish_time_raw", float64(c.FinishTimeRaw))
stmt.SetFloat("$finish_time_scaled", float64(c.FinishTimeScaled))
stmt.SetFloat("$finish_diff_time_from_prev", float64(c.FinishDiffTimeFromPrev))
stmt.SetInt64("$running_style", int64(c.ResponseHorseData.RunningStyle))
stmt.SetInt64("$running_style_ex", int64(c.RunningStyleEx))
stmt.SetInt64("$active_distance_aptitude", int64(c.ActiveProperDistance))
stmt.SetInt64("$active_surface_aptitude", int64(c.ActiveProperGroundType))
stmt.SetInt64("$mood", int64(c.RaceParam.Motivation))
stmt.SetFloat("$mood_coef", float64(c.RaceParam.MotivationCoef))
stmt.SetFloat("$base_speed", float64(c.RaceParam.BaseSpeed))
stmt.SetFloat("$base_stamina", float64(c.RaceParam.BaseStamina))
stmt.SetFloat("$base_power", float64(c.RaceParam.BasePow))
stmt.SetFloat("$base_guts", float64(c.RaceParam.BaseGuts))
stmt.SetFloat("$base_wit", float64(c.RaceParam.BaseWiz))
stmt.SetInt64("$popularity", int64(c.Popularity))
stmt.SetInt64("$popularity_rank_left", int64(c.PopularityRankLeft))
stmt.SetInt64("$popularity_rank_center", int64(c.PopularityRankCenter))
stmt.SetInt64("$popularity_rank_right", int64(c.PopularityRankRight))
stmt.SetFloat("$start_delay", float64(simdata.HorseResult[i].StartDelayTime))
stmt.SetFloat("$spurt_start_distance", float64(simdata.HorseResult[i].LastSpurtStartDistance))
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting race horses: %w", err)
}
}
return nil
}
func insertRaceFrames(ctx context.Context, log *slog.Logger, conn *sqlite.Conn, simdata *replay.RaceSimulateData, raceID int64) error {
const sql = `INSERT INTO race_frame VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
stmt := conn.Prep(sql)
stmt.BindInt64(1, raceID)
for _, f := range simdata.Frame {
log.DebugContext(ctx, "frame", slog.Float64("time", float64(f.Time)))
stmt.BindFloat(2, float64(f.Time))
for i, h := range f.HorseFrame {
stmt.BindInt64(3, int64(i))
stmt.BindFloat(4, float64(h.Distance))
stmt.BindInt64(5, int64(h.LanePosition))
stmt.BindInt64(6, int64(h.Speed))
stmt.BindInt64(7, int64(h.HP))
stmt.BindInt64(8, int64(h.TemptationMode))
stmt.BindInt64(9, int64(h.BlockFrontHorseIndex))
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting race frames: %w", err)
}
}
}
return nil
}
func insertRaceEvents(ctx context.Context, log *slog.Logger, conn *sqlite.Conn, simdata *replay.RaceSimulateData, raceID int64) error {
const sql = `INSERT INTO race_event VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
stmt := conn.Prep(sql)
for _, e := range simdata.Event {
log.DebugContext(ctx, "event", slog.Float64("time", float64(e.Event.FrameTime)), slog.Int("type", int(e.Event.Type)))
// Easier to clear all bindings every time now
// than to bind nulls to all the parameters that need them below.
stmt.ClearBindings()
stmt.BindInt64(1, raceID)
stmt.BindFloat(2, float64(e.Event.FrameTime))
stmt.BindInt64(3, int64(e.Event.Type))
for i, p := range e.Event.Param {
stmt.BindInt64(4+i, int64(p))
}
_, err := stmt.Step()
err = errors.Join(err, stmt.Reset())
if err != nil {
return fmt.Errorf("inserting race events: %w", err)
}
}
return nil
}
+49
View File
@@ -0,0 +1,49 @@
INSERT OR ROLLBACK INTO race (
config_id,
seed,
distance_diff_max,
frame_count,
horse_1,
horse_2,
horse_3,
horse_4,
horse_5,
horse_6,
horse_7,
horse_8,
horse_9,
horse_10,
horse_11,
horse_12,
horse_13,
horse_14,
horse_15,
horse_16,
horse_17,
horse_18
)
VALUES (
$config_id,
$seed,
$distance_diff_max,
$frame_count,
$horse_1,
$horse_2,
$horse_3,
$horse_4,
$horse_5,
$horse_6,
$horse_7,
$horse_8,
$horse_9,
$horse_10,
$horse_11,
$horse_12,
$horse_13,
$horse_14,
$horse_15,
$horse_16,
$horse_17,
$horse_18
)
RETURNING id
+4
View File
@@ -0,0 +1,4 @@
INSERT INTO race_config (type, course_set_id, ground_condition, weather, season, time, num_horse)
VALUES ($type, $course_set_id, $ground_condition, $weather, $season, $time, $num_horse)
ON CONFLICT DO UPDATE SET id=id
RETURNING id
+12
View File
@@ -0,0 +1,12 @@
INSERT INTO race_horse
VALUES (
$race, $horse,
$horse_index, $post,
$finish_order, $finish_time_raw, $finish_time_scaled, $finish_diff_time_from_prev,
$running_style, $running_style_ex,
$active_distance_aptitude, $active_surface_aptitude,
$mood, $mood_coef,
$base_speed, $base_stamina, $base_power, $base_guts, $base_wit,
$popularity, $popularity_rank_left, $popularity_rank_center, $popularity_rank_right,
$start_delay, $spurt_start_distance
)
+19
View File
@@ -0,0 +1,19 @@
INSERT INTO trained_chara (
trainer, trainer_id, trained_chara_id,
chara_id, chara_name, card_id, rarity, mob_id,
raw_speed, raw_stamina, raw_power, raw_guts, raw_wit,
turf, dirt,
sprint, mile, medium, long,
front_runner, pace_chaser, late_surger, end_closer,
fans, rank, rank_score
) VALUES (
$trainer, $trainer_id, $trained_chara_id,
$chara_id, $chara_name, $card_id, $rarity, $mob_id,
$raw_speed, $raw_stamina, $raw_power, $raw_guts, $raw_wit,
$turf, $dirt,
$sprint, $mile, $medium, $long,
$front_runner, $pace_chaser, $late_surger, $end_closer,
$fans, $rank, $rank_score
)
ON CONFLICT DO UPDATE SET id=id
RETURNING id
+74
View File
@@ -0,0 +1,74 @@
package main
import (
"context"
"encoding/json"
"flag"
"log/slog"
"os"
"os/signal"
"path/filepath"
"git.sunturtle.xyz/zephyr/horse/umadump/replay"
)
func main() {
var (
uri, journalMode string
fs []string
)
flag.StringVar(&uri, "db", "race.sqlite3", "output database `URI` or filename")
flag.StringVar(&journalMode, "journal", "memory", "journal `mode` to apply to database connections")
flag.Func("d", "`dir`ectory containing race dumps to load (repeatable)", func(s string) error {
es, err := os.ReadDir(s)
for _, e := range es {
if e.IsDir() {
continue
}
fs = append(fs, filepath.Join(s, e.Name()))
}
return err
})
flag.Parse()
fs = append(fs, flag.Args()...)
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
go func() {
<-ctx.Done()
stop()
}()
db := opendb(uri, journalMode)
ok := 0
for _, n := range fs {
log := slog.With(slog.String("file", n))
log.Info("begin")
f, err := os.Open(n)
if err != nil {
log.Error("open", slog.Any("err", err))
continue
}
var race replay.Race
d := json.NewDecoder(f)
d.DisallowUnknownFields()
log.Debug("decode")
if err := d.Decode(&race); err != nil {
log.Error("load", slog.Any("err", err))
continue
}
log.Debug("simdata")
simdata, err := replay.DecodeSim(race.SimDataBase64)
if err != nil {
log.Error("simdata", slog.Any("err", err))
continue
}
log.Debug("insert")
err = insert(ctx, db, log, &race, simdata)
if err != nil {
log.Error("insert", slog.Any("err", err))
continue
}
ok++
}
slog.Info("done", slog.Int("races", ok))
}
+234
View File
@@ -0,0 +1,234 @@
-- trained_chara lists horses who appear in races.
CREATE TABLE IF NOT EXISTS trained_chara (
-- id is the DB-internal ID of the Uma.
-- It does not come from the game and should not be supplied in DDL.
id INTEGER PRIMARY KEY,
trainer TEXT NOT NULL,
trainer_id INTEGER NOT NULL, -- 0 for NPC umas e.g. in practice races
trained_chara_id INTEGER NOT NULL,
chara_id INTEGER NOT NULL,
chara_name TEXT NOT NULL,
-- card_id is the Uma herself, e.g. 100201 for [Innocent Silence] Silence Suzuka.
card_id INTEGER NOT NULL,
rarity INTEGER NOT NULL,
mob_id INTEGER NOT NULL, -- 0 for Umas that are not mobs
-- Raw stats.
raw_speed INTEGER NOT NULL,
raw_stamina INTEGER NOT NULL,
raw_power INTEGER NOT NULL,
raw_guts INTEGER NOT NULL,
raw_wit INTEGER NOT NULL,
-- Aptitudes.
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,
-- Other data.
fans INTEGER NOT NULL,
rank INTEGER NOT NULL,
rank_score INTEGER NOT NULL,
UNIQUE (trainer_id, trained_chara_id)
) STRICT;
-- Insert trained chara ID 0 to represent no Uma.
INSERT OR IGNORE INTO trained_chara (
id,
trainer,
trainer_id,
trained_chara_id,
chara_id, chara_name,
card_id,
mob_id,
raw_speed, raw_stamina, raw_power, raw_guts, raw_wit,
turf, dirt,
sprint, mile, medium, long,
front_runner, pace_chaser, late_surger, end_closer,
fans,
rank, rank_score
)
VALUES (0, '', 0, 0, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-- trained_chara_skill lists the skills each observed horse owns.
CREATE TABLE IF NOT EXISTS trained_chara_skill (
trained_chara INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
skill_id INTEGER NOT NULL,
level INTEGER NOT NULL,
UNIQUE (trained_chara, skill_id)
) STRICT;
CREATE INDEX IF NOT EXISTS trained_chara_skill_by_trained_chara ON trained_chara_skill (trained_chara);
-- race_course_set is the accumulated information of observed race courses.
CREATE TABLE IF NOT EXISTS race_course_set (
id INTEGER PRIMARY KEY,
race_track_id INTEGER NOT NULL,
distance INTEGER NOT NULL,
ground INTEGER NOT NULL,
inout INTEGER NOT NULL,
turn INTEGER NOT NULL,
fence_set INTEGER NOT NULL,
float_lane_max INTEGER NOT NULL,
course_set_status_id INTEGER NOT NULL,
finish_time_min INTEGER NOT NULL,
finish_time_min_random_range INTEGER NOT NULL,
finish_time_max INTEGER NOT NULL,
finish_time_max_random_range INTEGER NOT NULL,
section_distance REAL NOT NULL,
distance_type INTEGER NOT NULL,
furlong_number INTEGER NOT NULL,
base_speed REAL NOT NULL
) STRICT;
-- race_config is observed configurations of races including the race type.
CREATE TABLE IF NOT EXISTS race_config (
-- id is the DB-internal ID of the race config.
id INTEGER PRIMARY KEY,
type INTEGER NOT NULL,
course_set_id INTEGER NOT NULL REFERENCES race_course_set (id) ON DELETE RESTRICT,
ground_condition INTEGER NOT NULL,
weather INTEGER NOT NULL,
season INTEGER NOT NULL,
time INTEGER NOT NULL,
num_horse INTEGER NOT NULL,
UNIQUE (type, course_set_id, ground_condition, weather, season, time, num_horse)
) STRICT;
CREATE INDEX IF NOT EXISTS race_config_by_type ON race_config (type);
-- race is all observed races.
CREATE TABLE IF NOT EXISTS race (
-- id is the DB-internal ID of the race.
id INTEGER PRIMARY KEY,
config_id INTEGER NOT NULL REFERENCES race_config (id),
seed INTEGER NOT NULL,
distance_diff_max REAL NOT NULL,
frame_count INTEGER NOT NULL,
-- There is no consistent ID for races, and even race seeds have been found
-- to collide well above the expected rate for a uniform distribution.
-- In order to prevent adding duplicates of races each time the tool is run,
-- we include the list of all horse IDs present in the race.
-- Analysis on the horses in the race should instead use the race_horse table.
-- Horse entries here are 0 where there is actually no horse at that gate.
horse_1 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_2 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_3 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_4 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_5 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_6 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_7 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_8 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_9 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_10 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_11 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_12 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_13 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_14 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_15 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_16 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_17 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_18 INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
UNIQUE (
config_id,
seed,
horse_1,
horse_2,
horse_3,
horse_4,
horse_5,
horse_6,
horse_7,
horse_8,
horse_9,
horse_10,
horse_11,
horse_12,
horse_13,
horse_14,
horse_15,
horse_16,
horse_17,
horse_18
)
) STRICT;
CREATE INDEX IF NOT EXISTS race_by_config ON race (config_id);
-- race_horse pairs each instance of a horse with its condition and performance
-- in a given race.
CREATE TABLE IF NOT EXISTS race_horse (
race INTEGER NOT NULL REFERENCES race (id) ON DELETE CASCADE,
horse INTEGER NOT NULL REFERENCES trained_chara (id) ON DELETE CASCADE,
horse_index INTEGER NOT NULL,
post INTEGER NOT NULL,
finish_order INTEGER NOT NULL,
finish_time_raw REAL NOT NULL,
finish_time_scaled REAL NOT NULL,
finish_diff_time_from_prev REAL NOT NULL,
running_style INTEGER NOT NULL,
running_style_ex INTEGER NOT NULL,
active_distance_aptitude INTEGER NOT NULL,
active_surface_aptitude INTEGER NOT NULL,
mood INTEGER NOT NULL,
mood_coef REAL NOT NULL,
base_speed REAL NOT NULL,
base_stamina REAL NOT NULL,
base_power REAL NOT NULL,
base_guts REAL NOT NULL,
base_wit REAL NOT NULL,
popularity INTEGER NOT NULL,
popularity_rank_left INTEGER NOT NULL,
popularity_rank_center INTEGER NOT NULL,
popularity_rank_right INTEGER NOT NULL,
start_delay REAL NOT NULL,
spurt_start_distance REAL NOT NULL,
PRIMARY KEY (race, horse),
UNIQUE (race, horse_index),
CHECK (horse != 0)
) STRICT;
-- race_frame holds the actual received frames.
CREATE TABLE IF NOT EXISTS race_frame (
race INTEGER NOT NULL REFERENCES race (id) ON DELETE CASCADE,
frame_time REAL NOT NULL,
horse_index INTEGER NOT NULL,
distance REAL NOT NULL,
lane INTEGER NOT NULL, -- scale -4
speed INTEGER NOT NULL, -- scale -2
hp INTEGER NOT NULL,
temptation INTEGER NOT NULL,
block_front_horse_index INTEGER NOT NULL,
PRIMARY KEY (race, frame_time, horse_index)
) STRICT;
-- race_event holds raw received race events.
-- Views such as race_event_skill_activate, race_event_spot_struggle_activate, &c.
-- interpret events per type.
CREATE TABLE IF NOT EXISTS race_event (
race INTEGER NOT NULL REFERENCES race (id) ON DELETE CASCADE,
frame_time REAL NOT NULL,
type INTEGER NOT NULL,
param_0 INTEGER,
param_1 INTEGER,
param_2 INTEGER,
param_3 INTEGER,
param_4 INTEGER,
param_5 INTEGER
) STRICT;
CREATE INDEX IF NOT EXISTS race_event_by_race ON race_event (race);
CREATE INDEX IF NOT EXISTS race_event_by_type ON race_event (type);
+36
View File
@@ -0,0 +1,36 @@
DROP VIEW IF EXISTS race_event_skill_activate;
DROP VIEW IF EXISTS race_event_spot_struggle_activate;
DROP VIEW IF EXISTS race_event_duel_activate;
DROP VIEW IF EXISTS race_event_release_conserve_power;
CREATE VIEW race_event_skill_activate AS
SELECT
race,
frame_time,
param_0 AS user_index,
param_1 AS skill,
param_2 * 0.0001 AS duration,
param_3 AS branch,
param_4 AS hit_bitmask
FROM race_event WHERE type = 3;
CREATE VIEW race_event_spot_struggle_activate AS
SELECT
race,
frame_time,
param_0 AS user_index
FROM race_event WHERE type = 4;
CREATE VIEW race_event_duel_activate AS
SELECT
race,
frame_time,
param_0 AS user_index
FROM race_event WHERE type = 5;
CREATE VIEW race_event_release_conserve_power AS
SELECT
race,
frame_time,
param_0 AS user_index
FROM race_event WHERE type = 6;
File diff suppressed because it is too large Load Diff
+37
View File
@@ -15,6 +15,9 @@ This file is my notes from exploring the database.
- 119 is scenario full titles (e.g. The Beginning: URA Finale), 120 is scenario descriptions, 237 is scenario names (e.g. URA Finale) - 119 is scenario full titles (e.g. The Beginning: URA Finale), 120 is scenario descriptions, 237 is scenario names (e.g. URA Finale)
- 130 is epithet names, 131 is epithet descriptions - 130 is epithet names, 131 is epithet descriptions
in the decomp, text data categories are named in `public enum MasterString.Category`.
some categories seem to be missing, though.
# succession factor (sparks) # succession factor (sparks)
tables are succession_factor and succession_factor_effect tables are succession_factor and succession_factor_effect
@@ -309,6 +312,9 @@ grade_rate_id appears to be consistently 800 iff maiden race and 900 iff debut r
recommend_class_id appears to be consistently 1 iff maiden race or debut race, 2 iff pre-op, 3 iff op; but other values are confusing. recommend_class_id appears to be consistently 1 iff maiden race or debut race, 2 iff pre-op, 3 iff op; but other values are confusing.
so, it doesn't seem like there's a particular flag that identifies maiden races, despite the restrictions on when they appear in the ui. so, it doesn't seem like there's a particular flag that identifies maiden races, despite the restrictions on when they appear in the ui.
race_course_set defines the racecourse, e.g. hanshin 1600 turf, that a given race occurs on.
notably, stat thresholds are defined here via join to race_course_set_status, rather than in course event data.
# trainee definitions # trainee definitions
- card_data has universal trainee stats: base skill set, stat growth bonuses ("talent"), default running style - card_data has universal trainee stats: base skill set, stat growth bonuses ("talent"), default running style
@@ -317,6 +323,37 @@ so, it doesn't seem like there's a particular flag that identifies maiden races,
- card_talent_hint_upgrade has costs to raise hint levels, but it's actually universal, only six rows - card_talent_hint_upgrade has costs to raise hint levels, but it's actually universal, only six rows
- single_mode_route_race is career goals (not only races) - single_mode_route_race is career goals (not only races)
- available_skill_set has starting skills including those unlocked by potential level given under need_rank (0 for pl1, 2 for pl2) - available_skill_set has starting skills including those unlocked by potential level given under need_rank (0 for pl1, 2 for pl2)
- single_mode_special_chara is scenario links
# gl
single_mode_live_song_list has the song list for lives ha ha.
this is defined from the perspective of bonuses they grant when you have them, not the shop per se.
- text_data category for song names is 210, look up by live_id; for post-concert effect text, category 208 indexed by song list id
- command_id and live_id are always equal
- level is 1 for all songs except the two instances of girls' legend u
- master_bonus_content_text_id corresponds to text_data categories 207 for pickup effect text and 209 for song name
- live_bonus_type is 1 for specialty prio, 2 for chain frequency, 3 for fb
- girls' legend u is defined twice as ids 22 and 24
costs are in single_mode_live_square.
- square_type is 1 for stat up, 2 for skill up, 3 for energy up, 4 for live
- perf_type_n is token type: 1 for dance, 2 for passion, 3 for vocals, 4 for visuals, 5 for composure
- perf_value_n is number of tokens
immediate bonuses are in single_mode_live_master_bonus.
- master_bonus_type is 1 for stat up, 2 for skill hint, 3 for energy up, 4 for song
- master_bonus_type_value is 1 for type 1, live id for type 4, 0 otherwise
- master_bonus_gain_type_n is 1 for stat, 2 for skill hint, 3 for energy, 5 for permanent training bonus
+ 1 for stat: then master_bonus_gain_value_n_1 is 1-5 for stat id or 6 for sp, n_2 is 1 for fixed or 2 for random (not actually in the game), n_3 is lower bound on gain, n_4 is 0 for fixed or upper bound for random
+ 2 for skill hint: then gain_value_n_1 is 3(*), n_2 is skill tag, n_3 is hint level
+ 3 for energy: then gain_value_n_1 is amount
+ 5 for permanent training bonus: then gain_value_n_1 is stat id (6 for sp), n_2 is amount
(*) MasterSingleModeLiveMasterBonus.SingleModeLiveMasterBonus.GainSkillHintTypeEnum defines values of Random = 1 and SkillId = 2, but they are unused in the db.
there is some ostensibly unused data.
- master bonus ids 12001-12206 grant random amounts of stats
- id 20000 corresponds to "Group Lesson" "Skill hint appropriate for aptitude"
# lobby conversations!!! # lobby conversations!!!
+8 -7
View File
@@ -89,13 +89,14 @@ func Umas(ctx context.Context, db *sqlitex.Pool) ([]horse.Uma, error) {
func Conversations(ctx context.Context, db *sqlitex.Pool) ([]horse.Conversation, error) { func Conversations(ctx context.Context, db *sqlitex.Pool) ([]horse.Conversation, error) {
return load(ctx, db, make([]horse.Conversation, 0, 1024), conversationSQL, func(s *sqlite.Stmt) horse.Conversation { return load(ctx, db, make([]horse.Conversation, 0, 1024), conversationSQL, func(s *sqlite.Stmt) horse.Conversation {
return horse.Conversation{ return horse.Conversation{
CharacterID: horse.CharacterID(s.ColumnInt(0)), ID: s.ColumnInt32(0),
Number: s.ColumnInt(1), CharacterID: horse.CharacterID(s.ColumnInt(1)),
Location: horse.LobbyConversationLocationID(s.ColumnInt(2)), Number: s.ColumnInt(2),
Chara1: horse.CharacterID(s.ColumnInt(3)), Location: horse.LobbyConversationLocationID(s.ColumnInt(3)),
Chara2: horse.CharacterID(s.ColumnInt(4)), Chara1: horse.CharacterID(s.ColumnInt(4)),
Chara3: horse.CharacterID(s.ColumnInt(5)), Chara2: horse.CharacterID(s.ColumnInt(5)),
ConditionType: s.ColumnInt(6), Chara3: horse.CharacterID(s.ColumnInt(6)),
ConditionType: s.ColumnInt(7),
} }
}) })
} }
+11
View File
@@ -238,12 +238,14 @@ func TestConversations(t *testing.T) {
} }
want := []horse.Conversation{ want := []horse.Conversation{
{ {
ID: 1,
CharacterID: 1001, CharacterID: 1001,
Number: 1, Number: 1,
Location: 410, Location: 410,
Chara1: 1001, Chara1: 1001,
}, },
{ {
ID: 2,
CharacterID: 1001, CharacterID: 1001,
Number: 2, Number: 2,
Location: 510, Location: 510,
@@ -251,6 +253,7 @@ func TestConversations(t *testing.T) {
ConditionType: 1, ConditionType: 1,
}, },
{ {
ID: 3,
CharacterID: 1001, CharacterID: 1001,
Number: 3, Number: 3,
Location: 310, Location: 310,
@@ -258,6 +261,7 @@ func TestConversations(t *testing.T) {
ConditionType: 1, ConditionType: 1,
}, },
{ {
ID: 76,
CharacterID: 1001, CharacterID: 1001,
Number: 4, Number: 4,
Location: 120, Location: 120,
@@ -266,6 +270,7 @@ func TestConversations(t *testing.T) {
ConditionType: 2, ConditionType: 2,
}, },
{ {
ID: 77,
CharacterID: 1001, CharacterID: 1001,
Number: 5, Number: 5,
Location: 520, Location: 520,
@@ -274,6 +279,7 @@ func TestConversations(t *testing.T) {
ConditionType: 3, ConditionType: 3,
}, },
{ {
ID: 126,
CharacterID: 1001, CharacterID: 1001,
Number: 6, Number: 6,
Location: 430, Location: 430,
@@ -283,12 +289,14 @@ func TestConversations(t *testing.T) {
ConditionType: 1, ConditionType: 1,
}, },
{ {
ID: 4,
CharacterID: 1002, CharacterID: 1002,
Number: 1, Number: 1,
Location: 310, Location: 310,
Chara1: 1002, Chara1: 1002,
}, },
{ {
ID: 5,
CharacterID: 1002, CharacterID: 1002,
Number: 2, Number: 2,
Location: 210, Location: 210,
@@ -296,6 +304,7 @@ func TestConversations(t *testing.T) {
ConditionType: 1, ConditionType: 1,
}, },
{ {
ID: 6,
CharacterID: 1002, CharacterID: 1002,
Number: 3, Number: 3,
Location: 110, Location: 110,
@@ -303,6 +312,7 @@ func TestConversations(t *testing.T) {
ConditionType: 1, ConditionType: 1,
}, },
{ {
ID: 78,
CharacterID: 1002, CharacterID: 1002,
Number: 4, Number: 4,
Location: 520, Location: 520,
@@ -311,6 +321,7 @@ func TestConversations(t *testing.T) {
ConditionType: 3, ConditionType: 3,
}, },
{ {
ID: 79,
CharacterID: 1002, CharacterID: 1002,
Number: 5, Number: 5,
Location: 220, Location: 220,
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 400.0
},
{
"_paramType": 0,
"_values": [
4,
259
],
"_distance": 675.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 934.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 725.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 735.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 725.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 735.0
}
]
}
+80
View File
@@ -0,0 +1,80 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
2,
275
],
"_distance": 150.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 700.0
},
{
"_paramType": 0,
"_values": [
4,
259
],
"_distance": 975.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 425.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1234.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1500.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1025.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1035.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1025.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1035.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
275
],
"_distance": 175.0
},
{
"_paramType": 0,
"_values": [
2,
275
],
"_distance": 450.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1000.0
},
{
"_paramType": 0,
"_values": [
4,
259
],
"_distance": 1275.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 175.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 725.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1000.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1534.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1325.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1335.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1325.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1335.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
275
],
"_distance": 375.0
},
{
"_paramType": 0,
"_values": [
2,
275
],
"_distance": 650.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1200.0
},
{
"_paramType": 0,
"_values": [
4,
259
],
"_distance": 1475.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 375.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 925.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1200.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1734.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1525.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1535.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1525.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1535.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 175.0
},
{
"_paramType": 0,
"_values": [
4,
275
],
"_distance": 450.0
},
{
"_paramType": 0,
"_values": [
1,
275
],
"_distance": 975.0
},
{
"_paramType": 0,
"_values": [
2,
275
],
"_distance": 1250.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1800.0
},
{
"_paramType": 0,
"_values": [
4,
259
],
"_distance": 2075.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 175.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 725.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 975.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1525.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1800.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2334.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2125.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2135.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2125.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2135.0
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
230
],
"_distance": 280.0
},
{
"_paramType": 0,
"_values": [
4,
226
],
"_distance": 510.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 280.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 736.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 550.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 560.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 550.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 560.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
230
],
"_distance": 240.0
},
{
"_paramType": 0,
"_values": [
2,
230
],
"_distance": 470.0
},
{
"_paramType": 0,
"_values": [
3,
230
],
"_distance": 980.0
},
{
"_paramType": 0,
"_values": [
4,
226
],
"_distance": 1210.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 240.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 980.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1436.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1700.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1250.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1260.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1250.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1260.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
230
],
"_distance": 200.0
},
{
"_paramType": 0,
"_values": [
4,
230
],
"_distance": 430.0
},
{
"_paramType": 0,
"_values": [
1,
230
],
"_distance": 940.0
},
{
"_paramType": 0,
"_values": [
2,
230
],
"_distance": 1170.0
},
{
"_paramType": 0,
"_values": [
3,
230
],
"_distance": 1680.0
},
{
"_paramType": 0,
"_values": [
4,
226
],
"_distance": 1910.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 200.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 660.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 940.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1408.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1680.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2136.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1950.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1960.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1950.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1960.0
}
]
}
+80
View File
@@ -0,0 +1,80 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
220
],
"_distance": 310.0
},
{
"_paramType": 0,
"_values": [
4,
208
],
"_distance": 530.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 310.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 738.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 600.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 610.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 600.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 610.0
},
{
"_paramType": 11,
"_values": [
10000,
555
],
"_distance": 0.0
}
]
}
+80
View File
@@ -0,0 +1,80 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
220
],
"_distance": 510.0
},
{
"_paramType": 0,
"_values": [
4,
208
],
"_distance": 730.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 510.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 938.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 810.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 810.0
},
{
"_paramType": 11,
"_values": [
10000,
755
],
"_distance": 0.0
}
]
}
+120
View File
@@ -0,0 +1,120 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
220
],
"_distance": 320.0
},
{
"_paramType": 0,
"_values": [
2,
220
],
"_distance": 540.0
},
{
"_paramType": 0,
"_values": [
3,
220
],
"_distance": 1110.0
},
{
"_paramType": 0,
"_values": [
4,
208
],
"_distance": 1330.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 320.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 760.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1110.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1538.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1400.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1410.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1400.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1410.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 220.0
},
{
"_paramType": 11,
"_values": [
10000,
720
],
"_distance": 665.0
}
]
}
+120
View File
@@ -0,0 +1,120 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
220
],
"_distance": 520.0
},
{
"_paramType": 0,
"_values": [
2,
220
],
"_distance": 740.0
},
{
"_paramType": 0,
"_values": [
3,
220
],
"_distance": 1310.0
},
{
"_paramType": 0,
"_values": [
4,
208
],
"_distance": 1530.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 520.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 960.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1310.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1738.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1600.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1610.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1600.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1610.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 420.0
},
{
"_paramType": 11,
"_values": [
10000,
720
],
"_distance": 865.0
}
]
}
+160
View File
@@ -0,0 +1,160 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
240
],
"_distance": 260.0
},
{
"_paramType": 0,
"_values": [
4,
230
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
1,
220
],
"_distance": 1120.0
},
{
"_paramType": 0,
"_values": [
2,
220
],
"_distance": 1340.0
},
{
"_paramType": 0,
"_values": [
3,
220
],
"_distance": 1910.0
},
{
"_paramType": 0,
"_values": [
4,
208
],
"_distance": 2130.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 260.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 730.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1120.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1560.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1910.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2338.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2200.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2210.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2200.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2210.0
},
{
"_paramType": 11,
"_values": [
10000,
495
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 970.0
},
{
"_paramType": 11,
"_values": [
10000,
720
],
"_distance": 1425.0
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
190
],
"_distance": 370.0
},
{
"_paramType": 0,
"_values": [
4,
180
],
"_distance": 560.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 370.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 740.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 600.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 610.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 600.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 610.0
}
]
}
+120
View File
@@ -0,0 +1,120 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
190
],
"_distance": 350.0
},
{
"_paramType": 0,
"_values": [
2,
190
],
"_distance": 540.0
},
{
"_paramType": 0,
"_values": [
3,
190
],
"_distance": 1070.0
},
{
"_paramType": 0,
"_values": [
4,
180
],
"_distance": 1260.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 350.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 730.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1070.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1440.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1700.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 11,
"_values": [
-10000,
340
],
"_distance": 275.0
},
{
"_paramType": 11,
"_values": [
10000,
670
],
"_distance": 615.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
190
],
"_distance": 292.0
},
{
"_paramType": 0,
"_values": [
4,
190
],
"_distance": 482.0
},
{
"_paramType": 0,
"_values": [
1,
190
],
"_distance": 1040.0
},
{
"_paramType": 0,
"_values": [
2,
190
],
"_distance": 1230.0
},
{
"_paramType": 0,
"_values": [
3,
190
],
"_distance": 1770.0
},
{
"_paramType": 0,
"_values": [
4,
180
],
"_distance": 1960.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 292.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 672.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1040.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1420.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1770.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2140.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2000.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2010.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2000.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2010.0
}
]
}
+63
View File
@@ -0,0 +1,63 @@
{
"courseParams": [
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 649.9000244140625
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 650.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 690.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 7,
"_values": [
2
],
"_distance": 30.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 696.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 706.0
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 450.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 650.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 842.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 725.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 735.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 750.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 760.0
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 650.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 850.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 650.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1042.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 925.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 935.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 950.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 960.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 550.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 750.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 550.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 942.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 810.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 810.0
},
{
"_paramType": 11,
"_values": [
10000,
350
],
"_distance": 250.0
},
{
"_paramType": 11,
"_values": [
-15000,
300
],
"_distance": 600.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 750.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 950.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 750.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1142.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1000.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1010.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1000.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1010.0
},
{
"_paramType": 11,
"_values": [
10000,
350
],
"_distance": 450.0
},
{
"_paramType": 11,
"_values": [
-15000,
300
],
"_distance": 800.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 420.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 620.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1250.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 1450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 420.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 820.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1250.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1642.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1525.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1535.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1525.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1535.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 950.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 1150.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 950.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1342.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1200.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1210.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1200.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1210.0
},
{
"_paramType": 11,
"_values": [
-15000,
300
],
"_distance": 1000.0
},
{
"_paramType": 11,
"_values": [
10000,
350
],
"_distance": 650.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 650.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 850.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1450.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 1650.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 650.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1050.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1842.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1725.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1735.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1725.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1735.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 810.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 1010.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1650.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 1850.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 810.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1210.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1650.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2042.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1925.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1935.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1925.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1935.0
}
]
}
+86
View File
@@ -0,0 +1,86 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
160
],
"_distance": 540.0
},
{
"_paramType": 0,
"_values": [
4,
147
],
"_distance": 700.0
},
{
"_paramType": 1,
"_values": [
1
],
"_distance": 0.0
},
{
"_paramType": 1,
"_values": [
2
],
"_distance": 80.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 540.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 847.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 750.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 760.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 815.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 825.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
160
],
"_distance": 400.0
},
{
"_paramType": 0,
"_values": [
2,
160
],
"_distance": 560.0
},
{
"_paramType": 0,
"_values": [
3,
160
],
"_distance": 1140.0
},
{
"_paramType": 0,
"_values": [
4,
147
],
"_distance": 1300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 720.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1140.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1447.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1350.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1360.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1350.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1360.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
160
],
"_distance": 380.0
},
{
"_paramType": 0,
"_values": [
4,
160
],
"_distance": 540.0
},
{
"_paramType": 0,
"_values": [
1,
160
],
"_distance": 1120.0
},
{
"_paramType": 0,
"_values": [
2,
160
],
"_distance": 1280.0
},
{
"_paramType": 0,
"_values": [
3,
160
],
"_distance": 1850.0
},
{
"_paramType": 0,
"_values": [
4,
160
],
"_distance": 2010.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 380.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1120.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1440.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1850.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2170.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2500.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2050.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2060.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2050.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2060.0
}
]
}
+80
View File
@@ -0,0 +1,80 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
300
],
"_distance": 420.0
},
{
"_paramType": 0,
"_values": [
4,
188
],
"_distance": 720.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 420.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 908.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 750.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 760.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 748.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 758.0
},
{
"_paramType": 11,
"_values": [
15000,
100
],
"_distance": 180.0
}
]
}
+112
View File
@@ -0,0 +1,112 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 330.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 530.0
},
{
"_paramType": 0,
"_values": [
3,
300
],
"_distance": 1020.0
},
{
"_paramType": 0,
"_values": [
4,
188
],
"_distance": 1320.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 330.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 730.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1020.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1508.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1350.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1360.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1350.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1360.0
},
{
"_paramType": 11,
"_values": [
15000,
100
],
"_distance": 780.0
}
]
}
+112
View File
@@ -0,0 +1,112 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 530.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 730.0
},
{
"_paramType": 0,
"_values": [
3,
300
],
"_distance": 1220.0
},
{
"_paramType": 0,
"_values": [
4,
188
],
"_distance": 1520.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 530.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 930.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1220.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1708.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1550.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1560.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1550.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1560.0
},
{
"_paramType": 11,
"_values": [
15000,
100
],
"_distance": 980.0
}
]
}
+152
View File
@@ -0,0 +1,152 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
300
],
"_distance": 220.0
},
{
"_paramType": 0,
"_values": [
4,
200
],
"_distance": 520.0
},
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 1130.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 1330.0
},
{
"_paramType": 0,
"_values": [
3,
300
],
"_distance": 1820.0
},
{
"_paramType": 0,
"_values": [
4,
188
],
"_distance": 2120.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 220.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 720.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1130.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1530.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1820.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2308.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2150.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2160.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2150.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2160.0
},
{
"_paramType": 11,
"_values": [
15000,
80
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
15000,
100
],
"_distance": 1580.0
}
]
}
+86
View File
@@ -0,0 +1,86 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
210
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
4,
145
],
"_distance": 710.0
},
{
"_paramType": 1,
"_values": [
1
],
"_distance": 0.0
},
{
"_paramType": 1,
"_values": [
2
],
"_distance": 110.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 500.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 855.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1150.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 751.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 761.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 751.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 761.0
}
]
}
+132
View File
@@ -0,0 +1,132 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
170
],
"_distance": 360.0
},
{
"_paramType": 0,
"_values": [
2,
170
],
"_distance": 530.0
},
{
"_paramType": 0,
"_values": [
3,
210
],
"_distance": 1050.0
},
{
"_paramType": 0,
"_values": [
4,
145
],
"_distance": 1260.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 360.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1050.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1405.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1700.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1301.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1311.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1301.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1311.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1301.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1311.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1301.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1311.0
},
{
"_paramType": 11,
"_values": [
-10000,
320
],
"_distance": 285.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
210
],
"_distance": 310.0
},
{
"_paramType": 0,
"_values": [
4,
160
],
"_distance": 520.0
},
{
"_paramType": 0,
"_values": [
1,
170
],
"_distance": 1060.0
},
{
"_paramType": 0,
"_values": [
2,
170
],
"_distance": 1230.0
},
{
"_paramType": 0,
"_values": [
3,
210
],
"_distance": 1750.0
},
{
"_paramType": 0,
"_values": [
4,
145
],
"_distance": 1960.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 310.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 680.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1060.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1400.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1750.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2105.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2001.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2011.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2001.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2011.0
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
350
],
"_distance": 300.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 650.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 890.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 710.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 710.0
},
{
"_paramType": 11,
"_values": [
-15000,
200
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 1025.0
}
]
}
+80
View File
@@ -0,0 +1,80 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
2,
450
],
"_distance": 50.0
},
{
"_paramType": 0,
"_values": [
3,
350
],
"_distance": 700.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 1050.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1290.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1100.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1110.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1100.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1110.0
},
{
"_paramType": 11,
"_values": [
-15000,
300
],
"_distance": 300.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 1425.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 175.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 425.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1000.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 1250.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 175.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 675.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1000.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1490.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 11,
"_values": [
20000,
35
],
"_distance": 1.0
},
{
"_paramType": 11,
"_values": [
15000,
200
],
"_distance": 125.0
},
{
"_paramType": 11,
"_values": [
-15000,
400
],
"_distance": 425.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 1625.0
}
]
}
+150
View File
@@ -0,0 +1,150 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 375.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 625.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1200.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 1450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 375.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 875.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1200.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1690.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 3,
"_values": [
7000
],
"_distance": 875.0
},
{
"_paramType": 3,
"_values": [
10000
],
"_distance": 1450.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1500.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1510.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1500.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1510.0
},
{
"_paramType": 11,
"_values": [
15000,
200
],
"_distance": 325.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 125.0
},
{
"_paramType": 11,
"_values": [
-15000,
400
],
"_distance": 625.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 1825.0
}
]
}
+120
View File
@@ -0,0 +1,120 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
247
],
"_distance": 403.0
},
{
"_paramType": 0,
"_values": [
2,
450
],
"_distance": 650.0
},
{
"_paramType": 0,
"_values": [
3,
350
],
"_distance": 1300.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 1650.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 403.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1890.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1700.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1710.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1700.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1710.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 153.0
},
{
"_paramType": 11,
"_values": [
15000,
200
],
"_distance": 353.0
},
{
"_paramType": 11,
"_values": [
-15000,
300
],
"_distance": 900.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 2025.0
}
]
}
+152
View File
@@ -0,0 +1,152 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
146
],
"_distance": 100.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 246.0
},
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 875.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 1125.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1700.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 1950.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 496.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 875.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1375.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1700.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2190.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2500.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2000.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2010.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2000.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2010.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 621.0
},
{
"_paramType": 11,
"_values": [
15000,
200
],
"_distance": 825.0
},
{
"_paramType": 11,
"_values": [
-15000,
400
],
"_distance": 1125.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 2325.0
}
]
}
+224
View File
@@ -0,0 +1,224 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 290.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 540.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1115.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 1365.0
},
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 1975.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 2225.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 2800.0
},
{
"_paramType": 0,
"_values": [
4,
240
],
"_distance": 3050.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 290.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 790.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1115.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1615.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1975.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 2475.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 2800.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 3290.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 3600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 3100.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 3110.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 3100.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 3110.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 40.0
},
{
"_paramType": 11,
"_values": [
15000,
200
],
"_distance": 240.0
},
{
"_paramType": 11,
"_values": [
-15000,
400
],
"_distance": 540.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 1740.0
},
{
"_paramType": 11,
"_values": [
15000,
200
],
"_distance": 1925.0
},
{
"_paramType": 11,
"_values": [
-15000,
400
],
"_distance": 2225.0
},
{
"_paramType": 11,
"_values": [
20000,
110
],
"_distance": 3425.0
}
]
}
+102
View File
@@ -0,0 +1,102 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 700.0
},
{
"_paramType": 1,
"_values": [
1
],
"_distance": 0.0
},
{
"_paramType": 1,
"_values": [
2
],
"_distance": 110.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 500.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 892.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 710.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 710.0
},
{
"_paramType": 11,
"_values": [
-15000,
175
],
"_distance": 175.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 1000.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 350.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 550.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1100.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 1300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 350.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 750.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1100.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1492.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 100.0
},
{
"_paramType": 11,
"_values": [
10000,
175
],
"_distance": 350.0
},
{
"_paramType": 11,
"_values": [
-15000,
175
],
"_distance": 775.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 1600.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 200.0
},
{
"_paramType": 0,
"_values": [
4,
200
],
"_distance": 400.0
},
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 950.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 1150.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1700.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 1900.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 200.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 600.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 950.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1350.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1700.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2092.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1900.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1910.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1900.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1910.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 300.0
},
{
"_paramType": 0,
"_values": [
4,
200
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 1050.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 1250.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1800.0
},
{
"_paramType": 0,
"_values": [
4,
192
],
"_distance": 2000.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1050.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1450.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1800.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2192.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2500.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2000.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2010.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2000.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2010.0
}
]
}
+96
View File
@@ -0,0 +1,96 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 350.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 625.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 350.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 875.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 710.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 750.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 760.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 125.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 250.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 950.0
}
]
}
+96
View File
@@ -0,0 +1,96 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 550.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 825.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 550.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1075.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 900.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 910.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 950.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 960.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 450.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 325.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1150.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 75.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 750.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 1025.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 325.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 750.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1275.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1100.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1110.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1126.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1136.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 525.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 650.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1350.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 200.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 950.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 1225.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 950.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1475.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1300.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1310.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1340.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1350.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 725.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 850.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1550.0
}
]
}
+128
View File
@@ -0,0 +1,128 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 225.0
},
{
"_paramType": 0,
"_values": [
2,
325
],
"_distance": 475.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1250.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 1525.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 225.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 800.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1250.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1775.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2300.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1600.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1610.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1640.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1650.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 1025.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 1150.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1850.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 325.0
},
{
"_paramType": 0,
"_values": [
2,
325
],
"_distance": 575.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1350.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 1625.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 325.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 900.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1350.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1875.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1700.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1710.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1740.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1750.0
},
{
"_paramType": 11,
"_values": [
15000,
40
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 1125.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 1250.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1950.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 425.0
},
{
"_paramType": 0,
"_values": [
2,
325
],
"_distance": 675.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1450.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 1725.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 425.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1000.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1975.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2500.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1800.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1810.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1850.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1860.0
},
{
"_paramType": 11,
"_values": [
15000,
140
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 1225.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 1350.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 2050.0
}
]
}
+184
View File
@@ -0,0 +1,184 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 292.0
},
{
"_paramType": 0,
"_values": [
4,
275
],
"_distance": 567.0
},
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 1325.0
},
{
"_paramType": 0,
"_values": [
2,
325
],
"_distance": 1575.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 2350.0
},
{
"_paramType": 0,
"_values": [
4,
250
],
"_distance": 2625.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 292.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 842.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1325.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1900.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 2350.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2875.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 3400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 2700.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 2710.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 2750.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 2760.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 67.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 192.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 892.0
},
{
"_paramType": 11,
"_values": [
20000,
75
],
"_distance": 2125.0
},
{
"_paramType": 11,
"_values": [
-15000,
250
],
"_distance": 2250.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 2950.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
225
],
"_distance": 350.0
},
{
"_paramType": 0,
"_values": [
4,
224
],
"_distance": 575.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 350.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 799.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1300.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 550.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 560.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 700.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 710.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 275.0
},
{
"_paramType": 11,
"_values": [
15000,
250
],
"_distance": 800.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
225
],
"_distance": 450.0
},
{
"_paramType": 0,
"_values": [
4,
224
],
"_distance": 675.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 899.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 650.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 660.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 810.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 375.0
},
{
"_paramType": 11,
"_values": [
15000,
250
],
"_distance": 900.0
}
]
}
+102
View File
@@ -0,0 +1,102 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
225
],
"_distance": 650.0
},
{
"_paramType": 0,
"_values": [
4,
224
],
"_distance": 875.0
},
{
"_paramType": 1,
"_values": [
1
],
"_distance": 0.0
},
{
"_paramType": 1,
"_values": [
2
],
"_distance": 120.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 650.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1099.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 900.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 910.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1000.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1010.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 575.0
},
{
"_paramType": 11,
"_values": [
15000,
250
],
"_distance": 1100.0
}
]
}
+120
View File
@@ -0,0 +1,120 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 200.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 450.0
},
{
"_paramType": 0,
"_values": [
3,
225
],
"_distance": 1150.0
},
{
"_paramType": 0,
"_values": [
4,
224
],
"_distance": 1375.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 200.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1150.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1599.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2100.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1400.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1410.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1500.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1510.0
},
{
"_paramType": 11,
"_values": [
-10000,
200
],
"_distance": 1075.0
},
{
"_paramType": 11,
"_values": [
15000,
250
],
"_distance": 1600.0
}
]
}
+112
View File
@@ -0,0 +1,112 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
2,
250
],
"_distance": 750.0
},
{
"_paramType": 0,
"_values": [
3,
225
],
"_distance": 1450.0
},
{
"_paramType": 0,
"_values": [
4,
225
],
"_distance": 1675.0
},
{
"_paramType": 0,
"_values": [
90,
500
],
"_distance": 2348.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 500.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1000.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1450.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1900.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1800.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1810.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1800.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1810.0
}
]
}
+169
View File
@@ -0,0 +1,169 @@
{
"courseParams": [
{
"_paramType": 1,
"_values": [
1
],
"_distance": 5.0
},
{
"_paramType": 0,
"_values": [
4,
276
],
"_distance": 205.0
},
{
"_paramType": 4,
"_values": [
40,
6000,
0
],
"_distance": 210.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 481.0
},
{
"_paramType": 0,
"_values": [
1,
250
],
"_distance": 1000.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1000.0
},
{
"_paramType": 5,
"_values": [
10,
20000
],
"_distance": 1005.0
},
{
"_paramType": 4,
"_values": [
10,
20000,
0
],
"_distance": 1005.0
},
{
"_paramType": 0,
"_values": [
2,
300
],
"_distance": 1250.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 1550.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1950.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1950.0
},
{
"_paramType": 5,
"_values": [
100,
0
],
"_distance": 1955.0
},
{
"_paramType": 0,
"_values": [
4,
275
],
"_distance": 2225.0
},
{
"_paramType": 4,
"_values": [
40,
6000,
0
],
"_distance": 2230.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 2500.0
},
{
"_paramType": 4,
"_values": [
50,
5000,
0
],
"_distance": 2600.0
},
{
"_paramType": 4,
"_values": [
70,
5000,
0
],
"_distance": 2800.0
},
{
"_paramType": 4,
"_values": [
90,
500,
0
],
"_distance": 2950.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 3000.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 300.0
},
{
"_paramType": 0,
"_values": [
4,
238
],
"_distance": 550.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 788.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 790.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 790.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 800.0
},
{
"_paramType": 11,
"_values": [
-10000,
775
],
"_distance": 100.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 875.0
}
]
}
+88
View File
@@ -0,0 +1,88 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
4,
238
],
"_distance": 750.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 500.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 988.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 860.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 870.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 850.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 860.0
},
{
"_paramType": 11,
"_values": [
-10000,
775
],
"_distance": 300.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 1075.0
}
]
}
+96
View File
@@ -0,0 +1,96 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
2,
150
],
"_distance": 150.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 700.0
},
{
"_paramType": 0,
"_values": [
4,
238
],
"_distance": 950.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 300.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1188.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1060.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1070.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1060.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1070.0
},
{
"_paramType": 11,
"_values": [
-10000,
775
],
"_distance": 500.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 1275.0
}
]
}
+128
View File
@@ -0,0 +1,128 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 300.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1100.0
},
{
"_paramType": 0,
"_values": [
4,
238
],
"_distance": 1350.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 300.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1100.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1588.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1460.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1470.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1460.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1470.0
},
{
"_paramType": 11,
"_values": [
20000,
50
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
-10000,
775
],
"_distance": 900.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 1675.0
}
]
}
+136
View File
@@ -0,0 +1,136 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 700.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1300.0
},
{
"_paramType": 0,
"_values": [
4,
238
],
"_distance": 1550.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 500.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 900.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1788.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1660.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1670.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1660.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1670.0
},
{
"_paramType": 11,
"_values": [
-10000,
150
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 150.0
},
{
"_paramType": 11,
"_values": [
-10000,
775
],
"_distance": 1100.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 1875.0
}
]
}
+72
View File
@@ -0,0 +1,72 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 400.0
},
{
"_paramType": 0,
"_values": [
4,
190
],
"_distance": 600.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 790.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 750.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 760.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 750.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 760.0
}
]
}
+122
View File
@@ -0,0 +1,122 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 600.0
},
{
"_paramType": 0,
"_values": [
4,
190
],
"_distance": 800.0
},
{
"_paramType": 1,
"_values": [
1
],
"_distance": 0.0
},
{
"_paramType": 1,
"_values": [
2
],
"_distance": 155.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 600.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 990.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 865.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 865.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 865.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 865.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 11,
"_values": [
-15000,
600
],
"_distance": 425.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1025.0
}
]
}
+148
View File
@@ -0,0 +1,148 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
165
],
"_distance": 270.0
},
{
"_paramType": 0,
"_values": [
2,
165
],
"_distance": 435.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1000.0
},
{
"_paramType": 0,
"_values": [
4,
190
],
"_distance": 1200.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 270.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 600.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1000.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1390.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1265.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1275.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1265.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1275.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1265.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1275.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1265.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1275.0
},
{
"_paramType": 11,
"_values": [
15000,
50
],
"_distance": 0.0
},
{
"_paramType": 11,
"_values": [
-15000,
600
],
"_distance": 825.0
},
{
"_paramType": 11,
"_values": [
15000,
150
],
"_distance": 1425.0
}
]
}
+104
View File
@@ -0,0 +1,104 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
165
],
"_distance": 370.0
},
{
"_paramType": 0,
"_values": [
2,
165
],
"_distance": 535.0
},
{
"_paramType": 0,
"_values": [
3,
200
],
"_distance": 1100.0
},
{
"_paramType": 0,
"_values": [
4,
190
],
"_distance": 1300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 370.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1100.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1490.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1900.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1365.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1375.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1365.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1375.0
}
]
}
+108
View File
@@ -0,0 +1,108 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 320.0
},
{
"_paramType": 0,
"_values": [
4,
277
],
"_distance": 595.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 320.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 872.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 675.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 685.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 675.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 685.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 675.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 685.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 675.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 685.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 120.0
},
{
"_paramType": 11,
"_values": [
-15000,
150
],
"_distance": 420.0
}
]
}
+108
View File
@@ -0,0 +1,108 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 520.0
},
{
"_paramType": 0,
"_values": [
4,
277
],
"_distance": 795.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 520.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1072.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 885.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 885.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 885.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 875.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 885.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 320.0
},
{
"_paramType": 11,
"_values": [
-15000,
150
],
"_distance": 620.0
}
]
}
+116
View File
@@ -0,0 +1,116 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 500.0
},
{
"_paramType": 0,
"_values": [
4,
247
],
"_distance": 750.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 500.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 997.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1400.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 825.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 835.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 825.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 835.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 825.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 835.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 825.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 835.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 250.0
},
{
"_paramType": 11,
"_values": [
10000,
225
],
"_distance": 350.0
},
{
"_paramType": 11,
"_values": [
-20000,
150
],
"_distance": 575.0
}
]
}
+108
View File
@@ -0,0 +1,108 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 720.0
},
{
"_paramType": 0,
"_values": [
4,
277
],
"_distance": 995.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 200.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 720.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1272.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1075.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1085.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1075.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1085.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1075.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1085.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1075.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1085.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 520.0
},
{
"_paramType": 11,
"_values": [
-15000,
150
],
"_distance": 820.0
}
]
}
+116
View File
@@ -0,0 +1,116 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 700.0
},
{
"_paramType": 0,
"_values": [
4,
247
],
"_distance": 950.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 200.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 700.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1197.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1600.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1025.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1035.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1025.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1035.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1025.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1035.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1025.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1035.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 450.0
},
{
"_paramType": 11,
"_values": [
10000,
225
],
"_distance": 550.0
},
{
"_paramType": 11,
"_values": [
-20000,
150
],
"_distance": 775.0
}
]
}
+116
View File
@@ -0,0 +1,116 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 900.0
},
{
"_paramType": 0,
"_values": [
4,
247
],
"_distance": 1150.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 900.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1397.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 1800.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1225.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1235.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1225.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1235.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1225.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1235.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1225.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1235.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 650.0
},
{
"_paramType": 11,
"_values": [
10000,
225
],
"_distance": 750.0
},
{
"_paramType": 11,
"_values": [
-20000,
150
],
"_distance": 975.0
}
]
}
+140
View File
@@ -0,0 +1,140 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
185
],
"_distance": 400.0
},
{
"_paramType": 0,
"_values": [
2,
185
],
"_distance": 585.0
},
{
"_paramType": 0,
"_values": [
3,
275
],
"_distance": 1120.0
},
{
"_paramType": 0,
"_values": [
4,
277
],
"_distance": 1395.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 770.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1120.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1672.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2000.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1475.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1485.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1475.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1485.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1475.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1485.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1475.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1485.0
},
{
"_paramType": 11,
"_values": [
15000,
175
],
"_distance": 970.0
},
{
"_paramType": 11,
"_values": [
-15000,
150
],
"_distance": 1270.0
}
]
}
+148
View File
@@ -0,0 +1,148 @@
{
"courseParams": [
{
"_paramType": 0,
"_values": [
1,
200
],
"_distance": 400.0
},
{
"_paramType": 0,
"_values": [
2,
200
],
"_distance": 600.0
},
{
"_paramType": 0,
"_values": [
3,
250
],
"_distance": 1300.0
},
{
"_paramType": 0,
"_values": [
4,
247
],
"_distance": 1550.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 0.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 400.0
},
{
"_paramType": 2,
"_values": [
1,
2
],
"_distance": 800.0
},
{
"_paramType": 2,
"_values": [
2,
2
],
"_distance": 1300.0
},
{
"_paramType": 2,
"_values": [
1,
1
],
"_distance": 1797.0
},
{
"_paramType": 2,
"_values": [
2,
1
],
"_distance": 2200.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1625.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1635.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1625.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1635.0
},
{
"_paramType": 4,
"_values": [],
"_distance": 1625.0
},
{
"_paramType": 5,
"_values": [],
"_distance": 1635.0
},
{
"_paramType": 8,
"_values": [],
"_distance": 1625.0
},
{
"_paramType": 9,
"_values": [],
"_distance": 1635.0
},
{
"_paramType": 11,
"_values": [
20000,
100
],
"_distance": 1050.0
},
{
"_paramType": 11,
"_values": [
10000,
225
],
"_distance": 1150.0
},
{
"_paramType": 11,
"_values": [
-20000,
150
],
"_distance": 1375.0
}
]
}

Some files were not shown because too many files have changed in this diff Show More