horse: implement inheritance

This commit is contained in:
2026-03-04 13:34:10 -05:00
parent cf814c6c72
commit 424f65dc8a
6 changed files with 512 additions and 25 deletions

293
test/example.kk Normal file
View File

@@ -0,0 +1,293 @@
module test/example
import std/num/decimal
import std/data/linearmap
import horse/game-id
import horse/global
import horse/global/character
import horse/global/saddle
import horse/global/skill
import horse/global/spark
import horse/global/uma
import horse/legacy
val p1 = Legacy(
uma = Veteran(
uma = Uma-id(102001), // seiun sky
sparks = [
301, // 1* power
2102, // 2* front runner
10200103, // 3* angling and scheming
1000302, // 2* osaka hai
1001001, // 1* japanese derby
1001101, // 1* yasuda kinen
1001701, // 1* qe2
2001402, // 2* non-standard distance
2004301, // 1* focus
2005301, // 1* early lead
2012401, // 1* front runner straightaways
2012502, // 2* front runner corners
2015201, // 1* front runner savvy
2016001, // 1* groundwork
2016102, // 2* thh
2016402, // 2* lone wolf
3000201, // 1* unity cup
].map(Spark-id(_)),
saddles = [
1, // classic triple crown
2, // senior autumn triple crown
4, // senior spring triple crown
5, // tenno sweep
6, // dual grand prix
7, // dual miles
10, // arima kinen
11, // japan cup
12, // derby
13, // tss
14, // takarazuka kinen
15, // tsa
16, // kikuka sho
17, // osaka hai
18, // satsuki sho
21, // yasuda kinen
23, // mile championship
25, // victoria mile
26, // qe2
33, // asahi hai fs
34, // hopeful stakes
96, // mainichi hai
].map(Saddle-id(_))
),
sub1 = Veteran(
uma = Uma-id(102601), // mihono bourbon
sparks = [
302, // 2* power
3303, // 3* medium
10260102, // 2* g00 1st
1001201, // 1* takarazuka kinen
1001702, // 2* qe2
1001901, // 1* japan cup
2004302, // 2* focus
2004502, // 2* prudent positioning
2012502, // 2* front corners
2015202, // 2* front savvy
2016002, // 2* groundwork
2016401, // 1* lone wolf
3000201, // 1* unity cup
].map(Spark-id(_)),
saddles = [
2, // senior autumn triple crown
6, // dual grand prix
7, // dual miles
10, // arima kinen
11, // japan cup
12, // derby
14, // takarazuka kinen
15, // tsa
17, // osaka hai
18, // satsuki sho
21, // yasuda kinen
23, // mile championship
25, // victoria mile
26, // qe2
27, // nhk mile cup
33, // asahi hai fs
34, // hopeful stakes
49, // spring stakes
].map(Saddle-id(_))
),
sub2 = Veteran(
uma = Uma-id(102401), // mayano top gun
sparks = [
302, // 2* power
1103, // 3* turf
10240101, // 1* flashy landing
1000601, // 1* tss
1001202, // 2* takarazuka kinen
1001502, // 2* kikuka sho
1001601, // 1* tsa
1002102, // 2* hanshin jf
1002301, // 1* arima kinen
2003503, // 3* corner recovery
2003802, // 2* straightaway recovery
2004602, // 2* ramp up
2005502, // 2* final push
2012702, // 2* leader's pride
2016002, // 2* groundwork
3000102, // 2* ura finale
].map(Spark-id(_)),
saddles = [
1, // classic triple crown
2, // senior autumn triple crown
4, // senior spring triple crown
5, // tenno sweep
6, // dual grand prix
7, // dual miles
10, // arima kinen
11, // japan cup
12, // derby
13, // tss
14, // takarazuka kinen
15, // tsa
16, // kikuka sho
18, // satsuki sho
21, // yasuda kinen
23, // mile championship
25, // victoria mile
26, // qe2
34, // hopeful stakes
35, // hanshin jf
].map(Saddle-id(_))
)
)
val p2 = Legacy(
uma = Veteran(
uma = Uma-id(100201), // silence suzuka
sparks = [
202, // 2* stamina
3301, // 1* medium
10020101, // 1* view from the lead
1000302, // 2* osaka hai
1001201, // 1* takarazuka kinen
1001502, // 2* kikuka sho
1001601, // 1* tsa
1002201, // 1* asahi hai fs
1002301, // 1* arima kinen
2003302, // 2* corner adept
2004302, // 2* focus
2004502, // 2* prudent positioning
2005301, // 1* early lead
2012602, // 2* dodging danger
2012802, // 2* moxie
2016002, // 2* groundwork
].map(Spark-id(_)),
saddles = [
1, // classic triple crown
2, // senior autumn triple crown
6, // dual grand prix
10, // arima kinen
11, // japan cup
12, // derby
14, // takarazuka kinen
15, // tsa
16, // kikuka sho
17, // osaka hai
18, // satsuki sho
21, // yasuda kinen
25, // victoria mile
26, // qe2
33, // asahi hai fs
34, // hopeful stakes
45, // yayoi sho
46, // kinko sho
63, // kobe shimbun hai
65, // mainichi okan
].map(Saddle-id(_))
),
sub1 = Veteran(
uma = Uma-id(102001), // seiun sky
sparks = [
301, // 1* power
2102, // 2* front runner
10200103, // 3* angling and scheming
1000302, // 2* osaka hai
1001001, // 1* japanese derby
1001101, // 1* yasuda kinen
1001701, // 1* qe2
2001402, // 2* non-standard distance
2004301, // 1* focus
2005301, // 1* early lead
2012401, // 1* front runner straightaways
2012502, // 2* front runner corners
2015201, // 1* front runner savvy
2016001, // 1* groundwork
2016102, // 2* thh
2016402, // 2* lone wolf
3000201, // 1* unity cup
].map(Spark-id(_)),
saddles = [
1, // classic triple crown
2, // senior autumn triple crown
4, // senior spring triple crown
5, // tenno sweep
6, // dual grand prix
7, // dual miles
10, // arima kinen
11, // japan cup
12, // derby
13, // tss
14, // takarazuka kinen
15, // tsa
16, // kikuka sho
17, // osaka hai
18, // satsuki sho
21, // yasuda kinen
23, // mile championship
25, // victoria mile
26, // qe2
33, // asahi hai fs
34, // hopeful stakes
96, // mainichi hai
].map(Saddle-id(_))
),
sub2 = Veteran(
uma = Uma-id(102601), // mihono bourbon
sparks = [
102, // 2* speed
3402, // 2* long
10260101, // 1* g00 1st
1000502, // 2* satsuki sho
1000701, // 1* nhk mile cup
1001201, // 1* takarazuka kinen
1001702, // 2* qe2
2000101, // 1* right-handed
2002102, // 2* sunny days
2004302, // 2* focus
2005301, // 1* early lead
2012502, // 2* front corners
2016001, // 1* groundwork
].map(Spark-id(_)),
saddles = [
1, // classic triple crown
2, // senior autumn triple crown
6, // dual grand prix
10, // arima kinen
11, // japan cup
12, // derby
14, // takarazuka kinen
15, // tsa
16, // kikuka sho
17, // osaka hai
18, // satsuki sho
26, // qe2
27, // nhk mile cup
33, // asahi hai fs
49, // spring stakes
].map(Saddle-id(_))
)
)
val trainee = Uma-id(102402) // wedding mayano
pub fun main()
val p1a = parent-affinity(trainee, p1, p2.uma.uma)
val p2a = parent-affinity(trainee, p2, p1.uma.uma)
val (s11a, s12a) = sub-affinity(trainee, p1)
val (s21a, s22a) = sub-affinity(trainee, p2)
println("trainee: " ++ trainee.show)
println("p1: " ++ p1.uma.uma.show ++ " affinity " ++ p1a.show)
println("s1-1: " ++ p1.sub1.uma.show ++ " affinity " ++ s11a.show)
println("s1-2: " ++ p1.sub2.uma.show ++ " affinity " ++ s12a.show)
println("p2: " ++ p2.uma.uma.show ++ " affinity " ++ p1a.show)
println("s1-1: " ++ p2.sub1.uma.show ++ " affinity " ++ s21a.show)
println("s1-2: " ++ p2.sub2.uma.show ++ " affinity " ++ s22a.show)
val inspo = inspiration(trainee, p1, p2)
val s = inspiration-gives(inspo, legacy/skills)
val a = inspiration-gives(inspo, legacy/aptitudes)
println("\nskills:")
s.list.foreach() fn((skill, pmf))
println(" " ++ skill.show ++ ": " ++ pmf.show)
println("\naptitudes:")
a.list.foreach() fn((apt, pmf))
println(" " ++ apt.show ++ ": " ++ pmf.show)