Compare commits
200
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55aa03aa41 | ||
|
|
0ffd2c099a | ||
|
|
6828b1bd88 | ||
|
|
78aee43e5f | ||
|
|
745c9d01dd | ||
|
|
e00fe0965a | ||
|
|
caa19dd85a | ||
|
|
3bf17944b3 | ||
|
|
30f89e86f0 | ||
|
|
8850dd4a08 | ||
|
|
8946091b93 | ||
|
|
9e3e06f0a0 | ||
|
|
12fea4c37e | ||
|
|
ad02e0711d | ||
|
|
869235a8c2 | ||
|
|
15f6d2c59a | ||
|
|
d0c11aa527 | ||
|
|
c7a847f677 | ||
|
|
0791fdd3d4 | ||
|
|
e5f18d3c78 | ||
|
|
0d3cf24714 | ||
|
|
a8ed0dbbe0 | ||
|
|
84f4f8e358 | ||
|
|
7085fea1b7 | ||
|
|
1f195024e1 | ||
|
|
a91980e603 | ||
|
|
8de957b59b | ||
|
|
206fee797c | ||
|
|
6ef2a190cd | ||
|
|
9a7028a44f | ||
|
|
a7218c68ed | ||
|
|
1f31ef223d | ||
|
|
444fea85f0 | ||
|
|
e92ce64b17 | ||
|
|
8d2a0e6c0d | ||
|
|
6b8b494739 | ||
|
|
d8d9ec6543 | ||
|
|
cb48e238a8 | ||
|
|
2bf229b5da | ||
|
|
bde080eadd | ||
|
|
1fe397ca81 | ||
|
|
5a13519189 | ||
|
|
9f4574e176 | ||
|
|
eaee64dca4 | ||
|
|
a232f78ac7 | ||
|
|
061fe89b7f | ||
|
|
c0ddc32997 | ||
|
|
9521b5e7c5 | ||
|
|
efcdf5d525 | ||
|
|
8faf5cadc7 | ||
|
|
656e155625 | ||
|
|
ff07b90c73 | ||
|
|
d265c81735 | ||
|
|
998156d345 | ||
|
|
aaa7c6d5b5 | ||
|
|
48118efeeb | ||
|
|
79d4e76090 | ||
|
|
ea39be0510 | ||
|
|
7bac55ca43 | ||
|
|
435da61405 | ||
|
|
f3e7c7b43b | ||
|
|
eded415df4 | ||
|
|
34029fe001 | ||
|
|
ffb700545f | ||
|
|
70ad09a13e | ||
|
|
74c22c7313 | ||
|
|
2c1b4b9261 | ||
|
|
e5128b6783 | ||
|
|
b22c8307fd | ||
|
|
cb54bbe414 | ||
|
|
096cff28b6 | ||
|
|
197df8f022 | ||
|
|
009dd1d695 | ||
|
|
bdafc93315 | ||
|
|
ef5b06d66e | ||
|
|
65b81612bc | ||
|
|
6269665e79 | ||
|
|
cae7d5b8f4 | ||
|
|
fca43e64b5 | ||
|
|
bc395a0788 | ||
|
|
1d879cbf9f | ||
|
|
240a3d9a73 | ||
|
|
3d73460934 | ||
|
|
0c518a9ce2 | ||
|
|
5cbb6d7b1d | ||
|
|
b0bd16fd04 | ||
|
|
55175c9c40 | ||
|
|
06e5a06680 | ||
|
|
dbb0dcd2dc | ||
|
|
02f723b83a | ||
|
|
1f58dec491 | ||
|
|
a6d264c79d | ||
|
|
d62e729052 | ||
|
|
9ce665865e | ||
|
|
7d395b2cc7 | ||
|
|
2b69211a6c | ||
|
|
67377c4690 | ||
|
|
1d65a0ec14 | ||
|
|
ad58edbfe1 | ||
|
|
f8e7bfbec6 | ||
|
|
2e618b613f | ||
|
|
cc2b5fcfcb | ||
|
|
8ef3936be5 | ||
|
|
b06e4b537b | ||
|
|
7b4cd41d3b | ||
|
|
2c9434729a | ||
|
|
7f02925ff7 | ||
|
|
b217691c8a | ||
|
|
4bce196c09 | ||
|
|
aa17d8ccf3 | ||
|
|
26a5ca4496 | ||
|
|
51f942ee18 | ||
|
|
2c773391f0 | ||
|
|
c66d969c82 | ||
|
|
bc9d722ee0 | ||
|
|
6482f11620 | ||
|
|
75024c7c11 | ||
|
|
dc78d51def | ||
|
|
5f0ad1b0e0 | ||
|
|
6db0ca5230 | ||
|
|
049617c22e | ||
|
|
d431d3382a | ||
|
|
a848c8eb72 | ||
|
|
871fd5fdcc | ||
|
|
e3dd37f515 | ||
|
|
3557b32298 | ||
|
|
20db674d25 | ||
|
|
2a4da0a73e | ||
|
|
e6335c1d6e | ||
|
|
f40fea0ec5 | ||
|
|
96503e40f6 | ||
|
|
c95e9bb4cc | ||
|
|
825fe0f2fb | ||
|
|
4ea689f426 | ||
|
|
f0bb6d1926 | ||
|
|
13436abd1a | ||
|
|
bed60a8a67 | ||
|
|
2b8ef759df | ||
|
|
9318bb9091 | ||
|
|
847f2eb8ca | ||
|
|
0b7201779c | ||
|
|
2b37c00ed0 | ||
|
|
2e5a78e1d8 | ||
|
|
277c904bc5 | ||
|
|
8945a3943b | ||
|
|
1cfd80ac3d | ||
|
|
b4e6a34aca | ||
|
|
b3c8699635 | ||
|
|
223495a04a | ||
|
|
40a015363c | ||
|
|
2869e7c160 | ||
|
|
30a72d91b8 | ||
|
|
efb36f705c | ||
|
|
6a30b1d6f0 | ||
|
|
7b45b8761b | ||
|
|
a89ef8fc4c | ||
|
|
bae79a5320 | ||
|
|
0f14ece4da | ||
|
|
b1c6850ce1 | ||
|
|
bd99cfaa6d | ||
|
|
3ab17cf9b0 | ||
|
|
4bd7962182 | ||
|
|
09f099171b | ||
|
|
4fff7069a8 | ||
|
|
3e2153b39c | ||
|
|
d0fa6ab15c | ||
|
|
9f8024d488 | ||
|
|
1df3bc1db9 | ||
|
|
a8c1b9c754 | ||
|
|
7600c48cc7 | ||
|
|
2e31560d6c | ||
|
|
2a07f193ec | ||
|
|
b720b325b3 | ||
|
|
80573a84ea | ||
|
|
bc94d66002 | ||
|
|
aca5fccaa7 | ||
|
|
ee6ced1390 | ||
|
|
af8e5907b9 | ||
|
|
9cf9fd198f | ||
|
|
0c2db10082 | ||
|
|
fae9c38098 | ||
|
|
0799bf658f | ||
|
|
2cec7c5699 | ||
|
|
b10a2572ec | ||
|
|
657cf22f71 | ||
|
|
dce58357ae | ||
|
|
7abe427c03 | ||
|
|
1a55150ddd | ||
|
|
3e879f3687 | ||
|
|
0eb932dc3c | ||
|
|
eb26b42543 | ||
|
|
d082ce3374 | ||
|
|
faccc3e912 | ||
|
|
af8edb8999 | ||
|
|
0abe5fc3e4 | ||
|
|
5a444ea08c | ||
|
|
dfb2ad2950 | ||
|
|
256e11d320 | ||
|
|
467098a9e4 | ||
|
|
9532e0ec89 |
@@ -1,3 +0,0 @@
|
|||||||
[submodule "std"]
|
|
||||||
path = std
|
|
||||||
url = git@github.com:koka-community/std.git
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: main
|
||||||
|
- event: pull_request
|
||||||
|
- event: manual
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: test
|
||||||
|
image: golang:1.26-alpine
|
||||||
|
commands:
|
||||||
|
- go vet ./...
|
||||||
|
- go test ./...
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: main
|
||||||
|
- event: pull_request
|
||||||
|
- event: manual
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: test
|
||||||
|
image: node:24-alpine
|
||||||
|
commands:
|
||||||
|
- cd zenno
|
||||||
|
- npm ci
|
||||||
|
- npm run check
|
||||||
|
- npm run lint
|
||||||
|
- npm run test
|
||||||
@@ -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}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -18,27 +18,34 @@ func _() {
|
|||||||
_ = x[AbilityHP-9]
|
_ = x[AbilityHP-9]
|
||||||
_ = x[AbilityGateDelay-10]
|
_ = x[AbilityGateDelay-10]
|
||||||
_ = x[AbilityFrenzy-13]
|
_ = x[AbilityFrenzy-13]
|
||||||
|
_ = x[AbilityAddGateDelay-14]
|
||||||
_ = x[AbilityCurrentSpeed-21]
|
_ = x[AbilityCurrentSpeed-21]
|
||||||
|
_ = x[AbilityCurrentSpeedUp-22]
|
||||||
_ = x[AbilityTargetSpeed-27]
|
_ = x[AbilityTargetSpeed-27]
|
||||||
_ = x[AbilityLaneSpeed-28]
|
_ = x[AbilityLaneSpeed-28]
|
||||||
|
_ = x[AbilityRushedChance-29]
|
||||||
_ = x[AbilityAccel-31]
|
_ = x[AbilityAccel-31]
|
||||||
_ = x[AbilityLaneChange-35]
|
_ = x[AbilityLaneChange-35]
|
||||||
|
_ = x[AbilityActivateRare-37]
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_AbilityType_name_0 = "SpeedStaminaPowerGutsWitEnable Great Escape"
|
_AbilityType_name_0 = "SpeedStaminaPowerGutsWitEnable Great Escape"
|
||||||
_AbilityType_name_1 = "VisionHPGate delay multiplier"
|
_AbilityType_name_1 = "VisionHPGate delay multiplier"
|
||||||
_AbilityType_name_2 = "Frenzy"
|
_AbilityType_name_2 = "FrenzyAdded gate delay"
|
||||||
_AbilityType_name_3 = "Current speed"
|
_AbilityType_name_3 = "Current speedCurrent speed"
|
||||||
_AbilityType_name_4 = "Target speedLane change speed"
|
_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 (
|
||||||
_AbilityType_index_0 = [...]uint8{0, 5, 12, 17, 21, 24, 43}
|
_AbilityType_index_0 = [...]uint8{0, 5, 12, 17, 21, 24, 43}
|
||||||
_AbilityType_index_1 = [...]uint8{0, 6, 8, 29}
|
_AbilityType_index_1 = [...]uint8{0, 6, 8, 29}
|
||||||
_AbilityType_index_4 = [...]uint8{0, 12, 29}
|
_AbilityType_index_2 = [...]uint8{0, 6, 22}
|
||||||
|
_AbilityType_index_3 = [...]uint8{0, 13, 26}
|
||||||
|
_AbilityType_index_4 = [...]uint8{0, 12, 29, 42}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (i AbilityType) String() string {
|
func (i AbilityType) String() string {
|
||||||
@@ -49,17 +56,21 @@ func (i AbilityType) String() string {
|
|||||||
case 8 <= i && i <= 10:
|
case 8 <= i && i <= 10:
|
||||||
i -= 8
|
i -= 8
|
||||||
return _AbilityType_name_1[_AbilityType_index_1[i]:_AbilityType_index_1[i+1]]
|
return _AbilityType_name_1[_AbilityType_index_1[i]:_AbilityType_index_1[i+1]]
|
||||||
case i == 13:
|
case 13 <= i && i <= 14:
|
||||||
return _AbilityType_name_2
|
i -= 13
|
||||||
case i == 21:
|
return _AbilityType_name_2[_AbilityType_index_2[i]:_AbilityType_index_2[i+1]]
|
||||||
return _AbilityType_name_3
|
case 21 <= i && i <= 22:
|
||||||
case 27 <= i && i <= 28:
|
i -= 21
|
||||||
|
return _AbilityType_name_3[_AbilityType_index_3[i]:_AbilityType_index_3[i+1]]
|
||||||
|
case 27 <= i && i <= 29:
|
||||||
i -= 27
|
i -= 27
|
||||||
return _AbilityType_name_4[_AbilityType_index_4[i]:_AbilityType_index_4[i+1]]
|
return _AbilityType_name_4[_AbilityType_index_4[i]:_AbilityType_index_4[i+1]]
|
||||||
case i == 31:
|
case i == 31:
|
||||||
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) + ")"
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -11,15 +11,25 @@ func (c Character) String() string {
|
|||||||
return c.Name
|
return c.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AffinityRelation holds precomputed affinity values for a pair or trio.
|
||||||
type AffinityRelation struct {
|
type AffinityRelation struct {
|
||||||
IDA int `json:"chara_a"`
|
IDA CharacterID `json:"chara_a"`
|
||||||
IDB int `json:"chara_b"`
|
IDB CharacterID `json:"chara_b"`
|
||||||
IDC int `json:"chara_c,omitzero"`
|
IDC CharacterID `json:"chara_c,omitzero"`
|
||||||
Affinity int `json:"affinity"`
|
Affinity int `json:"affinity"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AffinityDetail holds a single affinity entry.
|
||||||
|
type AffinityDetail struct {
|
||||||
|
CharaID CharacterID `json:"chara_id"`
|
||||||
|
Relation uint16 `json:"relation"`
|
||||||
|
Affinity uint16 `json:"affinity"`
|
||||||
|
}
|
||||||
|
|
||||||
// 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"`
|
||||||
@@ -27,8 +37,6 @@ type Conversation struct {
|
|||||||
Number int `json:"number"`
|
Number int `json:"number"`
|
||||||
// Location is the ID of the location the conversation occurs in the lobby.
|
// Location is the ID of the location the conversation occurs in the lobby.
|
||||||
Location LobbyConversationLocationID `json:"location"`
|
Location LobbyConversationLocationID `json:"location"`
|
||||||
// LocationName is the name of the lobby location, for convenience.
|
|
||||||
LocationName string `json:"location_name"`
|
|
||||||
// Chara1 is the first conversation participant ID.
|
// Chara1 is the first conversation participant ID.
|
||||||
// It does not necessarily match CharacterID.
|
// It does not necessarily match CharacterID.
|
||||||
Chara1 CharacterID `json:"chara_1"`
|
Chara1 CharacterID `json:"chara_1"`
|
||||||
+12
-2
@@ -1,10 +1,20 @@
|
|||||||
# horsebot
|
# horsebot
|
||||||
|
|
||||||
Discord bot serving horse game data.
|
Website and Discord bot serving horse game data.
|
||||||
|
|
||||||
Production instance is named Zenno Rob Roy, because she has read all about Umamusume and is always happy to share her knowledge and give recommendations.
|
Production instance is named Zenno Rob Roy, because she has read all about Umamusume and is always happy to share her knowledge and give recommendations.
|
||||||
|
|
||||||
## Running
|
The `-mdb` flag is mandatory for both website and Discord bot modes.
|
||||||
|
It provides data for both the horsebot API and the discord bot.
|
||||||
|
|
||||||
|
## Running the Website
|
||||||
|
|
||||||
|
If the `-public` flag is provided, its value gives the directory to serve at `/`.
|
||||||
|
The `-img` flag gives a separate directory into which images are synced from GameTora; obtain permission from Gertas prior to using it.
|
||||||
|
The images are served on `/img/`.
|
||||||
|
|
||||||
|
## Running the Discord Bot
|
||||||
|
|
||||||
|
Provide the `-token` flag pointing to a file containing the token.
|
||||||
The bot always uses the Gateway API.
|
The bot always uses the Gateway API.
|
||||||
If the `-http` argument is provided, it will also use the HTTP API, and `-key` must also be provided.
|
If the `-http` argument is provided, it will also use the HTTP API, and `-key` must also be provided.
|
||||||
|
|||||||
+80
-35
@@ -13,7 +13,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/disgoorg/disgo"
|
"github.com/disgoorg/disgo"
|
||||||
@@ -24,16 +24,19 @@ import (
|
|||||||
"github.com/disgoorg/disgo/httpserver"
|
"github.com/disgoorg/disgo/httpserver"
|
||||||
"github.com/disgoorg/disgo/rest"
|
"github.com/disgoorg/disgo/rest"
|
||||||
httpmiddle "github.com/go-chi/chi/v5/middleware"
|
httpmiddle "github.com/go-chi/chi/v5/middleware"
|
||||||
|
"zombiezen.com/go/sqlite"
|
||||||
|
"zombiezen.com/go/sqlite/sqlitex"
|
||||||
|
|
||||||
"git.sunturtle.xyz/zephyr/horse/horse"
|
"git.sunturtle.xyz/zephyr/horse/mdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
// public site
|
// public site
|
||||||
addr string
|
addr string
|
||||||
dataDir string
|
mdbf string
|
||||||
public string
|
public string
|
||||||
|
img string
|
||||||
// discord
|
// discord
|
||||||
tokenFile string
|
tokenFile string
|
||||||
apiRoute string
|
apiRoute string
|
||||||
@@ -42,9 +45,10 @@ func main() {
|
|||||||
level slog.Level
|
level slog.Level
|
||||||
textfmt string
|
textfmt string
|
||||||
)
|
)
|
||||||
flag.StringVar(&addr, "http", ":80", "`address` to bind HTTP server")
|
flag.StringVar(&addr, "http", ":13669", "`address` to bind HTTP server")
|
||||||
flag.StringVar(&dataDir, "data", "", "`dir`ectory containing exported json data")
|
flag.StringVar(&mdbf, "mdb", "", "`path` to master.mdb")
|
||||||
flag.StringVar(&public, "public", "", "`dir`ectory containing the website to serve")
|
flag.StringVar(&public, "public", "", "`dir`ectory containing the website to serve")
|
||||||
|
flag.StringVar(&img, "img", "", "`dir`ectory to save and serve images")
|
||||||
flag.StringVar(&tokenFile, "token", "", "`file` containing the Discord bot token")
|
flag.StringVar(&tokenFile, "token", "", "`file` containing the Discord bot token")
|
||||||
flag.StringVar(&apiRoute, "route", "/interactions/callback", "`path` to serve Discord HTTP API calls")
|
flag.StringVar(&apiRoute, "route", "/interactions/callback", "`path` to serve Discord HTTP API calls")
|
||||||
flag.StringVar(&pubkey, "key", "", "Discord public key")
|
flag.StringVar(&pubkey, "key", "", "Discord public key")
|
||||||
@@ -64,6 +68,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
slog.SetDefault(slog.New(lh))
|
slog.SetDefault(slog.New(lh))
|
||||||
|
|
||||||
|
if public != "" {
|
||||||
stat, err := os.Stat(public)
|
stat, err := os.Stat(public)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("public", slog.Any("err", err))
|
slog.Error("public", slog.Any("err", err))
|
||||||
@@ -73,10 +78,32 @@ func main() {
|
|||||||
slog.Error("public", slog.String("err", "not a directory"))
|
slog.Error("public", slog.String("err", "not a directory"))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
skills, err := loadSkills(filepath.Join(dataDir, "skill.json"))
|
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||||
|
|
||||||
|
db, err := sqlitex.NewPool(mdbf, sqlitex.PoolOptions{Flags: sqlite.OpenReadOnly})
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("mdb", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if img != "" {
|
||||||
|
// Ensure the img directory is in fact a directory
|
||||||
|
// before we start trying to fill it out.
|
||||||
|
err := os.MkdirAll(img, 0777)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("img", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
go saveImgs(ctx, db, img)
|
||||||
|
}
|
||||||
|
|
||||||
|
var client *bot.Client
|
||||||
|
if tokenFile != "" {
|
||||||
|
skills, err := mdb.Skills(ctx, db)
|
||||||
slog.Info("loaded skills", slog.Int("count", len(skills)))
|
slog.Info("loaded skills", slog.Int("count", len(skills)))
|
||||||
groups, err2 := loadSkillGroups(filepath.Join(dataDir, "skill-group.json"))
|
groups, err2 := mdb.SkillGroups(ctx, db)
|
||||||
slog.Info("loaded skill groups", slog.Int("count", len(groups)))
|
slog.Info("loaded skill groups", slog.Int("count", len(groups)))
|
||||||
if err = errors.Join(err, err2); err != nil {
|
if err = errors.Join(err, err2); err != nil {
|
||||||
slog.Error("loading data", slog.Any("err", err))
|
slog.Error("loading data", slog.Any("err", err))
|
||||||
@@ -85,15 +112,6 @@ func main() {
|
|||||||
skillSrv := newSkillServer(skills, groups)
|
skillSrv := newSkillServer(skills, groups)
|
||||||
slog.Info("skill server ready")
|
slog.Info("skill server ready")
|
||||||
|
|
||||||
token, err := os.ReadFile(tokenFile)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("reading token", slog.Any("err", err))
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
token = bytes.TrimSuffix(token, []byte{'\n'})
|
|
||||||
|
|
||||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
|
||||||
|
|
||||||
r := handler.New()
|
r := handler.New()
|
||||||
r.DefaultContext(func() context.Context { return ctx })
|
r.DefaultContext(func() context.Context { return ctx })
|
||||||
r.Use(middleware.Go)
|
r.Use(middleware.Go)
|
||||||
@@ -104,15 +122,41 @@ func main() {
|
|||||||
r.SelectMenuComponent("/swap", skillSrv.menu)
|
r.SelectMenuComponent("/swap", skillSrv.menu)
|
||||||
r.ButtonComponent("/swap/{id}", skillSrv.button)
|
r.ButtonComponent("/swap/{id}", skillSrv.button)
|
||||||
})
|
})
|
||||||
|
|
||||||
slog.Info("connect", slog.String("disgo", disgo.Version))
|
slog.Info("connect", slog.String("disgo", disgo.Version))
|
||||||
client, err := disgo.New(string(token), bot.WithDefaultGateway(), bot.WithEventListeners(r))
|
token, err := os.ReadFile(tokenFile)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("reading token", slog.Any("err", err))
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
token = bytes.TrimSuffix(token, []byte{'\n'})
|
||||||
|
client, err = disgo.New(string(token), bot.WithDefaultGateway(), bot.WithEventListeners(r))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("building bot", slog.Any("err", err))
|
slog.Error("building bot", slog.Any("err", err))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
if public != "" {
|
||||||
mux.Handle("GET /", httpmiddle.Compress(5)(http.FileServerFS(os.DirFS(public))))
|
mux.Handle("GET /", httpmiddle.Compress(5)(http.FileServerFS(os.DirFS(public))))
|
||||||
|
}
|
||||||
|
if img != "" {
|
||||||
|
mux.Handle("GET /img/", http.StripPrefix("/img", http.FileServerFS(os.DirFS(img))))
|
||||||
|
}
|
||||||
|
mux.Handle("GET /api/global/affinity", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.AffinitySummary)))
|
||||||
|
mux.Handle("GET /api/global/affinity-detail", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.AffinityDetail)))
|
||||||
|
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/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/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-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/support", httpmiddle.Compress(5)(dataroute(ctx, db, mdb.SupportCards)))
|
||||||
|
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)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -129,7 +173,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
srv := http.Server{
|
srv := http.Server{
|
||||||
Addr: addr,
|
Addr: addr,
|
||||||
Handler: mux,
|
Handler: httpmiddle.Logger(mux),
|
||||||
ReadTimeout: 15 * time.Second,
|
ReadTimeout: 15 * time.Second,
|
||||||
WriteTimeout: 15 * time.Second,
|
WriteTimeout: 15 * time.Second,
|
||||||
BaseContext: func(l net.Listener) context.Context { return ctx },
|
BaseContext: func(l net.Listener) context.Context { return ctx },
|
||||||
@@ -143,6 +187,7 @@ func main() {
|
|||||||
slog.Error("HTTP server closed", slog.Any("err", err))
|
slog.Error("HTTP server closed", slog.Any("err", err))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
if client != nil {
|
||||||
if err := handler.SyncCommands(client, commands, nil, rest.WithCtx(ctx)); err != nil {
|
if err := handler.SyncCommands(client, commands, nil, rest.WithCtx(ctx)); err != nil {
|
||||||
slog.Error("syncing commands", slog.Any("err", err))
|
slog.Error("syncing commands", slog.Any("err", err))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@@ -153,13 +198,17 @@ func main() {
|
|||||||
slog.Error("starting gateway", slog.Any("err", err))
|
slog.Error("starting gateway", slog.Any("err", err))
|
||||||
stop()
|
stop()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
slog.Info("ready")
|
slog.Info("ready")
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
stop()
|
stop()
|
||||||
|
|
||||||
ctx, stop = context.WithTimeout(context.Background(), 5*time.Second)
|
ctx, stop = context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
defer stop()
|
defer stop()
|
||||||
|
if client != nil {
|
||||||
client.Close(ctx)
|
client.Close(ctx)
|
||||||
|
}
|
||||||
if err := srv.Shutdown(ctx); err != nil {
|
if err := srv.Shutdown(ctx); err != nil {
|
||||||
slog.Error("HTTP API shutdown", slog.Any("err", err))
|
slog.Error("HTTP API shutdown", slog.Any("err", err))
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@@ -185,26 +234,22 @@ var commands = []discord.ApplicationCommandCreate{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadSkills(file string) ([]horse.Skill, error) {
|
func dataroute[T any](ctx context.Context, db *sqlitex.Pool, f func(context.Context, *sqlitex.Pool) ([]T, error)) http.HandlerFunc {
|
||||||
b, err := os.ReadFile(file)
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
data, err := f(ctx, db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
var skills []horse.Skill
|
b, err := json.Marshal(data)
|
||||||
if err := json.Unmarshal(b, &skills); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return skills, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadSkillGroups(file string) ([]horse.SkillGroup, error) {
|
|
||||||
b, err := os.ReadFile(file)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.Header().Set("Content-Length", strconv.Itoa(len(b)))
|
||||||
|
if _, err := w.Write(b); err != nil {
|
||||||
|
slog.Error("writing response", slog.Any("err", err))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
var groups []horse.SkillGroup
|
|
||||||
if err := json.Unmarshal(b, &groups); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return groups, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-13
@@ -9,8 +9,8 @@ import (
|
|||||||
"github.com/disgoorg/disgo/discord"
|
"github.com/disgoorg/disgo/discord"
|
||||||
"github.com/disgoorg/disgo/handler"
|
"github.com/disgoorg/disgo/handler"
|
||||||
|
|
||||||
|
"git.sunturtle.xyz/zephyr/horse"
|
||||||
"git.sunturtle.xyz/zephyr/horse/cmd/horsebot/autocomplete"
|
"git.sunturtle.xyz/zephyr/horse/cmd/horsebot/autocomplete"
|
||||||
"git.sunturtle.xyz/zephyr/horse/horse"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type skillServer struct {
|
type skillServer struct {
|
||||||
@@ -174,10 +174,8 @@ func (s *skillServer) render(id horse.SkillID) discord.ContainerComponent {
|
|||||||
text = append(text, "Condition: "+formatCondition(act.Condition))
|
text = append(text, "Condition: "+formatCondition(act.Condition))
|
||||||
var t string
|
var t string
|
||||||
switch {
|
switch {
|
||||||
case act.Duration < 0:
|
case act.Duration <= 0:
|
||||||
// passive; do nothing
|
// passive or instantaneous, e.g. recoveries; do nothing
|
||||||
case act.Duration == 0:
|
|
||||||
t = "Instantaneous "
|
|
||||||
case act.Duration >= 500e4:
|
case act.Duration >= 500e4:
|
||||||
t = "Permanent "
|
t = "Permanent "
|
||||||
case act.DurScale == horse.DurationDirect:
|
case act.DurScale == horse.DurationDirect:
|
||||||
@@ -210,17 +208,15 @@ func (s *skillServer) render(id horse.SkillID) discord.ContainerComponent {
|
|||||||
for _, rs := range rel {
|
for _, rs := range rel {
|
||||||
name := rs.Name
|
name := rs.Name
|
||||||
emoji := "⚪"
|
emoji := "⚪"
|
||||||
switch rs.Rarity {
|
switch {
|
||||||
case 1:
|
case rs.Rarity == 3, rs.Rarity == 4, rs.Rarity == 5:
|
||||||
if rs.UniqueOwner != "" {
|
emoji = "🟠"
|
||||||
|
case rs.UniqueOwner != "":
|
||||||
name += " (Inherited)"
|
name += " (Inherited)"
|
||||||
}
|
case rs.Rarity == 2:
|
||||||
case 2:
|
|
||||||
emoji = "🟡"
|
emoji = "🟡"
|
||||||
case 3, 4, 5:
|
case rs.GroupRate == -1:
|
||||||
emoji = "🟣"
|
emoji = "🟣"
|
||||||
default:
|
|
||||||
emoji = "⁉️"
|
|
||||||
}
|
}
|
||||||
b := discord.NewStringSelectMenuOption(name, strconv.Itoa(int(rs.ID))).WithEmoji(discord.NewComponentEmoji(emoji))
|
b := discord.NewStringSelectMenuOption(name, strconv.Itoa(int(rs.ID))).WithEmoji(discord.NewComponentEmoji(emoji))
|
||||||
if rs.ID == skill.ID {
|
if rs.ID == skill.ID {
|
||||||
|
|||||||
@@ -0,0 +1,185 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"image"
|
||||||
|
"image/png"
|
||||||
|
"log/slog"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gen2brain/avif"
|
||||||
|
"golang.org/x/image/draw"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
"zombiezen.com/go/sqlite"
|
||||||
|
"zombiezen.com/go/sqlite/sqlitex"
|
||||||
|
)
|
||||||
|
|
||||||
|
func saveImgs(ctx context.Context, db *sqlitex.Pool, out string) {
|
||||||
|
skill, err := skillIconIDs(ctx, db)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("skills", slog.Any("err", err))
|
||||||
|
}
|
||||||
|
chara, err := charaIDs(ctx, db)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("characters", slog.Any("err", err))
|
||||||
|
}
|
||||||
|
rank, err := rankIDs(ctx, db)
|
||||||
|
if err != nil {
|
||||||
|
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)
|
||||||
|
tick := time.NewTicker(250 * time.Millisecond)
|
||||||
|
idouts(ctx, g, tick, skill, filepath.Join(out, "skill"), "https://media.gametora.com/umamusume/skills/icon/%d.png", 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", "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 {
|
||||||
|
slog.Error("output", slog.Any("err", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// load scans all results of sql and appends them to r.
|
||||||
|
func load[T any](ctx context.Context, db *sqlitex.Pool, r []T, sql string, row func(*sqlite.Stmt) T) ([]T, error) {
|
||||||
|
conn, err := db.Take(ctx)
|
||||||
|
defer db.Put(conn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
stmt, err := conn.Prepare(sql)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
ok, err := stmt.Step()
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
r = append(r, row(stmt))
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func skillIconIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) {
|
||||||
|
return load(ctx, db, nil, "SELECT DISTINCT icon_id FROM skill_data", func(s *sqlite.Stmt) int32 {
|
||||||
|
return s.ColumnInt32(0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func charaIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) {
|
||||||
|
return load(ctx, db, nil, "SELECT id FROM chara_data", func(s *sqlite.Stmt) int32 {
|
||||||
|
return s.ColumnInt32(0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func rankIDs(ctx context.Context, db *sqlitex.Pool) ([]int32, error) {
|
||||||
|
return load(ctx, db, nil, "SELECT id-1 FROM single_mode_rank", func(s *sqlite.Stmt) int32 {
|
||||||
|
return s.ColumnInt32(0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
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}
|
||||||
|
|
||||||
|
func idouts(ctx context.Context, g *errgroup.Group, tick *time.Ticker, ids []int32, p, urlf string, sizes ...image.Point) {
|
||||||
|
for _, id := range ids {
|
||||||
|
g.Go(func() error {
|
||||||
|
n := strconv.Itoa(int(id))
|
||||||
|
p := filepath.Join(p, n)
|
||||||
|
_, err := os.Stat(p)
|
||||||
|
if !errors.Is(err, os.ErrNotExist) {
|
||||||
|
slog.DebugContext(ctx, "exists", slog.String("path", p))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if err := os.MkdirAll(p, 0777); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
url := fmt.Sprintf(urlf, id)
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
case <-tick.C: // continue on
|
||||||
|
}
|
||||||
|
img, err := dlimg(ctx, url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
slog.InfoContext(ctx, "resize", slog.String("url", url))
|
||||||
|
rs := resize(img, sizes...)
|
||||||
|
for _, r := range rs {
|
||||||
|
g.Go(func() error {
|
||||||
|
m := r.Bounds().Max
|
||||||
|
o := filepath.Join(p, fmt.Sprintf("%dx%d.png", m.X, m.Y))
|
||||||
|
slog.InfoContext(ctx, "write", slog.String("path", o))
|
||||||
|
f, err := os.Create(o)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
return pngenc.Encode(f, r)
|
||||||
|
})
|
||||||
|
g.Go(func() error {
|
||||||
|
m := r.Bounds().Max
|
||||||
|
o := filepath.Join(p, fmt.Sprintf("%dx%d.avif", m.X, m.Y))
|
||||||
|
slog.InfoContext(ctx, "write", slog.String("path", o))
|
||||||
|
f, err := os.Create(o)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
return avif.Encode(f, r)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func dlimg(ctx context.Context, url string) (image.Image, error) {
|
||||||
|
slog.InfoContext(ctx, "download", slog.String("url", url))
|
||||||
|
ctx, stop := context.WithTimeout(ctx, 5*time.Second)
|
||||||
|
defer stop()
|
||||||
|
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
slog.InfoContext(ctx, "decode", slog.String("url", url))
|
||||||
|
img, _, err := image.Decode(resp.Body)
|
||||||
|
return img, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func resize(img image.Image, sizes ...image.Point) []image.Image {
|
||||||
|
rs := make([]image.Image, 0, len(sizes))
|
||||||
|
for _, sz := range sizes {
|
||||||
|
d := image.NewNRGBA(image.Rectangle{Min: image.Point{}, Max: sz})
|
||||||
|
draw.CatmullRom.Scale(d, d.Bounds(), img, img.Bounds(), draw.Src, nil)
|
||||||
|
rs = append(rs, d)
|
||||||
|
}
|
||||||
|
return rs
|
||||||
|
}
|
||||||
@@ -1,418 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"cmp"
|
|
||||||
"context"
|
|
||||||
_ "embed"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"log/slog"
|
|
||||||
"maps"
|
|
||||||
"os"
|
|
||||||
"os/signal"
|
|
||||||
"path/filepath"
|
|
||||||
"slices"
|
|
||||||
|
|
||||||
"golang.org/x/sync/errgroup"
|
|
||||||
"zombiezen.com/go/sqlite"
|
|
||||||
"zombiezen.com/go/sqlite/sqlitex"
|
|
||||||
|
|
||||||
"git.sunturtle.xyz/zephyr/horse/horse"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var (
|
|
||||||
mdb string
|
|
||||||
out string
|
|
||||||
region string
|
|
||||||
)
|
|
||||||
flag.StringVar(&mdb, "mdb", os.ExpandEnv(`$USERPROFILE\AppData\LocalLow\Cygames\Umamusume\master\master.mdb`), "`path` to Umamusume master.mdb")
|
|
||||||
flag.StringVar(&out, "o", `.`, "`dir`ectory for output files")
|
|
||||||
flag.StringVar(®ion, "region", "global", "region the database is for (global, jp)")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
slog.Info("open", slog.String("mdb", mdb))
|
|
||||||
db, err := sqlitex.NewPool(mdb, sqlitex.PoolOptions{Flags: sqlite.OpenReadOnly})
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("opening mdb", slog.String("mdb", mdb), slog.Any("err", err))
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
|
||||||
go func() {
|
|
||||||
<-ctx.Done()
|
|
||||||
stop()
|
|
||||||
}()
|
|
||||||
|
|
||||||
loadgroup, ctx1 := errgroup.WithContext(ctx)
|
|
||||||
charas := load(ctx1, loadgroup, db, "characters", characterSQL, func(s *sqlite.Stmt) horse.Character {
|
|
||||||
return horse.Character{
|
|
||||||
ID: horse.CharacterID(s.ColumnInt(0)),
|
|
||||||
Name: s.ColumnText(1),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
aff := load(ctx1, loadgroup, db, "pair affinity", affinitySQL, func(s *sqlite.Stmt) horse.AffinityRelation {
|
|
||||||
return horse.AffinityRelation{
|
|
||||||
IDA: s.ColumnInt(0),
|
|
||||||
IDB: s.ColumnInt(1),
|
|
||||||
IDC: s.ColumnInt(2),
|
|
||||||
Affinity: s.ColumnInt(3),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
umas := load(ctx1, loadgroup, db, "umas", umaSQL, func(s *sqlite.Stmt) horse.Uma {
|
|
||||||
return horse.Uma{
|
|
||||||
ID: horse.UmaID(s.ColumnInt(0)),
|
|
||||||
CharacterID: horse.CharacterID(s.ColumnInt(1)),
|
|
||||||
Name: s.ColumnText(2),
|
|
||||||
Variant: s.ColumnText(3),
|
|
||||||
Sprint: horse.AptitudeLevel(s.ColumnInt(4)),
|
|
||||||
Mile: horse.AptitudeLevel(s.ColumnInt(6)),
|
|
||||||
Medium: horse.AptitudeLevel(s.ColumnInt(7)),
|
|
||||||
Long: horse.AptitudeLevel(s.ColumnInt(8)),
|
|
||||||
Front: horse.AptitudeLevel(s.ColumnInt(9)),
|
|
||||||
Pace: horse.AptitudeLevel(s.ColumnInt(10)),
|
|
||||||
Late: horse.AptitudeLevel(s.ColumnInt(11)),
|
|
||||||
End: horse.AptitudeLevel(s.ColumnInt(12)),
|
|
||||||
Turf: horse.AptitudeLevel(s.ColumnInt(13)),
|
|
||||||
Dirt: horse.AptitudeLevel(s.ColumnInt(14)),
|
|
||||||
Unique: horse.SkillID(s.ColumnInt(15)),
|
|
||||||
Skill1: horse.SkillID(s.ColumnInt(16)),
|
|
||||||
Skill2: horse.SkillID(s.ColumnInt(17)),
|
|
||||||
Skill3: horse.SkillID(s.ColumnInt(18)),
|
|
||||||
SkillPL2: horse.SkillID(s.ColumnInt(19)),
|
|
||||||
SkillPL3: horse.SkillID(s.ColumnInt(20)),
|
|
||||||
SkillPL4: horse.SkillID(s.ColumnInt(21)),
|
|
||||||
SkillPL5: horse.SkillID(s.ColumnInt(22)),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
sg := load(ctx1, loadgroup, db, "skill groups", skillGroupSQL, func(s *sqlite.Stmt) horse.SkillGroup {
|
|
||||||
return horse.SkillGroup{
|
|
||||||
ID: horse.SkillGroupID(s.ColumnInt(0)),
|
|
||||||
Skill1: horse.SkillID(s.ColumnInt(1)),
|
|
||||||
Skill2: horse.SkillID(s.ColumnInt(2)),
|
|
||||||
Skill3: horse.SkillID(s.ColumnInt(3)),
|
|
||||||
SkillBad: horse.SkillID(s.ColumnInt(4)),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
skills := load(ctx1, loadgroup, db, "skills", skillSQL, func(s *sqlite.Stmt) horse.Skill {
|
|
||||||
return horse.Skill{
|
|
||||||
ID: horse.SkillID(s.ColumnInt(0)),
|
|
||||||
Name: s.ColumnText(1),
|
|
||||||
Description: s.ColumnText(2),
|
|
||||||
Group: horse.SkillGroupID(s.ColumnInt32(3)),
|
|
||||||
Rarity: int8(s.ColumnInt(5)),
|
|
||||||
GroupRate: int8(s.ColumnInt(6)),
|
|
||||||
GradeValue: s.ColumnInt32(7),
|
|
||||||
WitCheck: s.ColumnBool(8),
|
|
||||||
Activations: trimActivations([]horse.Activation{
|
|
||||||
{
|
|
||||||
Precondition: s.ColumnText(9),
|
|
||||||
Condition: s.ColumnText(10),
|
|
||||||
Duration: horse.TenThousandths(s.ColumnInt(11)),
|
|
||||||
DurScale: horse.DurScale(s.ColumnInt(12)),
|
|
||||||
Cooldown: horse.TenThousandths(s.ColumnInt(13)),
|
|
||||||
Abilities: trimAbilities([]horse.Ability{
|
|
||||||
{
|
|
||||||
Type: horse.AbilityType(s.ColumnInt(14)),
|
|
||||||
ValueUsage: horse.AbilityValueUsage(s.ColumnInt(15)),
|
|
||||||
Value: horse.TenThousandths(s.ColumnInt(16)),
|
|
||||||
Target: horse.AbilityTarget(s.ColumnInt(17)),
|
|
||||||
TargetValue: s.ColumnInt32(18),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Type: horse.AbilityType(s.ColumnInt(19)),
|
|
||||||
ValueUsage: horse.AbilityValueUsage(s.ColumnInt(20)),
|
|
||||||
Value: horse.TenThousandths(s.ColumnInt(21)),
|
|
||||||
Target: horse.AbilityTarget(s.ColumnInt(22)),
|
|
||||||
TargetValue: s.ColumnInt32(23),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Type: horse.AbilityType(s.ColumnInt(24)),
|
|
||||||
ValueUsage: horse.AbilityValueUsage(s.ColumnInt(25)),
|
|
||||||
Value: horse.TenThousandths(s.ColumnInt(26)),
|
|
||||||
Target: horse.AbilityTarget(s.ColumnInt(27)),
|
|
||||||
TargetValue: s.ColumnInt32(28),
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Precondition: s.ColumnText(29),
|
|
||||||
Condition: s.ColumnText(30),
|
|
||||||
Duration: horse.TenThousandths(s.ColumnInt(31)),
|
|
||||||
DurScale: horse.DurScale(s.ColumnInt(32)),
|
|
||||||
Cooldown: horse.TenThousandths(s.ColumnInt(33)),
|
|
||||||
Abilities: trimAbilities([]horse.Ability{
|
|
||||||
{
|
|
||||||
Type: horse.AbilityType(s.ColumnInt(34)),
|
|
||||||
ValueUsage: horse.AbilityValueUsage(s.ColumnInt(35)),
|
|
||||||
Value: horse.TenThousandths(s.ColumnInt(36)),
|
|
||||||
Target: horse.AbilityTarget(s.ColumnInt(37)),
|
|
||||||
TargetValue: s.ColumnInt32(38),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Type: horse.AbilityType(s.ColumnInt(39)),
|
|
||||||
ValueUsage: horse.AbilityValueUsage(s.ColumnInt(40)),
|
|
||||||
Value: horse.TenThousandths(s.ColumnInt(41)),
|
|
||||||
Target: horse.AbilityTarget(s.ColumnInt(42)),
|
|
||||||
TargetValue: s.ColumnInt32(43),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Type: horse.AbilityType(s.ColumnInt(44)),
|
|
||||||
ValueUsage: horse.AbilityValueUsage(s.ColumnInt(45)),
|
|
||||||
Value: horse.TenThousandths(s.ColumnInt(46)),
|
|
||||||
Target: horse.AbilityTarget(s.ColumnInt(47)),
|
|
||||||
TargetValue: s.ColumnInt32(48),
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
UniqueOwner: s.ColumnText(52), // TODO(zeph): should be id, not name
|
|
||||||
SPCost: s.ColumnInt(49),
|
|
||||||
IconID: s.ColumnInt(53),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
races := load(ctx1, loadgroup, db, "races", raceSQL, func(s *sqlite.Stmt) horse.Race {
|
|
||||||
return horse.Race{
|
|
||||||
ID: horse.RaceID(s.ColumnInt(0)),
|
|
||||||
Name: s.ColumnText(1),
|
|
||||||
// TODO(zeph): grade
|
|
||||||
Thumbnail: s.ColumnInt(3),
|
|
||||||
Primary: horse.RaceID(s.ColumnInt(4)),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
saddles := load(ctx1, loadgroup, db, "saddles", saddleSQL, func(s *sqlite.Stmt) horse.Saddle {
|
|
||||||
return horse.Saddle{
|
|
||||||
ID: horse.SaddleID(s.ColumnInt(0)),
|
|
||||||
Name: s.ColumnText(1),
|
|
||||||
Races: trimZeros(
|
|
||||||
horse.RaceID(s.ColumnInt(2)),
|
|
||||||
horse.RaceID(s.ColumnInt(3)),
|
|
||||||
horse.RaceID(s.ColumnInt(4)),
|
|
||||||
),
|
|
||||||
Type: horse.SaddleType(s.ColumnInt(5)),
|
|
||||||
Primary: horse.SaddleID(s.ColumnInt(6)),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
scenarios := load(ctx1, loadgroup, db, "scenarios", scenarioSQL, func(s *sqlite.Stmt) horse.Scenario {
|
|
||||||
return horse.Scenario{
|
|
||||||
ID: horse.ScenarioID(s.ColumnInt(0)),
|
|
||||||
Name: s.ColumnText(1),
|
|
||||||
Title: s.ColumnText(2),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
sparks := load(ctx1, loadgroup, db, "sparks", sparkSQL, func(s *sqlite.Stmt) horse.Spark {
|
|
||||||
return horse.Spark{
|
|
||||||
ID: horse.SparkID(s.ColumnInt(0)),
|
|
||||||
Name: s.ColumnText(1),
|
|
||||||
Description: s.ColumnText(2),
|
|
||||||
Group: horse.SparkGroupID(s.ColumnInt(3)),
|
|
||||||
Rarity: horse.SparkRarity(s.ColumnInt(4)),
|
|
||||||
Type: horse.SparkType(s.ColumnInt(5)),
|
|
||||||
// Effects filled in later.
|
|
||||||
}
|
|
||||||
})
|
|
||||||
sparkeffs := load(ctx1, loadgroup, db, "spark effects", sparkEffectSQL, func(s *sqlite.Stmt) SparkEffImm {
|
|
||||||
return SparkEffImm{
|
|
||||||
Group: horse.SparkGroupID(s.ColumnInt(0)),
|
|
||||||
Effect: s.ColumnInt(1),
|
|
||||||
Target: horse.SparkTarget(s.ColumnInt(2)),
|
|
||||||
Value1: s.ColumnInt32(3),
|
|
||||||
Value2: s.ColumnInt32(4),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
convos := load(ctx1, loadgroup, db, "lobby conversations", conversationSQL, func(s *sqlite.Stmt) horse.Conversation {
|
|
||||||
return horse.Conversation{
|
|
||||||
CharacterID: horse.CharacterID(s.ColumnInt(0)),
|
|
||||||
Number: s.ColumnInt(1),
|
|
||||||
Location: horse.LobbyConversationLocationID(s.ColumnInt(2)),
|
|
||||||
LocationName: horse.LobbyConversationLocationID(s.ColumnInt(2)).String(),
|
|
||||||
Chara1: horse.CharacterID(s.ColumnInt(3)),
|
|
||||||
Chara2: horse.CharacterID(s.ColumnInt(4)),
|
|
||||||
Chara3: horse.CharacterID(s.ColumnInt(5)),
|
|
||||||
ConditionType: s.ColumnInt(6),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if err := os.MkdirAll(filepath.Join(out, region), 0775); err != nil {
|
|
||||||
slog.Error("create output dir", slog.Any("err", err))
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
writegroup, ctx2 := errgroup.WithContext(ctx)
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "character.json", charas) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "affinity.json", aff) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "uma.json", umas) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "skill-group.json", sg) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "skill.json", skills) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "race.json", races) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "saddle.json", saddles) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "scenario.json", scenarios) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "spark.json", mergesparks(sparks, sparkeffs)) })
|
|
||||||
writegroup.Go(func() error { return write(ctx2, out, region, "conversation.json", convos) })
|
|
||||||
if err := writegroup.Wait(); err != nil {
|
|
||||||
slog.ErrorContext(ctx, "write", slog.Any("err", err))
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
slog.InfoContext(ctx, "done")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
//go:embed sql/character.sql
|
|
||||||
characterSQL string
|
|
||||||
//go:embed sql/affinity.sql
|
|
||||||
affinitySQL string
|
|
||||||
//go:embed sql/uma.sql
|
|
||||||
umaSQL string
|
|
||||||
//go:embed sql/skill-group.sql
|
|
||||||
skillGroupSQL string
|
|
||||||
//go:embed sql/skill.sql
|
|
||||||
skillSQL string
|
|
||||||
//go:embed sql/race.sql
|
|
||||||
raceSQL string
|
|
||||||
//go:embed sql/saddle.sql
|
|
||||||
saddleSQL string
|
|
||||||
//go:embed sql/scenario.sql
|
|
||||||
scenarioSQL string
|
|
||||||
//go:embed sql/spark.sql
|
|
||||||
sparkSQL string
|
|
||||||
//go:embed sql/spark-effect.sql
|
|
||||||
sparkEffectSQL string
|
|
||||||
//go:embed sql/conversation.sql
|
|
||||||
conversationSQL string
|
|
||||||
)
|
|
||||||
|
|
||||||
func load[T any](ctx context.Context, group *errgroup.Group, db *sqlitex.Pool, kind, sql string, row func(*sqlite.Stmt) T) func() ([]T, error) {
|
|
||||||
slog.InfoContext(ctx, "load", slog.String("kind", kind))
|
|
||||||
var r []T
|
|
||||||
group.Go(func() error {
|
|
||||||
conn, err := db.Take(ctx)
|
|
||||||
defer db.Put(conn)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("couldn't get connection for %s: %w", kind, err)
|
|
||||||
}
|
|
||||||
stmt, _, err := conn.PrepareTransient(sql)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("couldn't prepare statement for %s: %w", kind, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
ok, err := stmt.Step()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("error stepping %s: %w", kind, err)
|
|
||||||
}
|
|
||||||
if !ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
r = append(r, row(stmt))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
return func() ([]T, error) {
|
|
||||||
err := group.Wait()
|
|
||||||
if err == context.Canceled {
|
|
||||||
// After the first wait, all future ones return context.Canceled.
|
|
||||||
// We want to be able to wait any number of times, so hide it.
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func write[T any](ctx context.Context, out, region, name string, v func() (T, error)) error {
|
|
||||||
p := filepath.Join(out, region, name)
|
|
||||||
r, err := v()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
slog.InfoContext(ctx, "write", slog.String("path", p))
|
|
||||||
f, err := os.Create(p)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
w := bufio.NewWriter(f)
|
|
||||||
enc := json.NewEncoder(w)
|
|
||||||
enc.SetEscapeHTML(false)
|
|
||||||
enc.SetIndent("", "\t")
|
|
||||||
err = enc.Encode(r)
|
|
||||||
err = errors.Join(err, w.Flush())
|
|
||||||
slog.InfoContext(ctx, "marshaled", slog.String("path", p))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func mergesparks(sparks func() ([]horse.Spark, error), effs func() ([]SparkEffImm, error)) func() ([]horse.Spark, error) {
|
|
||||||
return func() ([]horse.Spark, error) {
|
|
||||||
sp, err := sparks()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
ef, err := effs()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Spark effects are sorted by group ID, but groups apply to multiple
|
|
||||||
// sparks, and we don't rely on sparks and groups being in the same order.
|
|
||||||
// It is possible to merge in linear time, but not worth the effort:
|
|
||||||
// n log n is fine since this is an AOT step.
|
|
||||||
for i := range sp {
|
|
||||||
k, ok := slices.BinarySearchFunc(ef, sp[i].Group, func(e SparkEffImm, v horse.SparkGroupID) int { return cmp.Compare(e.Group, v) })
|
|
||||||
if !ok {
|
|
||||||
panic(fmt.Errorf("mergesparks: no spark group for %+v", &sp[i]))
|
|
||||||
}
|
|
||||||
// Back up to the first effect in the group.
|
|
||||||
for k > 0 && ef[k-1].Group == sp[i].Group {
|
|
||||||
k--
|
|
||||||
}
|
|
||||||
// Map effect IDs to the lists of their effects.
|
|
||||||
m := make(map[int][]horse.SparkEffect)
|
|
||||||
for _, e := range ef[k:] {
|
|
||||||
if e.Group != sp[i].Group {
|
|
||||||
// Done with this group.
|
|
||||||
break
|
|
||||||
}
|
|
||||||
m[e.Effect] = append(m[e.Effect], horse.SparkEffect{Target: e.Target, Value1: e.Value1, Value2: e.Value2})
|
|
||||||
}
|
|
||||||
// Now get effects in order.
|
|
||||||
keys := slices.Sorted(maps.Keys(m))
|
|
||||||
sp[i].Effects = make([][]horse.SparkEffect, 0, len(keys))
|
|
||||||
for _, key := range keys {
|
|
||||||
sp[i].Effects = append(sp[i].Effects, m[key])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sp, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type SparkEffImm struct {
|
|
||||||
Group horse.SparkGroupID
|
|
||||||
Effect int
|
|
||||||
Target horse.SparkTarget
|
|
||||||
Value1 int32
|
|
||||||
Value2 int32
|
|
||||||
}
|
|
||||||
|
|
||||||
func trimAbilities(s []horse.Ability) []horse.Ability {
|
|
||||||
for len(s) > 0 && s[len(s)-1].Type == 0 {
|
|
||||||
s = s[:len(s)-1]
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func trimActivations(s []horse.Activation) []horse.Activation {
|
|
||||||
for len(s) > 0 && s[len(s)-1].Condition == "" {
|
|
||||||
s = s[:len(s)-1]
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func trimZeros[T comparable](s ...T) []T {
|
|
||||||
var zero T
|
|
||||||
for len(s) > 0 && s[len(s)-1] == zero {
|
|
||||||
s = s[:len(s)-1]
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
SELECT
|
|
||||||
"index" AS "id",
|
|
||||||
"text" AS "name",
|
|
||||||
ROW_NUMBER() OVER (ORDER BY "index") - 1 AS "index"
|
|
||||||
FROM text_data
|
|
||||||
WHERE category = 6 AND "index" BETWEEN 1000 AND 1999
|
|
||||||
-- Exclude characters who have no succession relations defined.
|
|
||||||
AND "index" IN (SELECT chara_id FROM succession_relation_member)
|
|
||||||
ORDER BY "id"
|
|
||||||
+190767
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||||
@@ -228,6 +231,63 @@ tag_id is a slash-separated list of numeric IDs that roughly describe all effect
|
|||||||
- 614 base stat threshold passive
|
- 614 base stat threshold passive
|
||||||
- 615 mood passive
|
- 615 mood passive
|
||||||
|
|
||||||
|
unrelated, query to get all condition types:
|
||||||
|
```sql
|
||||||
|
WITH RECURSIVE condition AS (
|
||||||
|
SELECT DISTINCT precondition_1 AS c FROM skill_data
|
||||||
|
UNION
|
||||||
|
SELECT DISTINCT condition_1 AS c FROM skill_data
|
||||||
|
UNION
|
||||||
|
SELECT DISTINCT precondition_2 AS c FROM skill_data
|
||||||
|
UNION
|
||||||
|
SELECT DISTINCT condition_2 AS c FROM skill_data
|
||||||
|
), disj AS (
|
||||||
|
SELECT
|
||||||
|
IIF(INSTR(c, '@') != 0, SUBSTR(c, 1, INSTR(c, '@')-1), c) AS c,
|
||||||
|
IIF(INSTR(c, '@') != 0, SUBSTR(c, 1 + INSTR(c, '@')), '') AS rest
|
||||||
|
FROM condition
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
IIF(INSTR(rest, '@') != 0, SUBSTR(rest, 1, INSTR(rest, '@')-1), rest) AS c,
|
||||||
|
IIF(INSTR(rest, '@') != 0, SUBSTR(rest, 1 + INSTR(rest, '@')), '') AS rest
|
||||||
|
FROM disj
|
||||||
|
WHERE rest != ''
|
||||||
|
), term AS (
|
||||||
|
SELECT
|
||||||
|
IIF(INSTR(c, '&') != 0, SUBSTR(c, 1, INSTR(c, '&')-1), c) AS term,
|
||||||
|
IIF(INSTR(c, '&') != 0, SUBSTR(c, 1 + INSTR(c, '&')), '') AS rest
|
||||||
|
FROM disj
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
IIF(INSTR(rest, '&') != 0, SUBSTR(rest, 1, INSTR(rest, '&')-1), rest) AS term,
|
||||||
|
IIF(INSTR(rest, '&') != 0, SUBSTR(rest, 1 + INSTR(rest, '&')), '') AS rest
|
||||||
|
FROM term
|
||||||
|
WHERE rest != ''
|
||||||
|
), op AS (
|
||||||
|
SELECT
|
||||||
|
term,
|
||||||
|
CASE
|
||||||
|
WHEN INSTR(term, '==') != 0 THEN '=='
|
||||||
|
WHEN INSTR(term, '!=') != 0 THEN '!='
|
||||||
|
WHEN INSTR(term, '<=') != 0 THEN '<='
|
||||||
|
WHEN INSTR(term, '>=') != 0 THEN '>='
|
||||||
|
WHEN INSTR(term, '<') != 0 THEN '<'
|
||||||
|
WHEN INSTR(term, '>') != 0 THEN '>'
|
||||||
|
END AS op
|
||||||
|
FROM term WHERE term != ''
|
||||||
|
), type_op_arg AS (
|
||||||
|
SELECT DISTINCT
|
||||||
|
term,
|
||||||
|
SUBSTR(term, 1, INSTR(term, op) - 1) AS "type",
|
||||||
|
op,
|
||||||
|
CAST(SUBSTR(term, INSTR(term, op) + LENGTH(op)) AS INTEGER) AS arg
|
||||||
|
FROM op
|
||||||
|
)
|
||||||
|
SELECT DISTINCT CONCAT(type, op), arg FROM type_op_arg
|
||||||
|
```
|
||||||
|
|
||||||
|
final select can be adjusted to get different info, but type+op together seems most useful
|
||||||
|
|
||||||
# races
|
# races
|
||||||
|
|
||||||
- group 1, grade: g1 100, g2 200, g3 300, op 400, pre-op 700
|
- group 1, grade: g1 100, g2 200, g3 300, op 400, pre-op 700
|
||||||
@@ -252,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
|
||||||
@@ -260,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!!!
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
go run ./horsegen "$@"
|
|
||||||
go generate ./horse/...
|
|
||||||
go fmt ./...
|
|
||||||
go test ./...
|
|
||||||
-145007
File diff suppressed because it is too large
Load Diff
@@ -1,226 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"chara_id": 1001,
|
|
||||||
"name": "Special Week"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1002,
|
|
||||||
"name": "Silence Suzuka"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1003,
|
|
||||||
"name": "Tokai Teio"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1004,
|
|
||||||
"name": "Maruzensky"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1005,
|
|
||||||
"name": "Fuji Kiseki"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1006,
|
|
||||||
"name": "Oguri Cap"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1007,
|
|
||||||
"name": "Gold Ship"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1008,
|
|
||||||
"name": "Vodka"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1009,
|
|
||||||
"name": "Daiwa Scarlet"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1010,
|
|
||||||
"name": "Taiki Shuttle"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1011,
|
|
||||||
"name": "Grass Wonder"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1012,
|
|
||||||
"name": "Hishi Amazon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1013,
|
|
||||||
"name": "Mejiro McQueen"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1014,
|
|
||||||
"name": "El Condor Pasa"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1015,
|
|
||||||
"name": "T.M. Opera O"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1016,
|
|
||||||
"name": "Narita Brian"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1017,
|
|
||||||
"name": "Symboli Rudolf"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1018,
|
|
||||||
"name": "Air Groove"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1019,
|
|
||||||
"name": "Agnes Digital"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1020,
|
|
||||||
"name": "Seiun Sky"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1021,
|
|
||||||
"name": "Tamamo Cross"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1022,
|
|
||||||
"name": "Fine Motion"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1023,
|
|
||||||
"name": "Biwa Hayahide"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1024,
|
|
||||||
"name": "Mayano Top Gun"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1025,
|
|
||||||
"name": "Manhattan Cafe"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1026,
|
|
||||||
"name": "Mihono Bourbon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1027,
|
|
||||||
"name": "Mejiro Ryan"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1028,
|
|
||||||
"name": "Hishi Akebono"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1030,
|
|
||||||
"name": "Rice Shower"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1032,
|
|
||||||
"name": "Agnes Tachyon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1033,
|
|
||||||
"name": "Admire Vega"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1034,
|
|
||||||
"name": "Inari One"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1035,
|
|
||||||
"name": "Winning Ticket"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1037,
|
|
||||||
"name": "Eishin Flash"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1038,
|
|
||||||
"name": "Curren Chan"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1039,
|
|
||||||
"name": "Kawakami Princess"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1040,
|
|
||||||
"name": "Gold City"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1041,
|
|
||||||
"name": "Sakura Bakushin O"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1044,
|
|
||||||
"name": "Sweep Tosho"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1045,
|
|
||||||
"name": "Super Creek"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1046,
|
|
||||||
"name": "Smart Falcon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1048,
|
|
||||||
"name": "Tosen Jordan"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1050,
|
|
||||||
"name": "Narita Taishin"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1051,
|
|
||||||
"name": "Nishino Flower"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1052,
|
|
||||||
"name": "Haru Urara"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1056,
|
|
||||||
"name": "Matikanefukukitaru"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1058,
|
|
||||||
"name": "Meisho Doto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1059,
|
|
||||||
"name": "Mejiro Dober"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1060,
|
|
||||||
"name": "Nice Nature"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1061,
|
|
||||||
"name": "King Halo"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1062,
|
|
||||||
"name": "Matikanetannhauser"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1067,
|
|
||||||
"name": "Satono Diamond"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1068,
|
|
||||||
"name": "Kitasan Black"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1069,
|
|
||||||
"name": "Sakura Chiyono O"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1071,
|
|
||||||
"name": "Mejiro Ardan"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chara_id": 1074,
|
|
||||||
"name": "Mejiro Bright"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
File diff suppressed because it is too large
Load Diff
-1712
File diff suppressed because it is too large
Load Diff
-1420
File diff suppressed because it is too large
Load Diff
@@ -1,17 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"scenario_id": 1,
|
|
||||||
"name": "URA Finale",
|
|
||||||
"title": "The Beginning: URA Finale"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scenario_id": 2,
|
|
||||||
"name": "Unity Cup",
|
|
||||||
"title": "Unity Cup: Shine On, Team Spirit!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scenario_id": 4,
|
|
||||||
"name": "TS Climax",
|
|
||||||
"title": "Trackblazer: Start of the Climax"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
File diff suppressed because it is too large
Load Diff
-16215
File diff suppressed because it is too large
Load Diff
-36917
File diff suppressed because it is too large
Load Diff
-1778
File diff suppressed because it is too large
Load Diff
@@ -3,31 +3,38 @@ module git.sunturtle.xyz/zephyr/horse
|
|||||||
go 1.25.5
|
go 1.25.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/disgoorg/disgo v0.19.0-rc.15
|
github.com/disgoorg/disgo v0.19.6
|
||||||
github.com/go-chi/chi/v5 v5.2.5
|
github.com/gen2brain/avif v0.6.0
|
||||||
github.com/junegunn/fzf v0.67.0
|
github.com/go-chi/chi/v5 v5.3.1
|
||||||
golang.org/x/sync v0.20.0
|
github.com/google/go-cmp v0.7.0
|
||||||
|
github.com/junegunn/fzf v0.74.1
|
||||||
|
golang.org/x/image v0.44.0
|
||||||
|
golang.org/x/sync v0.22.0
|
||||||
zombiezen.com/go/sqlite v1.4.2
|
zombiezen.com/go/sqlite v1.4.2
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/disgoorg/godave v0.3.0 // indirect
|
||||||
github.com/disgoorg/json/v2 v2.0.0 // indirect
|
github.com/disgoorg/json/v2 v2.0.0 // indirect
|
||||||
github.com/disgoorg/omit v1.0.0 // indirect
|
github.com/disgoorg/omit v1.0.0 // indirect
|
||||||
github.com/disgoorg/snowflake/v2 v2.0.3 // indirect
|
github.com/disgoorg/snowflake/v2 v2.0.3 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
|
github.com/ebitengine/purego v0.10.2 // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.3 // indirect
|
github.com/gorilla/websocket v1.5.3 // indirect
|
||||||
github.com/klauspost/compress v1.18.2 // indirect
|
github.com/junegunn/go-shellwords v0.0.0-20250127100254-2aa3b3277741 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/klauspost/compress v1.19.1 // indirect
|
||||||
github.com/ncruces/go-strftime v0.1.9 // indirect
|
github.com/mattn/go-isatty v0.0.24 // indirect
|
||||||
|
github.com/ncruces/go-strftime v1.0.0 // indirect
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad // indirect
|
github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad // indirect
|
||||||
golang.org/x/crypto v0.46.0 // indirect
|
github.com/tetratelabs/wazero v1.12.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
golang.org/x/crypto v0.54.0 // indirect
|
||||||
golang.org/x/sys v0.39.0 // indirect
|
golang.org/x/sys v0.47.0 // indirect
|
||||||
modernc.org/libc v1.65.7 // indirect
|
golang.org/x/tools v0.48.0 // indirect
|
||||||
|
modernc.org/libc v1.74.3 // indirect
|
||||||
modernc.org/mathutil v1.7.1 // indirect
|
modernc.org/mathutil v1.7.1 // indirect
|
||||||
modernc.org/memory v1.11.0 // indirect
|
modernc.org/memory v1.11.0 // indirect
|
||||||
modernc.org/sqlite v1.37.1 // indirect
|
modernc.org/sqlite v1.54.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/disgoorg/disgo v0.19.0-rc.15 h1:x0NsV2gcbdjwuztsg2wYXw76p1Cpc8f6ByDrkPcfQtU=
|
github.com/disgoorg/disgo v0.19.6 h1:1xJQt6KZgiqvBOnjuziG1gE4Iqd0aJn8DNfE6eE+0qw=
|
||||||
github.com/disgoorg/disgo v0.19.0-rc.15/go.mod h1:14mgXzenkJqifkDmsEgU0zI1di6jNXodwX6L8geW33A=
|
github.com/disgoorg/disgo v0.19.6/go.mod h1:NnV63iw4lJdF1fnV0gX27XR43ZgRGqnL122svRMTgTE=
|
||||||
|
github.com/disgoorg/godave v0.3.0 h1:37F3ZuiMd8/EXeoCtTeE8iP2eT2nWsfEa4/ITwoKfe4=
|
||||||
|
github.com/disgoorg/godave v0.3.0/go.mod h1:OreAC3hpabr39bMVA+jwOVDq1EUPXH5A0XUBiZaDI1Y=
|
||||||
github.com/disgoorg/json/v2 v2.0.0 h1:U16yy/ARK7/aEpzjjqK1b/KaqqGHozUdeVw/DViEzQI=
|
github.com/disgoorg/json/v2 v2.0.0 h1:U16yy/ARK7/aEpzjjqK1b/KaqqGHozUdeVw/DViEzQI=
|
||||||
github.com/disgoorg/json/v2 v2.0.0/go.mod h1:jZTBC0nIE1WeetSEI3/Dka8g+qglb4FPVmp5I5HpEfI=
|
github.com/disgoorg/json/v2 v2.0.0/go.mod h1:jZTBC0nIE1WeetSEI3/Dka8g+qglb4FPVmp5I5HpEfI=
|
||||||
github.com/disgoorg/omit v1.0.0 h1:y0LkVUOyUHT8ZlnhIAeOZEA22UYykeysK8bLJ0SfT78=
|
github.com/disgoorg/omit v1.0.0 h1:y0LkVUOyUHT8ZlnhIAeOZEA22UYykeysK8bLJ0SfT78=
|
||||||
@@ -10,22 +12,30 @@ github.com/disgoorg/snowflake/v2 v2.0.3 h1:3B+PpFjr7j4ad7oeJu4RlQ+nYOTadsKapJIzg
|
|||||||
github.com/disgoorg/snowflake/v2 v2.0.3/go.mod h1:W6r7NUA7DwfZLwr00km6G4UnZ0zcoLBRufhkFWgAc4c=
|
github.com/disgoorg/snowflake/v2 v2.0.3/go.mod h1:W6r7NUA7DwfZLwr00km6G4UnZ0zcoLBRufhkFWgAc4c=
|
||||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||||
github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug=
|
github.com/ebitengine/purego v0.10.2 h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE=
|
||||||
github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0=
|
github.com/ebitengine/purego v0.10.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/gen2brain/avif v0.6.0 h1:/8WSgcU+IEF0jhKYsUZ/mzlziFuTeJFpIKBj2siTQps=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/gen2brain/avif v0.6.0/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
||||||
|
github.com/go-chi/chi/v5 v5.3.1 h1:3j4HZLGZQ3JpMCrPJF/Jl3mYJfWLKBfNJ6quurUGCf8=
|
||||||
|
github.com/go-chi/chi/v5 v5.3.1/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto=
|
||||||
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/junegunn/fzf v0.67.0 h1:naiOdIkV5/ZCfHgKQIV/f5YDWowl95G6yyOQqW8FeSo=
|
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
|
||||||
github.com/junegunn/fzf v0.67.0/go.mod h1:xlXX2/rmsccKQUnr9QOXPDi5DyV9cM0UjKy/huScBeE=
|
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||||
github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk=
|
github.com/junegunn/fzf v0.74.1 h1:rCGVdCSoOkfcfTxtxCO/vG2yceDjRlKSlv7IfCGkc/Y=
|
||||||
github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
|
github.com/junegunn/fzf v0.74.1/go.mod h1:hKDkO8orBWT5VLIZOL8oyhxn7mRLXdGyu+gz1Ss58pU=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/junegunn/go-shellwords v0.0.0-20250127100254-2aa3b3277741 h1:7dYDtfMDfKzjT+DVfIS4iqknSEKtZpEcXtu6vuaasHs=
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/junegunn/go-shellwords v0.0.0-20250127100254-2aa3b3277741/go.mod h1:6EILKtGpo5t+KLb85LNZLAF6P9LKp78hJI80PXMcn3c=
|
||||||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk=
|
||||||
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
||||||
|
github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI=
|
||||||
|
github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A=
|
||||||
|
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
|
||||||
|
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
||||||
@@ -36,43 +46,48 @@ github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad h1:qIQkSlF5vAUHxE
|
|||||||
github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad/go.mod h1:/pA7k3zsXKdjjAiUhB5CjuKib9KJGCaLvZwtxGC8U0s=
|
github.com/sasha-s/go-csync v0.0.0-20240107134140-fcbab37b09ad/go.mod h1:/pA7k3zsXKdjjAiUhB5CjuKib9KJGCaLvZwtxGC8U0s=
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
|
github.com/tetratelabs/wazero v1.12.0 h1:DuWcpNu/FzgEXgGBDp8J1Spc+CWOvvtvVyjKlaZopYU=
|
||||||
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
|
github.com/tetratelabs/wazero v1.12.0/go.mod h1:LvKtzl2RqO4gyF27BiXU+nKAjcV8f38U+kP/q2vgxh0=
|
||||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
|
golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw=
|
||||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk=
|
||||||
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
|
golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I=
|
||||||
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
|
golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY=
|
||||||
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
|
golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk=
|
||||||
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=
|
||||||
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
|
||||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
|
||||||
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
|
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
|
||||||
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs=
|
||||||
golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
|
golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY=
|
||||||
golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
|
golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE=
|
||||||
|
golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s=
|
modernc.org/cc/v4 v4.29.1 h1:MKgdCV3WykTSPqpVrnxdEDS0HEd2FHpKZDzxzU5LyeI=
|
||||||
modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
|
modernc.org/cc/v4 v4.29.1/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI=
|
||||||
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
|
modernc.org/ccgo/v4 v4.34.6 h1:sBgfIwyN0TQ9C5hwIeuqyeAKyMWnbvj2fvpF4L11uzU=
|
||||||
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
|
modernc.org/ccgo/v4 v4.34.6/go.mod h1:SZ8YcN9NG7XVsQYdm6jYBvi8PQP1qi+kqB6OhjqI3Fk=
|
||||||
modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8=
|
modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM=
|
||||||
modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
|
modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU=
|
||||||
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
|
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
|
||||||
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
|
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
|
||||||
modernc.org/libc v1.65.7 h1:Ia9Z4yzZtWNtUIuiPuQ7Qf7kxYrxP1/jeHZzG8bFu00=
|
modernc.org/gc/v3 v3.1.4 h1:2g65LGVSmFQrXeITAw97x7hCRvZFcyE1uDP+7Vng7JI=
|
||||||
modernc.org/libc v1.65.7/go.mod h1:011EQibzzio/VX3ygj1qGFt5kMjP0lHb0qCW5/D/pQU=
|
modernc.org/gc/v3 v3.1.4/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
|
||||||
|
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
|
||||||
|
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
|
||||||
|
modernc.org/libc v1.74.3 h1:a4J+Z8aVaxPyjyxRAdJzw246PqpcFGvVPnfT/AuM5Ws=
|
||||||
|
modernc.org/libc v1.74.3/go.mod h1:4H7h/MJ8wnjL8RAbp9v3OXgnk22X7MouHIhDbvP3gj4=
|
||||||
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
||||||
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
|
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
|
||||||
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
|
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
|
||||||
modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
|
modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg=
|
||||||
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
|
modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
|
||||||
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
|
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
|
||||||
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
|
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
|
||||||
modernc.org/sqlite v1.37.1 h1:EgHJK/FPoqC+q2YBXg7fUmES37pCHFc97sI7zSayBEs=
|
modernc.org/sqlite v1.54.0 h1:JCxR4qwkJvOaqAoYcgDoO25Nc+ROg6EJ2LfBVzdrgog=
|
||||||
modernc.org/sqlite v1.37.1/go.mod h1:XwdRtsE1MpiBcL54+MbKcaDvcuej+IYSMfLN6gSKV8g=
|
modernc.org/sqlite v1.54.0/go.mod h1:4ntCLuNmnH8+GNqjka1wNg7KJd5/Hi5FYp8K+XQ7GZw=
|
||||||
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
|
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
|
||||||
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
|
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
|
||||||
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
# horse
|
|
||||||
|
|
||||||
This directory contains manually written code and types on which the generated code depends.
|
|
||||||
|
|
||||||
The generated code is in ./global; other regions will follow the same convention once they are supported.
|
|
||||||
It is always safe to delete the entire directories and regenerate them.
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
module horse/character
|
|
||||||
|
|
||||||
import horse/game-id
|
|
||||||
|
|
||||||
pub struct character-detail
|
|
||||||
character-id: character-id
|
|
||||||
name: string
|
|
||||||
|
|
||||||
pub fun detail(
|
|
||||||
c: character-id,
|
|
||||||
?character/show: (character-id) -> string
|
|
||||||
): character-detail
|
|
||||||
Character-detail(c, c.show)
|
|
||||||
|
|
||||||
pub fun character-detail/show(d: character-detail): string
|
|
||||||
val Character-detail(Character-id(id), name) = d
|
|
||||||
name ++ " (ID " ++ id.show ++ ")"
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
module horse/game-id
|
|
||||||
|
|
||||||
// Game ID for characters, cards, skills, races, &c.
|
|
||||||
// Values for different categories may overlap.
|
|
||||||
pub alias game-id = int
|
|
||||||
|
|
||||||
// Specific game ID types.
|
|
||||||
// I've already made mistakes with ID categories and I haven't even committed this file yet.
|
|
||||||
|
|
||||||
pub struct scenario-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for characters.
|
|
||||||
// Generally numbers in the range 1000-9999.
|
|
||||||
pub struct character-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for trainees, i.e. costume instances of characters.
|
|
||||||
// Generally a character ID with two digits appended.
|
|
||||||
pub struct uma-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for skills.
|
|
||||||
pub struct skill-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for skill groups.
|
|
||||||
pub struct skill-group-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for skill icons.
|
|
||||||
pub struct skill-icon-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for races,
|
|
||||||
// i.e. "Tenno Sho (Spring)" and not "Tenno Sho (Spring) at Kyoto Racecourse."
|
|
||||||
pub struct race-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for race thumbnails.
|
|
||||||
pub struct race-thumbnail-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for saddles,
|
|
||||||
// i.e. one or more race wins that appear as a title.
|
|
||||||
pub struct saddle-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for sparks,
|
|
||||||
// i.e. succession factors.
|
|
||||||
pub struct spark-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// Game ID for spark groups,
|
|
||||||
// i.e. all rarities (star counts) of a single spark.
|
|
||||||
pub struct spark-group-id
|
|
||||||
game-id: game-id
|
|
||||||
|
|
||||||
// order2 comparison between any game ID types.
|
|
||||||
pub inline fun order2(x: a, y: a, ?a/game-id: (a) -> game-id): order2<a>
|
|
||||||
match x.game-id.cmp(y.game-id)
|
|
||||||
Lt -> Lt2(x, y)
|
|
||||||
Eq -> Eq2(x)
|
|
||||||
Gt -> Gt2(x, y)
|
|
||||||
|
|
||||||
// Comparison between any game ID types.
|
|
||||||
pub inline fun cmp(x: a, y: a, ?a/game-id: (a) -> game-id): order
|
|
||||||
x.game-id.cmp(y.game-id)
|
|
||||||
|
|
||||||
// Equality between any game ID types.
|
|
||||||
pub inline fun (==)(x: a, y: a, ?a/game-id: (a) -> game-id): bool
|
|
||||||
x.game-id == y.game-id
|
|
||||||
|
|
||||||
// Check whether a game ID is valid, i.e. nonzero.
|
|
||||||
pub inline fun is-valid(x: a, ?a/game-id: (a) -> game-id): bool
|
|
||||||
x.game-id != 0
|
|
||||||
|
|
||||||
// Construct an invalid game ID.
|
|
||||||
pub inline fun default/game-id(): game-id
|
|
||||||
0
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
module horse/global
|
|
||||||
|
|
||||||
import horse/game-id
|
|
||||||
|
|
||||||
// Shared saddle affinity bonus.
|
|
||||||
// `s` should be the complete list of all saddles shared between the veterans.
|
|
||||||
pub fun saddle-bonus(s: list<saddle-id>): int
|
|
||||||
s.length
|
|
||||||
-124
@@ -1,124 +0,0 @@
|
|||||||
module horse/legacy
|
|
||||||
|
|
||||||
import std/num/decimal
|
|
||||||
import std/data/linearmap
|
|
||||||
import std/data/linearset
|
|
||||||
import horse/game-id
|
|
||||||
import horse/spark
|
|
||||||
import horse/prob/dist
|
|
||||||
|
|
||||||
// A legacy, or parent and grandparents.
|
|
||||||
pub struct legacy
|
|
||||||
uma: veteran
|
|
||||||
sub1: veteran
|
|
||||||
sub2: veteran
|
|
||||||
|
|
||||||
// A veteran, or the result of a completed career.
|
|
||||||
pub struct veteran
|
|
||||||
uma: uma-id
|
|
||||||
sparks: list<spark-id>
|
|
||||||
saddles: list<saddle-id>
|
|
||||||
|
|
||||||
// Get all saddles shared between two lists thereof.
|
|
||||||
pub fun shared-saddles(a: list<saddle-id>, b: list<saddle-id>): list<saddle-id>
|
|
||||||
val sa: linearSet<saddle-id> = a.foldl(linear-set(Nil)) fn(s, id) if id.is-valid then s.add(id) else s
|
|
||||||
val c: linearSet<saddle-id> = b.foldl(linear-set(Nil)) fn(s, id) if sa.member(id) then s.add(id) else s
|
|
||||||
c.list
|
|
||||||
|
|
||||||
// Get the individual affinity for a legacy.
|
|
||||||
// Any invalid ID is treated as giving 0.
|
|
||||||
pub fun parent-affinity(
|
|
||||||
trainee: uma-id,
|
|
||||||
legacy: legacy,
|
|
||||||
other-parent: uma-id,
|
|
||||||
?character-id: (uma-id) -> character-id,
|
|
||||||
?saddle-bonus: (list<saddle-id>) -> int,
|
|
||||||
?pair-affinity: (a: character-id, b: character-id) -> int,
|
|
||||||
?trio-affinity: (a: character-id, b: character-id, c: character-id) -> int
|
|
||||||
): int
|
|
||||||
val t = trainee.character-id
|
|
||||||
val p1 = legacy.uma.uma.character-id
|
|
||||||
val s1 = legacy.sub1.uma.character-id
|
|
||||||
val s2 = legacy.sub2.uma.character-id
|
|
||||||
val p2 = other-parent.character-id
|
|
||||||
pair-affinity(t, p1) + pair-affinity(p1, p2)
|
|
||||||
+ trio-affinity(t, p1, s1) + trio-affinity(t, p1, s2)
|
|
||||||
+ saddle-bonus(shared-saddles(legacy.uma.saddles, legacy.sub1.saddles)) + saddle-bonus(shared-saddles(legacy.uma.saddles, legacy.sub2.saddles))
|
|
||||||
|
|
||||||
// Get the individual affinities for a legacy's sub-legacies.
|
|
||||||
// The first value is the legacy for the `legacy.sub1` and the second is for
|
|
||||||
// `legacy.sub2`.
|
|
||||||
// Any invalid ID is treated as giving 0.
|
|
||||||
pub fun sub-affinity(
|
|
||||||
trainee: uma-id,
|
|
||||||
legacy: legacy,
|
|
||||||
?character-id: (uma-id) -> character-id,
|
|
||||||
?saddle-bonus: (list<saddle-id>) -> int,
|
|
||||||
?trio-affinity: (a: character-id, b: character-id, c: character-id) -> int
|
|
||||||
): (int, int)
|
|
||||||
val t = trainee.character-id
|
|
||||||
val p = legacy.uma.uma.character-id
|
|
||||||
val s1 = legacy.sub1.uma.character-id
|
|
||||||
val s2 = legacy.sub2.uma.character-id
|
|
||||||
val r1 = trio-affinity(t, p, s1) + saddle-bonus(shared-saddles(legacy.uma.saddles, legacy.sub1.saddles))
|
|
||||||
val r2 = trio-affinity(t, p, s2) + saddle-bonus(shared-saddles(legacy.uma.saddles, legacy.sub2.saddles))
|
|
||||||
(r1, r2)
|
|
||||||
|
|
||||||
// Associate each spark with its actual chance to activate given an individual
|
|
||||||
// affinity value and the possible effects when it does.
|
|
||||||
pub fun uma/inspiration(l: list<spark-id>, affinity: int, ?spark-type: (spark-id) -> spark-type, ?rarity: (spark-id) -> rarity, ?effects: (spark-id) -> list<list<spark-effect>>): list<(spark-id, decimal, list<list<spark-effect>>)>
|
|
||||||
val a = decimal(1 + affinity, -2)
|
|
||||||
l.map() fn(id) (id, min(id.base-proc * a, 1.decimal), id.effects)
|
|
||||||
|
|
||||||
// Get the complete list of effects that may occur in an inspiration event
|
|
||||||
// and the respective probability of activation.
|
|
||||||
// Duplicates, i.e. multiple veterans with the same spark, are preserved.
|
|
||||||
pub fun inspiration(
|
|
||||||
trainee: uma-id,
|
|
||||||
parent1: legacy,
|
|
||||||
parent2: legacy,
|
|
||||||
?character-id: (uma-id) -> character-id,
|
|
||||||
?saddle-bonus: (list<saddle-id>) -> int,
|
|
||||||
?pair-affinity: (a: character-id, b: character-id) -> int,
|
|
||||||
?trio-affinity: (a: character-id, b: character-id, c: character-id) -> int,
|
|
||||||
?spark-type: (spark-id) -> spark-type,
|
|
||||||
?rarity: (spark-id) -> rarity,
|
|
||||||
?effects: (spark-id) -> list<list<spark-effect>>
|
|
||||||
): list<(spark-id, decimal, list<list<spark-effect>>)>
|
|
||||||
val p1a = parent-affinity(trainee, parent1, parent2.uma.uma)
|
|
||||||
val p2a = parent-affinity(trainee, parent2, parent1.uma.uma)
|
|
||||||
val (s11a, s12a) = sub-affinity(trainee, parent1)
|
|
||||||
val (s21a, s22a) = sub-affinity(trainee, parent2)
|
|
||||||
[
|
|
||||||
inspiration(parent1.uma.sparks, p1a),
|
|
||||||
inspiration(parent1.sub1.sparks, s11a),
|
|
||||||
inspiration(parent1.sub2.sparks, s12a),
|
|
||||||
inspiration(parent2.uma.sparks, p2a),
|
|
||||||
inspiration(parent2.sub1.sparks, s21a),
|
|
||||||
inspiration(parent2.sub2.sparks, s22a),
|
|
||||||
].concat
|
|
||||||
|
|
||||||
// Reduce a spark effect list to the skill it is able to give.
|
|
||||||
pub fun skills(l: list<list<spark-effect>>): maybe<skill-id>
|
|
||||||
val r: linearSet<skill-id> = l.head(Nil).foldl(linear-set(Nil)) fn(s, eff)
|
|
||||||
match eff
|
|
||||||
Skill-Hint(id, _) -> s + id
|
|
||||||
_ -> s
|
|
||||||
r.list.head
|
|
||||||
|
|
||||||
// Reduce a spark effect list to the aptitude it is able to give.
|
|
||||||
pub fun aptitudes(l: list<list<spark-effect>>): maybe<aptitude>
|
|
||||||
val r: linearSet<aptitude> = l.head(Nil).foldl(linear-set(Nil)) fn(s, eff)
|
|
||||||
match eff
|
|
||||||
Aptitude-Up(apt) -> s + apt
|
|
||||||
_ -> s
|
|
||||||
r.list.head
|
|
||||||
|
|
||||||
// Get the overall chance of each count of sparks, including zero, providing a
|
|
||||||
// given type of effect activating in a single inspiration event.
|
|
||||||
pub fun inspiration-gives(l: list<(spark-id, decimal, list<list<spark-effect>>)>, f: (list<list<spark-effect>>) -> maybe<a>, ?a/(==): (a, a) -> bool): linearMap<a, list<decimal>>
|
|
||||||
val m: linearMap<_, list<decimal>> = l.foldl(LinearMap(Nil)) fn(m, (_, p, eff))
|
|
||||||
match f(eff)
|
|
||||||
Nothing -> m
|
|
||||||
Just(a) -> m.map/update(a, [p]) fn(cur, pp) pp.append(cur)
|
|
||||||
m.map() fn(_, v) poisson-binomial(v)
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
module horse/movement
|
|
||||||
|
|
||||||
// Surface types.
|
|
||||||
pub type surface
|
|
||||||
Turf
|
|
||||||
Dirt
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `surface` type.
|
|
||||||
pub fun surface/show(this : surface) : e string
|
|
||||||
match this
|
|
||||||
Turf -> "Turf"
|
|
||||||
Dirt -> "Dirt"
|
|
||||||
|
|
||||||
// Race distance types.
|
|
||||||
pub type distance
|
|
||||||
Sprint
|
|
||||||
Mile
|
|
||||||
Medium
|
|
||||||
Long
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `distance` type.
|
|
||||||
pub fun distance/show(this : distance) : e string
|
|
||||||
match this
|
|
||||||
Sprint -> "Sprint"
|
|
||||||
Mile -> "Mile"
|
|
||||||
Medium -> "Medium"
|
|
||||||
Long -> "Long"
|
|
||||||
|
|
||||||
// Running styles.
|
|
||||||
pub type style
|
|
||||||
Front-Runner
|
|
||||||
Pace-Chaser
|
|
||||||
Late-Surger
|
|
||||||
End-Closer
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `style` type.
|
|
||||||
pub fun style/(==)(this : style, other : style) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(Front-Runner, Front-Runner) -> True
|
|
||||||
(Pace-Chaser, Pace-Chaser) -> True
|
|
||||||
(Late-Surger, Late-Surger) -> True
|
|
||||||
(End-Closer, End-Closer) -> True
|
|
||||||
(_, _) -> False
|
|
||||||
|
|
||||||
// Shows a string representation of the `style` type.
|
|
||||||
pub fun style/show(this : style) : e string
|
|
||||||
match this
|
|
||||||
Front-Runner -> "Front Runner"
|
|
||||||
Pace-Chaser -> "Pace Chaser"
|
|
||||||
Late-Surger -> "Late Surger"
|
|
||||||
End-Closer -> "End Closer"
|
|
||||||
|
|
||||||
// Aptitude levels.
|
|
||||||
pub type aptitude-level
|
|
||||||
G
|
|
||||||
F
|
|
||||||
E
|
|
||||||
D
|
|
||||||
C
|
|
||||||
B
|
|
||||||
A
|
|
||||||
S
|
|
||||||
|
|
||||||
// Get the integer value for an aptitude level, starting at G -> 1.
|
|
||||||
pub fun aptitude-level/int(l: aptitude-level): int
|
|
||||||
match l
|
|
||||||
G -> 1
|
|
||||||
F -> 2
|
|
||||||
E -> 3
|
|
||||||
D -> 4
|
|
||||||
C -> 5
|
|
||||||
B -> 6
|
|
||||||
A -> 7
|
|
||||||
S -> 8
|
|
||||||
|
|
||||||
// Get the aptitude level corresponding to an integer, starting at 1 -> G.
|
|
||||||
pub fun int/aptitude-level(l: int): maybe<aptitude-level>
|
|
||||||
match l
|
|
||||||
1 -> Just(G)
|
|
||||||
2 -> Just(F)
|
|
||||||
3 -> Just(E)
|
|
||||||
4 -> Just(D)
|
|
||||||
5 -> Just(C)
|
|
||||||
6 -> Just(B)
|
|
||||||
7 -> Just(A)
|
|
||||||
8 -> Just(S)
|
|
||||||
_ -> Nothing
|
|
||||||
|
|
||||||
// Comparison of the `aptitude-level` type.
|
|
||||||
pub fun aptitude-level/cmp(this : aptitude-level, other : aptitude-level) : e order
|
|
||||||
cmp(this.int, other.int)
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Fip comparison of the `aptitude-level` type.
|
|
||||||
pub fun aptitude-level/order2(this : aptitude-level, other : aptitude-level) : order2<aptitude-level>
|
|
||||||
match (this, other)
|
|
||||||
(G, G) -> Eq2(G)
|
|
||||||
(G, other') -> Lt2(G, other')
|
|
||||||
(this', G) -> Gt2(G, this')
|
|
||||||
(F, F) -> Eq2(F)
|
|
||||||
(F, other') -> Lt2(F, other')
|
|
||||||
(this', F) -> Gt2(F, this')
|
|
||||||
(E, E) -> Eq2(E)
|
|
||||||
(E, other') -> Lt2(E, other')
|
|
||||||
(this', E) -> Gt2(E, this')
|
|
||||||
(D, D) -> Eq2(D)
|
|
||||||
(D, other') -> Lt2(D, other')
|
|
||||||
(this', D) -> Gt2(D, this')
|
|
||||||
(C, C) -> Eq2(C)
|
|
||||||
(C, other') -> Lt2(C, other')
|
|
||||||
(this', C) -> Gt2(C, this')
|
|
||||||
(B, B) -> Eq2(B)
|
|
||||||
(B, other') -> Lt2(B, other')
|
|
||||||
(this', B) -> Gt2(B, this')
|
|
||||||
(A, A) -> Eq2(A)
|
|
||||||
(A, other') -> Lt2(A, other')
|
|
||||||
(this', A) -> Gt2(A, this')
|
|
||||||
(S, S) -> Eq2(S)
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `aptitude-level` type.
|
|
||||||
pub fun aptitude-level/show(this : aptitude-level) : string
|
|
||||||
match this
|
|
||||||
G -> "G"
|
|
||||||
F -> "F"
|
|
||||||
E -> "E"
|
|
||||||
D -> "D"
|
|
||||||
C -> "C"
|
|
||||||
B -> "B"
|
|
||||||
A -> "A"
|
|
||||||
S -> "S"
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
module horse/prob/dist
|
|
||||||
|
|
||||||
import std/num/decimal
|
|
||||||
|
|
||||||
tail fun pb-step(pn: list<decimal>, pi: decimal, pmfkm1: decimal, pmf: list<decimal>, next: ctx<list<decimal>>): list<decimal>
|
|
||||||
match pn
|
|
||||||
Nil -> next ++. Nil // final step overall
|
|
||||||
Cons(_, pp) -> match pmf
|
|
||||||
Cons(pmfk, pmf') ->
|
|
||||||
val next' = next ++ ctx Cons(pi * pmfkm1 + (1.decimal - pi) * pmfk, hole)
|
|
||||||
pb-step(pp, pi, pmfk, pmf', next')
|
|
||||||
Nil -> next ++. Cons(pi * pmfkm1, Nil) // last step of this iteration
|
|
||||||
|
|
||||||
// Given `n` different Bernoulli processes with respective probabilities in `pn`,
|
|
||||||
// find the distribution of `k` successes for `k` ranging from 0 to `n` inclusive.
|
|
||||||
// The index in the result list corresponds to `k`.
|
|
||||||
pub fun pmf/poisson-binomial(pn: list<decimal>): list<decimal>
|
|
||||||
pn.foldl([1.decimal]) fn(pmf, pi)
|
|
||||||
match pmf
|
|
||||||
Cons(pmf0, pmf') -> pb-step(pn, pi, pmf0, pmf', ctx Cons((1.decimal - pi) * pmf0, hole))
|
|
||||||
Nil -> impossible("fold started with non-empty pmf but got empty pmf")
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
module horse/prob/kfl
|
|
||||||
|
|
||||||
// kfl is a semiring of probabilities formed by vibes.
|
|
||||||
pub type kfl
|
|
||||||
// Effectively if not literally impossible events.
|
|
||||||
Impossible
|
|
||||||
// Not worth aiming for, but can technically still happen.
|
|
||||||
Probably-Not
|
|
||||||
// You expect it not to happen most of the time, but it might still be worth
|
|
||||||
// trying for it if you're being forced to play to your outs.
|
|
||||||
Doubtful
|
|
||||||
// More likely that it won't happen, but a success isn't surprising.
|
|
||||||
Unlikely
|
|
||||||
// Either it does or it doesn't.
|
|
||||||
Mayhapsibly
|
|
||||||
// Decent chance it doesn't happen, but you still expect it to.
|
|
||||||
Probably
|
|
||||||
// You expect it to happen most of the time, but accept that there will be failures.
|
|
||||||
Most-Likely
|
|
||||||
// Very close to guaranteed, but technically with a small chance to fail.
|
|
||||||
Cry-If-Not
|
|
||||||
// Absolutely guaranteed events.
|
|
||||||
Guaranteed
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Comparison of the `kfl` type.
|
|
||||||
pub fun cmp(this : kfl, other : kfl) : e order
|
|
||||||
match (this, other)
|
|
||||||
(Impossible, Impossible) -> Eq
|
|
||||||
(Impossible, _) -> Lt
|
|
||||||
(_, Impossible) -> Gt
|
|
||||||
(Probably-Not, Probably-Not) -> Eq
|
|
||||||
(Probably-Not, _) -> Lt
|
|
||||||
(_, Probably-Not) -> Gt
|
|
||||||
(Doubtful, Doubtful) -> Eq
|
|
||||||
(Doubtful, _) -> Lt
|
|
||||||
(_, Doubtful) -> Gt
|
|
||||||
(Unlikely, Unlikely) -> Eq
|
|
||||||
(Unlikely, _) -> Lt
|
|
||||||
(_, Unlikely) -> Gt
|
|
||||||
(Mayhapsibly, Mayhapsibly) -> Eq
|
|
||||||
(Mayhapsibly, _) -> Lt
|
|
||||||
(_, Mayhapsibly) -> Gt
|
|
||||||
(Probably, Probably) -> Eq
|
|
||||||
(Probably, _) -> Lt
|
|
||||||
(_, Probably) -> Gt
|
|
||||||
(Most-Likely, Most-Likely) -> Eq
|
|
||||||
(Most-Likely, _) -> Lt
|
|
||||||
(_, Most-Likely) -> Gt
|
|
||||||
(Cry-If-Not, Cry-If-Not) -> Eq
|
|
||||||
(Cry-If-Not, _) -> Lt
|
|
||||||
(_, Cry-If-Not) -> Gt
|
|
||||||
(Guaranteed, Guaranteed) -> Eq
|
|
||||||
|
|
||||||
// Shows a string representation of the `kfl` type.
|
|
||||||
pub fun show(this : kfl) : e string
|
|
||||||
match this
|
|
||||||
Impossible -> "impossible"
|
|
||||||
Probably-Not -> "probably not"
|
|
||||||
Doubtful -> "doubtful"
|
|
||||||
Unlikely -> "unlikely"
|
|
||||||
Mayhapsibly -> "mayhapsibly"
|
|
||||||
Probably -> "probably"
|
|
||||||
Most-Likely -> "most likely"
|
|
||||||
Cry-If-Not -> "cry if not"
|
|
||||||
Guaranteed -> "guaranteed"
|
|
||||||
|
|
||||||
// KFL multiplication, or the probability of cooccurrence of two independent events.
|
|
||||||
pub fun (*)(a: kfl, b: kfl): e kfl
|
|
||||||
val (l, h) = match a.cmp(b) // this operation is commutative
|
|
||||||
Gt -> (b, a)
|
|
||||||
_ -> (a, b)
|
|
||||||
match (l, h)
|
|
||||||
(r, Guaranteed) -> r // factor out Guaranteed cases
|
|
||||||
(Impossible, _) -> Impossible
|
|
||||||
(Probably-Not, _) -> Impossible
|
|
||||||
(r, Cry-If-Not) -> r // factor out further Cry-If-Not cases
|
|
||||||
(Doubtful, Most-Likely) -> Probably-Not
|
|
||||||
(Doubtful, _) -> Impossible
|
|
||||||
(Unlikely, Most-Likely) -> Doubtful
|
|
||||||
(Unlikely, Probably) -> Doubtful
|
|
||||||
(Unlikely, Mayhapsibly) -> Probably-Not
|
|
||||||
(Unlikely, _) -> Probably-Not // (Unlikely, Unlikely) because commutative
|
|
||||||
(Mayhapsibly, Most-Likely) -> Unlikely
|
|
||||||
(Mayhapsibly, Probably) -> Unlikely
|
|
||||||
(Mayhapsibly, _) -> Unlikely
|
|
||||||
(Probably, Most-Likely) -> Mayhapsibly
|
|
||||||
(Probably, _) -> Unlikely
|
|
||||||
(Most-Likely, _) -> Probably
|
|
||||||
// These two are only needed because the type system doesn't understand commutativity.
|
|
||||||
(Cry-If-Not, _) -> Cry-If-Not
|
|
||||||
(Guaranteed, _) -> Guaranteed
|
|
||||||
|
|
||||||
// KFL addition, or the probability of occurrence of at least one of two independent events.
|
|
||||||
pub fun (+)(a: kfl, b: kfl): e kfl
|
|
||||||
val (l, h) = match a.cmp(b) // this operation is commutative
|
|
||||||
Gt -> (b, a)
|
|
||||||
_ -> (a, b)
|
|
||||||
match (l, h)
|
|
||||||
// Cases with _ on the right are (a, a) due to commutativity.
|
|
||||||
// Cases with _ on the left simplify later cases that all absorb to the right.
|
|
||||||
(Guaranteed, _) -> Guaranteed
|
|
||||||
(_, Guaranteed) -> Guaranteed
|
|
||||||
(Cry-If-Not, _) -> Guaranteed
|
|
||||||
(Most-Likely, Cry-If-Not) -> Cry-If-Not
|
|
||||||
(Most-Likely, _) -> Cry-If-Not
|
|
||||||
(_, Cry-If-Not) -> Cry-If-Not
|
|
||||||
(Probably, Most-Likely) -> Cry-If-Not
|
|
||||||
(Probably, _) -> Most-Likely
|
|
||||||
(_, Most-Likely) -> Most-Likely
|
|
||||||
(Mayhapsibly, Probably) -> Most-Likely
|
|
||||||
(Mayhapsibly, _) -> Probably
|
|
||||||
(Unlikely, Probably) -> Most-Likely
|
|
||||||
(Unlikely, Mayhapsibly) -> Probably
|
|
||||||
(Unlikely, _) -> Mayhapsibly
|
|
||||||
(_, Probably) -> Probably
|
|
||||||
(Doubtful, Mayhapsibly) -> Probably
|
|
||||||
(Doubtful, Unlikely) -> Mayhapsibly
|
|
||||||
(Doubtful, _) -> Unlikely
|
|
||||||
(_, Mayhapsibly) -> Mayhapsibly
|
|
||||||
(_, Unlikely) -> Unlikely
|
|
||||||
(Probably-Not, Doubtful) -> Unlikely
|
|
||||||
(Probably-Not, _) -> Probably-Not
|
|
||||||
(_, Doubtful) -> Doubtful
|
|
||||||
(_, Probably-Not) -> Probably-Not
|
|
||||||
(_, Impossible) -> Impossible
|
|
||||||
|
|
||||||
// KFL union, or the probability of occurrence of exactly one of two independent events.
|
|
||||||
pub fun either(a: kfl, b: kfl): e kfl
|
|
||||||
val (l, h) = match a.cmp(b) // this operation is commutative
|
|
||||||
Gt -> (b, a)
|
|
||||||
_ -> (a, b)
|
|
||||||
match (l, h)
|
|
||||||
(Impossible, r) -> r
|
|
||||||
(Probably-Not, Guaranteed) -> Cry-If-Not
|
|
||||||
(Probably-Not, r) -> r
|
|
||||||
(Doubtful, Guaranteed) -> Most-Likely
|
|
||||||
(Doubtful, Cry-If-Not) -> Most-Likely
|
|
||||||
(Doubtful, Most-Likely) -> Probably
|
|
||||||
(Doubtful, Probably) -> Mayhapsibly
|
|
||||||
(Doubtful, Mayhapsibly) -> Mayhapsibly
|
|
||||||
(Doubtful, Unlikely) -> Mayhapsibly
|
|
||||||
(Doubtful, _) -> Unlikely
|
|
||||||
(Unlikely, Guaranteed) -> Probably
|
|
||||||
(Unlikely, Cry-If-Not) -> Mayhapsibly
|
|
||||||
(Unlikely, Most-Likely) -> Mayhapsibly
|
|
||||||
(Unlikely, _) -> Probably
|
|
||||||
(Mayhapsibly, Guaranteed) -> Mayhapsibly
|
|
||||||
(Mayhapsibly, Cry-If-Not) -> Mayhapsibly
|
|
||||||
(Mayhapsibly, Most-Likely) -> Mayhapsibly
|
|
||||||
(Mayhapsibly, _) -> Probably
|
|
||||||
(Probably, Guaranteed) -> Unlikely
|
|
||||||
(Probably, Cry-If-Not) -> Unlikely
|
|
||||||
(Probably, Most-Likely) -> Unlikely
|
|
||||||
(Probably, _) -> Mayhapsibly
|
|
||||||
(Most-Likely, _) -> Doubtful
|
|
||||||
(Cry-If-Not, _) -> Probably-Not
|
|
||||||
(Guaranteed, _) -> Impossible
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
module horse/prob/pmf
|
|
||||||
|
|
||||||
import std/core/list
|
|
||||||
|
|
||||||
// Discrete-support probability distribution implemented as a list with the invariant
|
|
||||||
// that support is always given in increasing order.
|
|
||||||
pub type pmf<s, v>
|
|
||||||
Event(s: s, v: v, next: pmf<s, v>)
|
|
||||||
End
|
|
||||||
|
|
||||||
// Add an independent event to the distribution.
|
|
||||||
pub fun add(p: pmf<s, v>, s: s, v: v, ?s/cmp: (a: s, b: s) -> order, ?v/(+): (new: v, old: v) -> e v): e pmf<s, v>
|
|
||||||
match p
|
|
||||||
End -> Event(s, v, End)
|
|
||||||
Event(s', v', next) -> match s.cmp(s')
|
|
||||||
Lt -> Event(s, v, Event(s', v', next))
|
|
||||||
Eq -> Event(s, v + v', next)
|
|
||||||
Gt -> Event(s', v', add(next, s, v))
|
|
||||||
|
|
||||||
// Replace an event in the distribution.
|
|
||||||
pub inline fun set(p: pmf<s, v>, s: s, v: v, ?s/cmp: (a: s, b: s) -> order): e pmf<s, v>
|
|
||||||
p.add(s, v, cmp, fn(new, old) new)
|
|
||||||
|
|
||||||
// Construct a pmf from a list of (support, value) entries.
|
|
||||||
pub fun list/pmf(l: list<(s, v)>, ?s/cmp: (a: s, b: s) -> order, ?v/(+): (new: v, old: v) -> e v): e pmf<s, v>
|
|
||||||
l.foldl(End) fn(p, (s, v)) p.add(s, v)
|
|
||||||
|
|
||||||
// Fold over the entries of the distribution.
|
|
||||||
pub tail fun foldl(p: pmf<s, v>, init: a, f: (a, s, v) -> e a): e a
|
|
||||||
match p
|
|
||||||
End -> init
|
|
||||||
Event(s, v, next) -> foldl(next, f(init, s, v), f)
|
|
||||||
|
|
||||||
// Convert the distribution to a list of entries.
|
|
||||||
pub fun pmf/list(p: pmf<s, v>): list<(s, v)>
|
|
||||||
p.foldl(Nil) fn(l, s, v) Cons((s, v), l)
|
|
||||||
|
|
||||||
// Distribution of cooccurrence of two events described by their distributions.
|
|
||||||
pub fun (*)(a: pmf<s, v>, b: pmf<s, v>, ?s/cmp: (a: s, b: s) -> order, ?v/(*): (a: v, b: v) -> e v): e pmf<s, v>
|
|
||||||
match a
|
|
||||||
End -> End
|
|
||||||
Event(sa, va, nexta) -> match b
|
|
||||||
End -> End
|
|
||||||
Event(sb, vb, nextb) -> match sa.cmp(sb)
|
|
||||||
Lt -> nexta * b
|
|
||||||
Eq -> Event(sa, va * vb, nexta * nextb)
|
|
||||||
Gt -> a * nextb
|
|
||||||
|
|
||||||
// Distribution of occurrence of at least one of two events described by their distributions.
|
|
||||||
pub fun (+)(a: pmf<s, v>, b: pmf<s, v>, ?s/cmp: (a: s, b: s) -> order, ?v/(+): (a: v, b: v) -> e v): e pmf<s, v>
|
|
||||||
match a
|
|
||||||
End -> b
|
|
||||||
Event(sa, va, nexta) -> match b
|
|
||||||
End -> a
|
|
||||||
Event(sb, vb, nextb) -> match sa.cmp(sb)
|
|
||||||
Lt -> Event(sa, va, nexta + b)
|
|
||||||
Eq -> Event(sa, va + vb, nexta + nextb)
|
|
||||||
Gt -> Event(sb, vb, a + nextb)
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package horse
|
|
||||||
|
|
||||||
type RaceID int32
|
|
||||||
|
|
||||||
// Race is the internal data about a race.
|
|
||||||
type Race struct {
|
|
||||||
ID RaceID `json:"race_id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Thumbnail int `json:"thumbnail"`
|
|
||||||
// Some careers contain unusual versions of races, e.g. Tenno Sho (Spring)
|
|
||||||
// in Hanshin instead of Kyoto for Narita Taishin and Biwa Hayahide.
|
|
||||||
// For such races, this field holds the normal race ID.
|
|
||||||
Primary RaceID `json:"primary"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SaddleID int32
|
|
||||||
|
|
||||||
// Saddle is the internal data about a race win saddle.
|
|
||||||
type Saddle struct {
|
|
||||||
ID SaddleID `json:"saddle_id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Races []RaceID `json:"races"`
|
|
||||||
Type SaddleType `json:"type"`
|
|
||||||
// Saddles that involve alternate races are themselves alternate.
|
|
||||||
// For such saddles, this field holds the normal saddle ID.
|
|
||||||
Primary SaddleID `json:"primary"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SaddleType int8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Saddle for multiple race wins, e.g. Classic Triple Crown, Dual Grand Prix, &c.
|
|
||||||
SaddleTypeHonor SaddleType = iota
|
|
||||||
SaddleTypeG3
|
|
||||||
SaddleTypeG2
|
|
||||||
SaddleTypeG1
|
|
||||||
)
|
|
||||||
|
|
||||||
type ScenarioID int8
|
|
||||||
|
|
||||||
// Scenario is metadata about a career scenario.
|
|
||||||
type Scenario struct {
|
|
||||||
ID ScenarioID `json:"scenario_id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
}
|
|
||||||
-301
@@ -1,301 +0,0 @@
|
|||||||
module horse/race
|
|
||||||
|
|
||||||
import std/data/linearset
|
|
||||||
import horse/game-id
|
|
||||||
|
|
||||||
pub struct race-detail
|
|
||||||
race-id: race-id
|
|
||||||
name: string
|
|
||||||
grade: grade
|
|
||||||
thumbnail-id: race-thumbnail-id
|
|
||||||
// Some careers contain unusual versions of races, e.g. Tenno Sho (Spring)
|
|
||||||
// in Hanshin instead of Kyoto for Narita Taishin and Biwa Hayahide.
|
|
||||||
// For such races, this field holds the normal race ID.
|
|
||||||
primary: race-id
|
|
||||||
|
|
||||||
pub fun detail(
|
|
||||||
r: race-id,
|
|
||||||
?race/show: (race-id) -> string,
|
|
||||||
?race/grade: (race-id) -> grade,
|
|
||||||
?race/thumbnail: (race-id) -> race-thumbnail-id,
|
|
||||||
?race/primary: (race-id) -> race-id
|
|
||||||
): race-detail
|
|
||||||
Race-detail(r, r.show, r.grade, r.thumbnail, r.primary)
|
|
||||||
|
|
||||||
pub fun race-detail/show(r: race-detail): string
|
|
||||||
val Race-detail(Race-id(id), name) = r
|
|
||||||
name ++ " (ID " ++ id.show ++ ")"
|
|
||||||
|
|
||||||
// Race grades.
|
|
||||||
pub type grade
|
|
||||||
Pre-OP
|
|
||||||
OP
|
|
||||||
G3
|
|
||||||
G2
|
|
||||||
G1
|
|
||||||
EX
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Comparison of the `grade` type.
|
|
||||||
pub fun grade/cmp(this : grade, other : grade) : e order
|
|
||||||
match (this, other)
|
|
||||||
(Pre-OP, Pre-OP) -> Eq
|
|
||||||
(Pre-OP, _) -> Lt
|
|
||||||
(_, Pre-OP) -> Gt
|
|
||||||
(OP, OP) -> Eq
|
|
||||||
(OP, _) -> Lt
|
|
||||||
(_, OP) -> Gt
|
|
||||||
(G3, G3) -> Eq
|
|
||||||
(G3, _) -> Lt
|
|
||||||
(_, G3) -> Gt
|
|
||||||
(G2, G2) -> Eq
|
|
||||||
(G2, _) -> Lt
|
|
||||||
(_, G2) -> Gt
|
|
||||||
(G1, G1) -> Eq
|
|
||||||
(G1, _) -> Lt
|
|
||||||
(_, G1) -> Gt
|
|
||||||
(EX, EX) -> Eq
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `grade` type.
|
|
||||||
pub fun grade/show(this : grade) : e string
|
|
||||||
match this
|
|
||||||
Pre-OP -> "Pre-OP"
|
|
||||||
OP -> "OP"
|
|
||||||
G3 -> "G3"
|
|
||||||
G2 -> "G2"
|
|
||||||
G1 -> "G1"
|
|
||||||
EX -> "EX"
|
|
||||||
|
|
||||||
pub struct saddle-detail
|
|
||||||
saddle-id: saddle-id
|
|
||||||
name: string
|
|
||||||
races: list<race-id>
|
|
||||||
saddle-type: saddle-type
|
|
||||||
// For careers with unusual races, granted saddles also differ.
|
|
||||||
// This field holds the normal saddle's ID for such cases.
|
|
||||||
primary: saddle-id
|
|
||||||
|
|
||||||
pub fun saddle/detail(
|
|
||||||
id: saddle-id,
|
|
||||||
?saddle/show: (saddle-id) -> string,
|
|
||||||
?saddle/races: (saddle-id) -> list<race-id>,
|
|
||||||
?saddle/saddle-type: (saddle-id) -> saddle-type,
|
|
||||||
?saddle/primary: (saddle-id) -> saddle-id
|
|
||||||
): saddle-detail
|
|
||||||
Saddle-detail(id, id.show, id.races, id.saddle-type, id.primary)
|
|
||||||
|
|
||||||
pub fun saddle-detail/show(s: saddle-detail): string
|
|
||||||
val Saddle-detail(Saddle-id(id), name, _, _, Saddle-id(primary)) = s
|
|
||||||
if id == primary then name else name ++ " (Alternate " ++ id.show ++ ")"
|
|
||||||
|
|
||||||
// Types of saddles.
|
|
||||||
pub type saddle-type
|
|
||||||
Honor // multiple race wins: classic triple crown, dual grand prix, &c.
|
|
||||||
G3-Win
|
|
||||||
G2-Win
|
|
||||||
G1-Win
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `saddle-type` type.
|
|
||||||
pub fun saddle-type/show(this : saddle-type) : e string
|
|
||||||
match this
|
|
||||||
Honor -> "Honor"
|
|
||||||
G3-Win -> "G3"
|
|
||||||
G2-Win -> "G2"
|
|
||||||
G1-Win -> "G1"
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `saddle-type` type.
|
|
||||||
pub fun saddle-type/(==)(this : saddle-type, other : saddle-type) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(Honor, Honor) -> True
|
|
||||||
(G3-Win, G3-Win) -> True
|
|
||||||
(G2-Win, G2-Win) -> True
|
|
||||||
(G1-Win, G1-Win) -> True
|
|
||||||
(_, _) -> False
|
|
||||||
|
|
||||||
// Turn that a race occurred.
|
|
||||||
pub struct turn
|
|
||||||
year: turn-year
|
|
||||||
month: turn-month
|
|
||||||
half: turn-half
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `turn` type.
|
|
||||||
pub fun turn/(==)(this : turn, other : turn) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(Turn(year, month, half), Turn(year', month', half')) -> year == year' && month == month' && half == half'
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Fip comparison of the `turn` type.
|
|
||||||
pub fun turn/order2(this : turn, other : turn) : e order2<turn>
|
|
||||||
match (this, other)
|
|
||||||
(Turn(year, month, half), Turn(year', month', half')) ->
|
|
||||||
match year.order2(year')
|
|
||||||
Eq2(year_eq) ->
|
|
||||||
match month.order2(month')
|
|
||||||
Eq2(month_eq) ->
|
|
||||||
match half.order2(half')
|
|
||||||
Eq2(half_eq) -> Eq2(Turn(year_eq, month_eq, half_eq))
|
|
||||||
Lt2(half_lt, half_gt) -> Lt2(Turn(year_eq, month_eq, half_lt), Turn(year_eq, month_eq, half_gt))
|
|
||||||
Gt2(half_lt, half_gt) -> Gt2(Turn(year_eq, month_eq, half_lt), Turn(year_eq, month_eq, half_gt))
|
|
||||||
Lt2(month_lt, month_gt) -> Lt2(Turn(year_eq, month_lt, half), Turn(year_eq, month_gt, half'))
|
|
||||||
Gt2(month_lt, month_gt) -> Gt2(Turn(year_eq, month_lt, half'), Turn(year_eq, month_gt, half))
|
|
||||||
Lt2(year_lt, year_gt) -> Lt2(Turn(year_lt, month, half), Turn(year_gt, month', half'))
|
|
||||||
Gt2(year_lt, year_gt) -> Gt2(Turn(year_lt, month', half'), Turn(year_gt, month, half))
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `turn` type.
|
|
||||||
pub fun turn/show(this : turn) : e string
|
|
||||||
this.year.show ++ " " ++ this.half.show ++ " " ++ this.month.show
|
|
||||||
|
|
||||||
pub type turn-year
|
|
||||||
Junior
|
|
||||||
Classic
|
|
||||||
Senior
|
|
||||||
Finale
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `turn-year` type.
|
|
||||||
pub fun turn-year/(==)(this : turn-year, other : turn-year) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(Junior, Junior) -> True
|
|
||||||
(Classic, Classic) -> True
|
|
||||||
(Senior, Senior) -> True
|
|
||||||
(Finale, Finale) -> True
|
|
||||||
(_, _) -> False
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Fip comparison of the `turn-year` type.
|
|
||||||
pub fun turn-year/order2(this : turn-year, other : turn-year) : e order2<turn-year>
|
|
||||||
match (this, other)
|
|
||||||
(Junior, Junior) -> Eq2(Junior)
|
|
||||||
(Junior, other') -> Lt2(Junior, other')
|
|
||||||
(this', Junior) -> Gt2(Junior, this')
|
|
||||||
(Classic, Classic) -> Eq2(Classic)
|
|
||||||
(Classic, other') -> Lt2(Classic, other')
|
|
||||||
(this', Classic) -> Gt2(Classic, this')
|
|
||||||
(Senior, Senior) -> Eq2(Senior)
|
|
||||||
(Senior, other') -> Lt2(Senior, other')
|
|
||||||
(this', Senior) -> Gt2(Senior, this')
|
|
||||||
(Finale, Finale) -> Eq2(Finale)
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `turn-year` type.
|
|
||||||
pub fun turn-year/show(this : turn-year) : e string
|
|
||||||
match this
|
|
||||||
Junior -> "Junior Year"
|
|
||||||
Classic -> "Classic Year"
|
|
||||||
Senior -> "Senior Year"
|
|
||||||
Finale -> "Finale 1" // the 1 is in the game
|
|
||||||
|
|
||||||
pub type turn-month
|
|
||||||
January
|
|
||||||
February
|
|
||||||
March
|
|
||||||
April
|
|
||||||
May
|
|
||||||
June
|
|
||||||
July
|
|
||||||
August
|
|
||||||
September
|
|
||||||
November
|
|
||||||
December
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `turn-month` type.
|
|
||||||
pub fun turn-month/(==)(this : turn-month, other : turn-month) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(January, January) -> True
|
|
||||||
(February, February) -> True
|
|
||||||
(March, March) -> True
|
|
||||||
(April, April) -> True
|
|
||||||
(May, May) -> True
|
|
||||||
(June, June) -> True
|
|
||||||
(July, July) -> True
|
|
||||||
(August, August) -> True
|
|
||||||
(September, September) -> True
|
|
||||||
(November, November) -> True
|
|
||||||
(December, December) -> True
|
|
||||||
(_, _) -> False
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Fip comparison of the `turn-month` type.
|
|
||||||
pub fun turn-month/order2(this : turn-month, other : turn-month) : e order2<turn-month>
|
|
||||||
match (this, other)
|
|
||||||
(January, January) -> Eq2(January)
|
|
||||||
(January, other') -> Lt2(January, other')
|
|
||||||
(this', January) -> Gt2(January, this')
|
|
||||||
(February, February) -> Eq2(February)
|
|
||||||
(February, other') -> Lt2(February, other')
|
|
||||||
(this', February) -> Gt2(February, this')
|
|
||||||
(March, March) -> Eq2(March)
|
|
||||||
(March, other') -> Lt2(March, other')
|
|
||||||
(this', March) -> Gt2(March, this')
|
|
||||||
(April, April) -> Eq2(April)
|
|
||||||
(April, other') -> Lt2(April, other')
|
|
||||||
(this', April) -> Gt2(April, this')
|
|
||||||
(May, May) -> Eq2(May)
|
|
||||||
(May, other') -> Lt2(May, other')
|
|
||||||
(this', May) -> Gt2(May, this')
|
|
||||||
(June, June) -> Eq2(June)
|
|
||||||
(June, other') -> Lt2(June, other')
|
|
||||||
(this', June) -> Gt2(June, this')
|
|
||||||
(July, July) -> Eq2(July)
|
|
||||||
(July, other') -> Lt2(July, other')
|
|
||||||
(this', July) -> Gt2(July, this')
|
|
||||||
(August, August) -> Eq2(August)
|
|
||||||
(August, other') -> Lt2(August, other')
|
|
||||||
(this', August) -> Gt2(August, this')
|
|
||||||
(September, September) -> Eq2(September)
|
|
||||||
(September, other') -> Lt2(September, other')
|
|
||||||
(this', September) -> Gt2(September, this')
|
|
||||||
(November, November) -> Eq2(November)
|
|
||||||
(November, other') -> Lt2(November, other')
|
|
||||||
(this', November) -> Gt2(November, this')
|
|
||||||
(December, December) -> Eq2(December)
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `turn-month` type.
|
|
||||||
pub fun turn-month/show(this : turn-month) : e string
|
|
||||||
match this
|
|
||||||
January -> "January"
|
|
||||||
February -> "February"
|
|
||||||
March -> "March"
|
|
||||||
April -> "April"
|
|
||||||
May -> "May"
|
|
||||||
June -> "June"
|
|
||||||
July -> "July"
|
|
||||||
August -> "August"
|
|
||||||
September -> "September"
|
|
||||||
November -> "November"
|
|
||||||
December -> "December"
|
|
||||||
|
|
||||||
pub type turn-half
|
|
||||||
Early
|
|
||||||
Late
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `turn-half` type.
|
|
||||||
pub fun turn-half/(==)(this : turn-half, other : turn-half) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(Early, Early) -> True
|
|
||||||
(Late, Late) -> True
|
|
||||||
(_, _) -> False
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Fip comparison of the `turn-half` type.
|
|
||||||
pub fun turn-half/order2(this : turn-half, other : turn-half) : e order2<turn-half>
|
|
||||||
match (this, other)
|
|
||||||
(Early, Early) -> Eq2(Early)
|
|
||||||
(Early, other') -> Lt2(Early, other')
|
|
||||||
(this', Early) -> Gt2(Early, this')
|
|
||||||
(Late, Late) -> Eq2(Late)
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `turn-half` type.
|
|
||||||
pub fun turn-half/show(this : turn-half) : e string
|
|
||||||
match this
|
|
||||||
Early -> "Early"
|
|
||||||
Late -> "Late"
|
|
||||||
-249
@@ -1,249 +0,0 @@
|
|||||||
module horse/skill
|
|
||||||
|
|
||||||
// This module contains skill-related definitions
|
|
||||||
// common to all versions of the game.
|
|
||||||
|
|
||||||
import std/num/decimal
|
|
||||||
import horse/game-id
|
|
||||||
import horse/movement
|
|
||||||
|
|
||||||
// Full details about a skill.
|
|
||||||
pub struct skill-detail
|
|
||||||
skill-id: skill-id
|
|
||||||
name: string
|
|
||||||
description: string
|
|
||||||
group-id: skill-group-id
|
|
||||||
rarity: rarity
|
|
||||||
group-rate: int
|
|
||||||
grade-value: int
|
|
||||||
wit-check: bool
|
|
||||||
activations: list<activation>
|
|
||||||
owner: maybe<uma-id>
|
|
||||||
sp-cost: int
|
|
||||||
icon-id: skill-icon-id
|
|
||||||
|
|
||||||
pub fun detail(
|
|
||||||
s: skill-id,
|
|
||||||
?skill/show: (skill-id) -> string,
|
|
||||||
?skill/description: (skill-id) -> string,
|
|
||||||
?skill/group: (skill-id) -> skill-group-id,
|
|
||||||
?skill/rarity: (skill-id) -> rarity,
|
|
||||||
?skill/group-rate: (skill-id) -> int,
|
|
||||||
?skill/grade-value: (skill-id) -> int,
|
|
||||||
?skill/wit-check: (skill-id) -> bool,
|
|
||||||
?skill/activations: (skill-id) -> list<activation>,
|
|
||||||
?skill/unique-owner: (skill-id) -> maybe<uma-id>,
|
|
||||||
?skill/sp-cost: (skill-id) -> int,
|
|
||||||
?skill/icon-id: (skill-id) -> skill-icon-id
|
|
||||||
): skill-detail
|
|
||||||
Skill-detail(
|
|
||||||
s,
|
|
||||||
s.show,
|
|
||||||
s.description,
|
|
||||||
s.group,
|
|
||||||
s.rarity,
|
|
||||||
s.group-rate,
|
|
||||||
s.grade-value,
|
|
||||||
s.wit-check,
|
|
||||||
s.activations,
|
|
||||||
s.unique-owner,
|
|
||||||
s.sp-cost,
|
|
||||||
s.icon-id
|
|
||||||
)
|
|
||||||
|
|
||||||
pub fun skill-detail/show(d: skill-detail, ?character/show: (character-id) -> string, ?uma/show: (uma-id) -> string): string
|
|
||||||
val Skill-detail(Skill-id(id), name, desc, _, rarity, _, grade-value, wit-check, activations, owner, sp-cost, _) = d
|
|
||||||
val r = name ++ " (ID " ++ id.show ++ "): " ++ desc ++ " " ++ activations.map(activation/show).join(". ") ++ (if wit-check then ". Wit check. " else ". No wit check. ") ++ rarity.show ++ " costing " ++ sp-cost.show ++ " SP, worth " ++ grade-value.show ++ " grade value."
|
|
||||||
match owner
|
|
||||||
Nothing -> r
|
|
||||||
Just(owner-id) -> match owner-id.show
|
|
||||||
"" -> r ++ " Unique skill of Uma with ID " ++ owner-id.show ++ "."
|
|
||||||
owner-name -> r ++ " Unique skill of " ++ owner-name ++ "."
|
|
||||||
|
|
||||||
// Skill rarity levels.
|
|
||||||
pub type rarity
|
|
||||||
Common // white
|
|
||||||
Rare // gold
|
|
||||||
Unique-Low // 1*/2* unique
|
|
||||||
Unique-Upgraded // 3*+ unique on a trainee upgraded from 1*/2*
|
|
||||||
Unique // base 3* unique
|
|
||||||
|
|
||||||
pub fun rarity/show(r: rarity): string
|
|
||||||
match r
|
|
||||||
Common -> "Common"
|
|
||||||
Rare -> "Rare"
|
|
||||||
Unique-Low -> "Unique (1\u2606/2\u2606)"
|
|
||||||
Unique-Upgraded -> "Unique (3\u2606+ from 1\u2606/2\u2606 upgraded)"
|
|
||||||
Unique -> "Unique (3\u2606+)"
|
|
||||||
|
|
||||||
// Condition and precondition logic.
|
|
||||||
pub alias condition = string
|
|
||||||
|
|
||||||
// Activation conditions and effects.
|
|
||||||
// A skill has one or two activations.
|
|
||||||
pub struct activation
|
|
||||||
precondition: condition
|
|
||||||
condition: condition
|
|
||||||
duration: decimal // seconds
|
|
||||||
dur-scale: dur-scale
|
|
||||||
cooldown: decimal // seconds
|
|
||||||
abilities: list<ability> // one to three elements
|
|
||||||
|
|
||||||
pub fun activation/show(a: activation, ?character/show: (character-id) -> string): string
|
|
||||||
match a
|
|
||||||
Activation("", condition, duration, _, _, abilities) | !duration.is-pos -> condition ++ " -> " ++ abilities.show
|
|
||||||
Activation("", condition, duration, Direct-Dur, cooldown, abilities) | cooldown >= 500.decimal -> condition ++ " -> for " ++ duration.show ++ "s, " ++ abilities.show
|
|
||||||
Activation("", condition, duration, dur-scale, cooldown, abilities) | cooldown >= 500.decimal -> condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ ", " ++ abilities.show
|
|
||||||
Activation("", condition, duration, Direct-Dur, cooldown, abilities) -> condition ++ " -> for " ++ duration.show ++ "s on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
|
|
||||||
Activation("", condition, duration, dur-scale, cooldown, abilities) -> condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ " on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
|
|
||||||
Activation(precondition, condition, duration, _, _, abilities) | !duration.is-pos -> precondition ++ " -> " ++ condition ++ " -> " ++ abilities.show
|
|
||||||
Activation(precondition, condition, duration, Direct-Dur, cooldown, abilities) | cooldown >= 500.decimal -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s, " ++ abilities.show
|
|
||||||
Activation(precondition, condition, duration, dur-scale, cooldown, abilities) | cooldown >= 500.decimal -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ ", " ++ abilities.show
|
|
||||||
Activation(precondition, condition, duration, Direct-Dur, cooldown, abilities) -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
|
|
||||||
Activation(precondition, condition, duration, dur-scale, cooldown, abilities) -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ " on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
|
|
||||||
|
|
||||||
// Special scaling types for skill activation durations.
|
|
||||||
pub type dur-scale
|
|
||||||
Direct-Dur
|
|
||||||
Front-Distance-Dur
|
|
||||||
Multiply-Remaining-HP
|
|
||||||
Increment-Pass
|
|
||||||
Midrace-Side-Block-Time-Dur
|
|
||||||
Multiply-Remaining-HP2
|
|
||||||
|
|
||||||
pub fun dur-scale/show(s: dur-scale): string
|
|
||||||
match s
|
|
||||||
Direct-Dur -> "with no scaling"
|
|
||||||
Front-Distance-Dur -> "scaling with distance from the front"
|
|
||||||
Multiply-Remaining-HP -> "scaling with remaining HP"
|
|
||||||
Increment-Pass -> "increasing with each pass while active"
|
|
||||||
Midrace-Side-Block-Time-Dur -> "scaling with mid-race phase blocked side time"
|
|
||||||
Multiply-Remaining-HP2 -> "scaling with remaining HP"
|
|
||||||
|
|
||||||
// Effects of activating a skill.
|
|
||||||
pub struct ability
|
|
||||||
ability-type: ability-type
|
|
||||||
value-usage: value-usage
|
|
||||||
target: target
|
|
||||||
|
|
||||||
pub fun ability/show(a: ability, ?character/show: (character-id) -> string): string
|
|
||||||
match a
|
|
||||||
Ability(t, Direct, Self) -> t.show
|
|
||||||
Ability(t, Direct, target) -> t.show ++ " " ++ target.show
|
|
||||||
Ability(t, v, Self) -> t.show ++ " " ++ v.show
|
|
||||||
Ability(t, v, target) -> t.show ++ " " ++ target.show ++ " " ++ v.show
|
|
||||||
|
|
||||||
// Skill ability effects.
|
|
||||||
pub type ability-type
|
|
||||||
Passive-Speed(bonus: decimal)
|
|
||||||
Passive-Stamina(bonus: decimal)
|
|
||||||
Passive-Power(bonus: decimal)
|
|
||||||
Passive-Guts(bonus: decimal)
|
|
||||||
Passive-Wit(bonus: decimal)
|
|
||||||
Great-Escape
|
|
||||||
Vision(bonus: decimal)
|
|
||||||
HP(rate: decimal)
|
|
||||||
Gate-Delay(rate: decimal)
|
|
||||||
Frenzy(add: decimal)
|
|
||||||
Current-Speed(add: decimal)
|
|
||||||
Target-Speed(add: decimal)
|
|
||||||
Lane-Speed(add: decimal)
|
|
||||||
Accel(add: decimal)
|
|
||||||
Lane-Change(add: decimal)
|
|
||||||
|
|
||||||
pub fun ability-type/show(a: ability-type): string
|
|
||||||
match a
|
|
||||||
Passive-Speed(bonus) -> bonus.show ++ " Speed"
|
|
||||||
Passive-Stamina(bonus) -> bonus.show ++ " Stamina"
|
|
||||||
Passive-Power(bonus) -> bonus.show ++ " Power"
|
|
||||||
Passive-Guts(bonus) -> bonus.show ++ " Guts"
|
|
||||||
Passive-Wit(bonus) -> bonus.show ++ " Wit"
|
|
||||||
Great-Escape -> "enable Great Escape style"
|
|
||||||
Vision(bonus) -> bonus.show ++ " vision"
|
|
||||||
HP(rate) | rate.is-pos -> show(rate * 100.decimal) ++ "% HP recovery"
|
|
||||||
HP(rate) -> show(rate * 100.decimal) ++ "% HP loss"
|
|
||||||
Gate-Delay(rate) -> rate.show ++ "× gate delay"
|
|
||||||
Frenzy(add) -> add.show ++ "s longer Rushed"
|
|
||||||
Current-Speed(rate) -> rate.show ++ "m/s current speed"
|
|
||||||
Target-Speed(rate) -> rate.show ++ "m/s target speed"
|
|
||||||
Lane-Speed(rate) -> rate.show ++ "m/s lane change speed"
|
|
||||||
Accel(rate) -> rate.show ++ "m/s² acceleration"
|
|
||||||
Lane-Change(rate) -> rate.show ++ " course width movement"
|
|
||||||
|
|
||||||
// Special scaling types for skill abilities.
|
|
||||||
pub type value-usage
|
|
||||||
Direct
|
|
||||||
Team-Speed
|
|
||||||
Team-Stamina
|
|
||||||
Team-Power
|
|
||||||
Team-Guts
|
|
||||||
Team-Wit
|
|
||||||
Multiply-Random
|
|
||||||
Multiply-Random2
|
|
||||||
Climax
|
|
||||||
Max-Stat
|
|
||||||
Passive-Count
|
|
||||||
Front-Distance-Add
|
|
||||||
Midrace-Side-Block-Time
|
|
||||||
Speed-Scaling
|
|
||||||
Speed-Scaling2
|
|
||||||
Arc-Global-Potential
|
|
||||||
Max-Lead-Distance
|
|
||||||
|
|
||||||
pub fun value-usage/show(v: value-usage): string
|
|
||||||
match v
|
|
||||||
Direct -> "with no scaling"
|
|
||||||
Team-Speed -> "scaling with team Speed"
|
|
||||||
Team-Stamina -> "scaling with team Stamina"
|
|
||||||
Team-Power -> "scaling with team Power"
|
|
||||||
Team-Guts -> "scaling with team Guts"
|
|
||||||
Team-Wit -> "scaling with team Wit"
|
|
||||||
Multiply-Random -> "scaling with a random multiplier (0×, 0.02×, or 0.04×)"
|
|
||||||
Multiply-Random2 -> "scaling with a random multiplier (0×, 0.02×, or 0.04×)"
|
|
||||||
Climax -> "scaling with the number of races won during training"
|
|
||||||
Max-Stat -> "scaling with the value of the user's highest stat"
|
|
||||||
Passive-Count -> "scaling with the number of Passive skills activated"
|
|
||||||
Front-Distance-Add -> "scaling with distance from the leader"
|
|
||||||
Midrace-Side-Block-Time -> "scaling with mid-race phase blocked side time"
|
|
||||||
Speed-Scaling -> "scaling with overall speed"
|
|
||||||
Speed-Scaling2 -> "scaling with overall speed"
|
|
||||||
Arc-Global-Potential -> "scaling with L'Arc global potential"
|
|
||||||
Max-Lead-Distance -> "scaling with the distance of the longest lead obtained in the first two thirds of the race"
|
|
||||||
|
|
||||||
// Who a skill ability targets.
|
|
||||||
pub type target
|
|
||||||
Self
|
|
||||||
Sympathizers
|
|
||||||
In-View
|
|
||||||
Frontmost(limit: int)
|
|
||||||
Ahead(limit: int)
|
|
||||||
Behind(limit: int)
|
|
||||||
All-Teammates
|
|
||||||
Style(style: style)
|
|
||||||
Rushing-Ahead(limit: int)
|
|
||||||
Rushing-Behind(limit: int)
|
|
||||||
Rushing-Style(style: style)
|
|
||||||
Specific-Character(who: character-id)
|
|
||||||
Triggering
|
|
||||||
|
|
||||||
pub fun target/show(t: target, ?character/show: (character-id) -> string): string
|
|
||||||
match t
|
|
||||||
Self -> "self"
|
|
||||||
Sympathizers -> "others with Sympathy"
|
|
||||||
In-View -> "others in field of view"
|
|
||||||
Frontmost(limit) -> "frontmost " ++ limit.show
|
|
||||||
Ahead(limit) | limit >= 18 -> "others ahead"
|
|
||||||
Ahead(limit) -> "next " ++ limit.show ++ " others ahead"
|
|
||||||
Behind(limit) | limit >= 18 -> "others behind"
|
|
||||||
Behind(limit) -> "next " ++ limit.show ++ " others behind"
|
|
||||||
All-Teammates -> "all teammates"
|
|
||||||
Style(s) -> "other " ++ s.show ++ "s"
|
|
||||||
Rushing-Ahead(limit) | limit >= 18 -> "others rushing ahead"
|
|
||||||
Rushing-Ahead(limit) -> "next " ++ limit.show ++ " others rushing ahead"
|
|
||||||
Rushing-Behind(limit) | limit >= 18 -> "others rushing behind"
|
|
||||||
Rushing-Behind(limit) -> "next " ++ limit.show ++ " others rushing behind"
|
|
||||||
Rushing-Style(s) -> "rushing " ++ s.show ++ "s"
|
|
||||||
Specific-Character(who) -> match who.show
|
|
||||||
"" -> "character with ID " ++ who.show
|
|
||||||
name -> name
|
|
||||||
Triggering -> "whosoever triggered this skill"
|
|
||||||
-175
@@ -1,175 +0,0 @@
|
|||||||
module horse/spark
|
|
||||||
|
|
||||||
import std/num/decimal
|
|
||||||
import horse/game-id
|
|
||||||
import horse/movement
|
|
||||||
|
|
||||||
// A spark on a veteran.
|
|
||||||
pub struct spark-detail
|
|
||||||
spark-id: spark-id
|
|
||||||
typ: spark-type
|
|
||||||
rarity: rarity
|
|
||||||
|
|
||||||
pub fun detail(id: spark-id, ?spark/spark-type: (spark-id) -> spark-type, ?spark/rarity: (spark-id) -> rarity): spark-detail
|
|
||||||
Spark-detail(id, id.spark-type, id.rarity)
|
|
||||||
|
|
||||||
pub fun spark-detail/show(s: spark-detail, ?spark/show: (spark-id) -> string): string
|
|
||||||
s.spark-id.show ++ " " ++ "\u2605".repeat(s.rarity.int)
|
|
||||||
|
|
||||||
// The category of a spark; roughly, blue, pink, green, or white, with some
|
|
||||||
// further subdivisions.
|
|
||||||
pub type spark-type
|
|
||||||
Stat // blue
|
|
||||||
Aptitude // red/pink
|
|
||||||
Unique // green
|
|
||||||
Race
|
|
||||||
Skill
|
|
||||||
// skip Carnival Bonus
|
|
||||||
Scenario
|
|
||||||
Surface
|
|
||||||
Distance
|
|
||||||
Style
|
|
||||||
Hidden
|
|
||||||
|
|
||||||
// Spark targets and effects.
|
|
||||||
pub type spark-effect
|
|
||||||
Stat-Up(s: stat, amount: int)
|
|
||||||
SP-Up(amount: int)
|
|
||||||
// skip Carnival Bonus
|
|
||||||
Random-Stat-Up(amount: int)
|
|
||||||
Aptitude-Up(a: aptitude, amount: int)
|
|
||||||
Skill-Hint(s: skill-id, levels: int)
|
|
||||||
Stat-Cap-Up(s: stat, amount: int)
|
|
||||||
|
|
||||||
// Get the base probability for a spark to trigger during a single inheritance.
|
|
||||||
pub fun decimal/base-proc(id: spark-id, ?spark-type: (spark-id) -> spark-type, ?rarity: (spark-id) -> rarity): decimal
|
|
||||||
val t = id.spark-type
|
|
||||||
val r = id.rarity
|
|
||||||
match (t, r)
|
|
||||||
(Stat, One) -> 70.decimal(-2)
|
|
||||||
(Stat, Two) -> 80.decimal(-2)
|
|
||||||
(Stat, Three) -> 90.decimal(-2)
|
|
||||||
(Aptitude, One) -> 1.decimal(-2)
|
|
||||||
(Aptitude, Two) -> 3.decimal(-2)
|
|
||||||
(Aptitude, Three) -> 5.decimal(-2)
|
|
||||||
(Unique, One) -> 5.decimal(-2)
|
|
||||||
(Unique, Two) -> 10.decimal(-2)
|
|
||||||
(Unique, Three) -> 15.decimal(-2)
|
|
||||||
(Race, One) -> 1.decimal(-2)
|
|
||||||
(Race, Two) -> 2.decimal(-2)
|
|
||||||
(Race, Three) -> 3.decimal(-2)
|
|
||||||
(_, One) -> 3.decimal(-2)
|
|
||||||
(_, Two) -> 6.decimal(-2)
|
|
||||||
(_, Three) -> 9.decimal(-2)
|
|
||||||
|
|
||||||
// The level or star count of a spark.
|
|
||||||
pub type rarity
|
|
||||||
One
|
|
||||||
Two
|
|
||||||
Three
|
|
||||||
|
|
||||||
pub fun rarity/int(l: rarity): int
|
|
||||||
match l
|
|
||||||
One -> 1
|
|
||||||
Two -> 2
|
|
||||||
Three -> 3
|
|
||||||
|
|
||||||
pub fun rarity/show(l: rarity): string
|
|
||||||
match l
|
|
||||||
One -> "1"
|
|
||||||
Two -> "2"
|
|
||||||
Three -> "3"
|
|
||||||
|
|
||||||
// Stat (blue) spark.
|
|
||||||
pub type stat
|
|
||||||
Speed
|
|
||||||
Stamina
|
|
||||||
Power
|
|
||||||
Guts
|
|
||||||
Wit
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Shows a string representation of the `stat` type.
|
|
||||||
pub fun stat/show(this : stat) : e string
|
|
||||||
match this
|
|
||||||
Speed -> "Speed"
|
|
||||||
Stamina -> "Stamina"
|
|
||||||
Power -> "Power"
|
|
||||||
Guts -> "Guts"
|
|
||||||
Wit -> "Wit"
|
|
||||||
|
|
||||||
// Aptitude (red/pink) spark.
|
|
||||||
pub type aptitude
|
|
||||||
Turf
|
|
||||||
Dirt
|
|
||||||
Sprint
|
|
||||||
Mile
|
|
||||||
Medium
|
|
||||||
Long
|
|
||||||
Front-Runner
|
|
||||||
Pace-Chaser
|
|
||||||
Late-Surger
|
|
||||||
End-Closer
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Fip comparison of the `aptitude` type.
|
|
||||||
pub fun aptitude/order2(this : aptitude, other : aptitude) : e order2<aptitude>
|
|
||||||
match (this, other)
|
|
||||||
(Turf, Turf) -> Eq2(Turf)
|
|
||||||
(Turf, other') -> Lt2(Turf, other')
|
|
||||||
(this', Turf) -> Gt2(Turf, this')
|
|
||||||
(Dirt, Dirt) -> Eq2(Dirt)
|
|
||||||
(Dirt, other') -> Lt2(Dirt, other')
|
|
||||||
(this', Dirt) -> Gt2(Dirt, this')
|
|
||||||
(Sprint, Sprint) -> Eq2(Sprint)
|
|
||||||
(Sprint, other') -> Lt2(Sprint, other')
|
|
||||||
(this', Sprint) -> Gt2(Sprint, this')
|
|
||||||
(Mile, Mile) -> Eq2(Mile)
|
|
||||||
(Mile, other') -> Lt2(Mile, other')
|
|
||||||
(this', Mile) -> Gt2(Mile, this')
|
|
||||||
(Medium, Medium) -> Eq2(Medium)
|
|
||||||
(Medium, other') -> Lt2(Medium, other')
|
|
||||||
(this', Medium) -> Gt2(Medium, this')
|
|
||||||
(Long, Long) -> Eq2(Long)
|
|
||||||
(Long, other') -> Lt2(Long, other')
|
|
||||||
(this', Long) -> Gt2(Long, this')
|
|
||||||
(Front-Runner, Front-Runner) -> Eq2(Front-Runner)
|
|
||||||
(Front-Runner, other') -> Lt2(Front-Runner, other')
|
|
||||||
(this', Front-Runner) -> Gt2(Front-Runner, this')
|
|
||||||
(Pace-Chaser, Pace-Chaser) -> Eq2(Pace-Chaser)
|
|
||||||
(Pace-Chaser, other') -> Lt2(Pace-Chaser, other')
|
|
||||||
(this', Pace-Chaser) -> Gt2(Pace-Chaser, this')
|
|
||||||
(Late-Surger, Late-Surger) -> Eq2(Late-Surger)
|
|
||||||
(Late-Surger, other') -> Lt2(Late-Surger, other')
|
|
||||||
(this', Late-Surger) -> Gt2(Late-Surger, this')
|
|
||||||
(End-Closer, End-Closer) -> Eq2(End-Closer)
|
|
||||||
|
|
||||||
// Automatically generated.
|
|
||||||
// Equality comparison of the `aptitude` type.
|
|
||||||
pub fun aptitude/(==)(this : aptitude, other : aptitude) : e bool
|
|
||||||
match (this, other)
|
|
||||||
(Turf, Turf) -> True
|
|
||||||
(Dirt, Dirt) -> True
|
|
||||||
(Sprint, Sprint) -> True
|
|
||||||
(Mile, Mile) -> True
|
|
||||||
(Medium, Medium) -> True
|
|
||||||
(Long, Long) -> True
|
|
||||||
(Front-Runner, Front-Runner) -> True
|
|
||||||
(Pace-Chaser, Pace-Chaser) -> True
|
|
||||||
(Late-Surger, Late-Surger) -> True
|
|
||||||
(End-Closer, End-Closer) -> True
|
|
||||||
(_, _) -> False
|
|
||||||
|
|
||||||
// Shows a string representation of the `aptitude` type.
|
|
||||||
pub fun aptitude/show(this : aptitude): string
|
|
||||||
match this
|
|
||||||
Turf -> "Turf"
|
|
||||||
Dirt -> "Dirt"
|
|
||||||
Sprint -> "Sprint"
|
|
||||||
Mile -> "Mile"
|
|
||||||
Medium -> "Medium"
|
|
||||||
Long -> "Long"
|
|
||||||
Front-Runner -> "Front Runner"
|
|
||||||
Pace-Chaser -> "Pace Chaser"
|
|
||||||
Late-Surger -> "Late Surger"
|
|
||||||
End-Closer -> "End Closer"
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
module horse/uma
|
|
||||||
|
|
||||||
import horse/game-id
|
|
||||||
import horse/movement
|
|
||||||
|
|
||||||
// Details of an uma, or character card.
|
|
||||||
pub struct uma-detail
|
|
||||||
uma-id: uma-id
|
|
||||||
character-id: character-id
|
|
||||||
sprint: aptitude-level
|
|
||||||
mile: aptitude-level
|
|
||||||
medium: aptitude-level
|
|
||||||
long: aptitude-level
|
|
||||||
front-runner: aptitude-level
|
|
||||||
pace-chaser: aptitude-level
|
|
||||||
late-surger: aptitude-level
|
|
||||||
end-closer: aptitude-level
|
|
||||||
turf: aptitude-level
|
|
||||||
dirt: aptitude-level
|
|
||||||
unique: skill-id
|
|
||||||
skill1: skill-id
|
|
||||||
skill2: skill-id
|
|
||||||
skill3: skill-id
|
|
||||||
skill-pl2: skill-id
|
|
||||||
skill-pl3: skill-id
|
|
||||||
skill-pl4: skill-id
|
|
||||||
skill-pl5: skill-id
|
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
package mdb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
_ "embed"
|
||||||
|
|
||||||
|
"zombiezen.com/go/sqlite"
|
||||||
|
"zombiezen.com/go/sqlite/sqlitex"
|
||||||
|
|
||||||
|
"git.sunturtle.xyz/zephyr/horse"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
//go:embed sql/character.sql
|
||||||
|
characterSQL string
|
||||||
|
//go:embed sql/affinity.sql
|
||||||
|
affinitySQL string
|
||||||
|
//go:embed sql/affinity-detail.sql
|
||||||
|
affinityDetailSQL string
|
||||||
|
//go:embed sql/uma.sql
|
||||||
|
umaSQL string
|
||||||
|
//go:embed sql/conversation.sql
|
||||||
|
conversationSQL string
|
||||||
|
)
|
||||||
|
|
||||||
|
// Characters retrieves all named characters.
|
||||||
|
func Characters(ctx context.Context, db *sqlitex.Pool) ([]horse.Character, error) {
|
||||||
|
return load(ctx, db, make([]horse.Character, 0, 128), characterSQL, func(s *sqlite.Stmt) horse.Character {
|
||||||
|
return horse.Character{
|
||||||
|
ID: horse.CharacterID(s.ColumnInt(0)),
|
||||||
|
Name: s.ColumnText(1),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// AffinitySummary gets precomputed base affinity for all pairs and trios of characters.
|
||||||
|
func AffinitySummary(ctx context.Context, db *sqlitex.Pool) ([]horse.AffinityRelation, error) {
|
||||||
|
return load(ctx, db, nil, affinitySQL, func(s *sqlite.Stmt) horse.AffinityRelation {
|
||||||
|
return horse.AffinityRelation{
|
||||||
|
IDA: horse.CharacterID(s.ColumnInt(0)),
|
||||||
|
IDB: horse.CharacterID(s.ColumnInt(1)),
|
||||||
|
IDC: horse.CharacterID(s.ColumnInt(2)),
|
||||||
|
Affinity: s.ColumnInt(3),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// AffinityDetail gets all individual affinity group entries.
|
||||||
|
func AffinityDetail(ctx context.Context, db *sqlitex.Pool) ([]horse.AffinityDetail, error) {
|
||||||
|
return load(ctx, db, nil, affinityDetailSQL, func(s *sqlite.Stmt) horse.AffinityDetail {
|
||||||
|
return horse.AffinityDetail{
|
||||||
|
CharaID: horse.CharacterID(s.ColumnInt(0)),
|
||||||
|
Relation: uint16(s.ColumnInt(1)),
|
||||||
|
Affinity: uint16(s.ColumnInt(2)),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Umas retrieves all trainable Uma variants.
|
||||||
|
func Umas(ctx context.Context, db *sqlitex.Pool) ([]horse.Uma, error) {
|
||||||
|
return load(ctx, db, make([]horse.Uma, 0, 128), umaSQL, func(s *sqlite.Stmt) horse.Uma {
|
||||||
|
return horse.Uma{
|
||||||
|
ID: horse.UmaID(s.ColumnInt(0)),
|
||||||
|
CharacterID: horse.CharacterID(s.ColumnInt(1)),
|
||||||
|
Name: s.ColumnText(2),
|
||||||
|
Variant: s.ColumnText(3),
|
||||||
|
Sprint: horse.AptitudeLevel(s.ColumnInt(5)),
|
||||||
|
Mile: horse.AptitudeLevel(s.ColumnInt(6)),
|
||||||
|
Medium: horse.AptitudeLevel(s.ColumnInt(7)),
|
||||||
|
Long: horse.AptitudeLevel(s.ColumnInt(8)),
|
||||||
|
Front: horse.AptitudeLevel(s.ColumnInt(9)),
|
||||||
|
Pace: horse.AptitudeLevel(s.ColumnInt(10)),
|
||||||
|
Late: horse.AptitudeLevel(s.ColumnInt(11)),
|
||||||
|
End: horse.AptitudeLevel(s.ColumnInt(12)),
|
||||||
|
Turf: horse.AptitudeLevel(s.ColumnInt(13)),
|
||||||
|
Dirt: horse.AptitudeLevel(s.ColumnInt(14)),
|
||||||
|
Unique: horse.SkillID(s.ColumnInt(15)),
|
||||||
|
Skill1: horse.SkillID(s.ColumnInt(16)),
|
||||||
|
Skill2: horse.SkillID(s.ColumnInt(17)),
|
||||||
|
Skill3: horse.SkillID(s.ColumnInt(18)),
|
||||||
|
SkillPL2: horse.SkillID(s.ColumnInt(19)),
|
||||||
|
SkillPL3: horse.SkillID(s.ColumnInt(20)),
|
||||||
|
SkillPL4: horse.SkillID(s.ColumnInt(21)),
|
||||||
|
SkillPL5: horse.SkillID(s.ColumnInt(22)),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
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 horse.Conversation{
|
||||||
|
ID: s.ColumnInt32(0),
|
||||||
|
CharacterID: horse.CharacterID(s.ColumnInt(1)),
|
||||||
|
Number: s.ColumnInt(2),
|
||||||
|
Location: horse.LobbyConversationLocationID(s.ColumnInt(3)),
|
||||||
|
Chara1: horse.CharacterID(s.ColumnInt(4)),
|
||||||
|
Chara2: horse.CharacterID(s.ColumnInt(5)),
|
||||||
|
Chara3: horse.CharacterID(s.ColumnInt(6)),
|
||||||
|
ConditionType: s.ColumnInt(7),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,336 @@
|
|||||||
|
package mdb_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "embed"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.sunturtle.xyz/zephyr/horse"
|
||||||
|
"git.sunturtle.xyz/zephyr/horse/mdb"
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed testdata/character.sql
|
||||||
|
var characterSQL string
|
||||||
|
|
||||||
|
func TestCharacters(t *testing.T) {
|
||||||
|
db := testdb(t.Context(), "file:TestCharacters?mode=memory&cache=shared", characterSQL)
|
||||||
|
got, err := mdb.Characters(t.Context(), db)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
want := []horse.Character{
|
||||||
|
{ID: 1001, Name: "Special Week"},
|
||||||
|
{ID: 1002, Name: "Silence Suzuka"},
|
||||||
|
{ID: 1078, Name: "Yamanin Zephyr"},
|
||||||
|
{ID: 2001, Name: "Happy Meek"},
|
||||||
|
{ID: 9001, Name: "Tazuna Hayakawa"},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(want, got); diff != "" {
|
||||||
|
t.Errorf("wrong characters (+got/-want):\n%s", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAffinitySummary(t *testing.T) {
|
||||||
|
db := testdb(t.Context(), "file:TestAffinitySummary?mode=memory&cache=shared", characterSQL)
|
||||||
|
got, err := mdb.AffinitySummary(t.Context(), db)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
want := []horse.AffinityRelation{
|
||||||
|
{IDA: 1001, IDB: 1002, Affinity: 23},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(want, got); diff != "" {
|
||||||
|
t.Errorf("wrong affinity (+got/-want):\n%s", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAffinityDetail(t *testing.T) {
|
||||||
|
db := testdb(t.Context(), "file:TestAffinityDetail?mode=memory&cache=shared", characterSQL)
|
||||||
|
got, err := mdb.AffinityDetail(t.Context(), db)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
want := []horse.AffinityDetail{
|
||||||
|
{CharaID: 1001, Relation: 103, Affinity: 2},
|
||||||
|
{CharaID: 1001, Relation: 202, Affinity: 2},
|
||||||
|
{CharaID: 1001, Relation: 301, Affinity: 2},
|
||||||
|
{CharaID: 1001, Relation: 401, Affinity: 2},
|
||||||
|
{CharaID: 1001, Relation: 502, Affinity: 2},
|
||||||
|
{CharaID: 1001, Relation: 510, Affinity: 2},
|
||||||
|
{CharaID: 1001, Relation: 2001, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2102, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2301, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2406, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2506, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2510, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2516, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2519, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2601, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2603, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2811, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 2903, Affinity: 7},
|
||||||
|
{CharaID: 1001, Relation: 3003, Affinity: 7},
|
||||||
|
{CharaID: 1001, Relation: 3004, Affinity: 7},
|
||||||
|
{CharaID: 1001, Relation: 3101, Affinity: 7},
|
||||||
|
{CharaID: 1001, Relation: 3205, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 7003, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 7004, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 7005, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 7006, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 7007, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8001, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8002, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8003, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8004, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8005, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8006, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8007, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8008, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8009, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8010, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8011, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8012, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8013, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8014, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8015, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8016, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8443, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8479, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8511, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8536, Affinity: 1},
|
||||||
|
{CharaID: 1001, Relation: 8640, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 104, Affinity: 2},
|
||||||
|
{CharaID: 1002, Relation: 202, Affinity: 2},
|
||||||
|
{CharaID: 1002, Relation: 301, Affinity: 2},
|
||||||
|
{CharaID: 1002, Relation: 402, Affinity: 2},
|
||||||
|
{CharaID: 1002, Relation: 2001, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 2406, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 2512, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 2601, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 2603, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 2810, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 2901, Affinity: 7},
|
||||||
|
{CharaID: 1002, Relation: 3003, Affinity: 7},
|
||||||
|
{CharaID: 1002, Relation: 3101, Affinity: 7},
|
||||||
|
{CharaID: 1002, Relation: 3205, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 7000, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 7001, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 7002, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 7013, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 7015, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8017, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8018, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8019, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8020, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8021, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8022, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8023, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8024, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8025, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8026, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8027, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8028, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8029, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8030, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8031, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8032, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8444, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8480, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8512, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8537, Affinity: 1},
|
||||||
|
{CharaID: 1002, Relation: 8641, Affinity: 1},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(want, got); diff != "" {
|
||||||
|
t.Errorf("wrong affinity details (+got/-want):\n%s", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUmas(t *testing.T) {
|
||||||
|
db := testdb(t.Context(), "file:TestUmas?mode=memory&cache=shared", characterSQL)
|
||||||
|
got, err := mdb.Umas(t.Context(), db)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
want := []horse.Uma{
|
||||||
|
{
|
||||||
|
ID: 100101,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Name: `[Special Dreamer] Special Week`,
|
||||||
|
Variant: `[Special Dreamer]`,
|
||||||
|
Sprint: 2,
|
||||||
|
Mile: 5,
|
||||||
|
Medium: 7,
|
||||||
|
Long: 7,
|
||||||
|
Front: 1,
|
||||||
|
Pace: 7,
|
||||||
|
Late: 7,
|
||||||
|
End: 5,
|
||||||
|
Turf: 7,
|
||||||
|
Dirt: 1,
|
||||||
|
Unique: 100011,
|
||||||
|
Skill1: 200512,
|
||||||
|
Skill2: 201352,
|
||||||
|
Skill3: 200732,
|
||||||
|
SkillPL2: 200162,
|
||||||
|
SkillPL3: 201351,
|
||||||
|
SkillPL4: 200612,
|
||||||
|
SkillPL5: 200511,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 100102,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Name: `[Hopp'n♪Happy Heart] Special Week`,
|
||||||
|
Variant: `[Hopp'n♪Happy Heart]`,
|
||||||
|
Sprint: 2,
|
||||||
|
Mile: 5,
|
||||||
|
Medium: 7,
|
||||||
|
Long: 7,
|
||||||
|
Front: 1,
|
||||||
|
Pace: 7,
|
||||||
|
Late: 7,
|
||||||
|
End: 5,
|
||||||
|
Turf: 7,
|
||||||
|
Dirt: 1,
|
||||||
|
Unique: 110011,
|
||||||
|
Skill1: 200462,
|
||||||
|
Skill2: 200592,
|
||||||
|
Skill3: 201132,
|
||||||
|
SkillPL2: 200212,
|
||||||
|
SkillPL3: 200591,
|
||||||
|
SkillPL4: 201611,
|
||||||
|
SkillPL5: 200461,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 100201,
|
||||||
|
CharacterID: 1002,
|
||||||
|
Name: `[Innocent Silence] Silence Suzuka`,
|
||||||
|
Variant: `[Innocent Silence]`,
|
||||||
|
Sprint: 4,
|
||||||
|
Mile: 7,
|
||||||
|
Medium: 7,
|
||||||
|
Long: 3,
|
||||||
|
Front: 7,
|
||||||
|
Pace: 5,
|
||||||
|
Late: 3,
|
||||||
|
End: 1,
|
||||||
|
Turf: 7,
|
||||||
|
Dirt: 1,
|
||||||
|
Unique: 100021,
|
||||||
|
Skill1: 200432,
|
||||||
|
Skill2: 200552,
|
||||||
|
Skill3: 200712,
|
||||||
|
SkillPL2: 200022,
|
||||||
|
SkillPL3: 200431,
|
||||||
|
SkillPL4: 200542,
|
||||||
|
SkillPL5: 200551,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(want, got); diff != "" {
|
||||||
|
t.Errorf("wrong umas (+got/-want):\n%s", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConversations(t *testing.T) {
|
||||||
|
db := testdb(t.Context(), "file:TestConversations?mode=memory&cache=shared", characterSQL)
|
||||||
|
got, err := mdb.Conversations(t.Context(), db)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
want := []horse.Conversation{
|
||||||
|
{
|
||||||
|
ID: 1,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Number: 1,
|
||||||
|
Location: 410,
|
||||||
|
Chara1: 1001,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 2,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Number: 2,
|
||||||
|
Location: 510,
|
||||||
|
Chara1: 1001,
|
||||||
|
ConditionType: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 3,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Number: 3,
|
||||||
|
Location: 310,
|
||||||
|
Chara1: 1001,
|
||||||
|
ConditionType: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 76,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Number: 4,
|
||||||
|
Location: 120,
|
||||||
|
Chara1: 1001,
|
||||||
|
Chara2: 1002,
|
||||||
|
ConditionType: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 77,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Number: 5,
|
||||||
|
Location: 520,
|
||||||
|
Chara1: 1003,
|
||||||
|
Chara2: 1001,
|
||||||
|
ConditionType: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 126,
|
||||||
|
CharacterID: 1001,
|
||||||
|
Number: 6,
|
||||||
|
Location: 430,
|
||||||
|
Chara1: 1001,
|
||||||
|
Chara2: 1014,
|
||||||
|
Chara3: 1011,
|
||||||
|
ConditionType: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 4,
|
||||||
|
CharacterID: 1002,
|
||||||
|
Number: 1,
|
||||||
|
Location: 310,
|
||||||
|
Chara1: 1002,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 5,
|
||||||
|
CharacterID: 1002,
|
||||||
|
Number: 2,
|
||||||
|
Location: 210,
|
||||||
|
Chara1: 1002,
|
||||||
|
ConditionType: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 6,
|
||||||
|
CharacterID: 1002,
|
||||||
|
Number: 3,
|
||||||
|
Location: 110,
|
||||||
|
Chara1: 1002,
|
||||||
|
ConditionType: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 78,
|
||||||
|
CharacterID: 1002,
|
||||||
|
Number: 4,
|
||||||
|
Location: 520,
|
||||||
|
Chara1: 1010,
|
||||||
|
Chara2: 1002,
|
||||||
|
ConditionType: 3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: 79,
|
||||||
|
CharacterID: 1002,
|
||||||
|
Number: 5,
|
||||||
|
Location: 220,
|
||||||
|
Chara1: 1002,
|
||||||
|
Chara2: 1018,
|
||||||
|
ConditionType: 2,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(want, got); diff != "" {
|
||||||
|
t.Errorf("wrong conversations (+got/-want):\n%s", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user