horsegen: generate alternate races/saddles with ids

This commit is contained in:
2026-02-10 13:55:47 -05:00
parent b55e1bc200
commit a534975601
8 changed files with 393 additions and 390 deletions

View File

@@ -29,10 +29,10 @@ const (
RaceAsahiHaiFuturityStakes RaceID = 1022 // Asahi Hai Futurity Stakes RaceAsahiHaiFuturityStakes RaceID = 1022 // Asahi Hai Futurity Stakes
RaceArimaKinen RaceID = 1023 // Arima Kinen RaceArimaKinen RaceID = 1023 // Arima Kinen
RaceHopefulStakes RaceID = 1024 // Hopeful Stakes RaceHopefulStakes RaceID = 1024 // Hopeful Stakes
RaceTakarazukaKinenAlternate RaceID = 1025 // Takarazuka Kinen RaceTakarazukaKinenAlt1025 RaceID = 1025 // Takarazuka Kinen
RaceKikukaShoAlternate RaceID = 1026 // Kikuka Sho RaceKikukaShoAlt1026 RaceID = 1026 // Kikuka Sho
RaceTennoShoSpringAlternate RaceID = 1027 // Tenno Sho (Spring) RaceTennoShoSpringAlt1027 RaceID = 1027 // Tenno Sho (Spring)
RaceSatsukiShoAlternate RaceID = 1028 // Satsuki Sho RaceSatsukiShoAlt1028 RaceID = 1028 // Satsuki Sho
RaceTeioSho RaceID = 1101 // Teio Sho RaceTeioSho RaceID = 1101 // Teio Sho
RaceJapanDirtDerby RaceID = 1102 // Japan Dirt Derby RaceJapanDirtDerby RaceID = 1102 // Japan Dirt Derby
RaceJBCLadiesClassic RaceID = 1103 // JBC Ladies Classic RaceJBCLadiesClassic RaceID = 1103 // JBC Ladies Classic
@@ -73,7 +73,7 @@ const (
RaceDailyHaiJuniorStakes RaceID = 2032 // Daily Hai Junior Stakes RaceDailyHaiJuniorStakes RaceID = 2032 // Daily Hai Junior Stakes
RaceStayersStakes RaceID = 2033 // Stayers Stakes RaceStayersStakes RaceID = 2033 // Stayers Stakes
RaceHanshinCup RaceID = 2034 // Hanshin Cup RaceHanshinCup RaceID = 2034 // Hanshin Cup
RaceSpringStakesAlternate RaceID = 2035 // Spring Stakes RaceSpringStakesAlt2035 RaceID = 2035 // Spring Stakes
RaceKyotoKimpai RaceID = 3001 // Kyoto Kimpai RaceKyotoKimpai RaceID = 3001 // Kyoto Kimpai
RaceNakayamaKimpai RaceID = 3002 // Nakayama Kimpai RaceNakayamaKimpai RaceID = 3002 // Nakayama Kimpai
RaceShinzanKinen RaceID = 3003 // Shinzan Kinen RaceShinzanKinen RaceID = 3003 // Shinzan Kinen
@@ -413,27 +413,27 @@ var AllRaces = map[RaceID]Race{
Name: "Hopeful Stakes", Name: "Hopeful Stakes",
Thumbnail: 1024, Thumbnail: 1024,
}, },
RaceTakarazukaKinenAlternate: { RaceTakarazukaKinenAlt1025: {
ID: 1025, ID: 1025,
Name: "Takarazuka Kinen" + " (Alternate)", Name: "Takarazuka Kinen" + " (Alternate 1025)",
Thumbnail: 1012, Thumbnail: 1012,
Primary: 1012, Primary: 1012,
}, },
RaceKikukaShoAlternate: { RaceKikukaShoAlt1026: {
ID: 1026, ID: 1026,
Name: "Kikuka Sho" + " (Alternate)", Name: "Kikuka Sho" + " (Alternate 1026)",
Thumbnail: 1015, Thumbnail: 1015,
Primary: 1015, Primary: 1015,
}, },
RaceTennoShoSpringAlternate: { RaceTennoShoSpringAlt1027: {
ID: 1027, ID: 1027,
Name: "Tenno Sho (Spring)" + " (Alternate)", Name: "Tenno Sho (Spring)" + " (Alternate 1027)",
Thumbnail: 1027, Thumbnail: 1027,
Primary: 1006, Primary: 1006,
}, },
RaceSatsukiShoAlternate: { RaceSatsukiShoAlt1028: {
ID: 1028, ID: 1028,
Name: "Satsuki Sho" + " (Alternate)", Name: "Satsuki Sho" + " (Alternate 1028)",
Thumbnail: 1028, Thumbnail: 1028,
Primary: 1005, Primary: 1005,
}, },
@@ -637,9 +637,9 @@ var AllRaces = map[RaceID]Race{
Name: "Hanshin Cup", Name: "Hanshin Cup",
Thumbnail: 2034, Thumbnail: 2034,
}, },
RaceSpringStakesAlternate: { RaceSpringStakesAlt2035: {
ID: 2035, ID: 2035,
Name: "Spring Stakes" + " (Alternate)", Name: "Spring Stakes" + " (Alternate 2035)",
Thumbnail: 2010, Thumbnail: 2010,
Primary: 2010, Primary: 2010,
}, },
@@ -1750,10 +1750,10 @@ var RaceNameToID = map[string]RaceID{
"Asahi Hai Futurity Stakes": 1022, "Asahi Hai Futurity Stakes": 1022,
"Arima Kinen": 1023, "Arima Kinen": 1023,
"Hopeful Stakes": 1024, "Hopeful Stakes": 1024,
"Takarazuka Kinen" + " (Alternate)": 1025, "Takarazuka Kinen" + " (Alternate 1025)": 1025,
"Kikuka Sho" + " (Alternate)": 1026, "Kikuka Sho" + " (Alternate 1026)": 1026,
"Tenno Sho (Spring)" + " (Alternate)": 1027, "Tenno Sho (Spring)" + " (Alternate 1027)": 1027,
"Satsuki Sho" + " (Alternate)": 1028, "Satsuki Sho" + " (Alternate 1028)": 1028,
"Teio Sho": 1101, "Teio Sho": 1101,
"Japan Dirt Derby": 1102, "Japan Dirt Derby": 1102,
"JBC Ladies Classic": 1103, "JBC Ladies Classic": 1103,
@@ -1794,7 +1794,7 @@ var RaceNameToID = map[string]RaceID{
"Daily Hai Junior Stakes": 2032, "Daily Hai Junior Stakes": 2032,
"Stayers Stakes": 2033, "Stayers Stakes": 2033,
"Hanshin Cup": 2034, "Hanshin Cup": 2034,
"Spring Stakes" + " (Alternate)": 2035, "Spring Stakes" + " (Alternate 2035)": 2035,
"Kyoto Kimpai": 3001, "Kyoto Kimpai": 3001,
"Nakayama Kimpai": 3002, "Nakayama Kimpai": 3002,
"Shinzan Kinen": 3003, "Shinzan Kinen": 3003,

View File

@@ -32,10 +32,10 @@ pub type race
Asahi-Hai-Futurity-Stakes Asahi-Hai-Futurity-Stakes
Arima-Kinen Arima-Kinen
Hopeful-Stakes Hopeful-Stakes
Takarazuka-Kinen-Alternate Takarazuka-Kinen-Alt1025
Kikuka-Sho-Alternate Kikuka-Sho-Alt1026
Tenno-Sho-Spring-Alternate Tenno-Sho-Spring-Alt1027
Satsuki-Sho-Alternate Satsuki-Sho-Alt1028
Teio-Sho Teio-Sho
Japan-Dirt-Derby Japan-Dirt-Derby
JBC-Ladies-Classic JBC-Ladies-Classic
@@ -76,7 +76,7 @@ pub type race
Daily-Hai-Junior-Stakes Daily-Hai-Junior-Stakes
Stayers-Stakes Stayers-Stakes
Hanshin-Cup Hanshin-Cup
Spring-Stakes-Alternate Spring-Stakes-Alt2035
Kyoto-Kimpai Kyoto-Kimpai
Nakayama-Kimpai Nakayama-Kimpai
Shinzan-Kinen Shinzan-Kinen
@@ -321,10 +321,10 @@ pub fun race-id(r: race): race-id
Asahi-Hai-Futurity-Stakes -> Race-id(1022) Asahi-Hai-Futurity-Stakes -> Race-id(1022)
Arima-Kinen -> Race-id(1023) Arima-Kinen -> Race-id(1023)
Hopeful-Stakes -> Race-id(1024) Hopeful-Stakes -> Race-id(1024)
Takarazuka-Kinen-Alternate -> Race-id(1025) Takarazuka-Kinen-Alt1025 -> Race-id(1025)
Kikuka-Sho-Alternate -> Race-id(1026) Kikuka-Sho-Alt1026 -> Race-id(1026)
Tenno-Sho-Spring-Alternate -> Race-id(1027) Tenno-Sho-Spring-Alt1027 -> Race-id(1027)
Satsuki-Sho-Alternate -> Race-id(1028) Satsuki-Sho-Alt1028 -> Race-id(1028)
Teio-Sho -> Race-id(1101) Teio-Sho -> Race-id(1101)
Japan-Dirt-Derby -> Race-id(1102) Japan-Dirt-Derby -> Race-id(1102)
JBC-Ladies-Classic -> Race-id(1103) JBC-Ladies-Classic -> Race-id(1103)
@@ -365,7 +365,7 @@ pub fun race-id(r: race): race-id
Daily-Hai-Junior-Stakes -> Race-id(2032) Daily-Hai-Junior-Stakes -> Race-id(2032)
Stayers-Stakes -> Race-id(2033) Stayers-Stakes -> Race-id(2033)
Hanshin-Cup -> Race-id(2034) Hanshin-Cup -> Race-id(2034)
Spring-Stakes-Alternate -> Race-id(2035) Spring-Stakes-Alt2035 -> Race-id(2035)
Kyoto-Kimpai -> Race-id(3001) Kyoto-Kimpai -> Race-id(3001)
Nakayama-Kimpai -> Race-id(3002) Nakayama-Kimpai -> Race-id(3002)
Shinzan-Kinen -> Race-id(3003) Shinzan-Kinen -> Race-id(3003)
@@ -609,10 +609,10 @@ pub val all = [
Asahi-Hai-Futurity-Stakes, Asahi-Hai-Futurity-Stakes,
Arima-Kinen, Arima-Kinen,
Hopeful-Stakes, Hopeful-Stakes,
Takarazuka-Kinen-Alternate, Takarazuka-Kinen-Alt1025,
Kikuka-Sho-Alternate, Kikuka-Sho-Alt1026,
Tenno-Sho-Spring-Alternate, Tenno-Sho-Spring-Alt1027,
Satsuki-Sho-Alternate, Satsuki-Sho-Alt1028,
Teio-Sho, Teio-Sho,
Japan-Dirt-Derby, Japan-Dirt-Derby,
JBC-Ladies-Classic, JBC-Ladies-Classic,
@@ -653,7 +653,7 @@ pub val all = [
Daily-Hai-Junior-Stakes, Daily-Hai-Junior-Stakes,
Stayers-Stakes, Stayers-Stakes,
Hanshin-Cup, Hanshin-Cup,
Spring-Stakes-Alternate, Spring-Stakes-Alt2035,
Kyoto-Kimpai, Kyoto-Kimpai,
Nakayama-Kimpai, Nakayama-Kimpai,
Shinzan-Kinen, Shinzan-Kinen,
@@ -897,10 +897,10 @@ val name2id: rbmap<string, race-id> = rb-map/empty()
.set("Asahi Hai Futurity Stakes", Race-id(1022)) .set("Asahi Hai Futurity Stakes", Race-id(1022))
.set("Arima Kinen", Race-id(1023)) .set("Arima Kinen", Race-id(1023))
.set("Hopeful Stakes", Race-id(1024)) .set("Hopeful Stakes", Race-id(1024))
.set("Takarazuka Kinen" ++ " (Alternate)", Race-id(1025)) .set("Takarazuka Kinen" ++ " (Alternate 1025)", Race-id(1025))
.set("Kikuka Sho" ++ " (Alternate)", Race-id(1026)) .set("Kikuka Sho" ++ " (Alternate 1026)", Race-id(1026))
.set("Tenno Sho (Spring)" ++ " (Alternate)", Race-id(1027)) .set("Tenno Sho (Spring)" ++ " (Alternate 1027)", Race-id(1027))
.set("Satsuki Sho" ++ " (Alternate)", Race-id(1028)) .set("Satsuki Sho" ++ " (Alternate 1028)", Race-id(1028))
.set("Teio Sho", Race-id(1101)) .set("Teio Sho", Race-id(1101))
.set("Japan Dirt Derby", Race-id(1102)) .set("Japan Dirt Derby", Race-id(1102))
.set("JBC Ladies Classic", Race-id(1103)) .set("JBC Ladies Classic", Race-id(1103))
@@ -941,7 +941,7 @@ val name2id: rbmap<string, race-id> = rb-map/empty()
.set("Daily Hai Junior Stakes", Race-id(2032)) .set("Daily Hai Junior Stakes", Race-id(2032))
.set("Stayers Stakes", Race-id(2033)) .set("Stayers Stakes", Race-id(2033))
.set("Hanshin Cup", Race-id(2034)) .set("Hanshin Cup", Race-id(2034))
.set("Spring Stakes" ++ " (Alternate)", Race-id(2035)) .set("Spring Stakes" ++ " (Alternate 2035)", Race-id(2035))
.set("Kyoto Kimpai", Race-id(3001)) .set("Kyoto Kimpai", Race-id(3001))
.set("Nakayama Kimpai", Race-id(3002)) .set("Nakayama Kimpai", Race-id(3002))
.set("Shinzan Kinen", Race-id(3003)) .set("Shinzan Kinen", Race-id(3003))
@@ -1160,13 +1160,13 @@ val name2id: rbmap<string, race-id> = rb-map/empty()
.set("Senryo Sho", Race-id(4526)) .set("Senryo Sho", Race-id(4526))
// Get the race ID that has the given exact name. // Get the race ID that has the given exact name.
// Alternate versions of races have " (Alternate)" in their names. // Alternate versions of races have an indication of their ID in their names.
// If no race matches the name, the result is an invalid ID. // If no race matches the name, the result is an invalid ID.
pub fun from-name(name: string): race-id pub fun from-name(name: string): race-id
name2id.lookup(name).default(Race-id(0)) name2id.lookup(name).default(Race-id(0))
// Get the name for a race. // Get the name for a race.
// Alternate versions of races have " (Alternate)" in their names. // Alternate versions of races have an indication of their ID in their names.
// If no race matches the ID, the result is the numeric ID. // If no race matches the ID, the result is the numeric ID.
pub fun show(r: race-id): string pub fun show(r: race-id): string
match r.game-id match r.game-id
@@ -1194,10 +1194,10 @@ pub fun show(r: race-id): string
1022 -> "Asahi Hai Futurity Stakes" 1022 -> "Asahi Hai Futurity Stakes"
1023 -> "Arima Kinen" 1023 -> "Arima Kinen"
1024 -> "Hopeful Stakes" 1024 -> "Hopeful Stakes"
1025 -> "Takarazuka Kinen" ++ " (Alternate)" 1025 -> "Takarazuka Kinen" ++ " (Alternate 1025)"
1026 -> "Kikuka Sho" ++ " (Alternate)" 1026 -> "Kikuka Sho" ++ " (Alternate 1026)"
1027 -> "Tenno Sho (Spring)" ++ " (Alternate)" 1027 -> "Tenno Sho (Spring)" ++ " (Alternate 1027)"
1028 -> "Satsuki Sho" ++ " (Alternate)" 1028 -> "Satsuki Sho" ++ " (Alternate 1028)"
1101 -> "Teio Sho" 1101 -> "Teio Sho"
1102 -> "Japan Dirt Derby" 1102 -> "Japan Dirt Derby"
1103 -> "JBC Ladies Classic" 1103 -> "JBC Ladies Classic"
@@ -1238,7 +1238,7 @@ pub fun show(r: race-id): string
2032 -> "Daily Hai Junior Stakes" 2032 -> "Daily Hai Junior Stakes"
2033 -> "Stayers Stakes" 2033 -> "Stayers Stakes"
2034 -> "Hanshin Cup" 2034 -> "Hanshin Cup"
2035 -> "Spring Stakes" ++ " (Alternate)" 2035 -> "Spring Stakes" ++ " (Alternate 2035)"
3001 -> "Kyoto Kimpai" 3001 -> "Kyoto Kimpai"
3002 -> "Nakayama Kimpai" 3002 -> "Nakayama Kimpai"
3003 -> "Shinzan Kinen" 3003 -> "Shinzan Kinen"

View File

@@ -151,18 +151,18 @@ pub type saddle
Chunichi-Shimbun-Hai Chunichi-Shimbun-Hai
Capella-S Capella-S
Turquoise-S Turquoise-S
Classic-Triple-Crown-Alt1 Classic-Triple-Crown-Alt144
Senior-Spring-Triple-Crown-Alt1 Senior-Spring-Triple-Crown-Alt145
Dual-Grand-Prix-Alt1 Dual-Grand-Prix-Alt146
Takarazuka-Kinen-Alt1 Takarazuka-Kinen-Alt147
Kikuka-Sho-Alt1 Kikuka-Sho-Alt148
Spring-S-Alt1 Spring-S-Alt149
Aoi-S Aoi-S
Senior-Spring-Triple-Crown-Alt2 Senior-Spring-Triple-Crown-Alt151
Tenno-Sweep-Alt1 Tenno-Sweep-Alt152
Tenno-Sho-Spring-Alt1 Tenno-Sho-Spring-Alt153
Classic-Triple-Crown-Alt2 Classic-Triple-Crown-Alt154
Satsuki-Sho-Alt1 Satsuki-Sho-Alt155
// Get the saddle ID for a saddle. // Get the saddle ID for a saddle.
pub fun saddle-id(s: saddle): saddle-id pub fun saddle-id(s: saddle): saddle-id
@@ -310,18 +310,18 @@ pub fun saddle-id(s: saddle): saddle-id
Chunichi-Shimbun-Hai -> Saddle-id(141) Chunichi-Shimbun-Hai -> Saddle-id(141)
Capella-S -> Saddle-id(142) Capella-S -> Saddle-id(142)
Turquoise-S -> Saddle-id(143) Turquoise-S -> Saddle-id(143)
Classic-Triple-Crown-Alt1 -> Saddle-id(144) Classic-Triple-Crown-Alt144 -> Saddle-id(144)
Senior-Spring-Triple-Crown-Alt1 -> Saddle-id(145) Senior-Spring-Triple-Crown-Alt145 -> Saddle-id(145)
Dual-Grand-Prix-Alt1 -> Saddle-id(146) Dual-Grand-Prix-Alt146 -> Saddle-id(146)
Takarazuka-Kinen-Alt1 -> Saddle-id(147) Takarazuka-Kinen-Alt147 -> Saddle-id(147)
Kikuka-Sho-Alt1 -> Saddle-id(148) Kikuka-Sho-Alt148 -> Saddle-id(148)
Spring-S-Alt1 -> Saddle-id(149) Spring-S-Alt149 -> Saddle-id(149)
Aoi-S -> Saddle-id(150) Aoi-S -> Saddle-id(150)
Senior-Spring-Triple-Crown-Alt2 -> Saddle-id(151) Senior-Spring-Triple-Crown-Alt151 -> Saddle-id(151)
Tenno-Sweep-Alt1 -> Saddle-id(152) Tenno-Sweep-Alt152 -> Saddle-id(152)
Tenno-Sho-Spring-Alt1 -> Saddle-id(153) Tenno-Sho-Spring-Alt153 -> Saddle-id(153)
Classic-Triple-Crown-Alt2 -> Saddle-id(154) Classic-Triple-Crown-Alt154 -> Saddle-id(154)
Satsuki-Sho-Alt1 -> Saddle-id(155) Satsuki-Sho-Alt155 -> Saddle-id(155)
// List of all saddles in ID order for easy iterating. // List of all saddles in ID order for easy iterating.
pub val all = [ pub val all = [
@@ -468,22 +468,22 @@ pub val all = [
Chunichi-Shimbun-Hai, Chunichi-Shimbun-Hai,
Capella-S, Capella-S,
Turquoise-S, Turquoise-S,
Classic-Triple-Crown-Alt1, Classic-Triple-Crown-Alt144,
Senior-Spring-Triple-Crown-Alt1, Senior-Spring-Triple-Crown-Alt145,
Dual-Grand-Prix-Alt1, Dual-Grand-Prix-Alt146,
Takarazuka-Kinen-Alt1, Takarazuka-Kinen-Alt147,
Kikuka-Sho-Alt1, Kikuka-Sho-Alt148,
Spring-S-Alt1, Spring-S-Alt149,
Aoi-S, Aoi-S,
Senior-Spring-Triple-Crown-Alt2, Senior-Spring-Triple-Crown-Alt151,
Tenno-Sweep-Alt1, Tenno-Sweep-Alt152,
Tenno-Sho-Spring-Alt1, Tenno-Sho-Spring-Alt153,
Classic-Triple-Crown-Alt2, Classic-Triple-Crown-Alt154,
Satsuki-Sho-Alt1, Satsuki-Sho-Alt155,
] ]
// Get the name for a saddle. // Get the name for a saddle.
// Alternate versions of saddles have an indication of such in their names. // Alternate versions of saddles have an indication of their ID in their names.
// If no saddle matches the ID, the result contains the numeric ID. // If no saddle matches the ID, the result contains the numeric ID.
pub fun show(s: saddle-id): string pub fun show(s: saddle-id): string
match s.game-id match s.game-id
@@ -630,18 +630,18 @@ pub fun show(s: saddle-id): string
141 -> "Chunichi Shimbun Hai" 141 -> "Chunichi Shimbun Hai"
142 -> "Capella S." 142 -> "Capella S."
143 -> "Turquoise S." 143 -> "Turquoise S."
144 -> "Classic Triple Crown" ++ " (Alternate 1)" 144 -> "Classic Triple Crown" ++ " (Alternate 144)"
145 -> "Senior Spring Triple Crown" ++ " (Alternate 1)" 145 -> "Senior Spring Triple Crown" ++ " (Alternate 145)"
146 -> "Dual Grand Prix" ++ " (Alternate 1)" 146 -> "Dual Grand Prix" ++ " (Alternate 146)"
147 -> "Takarazuka Kinen" ++ " (Alternate 1)" 147 -> "Takarazuka Kinen" ++ " (Alternate 147)"
148 -> "Kikuka Sho" ++ " (Alternate 1)" 148 -> "Kikuka Sho" ++ " (Alternate 148)"
149 -> "Spring S." ++ " (Alternate 1)" 149 -> "Spring S." ++ " (Alternate 149)"
150 -> "Aoi S." 150 -> "Aoi S."
151 -> "Senior Spring Triple Crown" ++ " (Alternate 2)" 151 -> "Senior Spring Triple Crown" ++ " (Alternate 151)"
152 -> "Tenno Sweep" ++ " (Alternate 1)" 152 -> "Tenno Sweep" ++ " (Alternate 152)"
153 -> "Tenno Sho (Spring)" ++ " (Alternate 1)" 153 -> "Tenno Sho (Spring)" ++ " (Alternate 153)"
154 -> "Classic Triple Crown" ++ " (Alternate 2)" 154 -> "Classic Triple Crown" ++ " (Alternate 154)"
155 -> "Satsuki Sho" ++ " (Alternate 1)" 155 -> "Satsuki Sho" ++ " (Alternate 155)"
x -> "saddle " ++ x.show x -> "saddle " ++ x.show
// Get the list of races that entitle a horse to a saddle. // Get the list of races that entitle a horse to a saddle.

View File

@@ -328,6 +328,7 @@ type Race struct {
Grade int Grade int
ThumbnailID int ThumbnailID int
Primary int Primary int
Alternate int
} }
func Races(ctx context.Context, db *sqlitex.Pool) ([]Race, error) { func Races(ctx context.Context, db *sqlitex.Pool) ([]Race, error) {
@@ -357,6 +358,7 @@ func Races(ctx context.Context, db *sqlitex.Pool) ([]Race, error) {
Grade: stmt.ColumnInt(2), Grade: stmt.ColumnInt(2),
ThumbnailID: stmt.ColumnInt(3), ThumbnailID: stmt.ColumnInt(3),
Primary: stmt.ColumnInt(4), Primary: stmt.ColumnInt(4),
Alternate: stmt.ColumnInt(5),
} }
r = append(r, race) r = append(r, race)
} }

View File

@@ -7,15 +7,15 @@ import . "git.sunturtle.xyz/zephyr/horse/horse"
const ( const (
{{- range $r := $.Races }} {{- range $r := $.Races }}
Race{{ goenum $r.Name }}{{ if ne $r.Primary $r.ID }}Alternate{{ end }} RaceID = {{ $r.ID }} // {{ $r.Name }} Race{{ goenum $r.Name }}{{ if $r.Alternate }}Alt{{ $r.ID }}{{ end }} RaceID = {{ $r.ID }} // {{ $r.Name }}
{{- end }} {{- end }}
) )
var AllRaces = map[RaceID]Race{ var AllRaces = map[RaceID]Race{
{{- range $r := $.Races }} {{- range $r := $.Races }}
Race{{ goenum $r.Name }}{{ if ne $r.Primary $r.ID }}Alternate{{ end }}: { Race{{ goenum $r.Name }}{{ if $r.Alternate }}Alt{{ $r.ID }}{{ end }}: {
ID: {{ $r.ID }}, ID: {{ $r.ID }},
Name: {{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} + " (Alternate)"{{ end }}, Name: {{ printf "%q" $r.Name }}{{ if $r.Alternate }} + " (Alternate {{ $r.ID }})"{{ end }},
Thumbnail: {{ $r.ThumbnailID }}, Thumbnail: {{ $r.ThumbnailID }},
{{- if ne $r.Primary $r.ID }} {{- if ne $r.Primary $r.ID }}
Primary: {{ $r.Primary }}, Primary: {{ $r.Primary }},
@@ -26,7 +26,7 @@ var AllRaces = map[RaceID]Race{
var RaceNameToID = map[string]RaceID{ var RaceNameToID = map[string]RaceID{
{{- range $r := $.Races }} {{- range $r := $.Races }}
{{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} + " (Alternate)"{{ end }}: {{ $r.ID }}, {{ printf "%q" $r.Name }}{{ if $r.Alternate }} + " (Alternate {{ $r.ID }})"{{ end }}: {{ $r.ID }},
{{- end }} {{- end }}
} }
{{ end }} {{ end }}

View File

@@ -10,41 +10,41 @@ pub import horse/race
// Enumeration of all races for type-safe programming. // Enumeration of all races for type-safe programming.
pub type race pub type race
{{- range $r := $.Races }} {{- range $r := $.Races }}
{{ kkenum $r.Name }}{{ if ne $r.Primary $r.ID }}-Alternate{{ end }} {{ kkenum $r.Name }}{{ if $r.Alternate }}-Alt{{ $r.ID }}{{ end }}
{{- end }} {{- end }}
// Get the race ID for a race. // Get the race ID for a race.
pub fun race-id(r: race): race-id pub fun race-id(r: race): race-id
match r match r
{{- range $r := $.Races }} {{- range $r := $.Races }}
{{ kkenum $r.Name }}{{ if ne $r.Primary $r.ID }}-Alternate{{ end }} -> Race-id({{ $r.ID }}) {{ kkenum $r.Name }}{{ if $r.Alternate }}-Alt{{ $r.ID }}{{ end }} -> Race-id({{ $r.ID }})
{{- end }} {{- end }}
// List of all races in ID order for easy iterating. // List of all races in ID order for easy iterating.
pub val all = [ pub val all = [
{{- range $r := $.Races }} {{- range $r := $.Races }}
{{ kkenum $r.Name }}{{ if ne $r.Primary $r.ID }}-Alternate{{ end }}, {{ kkenum $r.Name }}{{ if $r.Alternate }}-Alt{{ $r.ID }}{{ end }},
{{- end }} {{- end }}
] ]
val name2id: rbmap<string, race-id> = rb-map/empty() val name2id: rbmap<string, race-id> = rb-map/empty()
{{- range $r := $.Races }} {{- range $r := $.Races }}
.set({{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} ++ " (Alternate)"{{ end }}, Race-id({{ $r.ID }})) .set({{ printf "%q" $r.Name }}{{ if $r.Alternate }} ++ " (Alternate {{ $r.ID }})"{{ end }}, Race-id({{ $r.ID }}))
{{- end }} {{- end }}
// Get the race ID that has the given exact name. // Get the race ID that has the given exact name.
// Alternate versions of races have " (Alternate)" in their names. // Alternate versions of races have an indication of their ID in their names.
// If no race matches the name, the result is an invalid ID. // If no race matches the name, the result is an invalid ID.
pub fun from-name(name: string): race-id pub fun from-name(name: string): race-id
name2id.lookup(name).default(Race-id(0)) name2id.lookup(name).default(Race-id(0))
// Get the name for a race. // Get the name for a race.
// Alternate versions of races have " (Alternate)" in their names. // Alternate versions of races have an indication of their ID in their names.
// If no race matches the ID, the result is the numeric ID. // If no race matches the ID, the result is the numeric ID.
pub fun show(r: race-id): string pub fun show(r: race-id): string
match r.game-id match r.game-id
{{- range $r := $.Races }} {{- range $r := $.Races }}
{{ $r.ID }} -> {{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} ++ " (Alternate)"{{ end }} {{ $r.ID }} -> {{ printf "%q" $r.Name }}{{ if $r.Alternate }} ++ " (Alternate {{ $r.ID }})"{{ end }}
{{- end }} {{- end }}
x -> "race " ++ x.show x -> "race " ++ x.show
@@ -72,7 +72,7 @@ pub fun thumbnail(r: race-id): race-thumbnail-id
pub fun primary(r: race-id): race-id pub fun primary(r: race-id): race-id
match r.game-id match r.game-id
{{- range $r := $.Races }} {{- range $r := $.Races }}
{{- if ne $r.ID $r.Primary }} {{- if $r.Alternate }}
{{ $r.ID }} -> Race-id({{ $r.Primary }}) {{ $r.ID }} -> Race-id({{ $r.Primary }})
{{- end }} {{- end }}
{{- end }} {{- end }}

View File

@@ -6,7 +6,8 @@ SELECT
race_names.name, race_names.name,
race.grade, race.grade,
race.thumbnail_id, race.thumbnail_id,
MIN(race.id) OVER (PARTITION BY race_names.name) AS "primary" MIN(race.id) OVER (PARTITION BY race_names.name) AS "primary",
ROW_NUMBER() OVER (PARTITION BY race_names.name ORDER BY race.id) - 1 AS "alternate"
FROM race FROM race
JOIN race_names ON race.id = race_names.id JOIN race_names ON race.id = race_names.id
WHERE race."group" = 1 WHERE race."group" = 1

View File

@@ -10,30 +10,30 @@ pub import horse/{{ $.Region }}/race
// Enumeration of all saddles for type-safe programming. // Enumeration of all saddles for type-safe programming.
pub type saddle pub type saddle
{{- range $s := $.Saddles }} {{- range $s := $.Saddles }}
{{ kkenum $s.Name }}{{ if $s.Alternate }}-Alt{{ $s.Alternate }}{{ end }} {{ kkenum $s.Name }}{{ if $s.Alternate }}-Alt{{ $s.ID }}{{ end }}
{{- end }} {{- end }}
// Get the saddle ID for a saddle. // Get the saddle ID for a saddle.
pub fun saddle-id(s: saddle): saddle-id pub fun saddle-id(s: saddle): saddle-id
match s match s
{{- range $s := $.Saddles }} {{- range $s := $.Saddles }}
{{ kkenum $s.Name }}{{ if $s.Alternate }}-Alt{{ $s.Alternate }}{{ end }} -> Saddle-id({{ $s.ID }}) {{ kkenum $s.Name }}{{ if $s.Alternate }}-Alt{{ $s.ID }}{{ end }} -> Saddle-id({{ $s.ID }})
{{- end }} {{- end }}
// List of all saddles in ID order for easy iterating. // List of all saddles in ID order for easy iterating.
pub val all = [ pub val all = [
{{- range $s := $.Saddles }} {{- range $s := $.Saddles }}
{{ kkenum $s.Name }}{{ if $s.Alternate }}-Alt{{ $s.Alternate }}{{ end }}, {{ kkenum $s.Name }}{{ if $s.Alternate }}-Alt{{ $s.ID }}{{ end }},
{{- end }} {{- end }}
] ]
// Get the name for a saddle. // Get the name for a saddle.
// Alternate versions of saddles have an indication of such in their names. // Alternate versions of saddles have an indication of their ID in their names.
// If no saddle matches the ID, the result contains the numeric ID. // If no saddle matches the ID, the result contains the numeric ID.
pub fun show(s: saddle-id): string pub fun show(s: saddle-id): string
match s.game-id match s.game-id
{{- range $s := $.Saddles }} {{- range $s := $.Saddles }}
{{ $s.ID }} -> {{ printf "%q" $s.Name }}{{ if $s.Alternate }} ++ " (Alternate {{ $s.Alternate }})"{{ end }} {{ $s.ID }} -> {{ printf "%q" $s.Name }}{{ if $s.Alternate }} ++ " (Alternate {{ $s.ID }})"{{ end }}
{{- end }} {{- end }}
x -> "saddle " ++ x.show x -> "saddle " ++ x.show