From 34edcf97a71e8263267bb3c3690de2cf822c0f62 Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Fri, 30 Jan 2026 23:25:44 -0500 Subject: [PATCH] horsegen: generate races --- horse/game-id.kk | 14 + horse/global/race.go | 2006 ++++++++++++++++++++++++++++++++++++ horse/global/race.kk | 2044 +++++++++++++++++++++++++++++++++++++ horse/race.go | 17 + horse/race.kk | 669 +----------- horsegen/gen.go | 23 +- horsegen/load.go | 44 + horsegen/main.go | 20 + horsegen/race.go.template | 32 + horsegen/race.kk.template | 80 ++ horsegen/race.sql | 13 + 11 files changed, 4316 insertions(+), 646 deletions(-) create mode 100644 horse/global/race.go create mode 100644 horse/global/race.kk create mode 100644 horse/race.go create mode 100644 horsegen/race.go.template create mode 100644 horsegen/race.kk.template create mode 100644 horsegen/race.sql diff --git a/horse/game-id.kk b/horse/game-id.kk index ad8f3c4..168f6a3 100644 --- a/horse/game-id.kk +++ b/horse/game-id.kk @@ -29,6 +29,20 @@ pub struct skill-group-id 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 instances, +// i.e. "Tenno Sho (Spring) at Kyoto Racecourse" vs. "Tenno Sho (Spring) at Hanshin." +pub struct race-instance-id + game-id: game-id + +// Game ID for race thumbnails. +pub struct race-thumbnail-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 match x.game-id.cmp(y.game-id) diff --git a/horse/global/race.go b/horse/global/race.go new file mode 100644 index 0000000..9f958cb --- /dev/null +++ b/horse/global/race.go @@ -0,0 +1,2006 @@ +package global + +// Automatically generated with horsegen; DO NOT EDIT + +import . "git.sunturtle.xyz/zephyr/horse/horse" + +const ( + RaceFebruaryStakes RaceID = 1001 // February Stakes + RaceTakamatsunomiyaKinen RaceID = 1002 // Takamatsunomiya Kinen + RaceOsakaHai RaceID = 1003 // Osaka Hai + RaceOkaSho RaceID = 1004 // Oka Sho + RaceSatsukiSho RaceID = 1005 // Satsuki Sho + RaceTennoShoSpring RaceID = 1006 // Tenno Sho (Spring) + RaceNHKMileCup RaceID = 1007 // NHK Mile Cup + RaceVictoriaMile RaceID = 1008 // Victoria Mile + RaceJapaneseOaks RaceID = 1009 // Japanese Oaks + RaceTokyoYushunJapaneseDerby RaceID = 1010 // Tokyo Yushun (Japanese Derby) + RaceYasudaKinen RaceID = 1011 // Yasuda Kinen + RaceTakarazukaKinen RaceID = 1012 // Takarazuka Kinen + RaceSprintersStakes RaceID = 1013 // Sprinters Stakes + RaceShukaSho RaceID = 1014 // Shuka Sho + RaceKikukaSho RaceID = 1015 // Kikuka Sho + RaceTennoShoAutumn RaceID = 1016 // Tenno Sho (Autumn) + RaceQueenElizabethIICup RaceID = 1017 // Queen Elizabeth II Cup + RaceMileChampionship RaceID = 1018 // Mile Championship + RaceJapanCup RaceID = 1019 // Japan Cup + RaceChampionsCup RaceID = 1020 // Champions Cup + RaceHanshinJuvenileFillies RaceID = 1021 // Hanshin Juvenile Fillies + RaceAsahiHaiFuturityStakes RaceID = 1022 // Asahi Hai Futurity Stakes + RaceArimaKinen RaceID = 1023 // Arima Kinen + RaceHopefulStakes RaceID = 1024 // Hopeful Stakes + RaceTakarazukaKinenAlternate RaceID = 1025 // Takarazuka Kinen + RaceKikukaShoAlternate RaceID = 1026 // Kikuka Sho + RaceTennoShoSpringAlternate RaceID = 1027 // Tenno Sho (Spring) + RaceTeioSho RaceID = 1101 // Teio Sho + RaceJapanDirtDerby RaceID = 1102 // Japan Dirt Derby + RaceJBCLadiesClassic RaceID = 1103 // JBC Ladies’ Classic + RaceJBCSprint RaceID = 1104 // JBC Sprint + RaceJBCClassic RaceID = 1105 // JBC Classic + RaceTokyoDaishoten RaceID = 1106 // Tokyo Daishoten + RaceNikkeiShinshunHai RaceID = 2001 // Nikkei Shinshun Hai + RaceTokaiStakes RaceID = 2002 // Tokai Stakes + RaceAmericanJCC RaceID = 2003 // American JCC + RaceKyotoKinen RaceID = 2004 // Kyoto Kinen + RaceNakayamaKinen RaceID = 2005 // Nakayama Kinen + RaceYayoiSho RaceID = 2006 // Yayoi Sho + RaceKinkoSho RaceID = 2007 // Kinko Sho + RaceFilliesRevue RaceID = 2008 // Fillies' Revue + RaceHanshinDaishoten RaceID = 2009 // Hanshin Daishoten + RaceSpringStakes RaceID = 2010 // Spring Stakes + RaceNikkeiSho RaceID = 2011 // Nikkei Sho + RaceHanshinUmamusumeStakes RaceID = 2012 // Hanshin Umamusume Stakes + RaceNewZealandTrophy RaceID = 2013 // New Zealand Trophy + RaceMilersCup RaceID = 2014 // Milers Cup + RaceFloraStakes RaceID = 2015 // Flora Stakes + RaceAobaSho RaceID = 2016 // Aoba Sho + RaceKyotoShimbunHai RaceID = 2017 // Kyoto Shimbun Hai + RaceKeioHaiSpringCup RaceID = 2018 // Keio Hai Spring Cup + RaceMeguroKinen RaceID = 2019 // Meguro Kinen + RaceSapporoKinen RaceID = 2020 // Sapporo Kinen + RaceCentaurStakes RaceID = 2021 // Centaur Stakes + RaceRoseStakes RaceID = 2022 // Rose Stakes + RaceStLiteKinen RaceID = 2023 // St. Lite Kinen + RaceKobeShimbunHai RaceID = 2024 // Kobe Shimbun Hai + RaceAllComers RaceID = 2025 // All Comers + RaceMainichiOkan RaceID = 2026 // Mainichi Okan + RaceKyotoDaishoten RaceID = 2027 // Kyoto Daishoten + RaceFuchuUmamusumeStakes RaceID = 2028 // Fuchu Umamusume Stakes + RaceSwanStakes RaceID = 2029 // Swan Stakes + RaceKeioHaiJuniorStakes RaceID = 2030 // Keio Hai Junior Stakes + RaceCopaRepublicaArgentina RaceID = 2031 // Copa Republica Argentina + RaceDailyHaiJuniorStakes RaceID = 2032 // Daily Hai Junior Stakes + RaceStayersStakes RaceID = 2033 // Stayers Stakes + RaceHanshinCup RaceID = 2034 // Hanshin Cup + RaceSpringStakesAlternate RaceID = 2035 // Spring Stakes + RaceKyotoKimpai RaceID = 3001 // Kyoto Kimpai + RaceNakayamaKimpai RaceID = 3002 // Nakayama Kimpai + RaceShinzanKinen RaceID = 3003 // Shinzan Kinen + RaceFairyStakes RaceID = 3004 // Fairy Stakes + RaceAichiHai RaceID = 3005 // Aichi Hai + RaceKeiseiHai RaceID = 3006 // Keisei Hai + RaceSilkRoadStakes RaceID = 3007 // Silk Road Stakes + RaceNegishiStakes RaceID = 3008 // Negishi Stakes + RaceKisaragiSho RaceID = 3009 // Kisaragi Sho + RaceTokyoShimbunHai RaceID = 3010 // Tokyo Shimbun Hai + RaceQueenCup RaceID = 3011 // Queen Cup + RaceKyodoNewsHai RaceID = 3012 // Kyodo News Hai + RaceKyotoUmamusumeStakes RaceID = 3013 // Kyoto Umamusume Stakes + RaceDiamondStakes RaceID = 3014 // Diamond Stakes + RaceKokuraDaishoten RaceID = 3015 // Kokura Daishoten + RaceArlingtonCup RaceID = 3016 // Arlington Cup + RaceHankyuHai RaceID = 3017 // Hankyu Hai + RaceTulipSho RaceID = 3018 // Tulip Sho + RaceOceanStakes RaceID = 3019 // Ocean Stakes + RaceNakayamaUmamusumeStakes RaceID = 3020 // Nakayama Umamusume Stakes + RaceFalconStakes RaceID = 3021 // Falcon Stakes + RaceFlowerCup RaceID = 3022 // Flower Cup + RaceMainichiHai RaceID = 3023 // Mainichi Hai + RaceMarchStakes RaceID = 3024 // March Stakes + RaceLordDerbyChallengeTrophy RaceID = 3025 // Lord Derby Challenge Trophy + RaceAntaresStakes RaceID = 3026 // Antares Stakes + RaceFukushimaUmamusumeStakes RaceID = 3027 // Fukushima Umamusume Stakes + RaceNiigataDaishoten RaceID = 3028 // Niigata Daishoten + RaceHeianStakes RaceID = 3029 // Heian Stakes + RaceNaruoKinen RaceID = 3030 // Naruo Kinen + RaceMermaidStakes RaceID = 3031 // Mermaid Stakes + RaceEpsomCup RaceID = 3032 // Epsom Cup + RaceUnicornStakes RaceID = 3033 // Unicorn Stakes + RaceHakodateSprintStakes RaceID = 3034 // Hakodate Sprint Stakes + RaceCBCSho RaceID = 3035 // CBC Sho + RaceRadioNikkeiSho RaceID = 3036 // Radio Nikkei Sho + RaceProcyonStakes RaceID = 3037 // Procyon Stakes + RaceTanabataSho RaceID = 3038 // Tanabata Sho + RaceHakodateKinen RaceID = 3039 // Hakodate Kinen + RaceChukyoKinen RaceID = 3040 // Chukyo Kinen + RaceHakodateJuniorStakes RaceID = 3041 // Hakodate Junior Stakes + RaceIbisSummerDash RaceID = 3042 // Ibis Summer Dash + RaceQueenStakes RaceID = 3043 // Queen Stakes + RaceKokuraKinen RaceID = 3044 // Kokura Kinen + RaceLeopardStakes RaceID = 3045 // Leopard Stakes + RaceSekiyaKinen RaceID = 3046 // Sekiya Kinen + RaceElmStakes RaceID = 3047 // Elm Stakes + RaceKitakyushuKinen RaceID = 3048 // Kitakyushu Kinen + RaceNiigataJuniorStakes RaceID = 3049 // Niigata Junior Stakes + RaceKeenelandCup RaceID = 3050 // Keeneland Cup + RaceSapporoJuniorStakes RaceID = 3051 // Sapporo Junior Stakes + RaceKokuraJuniorStakes RaceID = 3052 // Kokura Junior Stakes + RaceNiigataKinen RaceID = 3053 // Niigata Kinen + RaceShionStakes RaceID = 3054 // Shion Stakes + RaceKeiseiHaiAutumnHandicap RaceID = 3055 // Keisei Hai Autumn Handicap + RaceSiriusStakes RaceID = 3056 // Sirius Stakes + RaceSaudiArabiaRoyalCup RaceID = 3057 // Saudi Arabia Royal Cup + RaceFujiStakes RaceID = 3058 // Fuji Stakes + RaceArtemisStakes RaceID = 3059 // Artemis Stakes + RaceFantasyStakes RaceID = 3060 // Fantasy Stakes + RaceMiyakoStakes RaceID = 3061 // Miyako Stakes + RaceMusashinoStakes RaceID = 3062 // Musashino Stakes + RaceFukushimaKinen RaceID = 3063 // Fukushima Kinen + RaceTokyoSportsHaiJuniorStakes RaceID = 3064 // Tokyo Sports Hai Junior Stakes + RaceKyotoJuniorStakes RaceID = 3065 // Kyoto Junior Stakes + RaceKeihanHai RaceID = 3066 // Keihan Hai + RaceChallengeCup RaceID = 3067 // Challenge Cup + RaceChunichiShimbunHai RaceID = 3068 // Chunichi Shimbun Hai + RaceCapellaStakes RaceID = 3069 // Capella Stakes + RaceTurquoiseStakes RaceID = 3070 // Turquoise Stakes + RaceManyoStakes RaceID = 4001 // Manyo Stakes + RaceJuniorCup RaceID = 4002 // Junior Cup + RaceYodoTankyoriStakes RaceID = 4003 // Yodo Tankyori Stakes + RacePolluxStakes RaceID = 4004 // Pollux Stakes + RaceJanuaryStakes RaceID = 4005 // January Stakes + RaceNewYearStakes RaceID = 4006 // New Year Stakes + RaceKobaiStakes RaceID = 4007 // Kobai Stakes + RaceSubaruStakes RaceID = 4008 // Subaru Stakes + RaceWakagomaStakes RaceID = 4009 // Wakagoma Stakes + RaceCarbuncleStakes RaceID = 4010 // Carbuncle Stakes + RaceShirafujiStakes RaceID = 4011 // Shirafuji Stakes + RaceCrocusStakes RaceID = 4012 // Crocus Stakes + RaceYamatoStakes RaceID = 4013 // Yamato Stakes + RaceElfinStakes RaceID = 4014 // Elfin Stakes + RaceRakuyoStakes RaceID = 4015 // Rakuyo Stakes + RaceAldebaranStakes RaceID = 4016 // Aldebaran Stakes + RaceValentineStakes RaceID = 4017 // Valentine Stakes + RaceHyacinthStakes RaceID = 4018 // Hyacinth Stakes + RaceSobuStakes RaceID = 4019 // Sobu Stakes + RaceSumireStakes RaceID = 4020 // Sumire Stakes + RaceOsakajoStakes RaceID = 4021 // Osakajo Stakes + RacePolarisStakes RaceID = 4022 // Polaris Stakes + RaceNigawaStakes RaceID = 4023 // Nigawa Stakes + RaceAnemoneStakes RaceID = 4024 // Anemone Stakes + RaceShoryuStakes RaceID = 4025 // Shoryu Stakes + RaceKochiStakes RaceID = 4026 // Kochi Stakes + RaceWakabaStakes RaceID = 4027 // Wakaba Stakes + RaceChibaStakes RaceID = 4028 // Chiba Stakes + RaceRokkoStakes RaceID = 4030 // Rokko Stakes + RaceCoralStakes RaceID = 4031 // Coral Stakes + RaceMargueriteStakes RaceID = 4032 // Marguerite Stakes + RaceFukuryuStakes RaceID = 4033 // Fukuryu Stakes + RaceWasurenagusaSho RaceID = 4035 // Wasurenagusa Sho + RaceKeiyoStakes RaceID = 4036 // Keiyo Stakes + RaceShunraiStakes RaceID = 4037 // Shunrai Stakes + RaceFukushimaMimpoHai RaceID = 4038 // Fukushima Mimpo Hai + RaceTachibanaStakes RaceID = 4039 // Tachibana Stakes + RaceOasisStakes RaceID = 4040 // Oasis Stakes + RaceTennozanStakes RaceID = 4041 // Tennozan Stakes + RaceTangoStakes RaceID = 4042 // Tango Stakes + RaceSweetpeaStakes RaceID = 4043 // Sweetpea Stakes + RaceTanigawadakeStakes RaceID = 4044 // Tanigawadake Stakes + RacePrincipalStakes RaceID = 4045 // Principal Stakes + RaceMetropolitanStakes RaceID = 4046 // Metropolitan Stakes + RaceKuramaStakes RaceID = 4047 // Kurama Stakes + RaceBrilliantStakes RaceID = 4048 // Brilliant Stakes + RaceMiyakoojiStakes RaceID = 4049 // Miyakooji Stakes + RaceAoiStakes RaceID = 4050 // Aoi Stakes + RaceRittoStakes RaceID = 4051 // Ritto Stakes + RaceSeiryuStakes RaceID = 4052 // Seiryu Stakes + RaceMayStakes RaceID = 4053 // May Stakes + RaceHosuStakes RaceID = 4054 // Hosu Stakes + RaceIdatenStakes RaceID = 4055 // Idaten Stakes + RaceShirayuriStakes RaceID = 4056 // Shirayuri Stakes + RaceKeyakiStakes RaceID = 4057 // Keyaki Stakes + RaceAzuchijoStakes RaceID = 4058 // Azuchijo Stakes + RaceAkhaltekeStakes RaceID = 4059 // Akhalteke Stakes + RaceTempozanStakes RaceID = 4060 // Tempozan Stakes + RaceYonagoStakes RaceID = 4061 // Yonago Stakes + RaceOnumaStakes RaceID = 4062 // Onuma Stakes + RaceParadiseStakes RaceID = 4063 // Paradise Stakes + RaceTomoeSho RaceID = 4064 // Tomoe Sho + RaceMarineStakes RaceID = 4065 // Marine Stakes + RaceMeitetsuHai RaceID = 4066 // Meitetsu Hai + RaceChukyoJuniorStakes RaceID = 4068 // Chukyo Junior Stakes + RaceFukushimaTVOpen RaceID = 4069 // Fukushima TV Open + RaceDahliaSho RaceID = 4070 // Dahlia Sho + RaceSapporoNikkeiOpen RaceID = 4071 // Sapporo Nikkei Open + RaceUHBSho RaceID = 4072 // UHB Sho + RaceAsoStakes RaceID = 4073 // Aso Stakes + RacePhoenixSho RaceID = 4074 // Phoenix Sho + RaceCosmosSho RaceID = 4075 // Cosmos Sho + RaceNSTSho RaceID = 4076 // NST Sho + RaceCloverSho RaceID = 4077 // Clover Sho + RaceHimawariSho RaceID = 4078 // Himawari Sho + RaceBSNSho RaceID = 4079 // BSN Sho + RaceKokuraNikkeiOpen RaceID = 4080 // Kokura Nikkei Open + RaceTokiStakes RaceID = 4081 // Toki Stakes + RaceTanchoStakes RaceID = 4082 // Tancho Stakes + RaceSuzuranSho RaceID = 4083 // Suzuran Sho + RaceEnifStakes RaceID = 4084 // Enif Stakes + RaceNojigikuStakes RaceID = 4085 // Nojigiku Stakes + RaceRadioNipponSho RaceID = 4086 // Radio Nippon Sho + RaceKikyoStakes RaceID = 4087 // Kikyo Stakes + RaceFuyoStakes RaceID = 4088 // Fuyo Stakes + RaceCannaStakes RaceID = 4089 // Canna Stakes + RacePortIslandStakes RaceID = 4090 // Port Island Stakes + RaceOpalStakes RaceID = 4091 // Opal Stakes + RaceGreenChannelCup RaceID = 4092 // Green Channel Cup + RaceMomijiStakes RaceID = 4093 // Momiji Stakes + RaceOctoberStakes RaceID = 4094 // October Stakes + RaceShinetsuStakes RaceID = 4095 // Shinetsu Stakes + RaceIvyStakes RaceID = 4096 // Ivy Stakes + RaceMuromachiStakes RaceID = 4097 // Muromachi Stakes + RaceBrazilCup RaceID = 4098 // Brazil Cup + RaceHagiStakes RaceID = 4099 // Hagi Stakes + RaceCassiopeiaStakes RaceID = 4100 // Cassiopeia Stakes + RaceLumiereAutumnDash RaceID = 4101 // Lumiere Autumn Dash + RaceOroCup RaceID = 4102 // Oro Cup + RaceFukushimaJuniorStakes RaceID = 4103 // Fukushima Junior Stakes + RaceAndromedaStakes RaceID = 4104 // Andromeda Stakes + RaceShimotsukiStakes RaceID = 4105 // Shimotsuki Stakes + RaceFukushimaMinyuCup RaceID = 4106 // Fukushima Minyu Cup + RaceCapitalStakes RaceID = 4107 // Capital Stakes + RaceAutumnLeafStakes RaceID = 4108 // Autumn Leaf Stakes + RaceLapisLazuliStakes RaceID = 4109 // Lapis Lazuli Stakes + RaceShiwasuStakes RaceID = 4110 // Shiwasu Stakes + RaceRigelStakes RaceID = 4111 // Rigel Stakes + RaceTanzaniteStakes RaceID = 4112 // Tanzanite Stakes + RaceDecemberStakes RaceID = 4113 // December Stakes + RaceChristmasRoseStakes RaceID = 4114 // Christmas Rose Stakes + RaceGalaxyStakes RaceID = 4115 // Galaxy Stakes + RaceBetelgeuseStakes RaceID = 4116 // Betelgeuse Stakes + RaceKitakyushuTankyoriStakes RaceID = 4118 // Kitakyushu Tankyori Stakes + RaceAzumakofujiStakes RaceID = 4119 // Azumakofuji Stakes + RaceSleipnirStakes RaceID = 4120 // Sleipnir Stakes + RaceSannomiyaStakes RaceID = 4121 // Sannomiya Stakes + RaceKanetsuStakes RaceID = 4122 // Kanetsu Stakes + RaceNagatsukiStakes RaceID = 4123 // Nagatsuki Stakes + RaceUzumasaStakes RaceID = 4124 // Uzumasa Stakes + RaceAsterSho RaceID = 4501 // Aster Sho + RaceSaffronSho RaceID = 4502 // Saffron Sho + RaceRindoSho RaceID = 4503 // Rindo Sho + RaceShigikuSho RaceID = 4504 // Shigiku Sho + RacePlatanusSho RaceID = 4505 // Platanus Sho + RaceNadeshikoSho RaceID = 4506 // Nadeshiko Sho + RaceHyakunichisoTokubetsu RaceID = 4507 // Hyakunichiso Tokubetsu + RaceKimmokuseiTokubetsu RaceID = 4508 // Kimmokusei Tokubetsu + RaceOxalisSho RaceID = 4509 // Oxalis Sho + RaceKigikuSho RaceID = 4510 // Kigiku Sho + RaceMochinokiSho RaceID = 4511 // Mochinoki Sho + RaceAkamatsuSho RaceID = 4512 // Akamatsu Sho + RaceShumeigikuSho RaceID = 4513 // Shumeigiku Sho + RaceCattleyaSho RaceID = 4514 // Cattleya Sho + RaceBegoniaSho RaceID = 4515 // Begonia Sho + RaceShiragikuSho RaceID = 4516 // Shiragiku Sho + RaceHabotanSho RaceID = 4517 // Habotan Sho + RaceKoyamakiSho RaceID = 4518 // Koyamaki Sho + RaceManryoSho RaceID = 4519 // Manryo Sho + RaceKuromatsuSho RaceID = 4520 // Kuromatsu Sho + RaceEricaSho RaceID = 4521 // Erica Sho + RaceTsuwabukiSho RaceID = 4522 // Tsuwabuki Sho + RaceHiiragiSho RaceID = 4523 // Hiiragi Sho + RaceSazankaSho RaceID = 4524 // Sazanka Sho + RaceKantsubakiSho RaceID = 4525 // Kantsubaki Sho + RaceSenryoSho RaceID = 4526 // Senryo Sho +) + +var AllRaces = map[RaceID]Race{ + RaceFebruaryStakes: { + ID: 1001, + Name: "February Stakes", + Thumbnail: 1001, + }, + RaceTakamatsunomiyaKinen: { + ID: 1002, + Name: "Takamatsunomiya Kinen", + Thumbnail: 1002, + }, + RaceOsakaHai: { + ID: 1003, + Name: "Osaka Hai", + Thumbnail: 1003, + }, + RaceOkaSho: { + ID: 1004, + Name: "Oka Sho", + Thumbnail: 1004, + }, + RaceSatsukiSho: { + ID: 1005, + Name: "Satsuki Sho", + Thumbnail: 1005, + }, + RaceTennoShoSpring: { + ID: 1006, + Name: "Tenno Sho (Spring)", + Thumbnail: 1006, + }, + RaceNHKMileCup: { + ID: 1007, + Name: "NHK Mile Cup", + Thumbnail: 1007, + }, + RaceVictoriaMile: { + ID: 1008, + Name: "Victoria Mile", + Thumbnail: 1008, + }, + RaceJapaneseOaks: { + ID: 1009, + Name: "Japanese Oaks", + Thumbnail: 1009, + }, + RaceTokyoYushunJapaneseDerby: { + ID: 1010, + Name: "Tokyo Yushun (Japanese Derby)", + Thumbnail: 1010, + }, + RaceYasudaKinen: { + ID: 1011, + Name: "Yasuda Kinen", + Thumbnail: 1011, + }, + RaceTakarazukaKinen: { + ID: 1012, + Name: "Takarazuka Kinen", + Thumbnail: 1012, + }, + RaceSprintersStakes: { + ID: 1013, + Name: "Sprinters Stakes", + Thumbnail: 1013, + }, + RaceShukaSho: { + ID: 1014, + Name: "Shuka Sho", + Thumbnail: 1014, + }, + RaceKikukaSho: { + ID: 1015, + Name: "Kikuka Sho", + Thumbnail: 1015, + }, + RaceTennoShoAutumn: { + ID: 1016, + Name: "Tenno Sho (Autumn)", + Thumbnail: 1016, + }, + RaceQueenElizabethIICup: { + ID: 1017, + Name: "Queen Elizabeth II Cup", + Thumbnail: 1017, + }, + RaceMileChampionship: { + ID: 1018, + Name: "Mile Championship", + Thumbnail: 1018, + }, + RaceJapanCup: { + ID: 1019, + Name: "Japan Cup", + Thumbnail: 1019, + }, + RaceChampionsCup: { + ID: 1020, + Name: "Champions Cup", + Thumbnail: 1020, + }, + RaceHanshinJuvenileFillies: { + ID: 1021, + Name: "Hanshin Juvenile Fillies", + Thumbnail: 1021, + }, + RaceAsahiHaiFuturityStakes: { + ID: 1022, + Name: "Asahi Hai Futurity Stakes", + Thumbnail: 1022, + }, + RaceArimaKinen: { + ID: 1023, + Name: "Arima Kinen", + Thumbnail: 1023, + }, + RaceHopefulStakes: { + ID: 1024, + Name: "Hopeful Stakes", + Thumbnail: 1024, + }, + RaceTakarazukaKinenAlternate: { + ID: 1025, + Name: "Takarazuka Kinen" + " (Alternate)", + Thumbnail: 1012, + Primary: 1012, + }, + RaceKikukaShoAlternate: { + ID: 1026, + Name: "Kikuka Sho" + " (Alternate)", + Thumbnail: 1015, + Primary: 1015, + }, + RaceTennoShoSpringAlternate: { + ID: 1027, + Name: "Tenno Sho (Spring)" + " (Alternate)", + Thumbnail: 1027, + Primary: 1006, + }, + RaceTeioSho: { + ID: 1101, + Name: "Teio Sho", + Thumbnail: 1101, + }, + RaceJapanDirtDerby: { + ID: 1102, + Name: "Japan Dirt Derby", + Thumbnail: 1102, + }, + RaceJBCLadiesClassic: { + ID: 1103, + Name: "JBC Ladies’ Classic", + Thumbnail: 1103, + }, + RaceJBCSprint: { + ID: 1104, + Name: "JBC Sprint", + Thumbnail: 1104, + }, + RaceJBCClassic: { + ID: 1105, + Name: "JBC Classic", + Thumbnail: 1105, + }, + RaceTokyoDaishoten: { + ID: 1106, + Name: "Tokyo Daishoten", + Thumbnail: 1106, + }, + RaceNikkeiShinshunHai: { + ID: 2001, + Name: "Nikkei Shinshun Hai", + Thumbnail: 2001, + }, + RaceTokaiStakes: { + ID: 2002, + Name: "Tokai Stakes", + Thumbnail: 2002, + }, + RaceAmericanJCC: { + ID: 2003, + Name: "American JCC", + Thumbnail: 2003, + }, + RaceKyotoKinen: { + ID: 2004, + Name: "Kyoto Kinen", + Thumbnail: 2004, + }, + RaceNakayamaKinen: { + ID: 2005, + Name: "Nakayama Kinen", + Thumbnail: 2005, + }, + RaceYayoiSho: { + ID: 2006, + Name: "Yayoi Sho", + Thumbnail: 2006, + }, + RaceKinkoSho: { + ID: 2007, + Name: "Kinko Sho", + Thumbnail: 2007, + }, + RaceFilliesRevue: { + ID: 2008, + Name: "Fillies' Revue", + Thumbnail: 2008, + }, + RaceHanshinDaishoten: { + ID: 2009, + Name: "Hanshin Daishoten", + Thumbnail: 2009, + }, + RaceSpringStakes: { + ID: 2010, + Name: "Spring Stakes", + Thumbnail: 2010, + }, + RaceNikkeiSho: { + ID: 2011, + Name: "Nikkei Sho", + Thumbnail: 2011, + }, + RaceHanshinUmamusumeStakes: { + ID: 2012, + Name: "Hanshin Umamusume Stakes", + Thumbnail: 2012, + }, + RaceNewZealandTrophy: { + ID: 2013, + Name: "New Zealand Trophy", + Thumbnail: 2013, + }, + RaceMilersCup: { + ID: 2014, + Name: "Milers Cup", + Thumbnail: 2014, + }, + RaceFloraStakes: { + ID: 2015, + Name: "Flora Stakes", + Thumbnail: 2015, + }, + RaceAobaSho: { + ID: 2016, + Name: "Aoba Sho", + Thumbnail: 2016, + }, + RaceKyotoShimbunHai: { + ID: 2017, + Name: "Kyoto Shimbun Hai", + Thumbnail: 2017, + }, + RaceKeioHaiSpringCup: { + ID: 2018, + Name: "Keio Hai Spring Cup", + Thumbnail: 2018, + }, + RaceMeguroKinen: { + ID: 2019, + Name: "Meguro Kinen", + Thumbnail: 2019, + }, + RaceSapporoKinen: { + ID: 2020, + Name: "Sapporo Kinen", + Thumbnail: 2020, + }, + RaceCentaurStakes: { + ID: 2021, + Name: "Centaur Stakes", + Thumbnail: 2021, + }, + RaceRoseStakes: { + ID: 2022, + Name: "Rose Stakes", + Thumbnail: 2022, + }, + RaceStLiteKinen: { + ID: 2023, + Name: "St. Lite Kinen", + Thumbnail: 2023, + }, + RaceKobeShimbunHai: { + ID: 2024, + Name: "Kobe Shimbun Hai", + Thumbnail: 2024, + }, + RaceAllComers: { + ID: 2025, + Name: "All Comers", + Thumbnail: 2025, + }, + RaceMainichiOkan: { + ID: 2026, + Name: "Mainichi Okan", + Thumbnail: 2026, + }, + RaceKyotoDaishoten: { + ID: 2027, + Name: "Kyoto Daishoten", + Thumbnail: 2027, + }, + RaceFuchuUmamusumeStakes: { + ID: 2028, + Name: "Fuchu Umamusume Stakes", + Thumbnail: 2028, + }, + RaceSwanStakes: { + ID: 2029, + Name: "Swan Stakes", + Thumbnail: 2029, + }, + RaceKeioHaiJuniorStakes: { + ID: 2030, + Name: "Keio Hai Junior Stakes", + Thumbnail: 2030, + }, + RaceCopaRepublicaArgentina: { + ID: 2031, + Name: "Copa Republica Argentina", + Thumbnail: 2031, + }, + RaceDailyHaiJuniorStakes: { + ID: 2032, + Name: "Daily Hai Junior Stakes", + Thumbnail: 2032, + }, + RaceStayersStakes: { + ID: 2033, + Name: "Stayers Stakes", + Thumbnail: 2033, + }, + RaceHanshinCup: { + ID: 2034, + Name: "Hanshin Cup", + Thumbnail: 2034, + }, + RaceSpringStakesAlternate: { + ID: 2035, + Name: "Spring Stakes" + " (Alternate)", + Thumbnail: 2010, + Primary: 2010, + }, + RaceKyotoKimpai: { + ID: 3001, + Name: "Kyoto Kimpai", + Thumbnail: 3001, + }, + RaceNakayamaKimpai: { + ID: 3002, + Name: "Nakayama Kimpai", + Thumbnail: 3002, + }, + RaceShinzanKinen: { + ID: 3003, + Name: "Shinzan Kinen", + Thumbnail: 3003, + }, + RaceFairyStakes: { + ID: 3004, + Name: "Fairy Stakes", + Thumbnail: 3004, + }, + RaceAichiHai: { + ID: 3005, + Name: "Aichi Hai", + Thumbnail: 3005, + }, + RaceKeiseiHai: { + ID: 3006, + Name: "Keisei Hai", + Thumbnail: 3006, + }, + RaceSilkRoadStakes: { + ID: 3007, + Name: "Silk Road Stakes", + Thumbnail: 3007, + }, + RaceNegishiStakes: { + ID: 3008, + Name: "Negishi Stakes", + Thumbnail: 3008, + }, + RaceKisaragiSho: { + ID: 3009, + Name: "Kisaragi Sho", + Thumbnail: 3009, + }, + RaceTokyoShimbunHai: { + ID: 3010, + Name: "Tokyo Shimbun Hai", + Thumbnail: 3010, + }, + RaceQueenCup: { + ID: 3011, + Name: "Queen Cup", + Thumbnail: 3011, + }, + RaceKyodoNewsHai: { + ID: 3012, + Name: "Kyodo News Hai", + Thumbnail: 3012, + }, + RaceKyotoUmamusumeStakes: { + ID: 3013, + Name: "Kyoto Umamusume Stakes", + Thumbnail: 3013, + }, + RaceDiamondStakes: { + ID: 3014, + Name: "Diamond Stakes", + Thumbnail: 3014, + }, + RaceKokuraDaishoten: { + ID: 3015, + Name: "Kokura Daishoten", + Thumbnail: 3015, + }, + RaceArlingtonCup: { + ID: 3016, + Name: "Arlington Cup", + Thumbnail: 3016, + }, + RaceHankyuHai: { + ID: 3017, + Name: "Hankyu Hai", + Thumbnail: 3017, + }, + RaceTulipSho: { + ID: 3018, + Name: "Tulip Sho", + Thumbnail: 3018, + }, + RaceOceanStakes: { + ID: 3019, + Name: "Ocean Stakes", + Thumbnail: 3019, + }, + RaceNakayamaUmamusumeStakes: { + ID: 3020, + Name: "Nakayama Umamusume Stakes", + Thumbnail: 3020, + }, + RaceFalconStakes: { + ID: 3021, + Name: "Falcon Stakes", + Thumbnail: 3021, + }, + RaceFlowerCup: { + ID: 3022, + Name: "Flower Cup", + Thumbnail: 3022, + }, + RaceMainichiHai: { + ID: 3023, + Name: "Mainichi Hai", + Thumbnail: 3023, + }, + RaceMarchStakes: { + ID: 3024, + Name: "March Stakes", + Thumbnail: 3024, + }, + RaceLordDerbyChallengeTrophy: { + ID: 3025, + Name: "Lord Derby Challenge Trophy", + Thumbnail: 3025, + }, + RaceAntaresStakes: { + ID: 3026, + Name: "Antares Stakes", + Thumbnail: 3026, + }, + RaceFukushimaUmamusumeStakes: { + ID: 3027, + Name: "Fukushima Umamusume Stakes", + Thumbnail: 3027, + }, + RaceNiigataDaishoten: { + ID: 3028, + Name: "Niigata Daishoten", + Thumbnail: 3028, + }, + RaceHeianStakes: { + ID: 3029, + Name: "Heian Stakes", + Thumbnail: 3029, + }, + RaceNaruoKinen: { + ID: 3030, + Name: "Naruo Kinen", + Thumbnail: 3030, + }, + RaceMermaidStakes: { + ID: 3031, + Name: "Mermaid Stakes", + Thumbnail: 3031, + }, + RaceEpsomCup: { + ID: 3032, + Name: "Epsom Cup", + Thumbnail: 3032, + }, + RaceUnicornStakes: { + ID: 3033, + Name: "Unicorn Stakes", + Thumbnail: 3033, + }, + RaceHakodateSprintStakes: { + ID: 3034, + Name: "Hakodate Sprint Stakes", + Thumbnail: 3034, + }, + RaceCBCSho: { + ID: 3035, + Name: "CBC Sho", + Thumbnail: 3035, + }, + RaceRadioNikkeiSho: { + ID: 3036, + Name: "Radio Nikkei Sho", + Thumbnail: 3036, + }, + RaceProcyonStakes: { + ID: 3037, + Name: "Procyon Stakes", + Thumbnail: 3037, + }, + RaceTanabataSho: { + ID: 3038, + Name: "Tanabata Sho", + Thumbnail: 3038, + }, + RaceHakodateKinen: { + ID: 3039, + Name: "Hakodate Kinen", + Thumbnail: 3039, + }, + RaceChukyoKinen: { + ID: 3040, + Name: "Chukyo Kinen", + Thumbnail: 3040, + }, + RaceHakodateJuniorStakes: { + ID: 3041, + Name: "Hakodate Junior Stakes", + Thumbnail: 3041, + }, + RaceIbisSummerDash: { + ID: 3042, + Name: "Ibis Summer Dash", + Thumbnail: 3042, + }, + RaceQueenStakes: { + ID: 3043, + Name: "Queen Stakes", + Thumbnail: 3043, + }, + RaceKokuraKinen: { + ID: 3044, + Name: "Kokura Kinen", + Thumbnail: 3044, + }, + RaceLeopardStakes: { + ID: 3045, + Name: "Leopard Stakes", + Thumbnail: 3045, + }, + RaceSekiyaKinen: { + ID: 3046, + Name: "Sekiya Kinen", + Thumbnail: 3046, + }, + RaceElmStakes: { + ID: 3047, + Name: "Elm Stakes", + Thumbnail: 3047, + }, + RaceKitakyushuKinen: { + ID: 3048, + Name: "Kitakyushu Kinen", + Thumbnail: 3048, + }, + RaceNiigataJuniorStakes: { + ID: 3049, + Name: "Niigata Junior Stakes", + Thumbnail: 3049, + }, + RaceKeenelandCup: { + ID: 3050, + Name: "Keeneland Cup", + Thumbnail: 3050, + }, + RaceSapporoJuniorStakes: { + ID: 3051, + Name: "Sapporo Junior Stakes", + Thumbnail: 3051, + }, + RaceKokuraJuniorStakes: { + ID: 3052, + Name: "Kokura Junior Stakes", + Thumbnail: 3052, + }, + RaceNiigataKinen: { + ID: 3053, + Name: "Niigata Kinen", + Thumbnail: 3053, + }, + RaceShionStakes: { + ID: 3054, + Name: "Shion Stakes", + Thumbnail: 3054, + }, + RaceKeiseiHaiAutumnHandicap: { + ID: 3055, + Name: "Keisei Hai Autumn Handicap", + Thumbnail: 3055, + }, + RaceSiriusStakes: { + ID: 3056, + Name: "Sirius Stakes", + Thumbnail: 3056, + }, + RaceSaudiArabiaRoyalCup: { + ID: 3057, + Name: "Saudi Arabia Royal Cup", + Thumbnail: 3057, + }, + RaceFujiStakes: { + ID: 3058, + Name: "Fuji Stakes", + Thumbnail: 3058, + }, + RaceArtemisStakes: { + ID: 3059, + Name: "Artemis Stakes", + Thumbnail: 3059, + }, + RaceFantasyStakes: { + ID: 3060, + Name: "Fantasy Stakes", + Thumbnail: 3060, + }, + RaceMiyakoStakes: { + ID: 3061, + Name: "Miyako Stakes", + Thumbnail: 3061, + }, + RaceMusashinoStakes: { + ID: 3062, + Name: "Musashino Stakes", + Thumbnail: 3062, + }, + RaceFukushimaKinen: { + ID: 3063, + Name: "Fukushima Kinen", + Thumbnail: 3063, + }, + RaceTokyoSportsHaiJuniorStakes: { + ID: 3064, + Name: "Tokyo Sports Hai Junior Stakes", + Thumbnail: 3064, + }, + RaceKyotoJuniorStakes: { + ID: 3065, + Name: "Kyoto Junior Stakes", + Thumbnail: 3065, + }, + RaceKeihanHai: { + ID: 3066, + Name: "Keihan Hai", + Thumbnail: 3066, + }, + RaceChallengeCup: { + ID: 3067, + Name: "Challenge Cup", + Thumbnail: 3067, + }, + RaceChunichiShimbunHai: { + ID: 3068, + Name: "Chunichi Shimbun Hai", + Thumbnail: 3068, + }, + RaceCapellaStakes: { + ID: 3069, + Name: "Capella Stakes", + Thumbnail: 3069, + }, + RaceTurquoiseStakes: { + ID: 3070, + Name: "Turquoise Stakes", + Thumbnail: 3070, + }, + RaceManyoStakes: { + ID: 4001, + Name: "Manyo Stakes", + Thumbnail: 4001, + }, + RaceJuniorCup: { + ID: 4002, + Name: "Junior Cup", + Thumbnail: 4002, + }, + RaceYodoTankyoriStakes: { + ID: 4003, + Name: "Yodo Tankyori Stakes", + Thumbnail: 4003, + }, + RacePolluxStakes: { + ID: 4004, + Name: "Pollux Stakes", + Thumbnail: 4004, + }, + RaceJanuaryStakes: { + ID: 4005, + Name: "January Stakes", + Thumbnail: 4005, + }, + RaceNewYearStakes: { + ID: 4006, + Name: "New Year Stakes", + Thumbnail: 4006, + }, + RaceKobaiStakes: { + ID: 4007, + Name: "Kobai Stakes", + Thumbnail: 4007, + }, + RaceSubaruStakes: { + ID: 4008, + Name: "Subaru Stakes", + Thumbnail: 4008, + }, + RaceWakagomaStakes: { + ID: 4009, + Name: "Wakagoma Stakes", + Thumbnail: 4009, + }, + RaceCarbuncleStakes: { + ID: 4010, + Name: "Carbuncle Stakes", + Thumbnail: 4010, + }, + RaceShirafujiStakes: { + ID: 4011, + Name: "Shirafuji Stakes", + Thumbnail: 4011, + }, + RaceCrocusStakes: { + ID: 4012, + Name: "Crocus Stakes", + Thumbnail: 4012, + }, + RaceYamatoStakes: { + ID: 4013, + Name: "Yamato Stakes", + Thumbnail: 4013, + }, + RaceElfinStakes: { + ID: 4014, + Name: "Elfin Stakes", + Thumbnail: 4014, + }, + RaceRakuyoStakes: { + ID: 4015, + Name: "Rakuyo Stakes", + Thumbnail: 4015, + }, + RaceAldebaranStakes: { + ID: 4016, + Name: "Aldebaran Stakes", + Thumbnail: 4016, + }, + RaceValentineStakes: { + ID: 4017, + Name: "Valentine Stakes", + Thumbnail: 4017, + }, + RaceHyacinthStakes: { + ID: 4018, + Name: "Hyacinth Stakes", + Thumbnail: 4018, + }, + RaceSobuStakes: { + ID: 4019, + Name: "Sobu Stakes", + Thumbnail: 4019, + }, + RaceSumireStakes: { + ID: 4020, + Name: "Sumire Stakes", + Thumbnail: 4020, + }, + RaceOsakajoStakes: { + ID: 4021, + Name: "Osakajo Stakes", + Thumbnail: 4021, + }, + RacePolarisStakes: { + ID: 4022, + Name: "Polaris Stakes", + Thumbnail: 4022, + }, + RaceNigawaStakes: { + ID: 4023, + Name: "Nigawa Stakes", + Thumbnail: 4023, + }, + RaceAnemoneStakes: { + ID: 4024, + Name: "Anemone Stakes", + Thumbnail: 4024, + }, + RaceShoryuStakes: { + ID: 4025, + Name: "Shoryu Stakes", + Thumbnail: 4025, + }, + RaceKochiStakes: { + ID: 4026, + Name: "Kochi Stakes", + Thumbnail: 4026, + }, + RaceWakabaStakes: { + ID: 4027, + Name: "Wakaba Stakes", + Thumbnail: 4027, + }, + RaceChibaStakes: { + ID: 4028, + Name: "Chiba Stakes", + Thumbnail: 4028, + }, + RaceRokkoStakes: { + ID: 4030, + Name: "Rokko Stakes", + Thumbnail: 4030, + }, + RaceCoralStakes: { + ID: 4031, + Name: "Coral Stakes", + Thumbnail: 4031, + }, + RaceMargueriteStakes: { + ID: 4032, + Name: "Marguerite Stakes", + Thumbnail: 4032, + }, + RaceFukuryuStakes: { + ID: 4033, + Name: "Fukuryu Stakes", + Thumbnail: 4033, + }, + RaceWasurenagusaSho: { + ID: 4035, + Name: "Wasurenagusa Sho", + Thumbnail: 4035, + }, + RaceKeiyoStakes: { + ID: 4036, + Name: "Keiyo Stakes", + Thumbnail: 4036, + }, + RaceShunraiStakes: { + ID: 4037, + Name: "Shunrai Stakes", + Thumbnail: 4037, + }, + RaceFukushimaMimpoHai: { + ID: 4038, + Name: "Fukushima Mimpo Hai", + Thumbnail: 4038, + }, + RaceTachibanaStakes: { + ID: 4039, + Name: "Tachibana Stakes", + Thumbnail: 4039, + }, + RaceOasisStakes: { + ID: 4040, + Name: "Oasis Stakes", + Thumbnail: 4040, + }, + RaceTennozanStakes: { + ID: 4041, + Name: "Tennozan Stakes", + Thumbnail: 4041, + }, + RaceTangoStakes: { + ID: 4042, + Name: "Tango Stakes", + Thumbnail: 4042, + }, + RaceSweetpeaStakes: { + ID: 4043, + Name: "Sweetpea Stakes", + Thumbnail: 4043, + }, + RaceTanigawadakeStakes: { + ID: 4044, + Name: "Tanigawadake Stakes", + Thumbnail: 4044, + }, + RacePrincipalStakes: { + ID: 4045, + Name: "Principal Stakes", + Thumbnail: 4045, + }, + RaceMetropolitanStakes: { + ID: 4046, + Name: "Metropolitan Stakes", + Thumbnail: 4046, + }, + RaceKuramaStakes: { + ID: 4047, + Name: "Kurama Stakes", + Thumbnail: 4047, + }, + RaceBrilliantStakes: { + ID: 4048, + Name: "Brilliant Stakes", + Thumbnail: 4048, + }, + RaceMiyakoojiStakes: { + ID: 4049, + Name: "Miyakooji Stakes", + Thumbnail: 4049, + }, + RaceAoiStakes: { + ID: 4050, + Name: "Aoi Stakes", + Thumbnail: 4050, + }, + RaceRittoStakes: { + ID: 4051, + Name: "Ritto Stakes", + Thumbnail: 4051, + }, + RaceSeiryuStakes: { + ID: 4052, + Name: "Seiryu Stakes", + Thumbnail: 4052, + }, + RaceMayStakes: { + ID: 4053, + Name: "May Stakes", + Thumbnail: 4053, + }, + RaceHosuStakes: { + ID: 4054, + Name: "Hosu Stakes", + Thumbnail: 4054, + }, + RaceIdatenStakes: { + ID: 4055, + Name: "Idaten Stakes", + Thumbnail: 4055, + }, + RaceShirayuriStakes: { + ID: 4056, + Name: "Shirayuri Stakes", + Thumbnail: 4056, + }, + RaceKeyakiStakes: { + ID: 4057, + Name: "Keyaki Stakes", + Thumbnail: 4057, + }, + RaceAzuchijoStakes: { + ID: 4058, + Name: "Azuchijo Stakes", + Thumbnail: 4058, + }, + RaceAkhaltekeStakes: { + ID: 4059, + Name: "Akhalteke Stakes", + Thumbnail: 4059, + }, + RaceTempozanStakes: { + ID: 4060, + Name: "Tempozan Stakes", + Thumbnail: 4060, + }, + RaceYonagoStakes: { + ID: 4061, + Name: "Yonago Stakes", + Thumbnail: 4061, + }, + RaceOnumaStakes: { + ID: 4062, + Name: "Onuma Stakes", + Thumbnail: 4062, + }, + RaceParadiseStakes: { + ID: 4063, + Name: "Paradise Stakes", + Thumbnail: 4063, + }, + RaceTomoeSho: { + ID: 4064, + Name: "Tomoe Sho", + Thumbnail: 4064, + }, + RaceMarineStakes: { + ID: 4065, + Name: "Marine Stakes", + Thumbnail: 4065, + }, + RaceMeitetsuHai: { + ID: 4066, + Name: "Meitetsu Hai", + Thumbnail: 4066, + }, + RaceChukyoJuniorStakes: { + ID: 4068, + Name: "Chukyo Junior Stakes", + Thumbnail: 4068, + }, + RaceFukushimaTVOpen: { + ID: 4069, + Name: "Fukushima TV Open", + Thumbnail: 4069, + }, + RaceDahliaSho: { + ID: 4070, + Name: "Dahlia Sho", + Thumbnail: 4070, + }, + RaceSapporoNikkeiOpen: { + ID: 4071, + Name: "Sapporo Nikkei Open", + Thumbnail: 4071, + }, + RaceUHBSho: { + ID: 4072, + Name: "UHB Sho", + Thumbnail: 4072, + }, + RaceAsoStakes: { + ID: 4073, + Name: "Aso Stakes", + Thumbnail: 4073, + }, + RacePhoenixSho: { + ID: 4074, + Name: "Phoenix Sho", + Thumbnail: 4074, + }, + RaceCosmosSho: { + ID: 4075, + Name: "Cosmos Sho", + Thumbnail: 4075, + }, + RaceNSTSho: { + ID: 4076, + Name: "NST Sho", + Thumbnail: 4076, + }, + RaceCloverSho: { + ID: 4077, + Name: "Clover Sho", + Thumbnail: 4077, + }, + RaceHimawariSho: { + ID: 4078, + Name: "Himawari Sho", + Thumbnail: 4078, + }, + RaceBSNSho: { + ID: 4079, + Name: "BSN Sho", + Thumbnail: 4079, + }, + RaceKokuraNikkeiOpen: { + ID: 4080, + Name: "Kokura Nikkei Open", + Thumbnail: 4080, + }, + RaceTokiStakes: { + ID: 4081, + Name: "Toki Stakes", + Thumbnail: 4081, + }, + RaceTanchoStakes: { + ID: 4082, + Name: "Tancho Stakes", + Thumbnail: 4082, + }, + RaceSuzuranSho: { + ID: 4083, + Name: "Suzuran Sho", + Thumbnail: 4083, + }, + RaceEnifStakes: { + ID: 4084, + Name: "Enif Stakes", + Thumbnail: 4084, + }, + RaceNojigikuStakes: { + ID: 4085, + Name: "Nojigiku Stakes", + Thumbnail: 4085, + }, + RaceRadioNipponSho: { + ID: 4086, + Name: "Radio Nippon Sho", + Thumbnail: 4086, + }, + RaceKikyoStakes: { + ID: 4087, + Name: "Kikyo Stakes", + Thumbnail: 4087, + }, + RaceFuyoStakes: { + ID: 4088, + Name: "Fuyo Stakes", + Thumbnail: 4088, + }, + RaceCannaStakes: { + ID: 4089, + Name: "Canna Stakes", + Thumbnail: 4089, + }, + RacePortIslandStakes: { + ID: 4090, + Name: "Port Island Stakes", + Thumbnail: 4090, + }, + RaceOpalStakes: { + ID: 4091, + Name: "Opal Stakes", + Thumbnail: 4091, + }, + RaceGreenChannelCup: { + ID: 4092, + Name: "Green Channel Cup", + Thumbnail: 4092, + }, + RaceMomijiStakes: { + ID: 4093, + Name: "Momiji Stakes", + Thumbnail: 4093, + }, + RaceOctoberStakes: { + ID: 4094, + Name: "October Stakes", + Thumbnail: 4094, + }, + RaceShinetsuStakes: { + ID: 4095, + Name: "Shinetsu Stakes", + Thumbnail: 4095, + }, + RaceIvyStakes: { + ID: 4096, + Name: "Ivy Stakes", + Thumbnail: 4096, + }, + RaceMuromachiStakes: { + ID: 4097, + Name: "Muromachi Stakes", + Thumbnail: 4097, + }, + RaceBrazilCup: { + ID: 4098, + Name: "Brazil Cup", + Thumbnail: 4098, + }, + RaceHagiStakes: { + ID: 4099, + Name: "Hagi Stakes", + Thumbnail: 4099, + }, + RaceCassiopeiaStakes: { + ID: 4100, + Name: "Cassiopeia Stakes", + Thumbnail: 4100, + }, + RaceLumiereAutumnDash: { + ID: 4101, + Name: "Lumiere Autumn Dash", + Thumbnail: 4101, + }, + RaceOroCup: { + ID: 4102, + Name: "Oro Cup", + Thumbnail: 4102, + }, + RaceFukushimaJuniorStakes: { + ID: 4103, + Name: "Fukushima Junior Stakes", + Thumbnail: 4103, + }, + RaceAndromedaStakes: { + ID: 4104, + Name: "Andromeda Stakes", + Thumbnail: 4104, + }, + RaceShimotsukiStakes: { + ID: 4105, + Name: "Shimotsuki Stakes", + Thumbnail: 4105, + }, + RaceFukushimaMinyuCup: { + ID: 4106, + Name: "Fukushima Minyu Cup", + Thumbnail: 4106, + }, + RaceCapitalStakes: { + ID: 4107, + Name: "Capital Stakes", + Thumbnail: 4107, + }, + RaceAutumnLeafStakes: { + ID: 4108, + Name: "Autumn Leaf Stakes", + Thumbnail: 4108, + }, + RaceLapisLazuliStakes: { + ID: 4109, + Name: "Lapis Lazuli Stakes", + Thumbnail: 4109, + }, + RaceShiwasuStakes: { + ID: 4110, + Name: "Shiwasu Stakes", + Thumbnail: 4110, + }, + RaceRigelStakes: { + ID: 4111, + Name: "Rigel Stakes", + Thumbnail: 4111, + }, + RaceTanzaniteStakes: { + ID: 4112, + Name: "Tanzanite Stakes", + Thumbnail: 4112, + }, + RaceDecemberStakes: { + ID: 4113, + Name: "December Stakes", + Thumbnail: 4113, + }, + RaceChristmasRoseStakes: { + ID: 4114, + Name: "Christmas Rose Stakes", + Thumbnail: 4114, + }, + RaceGalaxyStakes: { + ID: 4115, + Name: "Galaxy Stakes", + Thumbnail: 4115, + }, + RaceBetelgeuseStakes: { + ID: 4116, + Name: "Betelgeuse Stakes", + Thumbnail: 4116, + }, + RaceKitakyushuTankyoriStakes: { + ID: 4118, + Name: "Kitakyushu Tankyori Stakes", + Thumbnail: 4117, + }, + RaceAzumakofujiStakes: { + ID: 4119, + Name: "Azumakofuji Stakes", + Thumbnail: 4118, + }, + RaceSleipnirStakes: { + ID: 4120, + Name: "Sleipnir Stakes", + Thumbnail: 4119, + }, + RaceSannomiyaStakes: { + ID: 4121, + Name: "Sannomiya Stakes", + Thumbnail: 4120, + }, + RaceKanetsuStakes: { + ID: 4122, + Name: "Kanetsu Stakes", + Thumbnail: 4121, + }, + RaceNagatsukiStakes: { + ID: 4123, + Name: "Nagatsuki Stakes", + Thumbnail: 4122, + }, + RaceUzumasaStakes: { + ID: 4124, + Name: "Uzumasa Stakes", + Thumbnail: 4123, + }, + RaceAsterSho: { + ID: 4501, + Name: "Aster Sho", + Thumbnail: 4501, + }, + RaceSaffronSho: { + ID: 4502, + Name: "Saffron Sho", + Thumbnail: 4502, + }, + RaceRindoSho: { + ID: 4503, + Name: "Rindo Sho", + Thumbnail: 4503, + }, + RaceShigikuSho: { + ID: 4504, + Name: "Shigiku Sho", + Thumbnail: 4504, + }, + RacePlatanusSho: { + ID: 4505, + Name: "Platanus Sho", + Thumbnail: 4505, + }, + RaceNadeshikoSho: { + ID: 4506, + Name: "Nadeshiko Sho", + Thumbnail: 4506, + }, + RaceHyakunichisoTokubetsu: { + ID: 4507, + Name: "Hyakunichiso Tokubetsu", + Thumbnail: 4507, + }, + RaceKimmokuseiTokubetsu: { + ID: 4508, + Name: "Kimmokusei Tokubetsu", + Thumbnail: 4508, + }, + RaceOxalisSho: { + ID: 4509, + Name: "Oxalis Sho", + Thumbnail: 4509, + }, + RaceKigikuSho: { + ID: 4510, + Name: "Kigiku Sho", + Thumbnail: 4510, + }, + RaceMochinokiSho: { + ID: 4511, + Name: "Mochinoki Sho", + Thumbnail: 4511, + }, + RaceAkamatsuSho: { + ID: 4512, + Name: "Akamatsu Sho", + Thumbnail: 4512, + }, + RaceShumeigikuSho: { + ID: 4513, + Name: "Shumeigiku Sho", + Thumbnail: 4513, + }, + RaceCattleyaSho: { + ID: 4514, + Name: "Cattleya Sho", + Thumbnail: 4514, + }, + RaceBegoniaSho: { + ID: 4515, + Name: "Begonia Sho", + Thumbnail: 4515, + }, + RaceShiragikuSho: { + ID: 4516, + Name: "Shiragiku Sho", + Thumbnail: 4516, + }, + RaceHabotanSho: { + ID: 4517, + Name: "Habotan Sho", + Thumbnail: 4517, + }, + RaceKoyamakiSho: { + ID: 4518, + Name: "Koyamaki Sho", + Thumbnail: 4518, + }, + RaceManryoSho: { + ID: 4519, + Name: "Manryo Sho", + Thumbnail: 4519, + }, + RaceKuromatsuSho: { + ID: 4520, + Name: "Kuromatsu Sho", + Thumbnail: 4520, + }, + RaceEricaSho: { + ID: 4521, + Name: "Erica Sho", + Thumbnail: 4521, + }, + RaceTsuwabukiSho: { + ID: 4522, + Name: "Tsuwabuki Sho", + Thumbnail: 4522, + }, + RaceHiiragiSho: { + ID: 4523, + Name: "Hiiragi Sho", + Thumbnail: 4523, + }, + RaceSazankaSho: { + ID: 4524, + Name: "Sazanka Sho", + Thumbnail: 4524, + }, + RaceKantsubakiSho: { + ID: 4525, + Name: "Kantsubaki Sho", + Thumbnail: 4525, + }, + RaceSenryoSho: { + ID: 4526, + Name: "Senryo Sho", + Thumbnail: 4526, + }, +} + +var RaceNameToID = map[string]RaceID{ + "February Stakes": 1001, + "Takamatsunomiya Kinen": 1002, + "Osaka Hai": 1003, + "Oka Sho": 1004, + "Satsuki Sho": 1005, + "Tenno Sho (Spring)": 1006, + "NHK Mile Cup": 1007, + "Victoria Mile": 1008, + "Japanese Oaks": 1009, + "Tokyo Yushun (Japanese Derby)": 1010, + "Yasuda Kinen": 1011, + "Takarazuka Kinen": 1012, + "Sprinters Stakes": 1013, + "Shuka Sho": 1014, + "Kikuka Sho": 1015, + "Tenno Sho (Autumn)": 1016, + "Queen Elizabeth II Cup": 1017, + "Mile Championship": 1018, + "Japan Cup": 1019, + "Champions Cup": 1020, + "Hanshin Juvenile Fillies": 1021, + "Asahi Hai Futurity Stakes": 1022, + "Arima Kinen": 1023, + "Hopeful Stakes": 1024, + "Takarazuka Kinen" + " (Alternate)": 1025, + "Kikuka Sho" + " (Alternate)": 1026, + "Tenno Sho (Spring)" + " (Alternate)": 1027, + "Teio Sho": 1101, + "Japan Dirt Derby": 1102, + "JBC Ladies’ Classic": 1103, + "JBC Sprint": 1104, + "JBC Classic": 1105, + "Tokyo Daishoten": 1106, + "Nikkei Shinshun Hai": 2001, + "Tokai Stakes": 2002, + "American JCC": 2003, + "Kyoto Kinen": 2004, + "Nakayama Kinen": 2005, + "Yayoi Sho": 2006, + "Kinko Sho": 2007, + "Fillies' Revue": 2008, + "Hanshin Daishoten": 2009, + "Spring Stakes": 2010, + "Nikkei Sho": 2011, + "Hanshin Umamusume Stakes": 2012, + "New Zealand Trophy": 2013, + "Milers Cup": 2014, + "Flora Stakes": 2015, + "Aoba Sho": 2016, + "Kyoto Shimbun Hai": 2017, + "Keio Hai Spring Cup": 2018, + "Meguro Kinen": 2019, + "Sapporo Kinen": 2020, + "Centaur Stakes": 2021, + "Rose Stakes": 2022, + "St. Lite Kinen": 2023, + "Kobe Shimbun Hai": 2024, + "All Comers": 2025, + "Mainichi Okan": 2026, + "Kyoto Daishoten": 2027, + "Fuchu Umamusume Stakes": 2028, + "Swan Stakes": 2029, + "Keio Hai Junior Stakes": 2030, + "Copa Republica Argentina": 2031, + "Daily Hai Junior Stakes": 2032, + "Stayers Stakes": 2033, + "Hanshin Cup": 2034, + "Spring Stakes" + " (Alternate)": 2035, + "Kyoto Kimpai": 3001, + "Nakayama Kimpai": 3002, + "Shinzan Kinen": 3003, + "Fairy Stakes": 3004, + "Aichi Hai": 3005, + "Keisei Hai": 3006, + "Silk Road Stakes": 3007, + "Negishi Stakes": 3008, + "Kisaragi Sho": 3009, + "Tokyo Shimbun Hai": 3010, + "Queen Cup": 3011, + "Kyodo News Hai": 3012, + "Kyoto Umamusume Stakes": 3013, + "Diamond Stakes": 3014, + "Kokura Daishoten": 3015, + "Arlington Cup": 3016, + "Hankyu Hai": 3017, + "Tulip Sho": 3018, + "Ocean Stakes": 3019, + "Nakayama Umamusume Stakes": 3020, + "Falcon Stakes": 3021, + "Flower Cup": 3022, + "Mainichi Hai": 3023, + "March Stakes": 3024, + "Lord Derby Challenge Trophy": 3025, + "Antares Stakes": 3026, + "Fukushima Umamusume Stakes": 3027, + "Niigata Daishoten": 3028, + "Heian Stakes": 3029, + "Naruo Kinen": 3030, + "Mermaid Stakes": 3031, + "Epsom Cup": 3032, + "Unicorn Stakes": 3033, + "Hakodate Sprint Stakes": 3034, + "CBC Sho": 3035, + "Radio Nikkei Sho": 3036, + "Procyon Stakes": 3037, + "Tanabata Sho": 3038, + "Hakodate Kinen": 3039, + "Chukyo Kinen": 3040, + "Hakodate Junior Stakes": 3041, + "Ibis Summer Dash": 3042, + "Queen Stakes": 3043, + "Kokura Kinen": 3044, + "Leopard Stakes": 3045, + "Sekiya Kinen": 3046, + "Elm Stakes": 3047, + "Kitakyushu Kinen": 3048, + "Niigata Junior Stakes": 3049, + "Keeneland Cup": 3050, + "Sapporo Junior Stakes": 3051, + "Kokura Junior Stakes": 3052, + "Niigata Kinen": 3053, + "Shion Stakes": 3054, + "Keisei Hai Autumn Handicap": 3055, + "Sirius Stakes": 3056, + "Saudi Arabia Royal Cup": 3057, + "Fuji Stakes": 3058, + "Artemis Stakes": 3059, + "Fantasy Stakes": 3060, + "Miyako Stakes": 3061, + "Musashino Stakes": 3062, + "Fukushima Kinen": 3063, + "Tokyo Sports Hai Junior Stakes": 3064, + "Kyoto Junior Stakes": 3065, + "Keihan Hai": 3066, + "Challenge Cup": 3067, + "Chunichi Shimbun Hai": 3068, + "Capella Stakes": 3069, + "Turquoise Stakes": 3070, + "Manyo Stakes": 4001, + "Junior Cup": 4002, + "Yodo Tankyori Stakes": 4003, + "Pollux Stakes": 4004, + "January Stakes": 4005, + "New Year Stakes": 4006, + "Kobai Stakes": 4007, + "Subaru Stakes": 4008, + "Wakagoma Stakes": 4009, + "Carbuncle Stakes": 4010, + "Shirafuji Stakes": 4011, + "Crocus Stakes": 4012, + "Yamato Stakes": 4013, + "Elfin Stakes": 4014, + "Rakuyo Stakes": 4015, + "Aldebaran Stakes": 4016, + "Valentine Stakes": 4017, + "Hyacinth Stakes": 4018, + "Sobu Stakes": 4019, + "Sumire Stakes": 4020, + "Osakajo Stakes": 4021, + "Polaris Stakes": 4022, + "Nigawa Stakes": 4023, + "Anemone Stakes": 4024, + "Shoryu Stakes": 4025, + "Kochi Stakes": 4026, + "Wakaba Stakes": 4027, + "Chiba Stakes": 4028, + "Rokko Stakes": 4030, + "Coral Stakes": 4031, + "Marguerite Stakes": 4032, + "Fukuryu Stakes": 4033, + "Wasurenagusa Sho": 4035, + "Keiyo Stakes": 4036, + "Shunrai Stakes": 4037, + "Fukushima Mimpo Hai": 4038, + "Tachibana Stakes": 4039, + "Oasis Stakes": 4040, + "Tennozan Stakes": 4041, + "Tango Stakes": 4042, + "Sweetpea Stakes": 4043, + "Tanigawadake Stakes": 4044, + "Principal Stakes": 4045, + "Metropolitan Stakes": 4046, + "Kurama Stakes": 4047, + "Brilliant Stakes": 4048, + "Miyakooji Stakes": 4049, + "Aoi Stakes": 4050, + "Ritto Stakes": 4051, + "Seiryu Stakes": 4052, + "May Stakes": 4053, + "Hosu Stakes": 4054, + "Idaten Stakes": 4055, + "Shirayuri Stakes": 4056, + "Keyaki Stakes": 4057, + "Azuchijo Stakes": 4058, + "Akhalteke Stakes": 4059, + "Tempozan Stakes": 4060, + "Yonago Stakes": 4061, + "Onuma Stakes": 4062, + "Paradise Stakes": 4063, + "Tomoe Sho": 4064, + "Marine Stakes": 4065, + "Meitetsu Hai": 4066, + "Chukyo Junior Stakes": 4068, + "Fukushima TV Open": 4069, + "Dahlia Sho": 4070, + "Sapporo Nikkei Open": 4071, + "UHB Sho": 4072, + "Aso Stakes": 4073, + "Phoenix Sho": 4074, + "Cosmos Sho": 4075, + "NST Sho": 4076, + "Clover Sho": 4077, + "Himawari Sho": 4078, + "BSN Sho": 4079, + "Kokura Nikkei Open": 4080, + "Toki Stakes": 4081, + "Tancho Stakes": 4082, + "Suzuran Sho": 4083, + "Enif Stakes": 4084, + "Nojigiku Stakes": 4085, + "Radio Nippon Sho": 4086, + "Kikyo Stakes": 4087, + "Fuyo Stakes": 4088, + "Canna Stakes": 4089, + "Port Island Stakes": 4090, + "Opal Stakes": 4091, + "Green Channel Cup": 4092, + "Momiji Stakes": 4093, + "October Stakes": 4094, + "Shinetsu Stakes": 4095, + "Ivy Stakes": 4096, + "Muromachi Stakes": 4097, + "Brazil Cup": 4098, + "Hagi Stakes": 4099, + "Cassiopeia Stakes": 4100, + "Lumiere Autumn Dash": 4101, + "Oro Cup": 4102, + "Fukushima Junior Stakes": 4103, + "Andromeda Stakes": 4104, + "Shimotsuki Stakes": 4105, + "Fukushima Minyu Cup": 4106, + "Capital Stakes": 4107, + "Autumn Leaf Stakes": 4108, + "Lapis Lazuli Stakes": 4109, + "Shiwasu Stakes": 4110, + "Rigel Stakes": 4111, + "Tanzanite Stakes": 4112, + "December Stakes": 4113, + "Christmas Rose Stakes": 4114, + "Galaxy Stakes": 4115, + "Betelgeuse Stakes": 4116, + "Kitakyushu Tankyori Stakes": 4118, + "Azumakofuji Stakes": 4119, + "Sleipnir Stakes": 4120, + "Sannomiya Stakes": 4121, + "Kanetsu Stakes": 4122, + "Nagatsuki Stakes": 4123, + "Uzumasa Stakes": 4124, + "Aster Sho": 4501, + "Saffron Sho": 4502, + "Rindo Sho": 4503, + "Shigiku Sho": 4504, + "Platanus Sho": 4505, + "Nadeshiko Sho": 4506, + "Hyakunichiso Tokubetsu": 4507, + "Kimmokusei Tokubetsu": 4508, + "Oxalis Sho": 4509, + "Kigiku Sho": 4510, + "Mochinoki Sho": 4511, + "Akamatsu Sho": 4512, + "Shumeigiku Sho": 4513, + "Cattleya Sho": 4514, + "Begonia Sho": 4515, + "Shiragiku Sho": 4516, + "Habotan Sho": 4517, + "Koyamaki Sho": 4518, + "Manryo Sho": 4519, + "Kuromatsu Sho": 4520, + "Erica Sho": 4521, + "Tsuwabuki Sho": 4522, + "Hiiragi Sho": 4523, + "Sazanka Sho": 4524, + "Kantsubaki Sho": 4525, + "Senryo Sho": 4526, +} diff --git a/horse/global/race.kk b/horse/global/race.kk new file mode 100644 index 0000000..fe7a967 --- /dev/null +++ b/horse/global/race.kk @@ -0,0 +1,2044 @@ +module horse/global/race + +// Automatically generated with horsegen; DO NOT EDIT + +import std/data/rb-map +import horse/game-id +pub import horse/race + +// Enumeration of all races for type-safe programming. +pub type race + February-Stakes + Takamatsunomiya-Kinen + Osaka-Hai + Oka-Sho + Satsuki-Sho + Tenno-Sho-Spring + NHK-Mile-Cup + Victoria-Mile + Japanese-Oaks + Tokyo-Yushun-Japanese-Derby + Yasuda-Kinen + Takarazuka-Kinen + Sprinters-Stakes + Shuka-Sho + Kikuka-Sho + Tenno-Sho-Autumn + Queen-Elizabeth-II-Cup + Mile-Championship + Japan-Cup + Champions-Cup + Hanshin-Juvenile-Fillies + Asahi-Hai-Futurity-Stakes + Arima-Kinen + Hopeful-Stakes + Takarazuka-Kinen-Alternate + Kikuka-Sho-Alternate + Tenno-Sho-Spring-Alternate + Teio-Sho + Japan-Dirt-Derby + JBC-Ladies-Classic + JBC-Sprint + JBC-Classic + Tokyo-Daishoten + Nikkei-Shinshun-Hai + Tokai-Stakes + American-JCC + Kyoto-Kinen + Nakayama-Kinen + Yayoi-Sho + Kinko-Sho + Fillies-Revue + Hanshin-Daishoten + Spring-Stakes + Nikkei-Sho + Hanshin-Umamusume-Stakes + New-Zealand-Trophy + Milers-Cup + Flora-Stakes + Aoba-Sho + Kyoto-Shimbun-Hai + Keio-Hai-Spring-Cup + Meguro-Kinen + Sapporo-Kinen + Centaur-Stakes + Rose-Stakes + St-Lite-Kinen + Kobe-Shimbun-Hai + All-Comers + Mainichi-Okan + Kyoto-Daishoten + Fuchu-Umamusume-Stakes + Swan-Stakes + Keio-Hai-Junior-Stakes + Copa-Republica-Argentina + Daily-Hai-Junior-Stakes + Stayers-Stakes + Hanshin-Cup + Spring-Stakes-Alternate + Kyoto-Kimpai + Nakayama-Kimpai + Shinzan-Kinen + Fairy-Stakes + Aichi-Hai + Keisei-Hai + Silk-Road-Stakes + Negishi-Stakes + Kisaragi-Sho + Tokyo-Shimbun-Hai + Queen-Cup + Kyodo-News-Hai + Kyoto-Umamusume-Stakes + Diamond-Stakes + Kokura-Daishoten + Arlington-Cup + Hankyu-Hai + Tulip-Sho + Ocean-Stakes + Nakayama-Umamusume-Stakes + Falcon-Stakes + Flower-Cup + Mainichi-Hai + March-Stakes + Lord-Derby-Challenge-Trophy + Antares-Stakes + Fukushima-Umamusume-Stakes + Niigata-Daishoten + Heian-Stakes + Naruo-Kinen + Mermaid-Stakes + Epsom-Cup + Unicorn-Stakes + Hakodate-Sprint-Stakes + CBC-Sho + Radio-Nikkei-Sho + Procyon-Stakes + Tanabata-Sho + Hakodate-Kinen + Chukyo-Kinen + Hakodate-Junior-Stakes + Ibis-Summer-Dash + Queen-Stakes + Kokura-Kinen + Leopard-Stakes + Sekiya-Kinen + Elm-Stakes + Kitakyushu-Kinen + Niigata-Junior-Stakes + Keeneland-Cup + Sapporo-Junior-Stakes + Kokura-Junior-Stakes + Niigata-Kinen + Shion-Stakes + Keisei-Hai-Autumn-Handicap + Sirius-Stakes + Saudi-Arabia-Royal-Cup + Fuji-Stakes + Artemis-Stakes + Fantasy-Stakes + Miyako-Stakes + Musashino-Stakes + Fukushima-Kinen + Tokyo-Sports-Hai-Junior-Stakes + Kyoto-Junior-Stakes + Keihan-Hai + Challenge-Cup + Chunichi-Shimbun-Hai + Capella-Stakes + Turquoise-Stakes + Manyo-Stakes + Junior-Cup + Yodo-Tankyori-Stakes + Pollux-Stakes + January-Stakes + New-Year-Stakes + Kobai-Stakes + Subaru-Stakes + Wakagoma-Stakes + Carbuncle-Stakes + Shirafuji-Stakes + Crocus-Stakes + Yamato-Stakes + Elfin-Stakes + Rakuyo-Stakes + Aldebaran-Stakes + Valentine-Stakes + Hyacinth-Stakes + Sobu-Stakes + Sumire-Stakes + Osakajo-Stakes + Polaris-Stakes + Nigawa-Stakes + Anemone-Stakes + Shoryu-Stakes + Kochi-Stakes + Wakaba-Stakes + Chiba-Stakes + Rokko-Stakes + Coral-Stakes + Marguerite-Stakes + Fukuryu-Stakes + Wasurenagusa-Sho + Keiyo-Stakes + Shunrai-Stakes + Fukushima-Mimpo-Hai + Tachibana-Stakes + Oasis-Stakes + Tennozan-Stakes + Tango-Stakes + Sweetpea-Stakes + Tanigawadake-Stakes + Principal-Stakes + Metropolitan-Stakes + Kurama-Stakes + Brilliant-Stakes + Miyakooji-Stakes + Aoi-Stakes + Ritto-Stakes + Seiryu-Stakes + May-Stakes + Hosu-Stakes + Idaten-Stakes + Shirayuri-Stakes + Keyaki-Stakes + Azuchijo-Stakes + Akhalteke-Stakes + Tempozan-Stakes + Yonago-Stakes + Onuma-Stakes + Paradise-Stakes + Tomoe-Sho + Marine-Stakes + Meitetsu-Hai + Chukyo-Junior-Stakes + Fukushima-TV-Open + Dahlia-Sho + Sapporo-Nikkei-Open + UHB-Sho + Aso-Stakes + Phoenix-Sho + Cosmos-Sho + NST-Sho + Clover-Sho + Himawari-Sho + BSN-Sho + Kokura-Nikkei-Open + Toki-Stakes + Tancho-Stakes + Suzuran-Sho + Enif-Stakes + Nojigiku-Stakes + Radio-Nippon-Sho + Kikyo-Stakes + Fuyo-Stakes + Canna-Stakes + Port-Island-Stakes + Opal-Stakes + Green-Channel-Cup + Momiji-Stakes + October-Stakes + Shinetsu-Stakes + Ivy-Stakes + Muromachi-Stakes + Brazil-Cup + Hagi-Stakes + Cassiopeia-Stakes + Lumiere-Autumn-Dash + Oro-Cup + Fukushima-Junior-Stakes + Andromeda-Stakes + Shimotsuki-Stakes + Fukushima-Minyu-Cup + Capital-Stakes + Autumn-Leaf-Stakes + Lapis-Lazuli-Stakes + Shiwasu-Stakes + Rigel-Stakes + Tanzanite-Stakes + December-Stakes + Christmas-Rose-Stakes + Galaxy-Stakes + Betelgeuse-Stakes + Kitakyushu-Tankyori-Stakes + Azumakofuji-Stakes + Sleipnir-Stakes + Sannomiya-Stakes + Kanetsu-Stakes + Nagatsuki-Stakes + Uzumasa-Stakes + Aster-Sho + Saffron-Sho + Rindo-Sho + Shigiku-Sho + Platanus-Sho + Nadeshiko-Sho + Hyakunichiso-Tokubetsu + Kimmokusei-Tokubetsu + Oxalis-Sho + Kigiku-Sho + Mochinoki-Sho + Akamatsu-Sho + Shumeigiku-Sho + Cattleya-Sho + Begonia-Sho + Shiragiku-Sho + Habotan-Sho + Koyamaki-Sho + Manryo-Sho + Kuromatsu-Sho + Erica-Sho + Tsuwabuki-Sho + Hiiragi-Sho + Sazanka-Sho + Kantsubaki-Sho + Senryo-Sho + +// Get the race ID for a race. +pub fun race-id(r: race): race-id + match r + February-Stakes -> Race-id(1001) + Takamatsunomiya-Kinen -> Race-id(1002) + Osaka-Hai -> Race-id(1003) + Oka-Sho -> Race-id(1004) + Satsuki-Sho -> Race-id(1005) + Tenno-Sho-Spring -> Race-id(1006) + NHK-Mile-Cup -> Race-id(1007) + Victoria-Mile -> Race-id(1008) + Japanese-Oaks -> Race-id(1009) + Tokyo-Yushun-Japanese-Derby -> Race-id(1010) + Yasuda-Kinen -> Race-id(1011) + Takarazuka-Kinen -> Race-id(1012) + Sprinters-Stakes -> Race-id(1013) + Shuka-Sho -> Race-id(1014) + Kikuka-Sho -> Race-id(1015) + Tenno-Sho-Autumn -> Race-id(1016) + Queen-Elizabeth-II-Cup -> Race-id(1017) + Mile-Championship -> Race-id(1018) + Japan-Cup -> Race-id(1019) + Champions-Cup -> Race-id(1020) + Hanshin-Juvenile-Fillies -> Race-id(1021) + Asahi-Hai-Futurity-Stakes -> Race-id(1022) + Arima-Kinen -> Race-id(1023) + Hopeful-Stakes -> Race-id(1024) + Takarazuka-Kinen-Alternate -> Race-id(1025) + Kikuka-Sho-Alternate -> Race-id(1026) + Tenno-Sho-Spring-Alternate -> Race-id(1027) + Teio-Sho -> Race-id(1101) + Japan-Dirt-Derby -> Race-id(1102) + JBC-Ladies-Classic -> Race-id(1103) + JBC-Sprint -> Race-id(1104) + JBC-Classic -> Race-id(1105) + Tokyo-Daishoten -> Race-id(1106) + Nikkei-Shinshun-Hai -> Race-id(2001) + Tokai-Stakes -> Race-id(2002) + American-JCC -> Race-id(2003) + Kyoto-Kinen -> Race-id(2004) + Nakayama-Kinen -> Race-id(2005) + Yayoi-Sho -> Race-id(2006) + Kinko-Sho -> Race-id(2007) + Fillies-Revue -> Race-id(2008) + Hanshin-Daishoten -> Race-id(2009) + Spring-Stakes -> Race-id(2010) + Nikkei-Sho -> Race-id(2011) + Hanshin-Umamusume-Stakes -> Race-id(2012) + New-Zealand-Trophy -> Race-id(2013) + Milers-Cup -> Race-id(2014) + Flora-Stakes -> Race-id(2015) + Aoba-Sho -> Race-id(2016) + Kyoto-Shimbun-Hai -> Race-id(2017) + Keio-Hai-Spring-Cup -> Race-id(2018) + Meguro-Kinen -> Race-id(2019) + Sapporo-Kinen -> Race-id(2020) + Centaur-Stakes -> Race-id(2021) + Rose-Stakes -> Race-id(2022) + St-Lite-Kinen -> Race-id(2023) + Kobe-Shimbun-Hai -> Race-id(2024) + All-Comers -> Race-id(2025) + Mainichi-Okan -> Race-id(2026) + Kyoto-Daishoten -> Race-id(2027) + Fuchu-Umamusume-Stakes -> Race-id(2028) + Swan-Stakes -> Race-id(2029) + Keio-Hai-Junior-Stakes -> Race-id(2030) + Copa-Republica-Argentina -> Race-id(2031) + Daily-Hai-Junior-Stakes -> Race-id(2032) + Stayers-Stakes -> Race-id(2033) + Hanshin-Cup -> Race-id(2034) + Spring-Stakes-Alternate -> Race-id(2035) + Kyoto-Kimpai -> Race-id(3001) + Nakayama-Kimpai -> Race-id(3002) + Shinzan-Kinen -> Race-id(3003) + Fairy-Stakes -> Race-id(3004) + Aichi-Hai -> Race-id(3005) + Keisei-Hai -> Race-id(3006) + Silk-Road-Stakes -> Race-id(3007) + Negishi-Stakes -> Race-id(3008) + Kisaragi-Sho -> Race-id(3009) + Tokyo-Shimbun-Hai -> Race-id(3010) + Queen-Cup -> Race-id(3011) + Kyodo-News-Hai -> Race-id(3012) + Kyoto-Umamusume-Stakes -> Race-id(3013) + Diamond-Stakes -> Race-id(3014) + Kokura-Daishoten -> Race-id(3015) + Arlington-Cup -> Race-id(3016) + Hankyu-Hai -> Race-id(3017) + Tulip-Sho -> Race-id(3018) + Ocean-Stakes -> Race-id(3019) + Nakayama-Umamusume-Stakes -> Race-id(3020) + Falcon-Stakes -> Race-id(3021) + Flower-Cup -> Race-id(3022) + Mainichi-Hai -> Race-id(3023) + March-Stakes -> Race-id(3024) + Lord-Derby-Challenge-Trophy -> Race-id(3025) + Antares-Stakes -> Race-id(3026) + Fukushima-Umamusume-Stakes -> Race-id(3027) + Niigata-Daishoten -> Race-id(3028) + Heian-Stakes -> Race-id(3029) + Naruo-Kinen -> Race-id(3030) + Mermaid-Stakes -> Race-id(3031) + Epsom-Cup -> Race-id(3032) + Unicorn-Stakes -> Race-id(3033) + Hakodate-Sprint-Stakes -> Race-id(3034) + CBC-Sho -> Race-id(3035) + Radio-Nikkei-Sho -> Race-id(3036) + Procyon-Stakes -> Race-id(3037) + Tanabata-Sho -> Race-id(3038) + Hakodate-Kinen -> Race-id(3039) + Chukyo-Kinen -> Race-id(3040) + Hakodate-Junior-Stakes -> Race-id(3041) + Ibis-Summer-Dash -> Race-id(3042) + Queen-Stakes -> Race-id(3043) + Kokura-Kinen -> Race-id(3044) + Leopard-Stakes -> Race-id(3045) + Sekiya-Kinen -> Race-id(3046) + Elm-Stakes -> Race-id(3047) + Kitakyushu-Kinen -> Race-id(3048) + Niigata-Junior-Stakes -> Race-id(3049) + Keeneland-Cup -> Race-id(3050) + Sapporo-Junior-Stakes -> Race-id(3051) + Kokura-Junior-Stakes -> Race-id(3052) + Niigata-Kinen -> Race-id(3053) + Shion-Stakes -> Race-id(3054) + Keisei-Hai-Autumn-Handicap -> Race-id(3055) + Sirius-Stakes -> Race-id(3056) + Saudi-Arabia-Royal-Cup -> Race-id(3057) + Fuji-Stakes -> Race-id(3058) + Artemis-Stakes -> Race-id(3059) + Fantasy-Stakes -> Race-id(3060) + Miyako-Stakes -> Race-id(3061) + Musashino-Stakes -> Race-id(3062) + Fukushima-Kinen -> Race-id(3063) + Tokyo-Sports-Hai-Junior-Stakes -> Race-id(3064) + Kyoto-Junior-Stakes -> Race-id(3065) + Keihan-Hai -> Race-id(3066) + Challenge-Cup -> Race-id(3067) + Chunichi-Shimbun-Hai -> Race-id(3068) + Capella-Stakes -> Race-id(3069) + Turquoise-Stakes -> Race-id(3070) + Manyo-Stakes -> Race-id(4001) + Junior-Cup -> Race-id(4002) + Yodo-Tankyori-Stakes -> Race-id(4003) + Pollux-Stakes -> Race-id(4004) + January-Stakes -> Race-id(4005) + New-Year-Stakes -> Race-id(4006) + Kobai-Stakes -> Race-id(4007) + Subaru-Stakes -> Race-id(4008) + Wakagoma-Stakes -> Race-id(4009) + Carbuncle-Stakes -> Race-id(4010) + Shirafuji-Stakes -> Race-id(4011) + Crocus-Stakes -> Race-id(4012) + Yamato-Stakes -> Race-id(4013) + Elfin-Stakes -> Race-id(4014) + Rakuyo-Stakes -> Race-id(4015) + Aldebaran-Stakes -> Race-id(4016) + Valentine-Stakes -> Race-id(4017) + Hyacinth-Stakes -> Race-id(4018) + Sobu-Stakes -> Race-id(4019) + Sumire-Stakes -> Race-id(4020) + Osakajo-Stakes -> Race-id(4021) + Polaris-Stakes -> Race-id(4022) + Nigawa-Stakes -> Race-id(4023) + Anemone-Stakes -> Race-id(4024) + Shoryu-Stakes -> Race-id(4025) + Kochi-Stakes -> Race-id(4026) + Wakaba-Stakes -> Race-id(4027) + Chiba-Stakes -> Race-id(4028) + Rokko-Stakes -> Race-id(4030) + Coral-Stakes -> Race-id(4031) + Marguerite-Stakes -> Race-id(4032) + Fukuryu-Stakes -> Race-id(4033) + Wasurenagusa-Sho -> Race-id(4035) + Keiyo-Stakes -> Race-id(4036) + Shunrai-Stakes -> Race-id(4037) + Fukushima-Mimpo-Hai -> Race-id(4038) + Tachibana-Stakes -> Race-id(4039) + Oasis-Stakes -> Race-id(4040) + Tennozan-Stakes -> Race-id(4041) + Tango-Stakes -> Race-id(4042) + Sweetpea-Stakes -> Race-id(4043) + Tanigawadake-Stakes -> Race-id(4044) + Principal-Stakes -> Race-id(4045) + Metropolitan-Stakes -> Race-id(4046) + Kurama-Stakes -> Race-id(4047) + Brilliant-Stakes -> Race-id(4048) + Miyakooji-Stakes -> Race-id(4049) + Aoi-Stakes -> Race-id(4050) + Ritto-Stakes -> Race-id(4051) + Seiryu-Stakes -> Race-id(4052) + May-Stakes -> Race-id(4053) + Hosu-Stakes -> Race-id(4054) + Idaten-Stakes -> Race-id(4055) + Shirayuri-Stakes -> Race-id(4056) + Keyaki-Stakes -> Race-id(4057) + Azuchijo-Stakes -> Race-id(4058) + Akhalteke-Stakes -> Race-id(4059) + Tempozan-Stakes -> Race-id(4060) + Yonago-Stakes -> Race-id(4061) + Onuma-Stakes -> Race-id(4062) + Paradise-Stakes -> Race-id(4063) + Tomoe-Sho -> Race-id(4064) + Marine-Stakes -> Race-id(4065) + Meitetsu-Hai -> Race-id(4066) + Chukyo-Junior-Stakes -> Race-id(4068) + Fukushima-TV-Open -> Race-id(4069) + Dahlia-Sho -> Race-id(4070) + Sapporo-Nikkei-Open -> Race-id(4071) + UHB-Sho -> Race-id(4072) + Aso-Stakes -> Race-id(4073) + Phoenix-Sho -> Race-id(4074) + Cosmos-Sho -> Race-id(4075) + NST-Sho -> Race-id(4076) + Clover-Sho -> Race-id(4077) + Himawari-Sho -> Race-id(4078) + BSN-Sho -> Race-id(4079) + Kokura-Nikkei-Open -> Race-id(4080) + Toki-Stakes -> Race-id(4081) + Tancho-Stakes -> Race-id(4082) + Suzuran-Sho -> Race-id(4083) + Enif-Stakes -> Race-id(4084) + Nojigiku-Stakes -> Race-id(4085) + Radio-Nippon-Sho -> Race-id(4086) + Kikyo-Stakes -> Race-id(4087) + Fuyo-Stakes -> Race-id(4088) + Canna-Stakes -> Race-id(4089) + Port-Island-Stakes -> Race-id(4090) + Opal-Stakes -> Race-id(4091) + Green-Channel-Cup -> Race-id(4092) + Momiji-Stakes -> Race-id(4093) + October-Stakes -> Race-id(4094) + Shinetsu-Stakes -> Race-id(4095) + Ivy-Stakes -> Race-id(4096) + Muromachi-Stakes -> Race-id(4097) + Brazil-Cup -> Race-id(4098) + Hagi-Stakes -> Race-id(4099) + Cassiopeia-Stakes -> Race-id(4100) + Lumiere-Autumn-Dash -> Race-id(4101) + Oro-Cup -> Race-id(4102) + Fukushima-Junior-Stakes -> Race-id(4103) + Andromeda-Stakes -> Race-id(4104) + Shimotsuki-Stakes -> Race-id(4105) + Fukushima-Minyu-Cup -> Race-id(4106) + Capital-Stakes -> Race-id(4107) + Autumn-Leaf-Stakes -> Race-id(4108) + Lapis-Lazuli-Stakes -> Race-id(4109) + Shiwasu-Stakes -> Race-id(4110) + Rigel-Stakes -> Race-id(4111) + Tanzanite-Stakes -> Race-id(4112) + December-Stakes -> Race-id(4113) + Christmas-Rose-Stakes -> Race-id(4114) + Galaxy-Stakes -> Race-id(4115) + Betelgeuse-Stakes -> Race-id(4116) + Kitakyushu-Tankyori-Stakes -> Race-id(4118) + Azumakofuji-Stakes -> Race-id(4119) + Sleipnir-Stakes -> Race-id(4120) + Sannomiya-Stakes -> Race-id(4121) + Kanetsu-Stakes -> Race-id(4122) + Nagatsuki-Stakes -> Race-id(4123) + Uzumasa-Stakes -> Race-id(4124) + Aster-Sho -> Race-id(4501) + Saffron-Sho -> Race-id(4502) + Rindo-Sho -> Race-id(4503) + Shigiku-Sho -> Race-id(4504) + Platanus-Sho -> Race-id(4505) + Nadeshiko-Sho -> Race-id(4506) + Hyakunichiso-Tokubetsu -> Race-id(4507) + Kimmokusei-Tokubetsu -> Race-id(4508) + Oxalis-Sho -> Race-id(4509) + Kigiku-Sho -> Race-id(4510) + Mochinoki-Sho -> Race-id(4511) + Akamatsu-Sho -> Race-id(4512) + Shumeigiku-Sho -> Race-id(4513) + Cattleya-Sho -> Race-id(4514) + Begonia-Sho -> Race-id(4515) + Shiragiku-Sho -> Race-id(4516) + Habotan-Sho -> Race-id(4517) + Koyamaki-Sho -> Race-id(4518) + Manryo-Sho -> Race-id(4519) + Kuromatsu-Sho -> Race-id(4520) + Erica-Sho -> Race-id(4521) + Tsuwabuki-Sho -> Race-id(4522) + Hiiragi-Sho -> Race-id(4523) + Sazanka-Sho -> Race-id(4524) + Kantsubaki-Sho -> Race-id(4525) + Senryo-Sho -> Race-id(4526) + +// List of all races in ID order for easy iterating. +pub val all = [ + February-Stakes, + Takamatsunomiya-Kinen, + Osaka-Hai, + Oka-Sho, + Satsuki-Sho, + Tenno-Sho-Spring, + NHK-Mile-Cup, + Victoria-Mile, + Japanese-Oaks, + Tokyo-Yushun-Japanese-Derby, + Yasuda-Kinen, + Takarazuka-Kinen, + Sprinters-Stakes, + Shuka-Sho, + Kikuka-Sho, + Tenno-Sho-Autumn, + Queen-Elizabeth-II-Cup, + Mile-Championship, + Japan-Cup, + Champions-Cup, + Hanshin-Juvenile-Fillies, + Asahi-Hai-Futurity-Stakes, + Arima-Kinen, + Hopeful-Stakes, + Takarazuka-Kinen-Alternate, + Kikuka-Sho-Alternate, + Tenno-Sho-Spring-Alternate, + Teio-Sho, + Japan-Dirt-Derby, + JBC-Ladies-Classic, + JBC-Sprint, + JBC-Classic, + Tokyo-Daishoten, + Nikkei-Shinshun-Hai, + Tokai-Stakes, + American-JCC, + Kyoto-Kinen, + Nakayama-Kinen, + Yayoi-Sho, + Kinko-Sho, + Fillies-Revue, + Hanshin-Daishoten, + Spring-Stakes, + Nikkei-Sho, + Hanshin-Umamusume-Stakes, + New-Zealand-Trophy, + Milers-Cup, + Flora-Stakes, + Aoba-Sho, + Kyoto-Shimbun-Hai, + Keio-Hai-Spring-Cup, + Meguro-Kinen, + Sapporo-Kinen, + Centaur-Stakes, + Rose-Stakes, + St-Lite-Kinen, + Kobe-Shimbun-Hai, + All-Comers, + Mainichi-Okan, + Kyoto-Daishoten, + Fuchu-Umamusume-Stakes, + Swan-Stakes, + Keio-Hai-Junior-Stakes, + Copa-Republica-Argentina, + Daily-Hai-Junior-Stakes, + Stayers-Stakes, + Hanshin-Cup, + Spring-Stakes-Alternate, + Kyoto-Kimpai, + Nakayama-Kimpai, + Shinzan-Kinen, + Fairy-Stakes, + Aichi-Hai, + Keisei-Hai, + Silk-Road-Stakes, + Negishi-Stakes, + Kisaragi-Sho, + Tokyo-Shimbun-Hai, + Queen-Cup, + Kyodo-News-Hai, + Kyoto-Umamusume-Stakes, + Diamond-Stakes, + Kokura-Daishoten, + Arlington-Cup, + Hankyu-Hai, + Tulip-Sho, + Ocean-Stakes, + Nakayama-Umamusume-Stakes, + Falcon-Stakes, + Flower-Cup, + Mainichi-Hai, + March-Stakes, + Lord-Derby-Challenge-Trophy, + Antares-Stakes, + Fukushima-Umamusume-Stakes, + Niigata-Daishoten, + Heian-Stakes, + Naruo-Kinen, + Mermaid-Stakes, + Epsom-Cup, + Unicorn-Stakes, + Hakodate-Sprint-Stakes, + CBC-Sho, + Radio-Nikkei-Sho, + Procyon-Stakes, + Tanabata-Sho, + Hakodate-Kinen, + Chukyo-Kinen, + Hakodate-Junior-Stakes, + Ibis-Summer-Dash, + Queen-Stakes, + Kokura-Kinen, + Leopard-Stakes, + Sekiya-Kinen, + Elm-Stakes, + Kitakyushu-Kinen, + Niigata-Junior-Stakes, + Keeneland-Cup, + Sapporo-Junior-Stakes, + Kokura-Junior-Stakes, + Niigata-Kinen, + Shion-Stakes, + Keisei-Hai-Autumn-Handicap, + Sirius-Stakes, + Saudi-Arabia-Royal-Cup, + Fuji-Stakes, + Artemis-Stakes, + Fantasy-Stakes, + Miyako-Stakes, + Musashino-Stakes, + Fukushima-Kinen, + Tokyo-Sports-Hai-Junior-Stakes, + Kyoto-Junior-Stakes, + Keihan-Hai, + Challenge-Cup, + Chunichi-Shimbun-Hai, + Capella-Stakes, + Turquoise-Stakes, + Manyo-Stakes, + Junior-Cup, + Yodo-Tankyori-Stakes, + Pollux-Stakes, + January-Stakes, + New-Year-Stakes, + Kobai-Stakes, + Subaru-Stakes, + Wakagoma-Stakes, + Carbuncle-Stakes, + Shirafuji-Stakes, + Crocus-Stakes, + Yamato-Stakes, + Elfin-Stakes, + Rakuyo-Stakes, + Aldebaran-Stakes, + Valentine-Stakes, + Hyacinth-Stakes, + Sobu-Stakes, + Sumire-Stakes, + Osakajo-Stakes, + Polaris-Stakes, + Nigawa-Stakes, + Anemone-Stakes, + Shoryu-Stakes, + Kochi-Stakes, + Wakaba-Stakes, + Chiba-Stakes, + Rokko-Stakes, + Coral-Stakes, + Marguerite-Stakes, + Fukuryu-Stakes, + Wasurenagusa-Sho, + Keiyo-Stakes, + Shunrai-Stakes, + Fukushima-Mimpo-Hai, + Tachibana-Stakes, + Oasis-Stakes, + Tennozan-Stakes, + Tango-Stakes, + Sweetpea-Stakes, + Tanigawadake-Stakes, + Principal-Stakes, + Metropolitan-Stakes, + Kurama-Stakes, + Brilliant-Stakes, + Miyakooji-Stakes, + Aoi-Stakes, + Ritto-Stakes, + Seiryu-Stakes, + May-Stakes, + Hosu-Stakes, + Idaten-Stakes, + Shirayuri-Stakes, + Keyaki-Stakes, + Azuchijo-Stakes, + Akhalteke-Stakes, + Tempozan-Stakes, + Yonago-Stakes, + Onuma-Stakes, + Paradise-Stakes, + Tomoe-Sho, + Marine-Stakes, + Meitetsu-Hai, + Chukyo-Junior-Stakes, + Fukushima-TV-Open, + Dahlia-Sho, + Sapporo-Nikkei-Open, + UHB-Sho, + Aso-Stakes, + Phoenix-Sho, + Cosmos-Sho, + NST-Sho, + Clover-Sho, + Himawari-Sho, + BSN-Sho, + Kokura-Nikkei-Open, + Toki-Stakes, + Tancho-Stakes, + Suzuran-Sho, + Enif-Stakes, + Nojigiku-Stakes, + Radio-Nippon-Sho, + Kikyo-Stakes, + Fuyo-Stakes, + Canna-Stakes, + Port-Island-Stakes, + Opal-Stakes, + Green-Channel-Cup, + Momiji-Stakes, + October-Stakes, + Shinetsu-Stakes, + Ivy-Stakes, + Muromachi-Stakes, + Brazil-Cup, + Hagi-Stakes, + Cassiopeia-Stakes, + Lumiere-Autumn-Dash, + Oro-Cup, + Fukushima-Junior-Stakes, + Andromeda-Stakes, + Shimotsuki-Stakes, + Fukushima-Minyu-Cup, + Capital-Stakes, + Autumn-Leaf-Stakes, + Lapis-Lazuli-Stakes, + Shiwasu-Stakes, + Rigel-Stakes, + Tanzanite-Stakes, + December-Stakes, + Christmas-Rose-Stakes, + Galaxy-Stakes, + Betelgeuse-Stakes, + Kitakyushu-Tankyori-Stakes, + Azumakofuji-Stakes, + Sleipnir-Stakes, + Sannomiya-Stakes, + Kanetsu-Stakes, + Nagatsuki-Stakes, + Uzumasa-Stakes, + Aster-Sho, + Saffron-Sho, + Rindo-Sho, + Shigiku-Sho, + Platanus-Sho, + Nadeshiko-Sho, + Hyakunichiso-Tokubetsu, + Kimmokusei-Tokubetsu, + Oxalis-Sho, + Kigiku-Sho, + Mochinoki-Sho, + Akamatsu-Sho, + Shumeigiku-Sho, + Cattleya-Sho, + Begonia-Sho, + Shiragiku-Sho, + Habotan-Sho, + Koyamaki-Sho, + Manryo-Sho, + Kuromatsu-Sho, + Erica-Sho, + Tsuwabuki-Sho, + Hiiragi-Sho, + Sazanka-Sho, + Kantsubaki-Sho, + Senryo-Sho, +] + +val name2id: rbmap = rb-map/empty() + .set("February Stakes", Race-id(1001)) + .set("Takamatsunomiya Kinen", Race-id(1002)) + .set("Osaka Hai", Race-id(1003)) + .set("Oka Sho", Race-id(1004)) + .set("Satsuki Sho", Race-id(1005)) + .set("Tenno Sho (Spring)", Race-id(1006)) + .set("NHK Mile Cup", Race-id(1007)) + .set("Victoria Mile", Race-id(1008)) + .set("Japanese Oaks", Race-id(1009)) + .set("Tokyo Yushun (Japanese Derby)", Race-id(1010)) + .set("Yasuda Kinen", Race-id(1011)) + .set("Takarazuka Kinen", Race-id(1012)) + .set("Sprinters Stakes", Race-id(1013)) + .set("Shuka Sho", Race-id(1014)) + .set("Kikuka Sho", Race-id(1015)) + .set("Tenno Sho (Autumn)", Race-id(1016)) + .set("Queen Elizabeth II Cup", Race-id(1017)) + .set("Mile Championship", Race-id(1018)) + .set("Japan Cup", Race-id(1019)) + .set("Champions Cup", Race-id(1020)) + .set("Hanshin Juvenile Fillies", Race-id(1021)) + .set("Asahi Hai Futurity Stakes", Race-id(1022)) + .set("Arima Kinen", Race-id(1023)) + .set("Hopeful Stakes", Race-id(1024)) + .set("Takarazuka Kinen" ++ " (Alternate)", Race-id(1025)) + .set("Kikuka Sho" ++ " (Alternate)", Race-id(1026)) + .set("Tenno Sho (Spring)" ++ " (Alternate)", Race-id(1027)) + .set("Teio Sho", Race-id(1101)) + .set("Japan Dirt Derby", Race-id(1102)) + .set("JBC Ladies’ Classic", Race-id(1103)) + .set("JBC Sprint", Race-id(1104)) + .set("JBC Classic", Race-id(1105)) + .set("Tokyo Daishoten", Race-id(1106)) + .set("Nikkei Shinshun Hai", Race-id(2001)) + .set("Tokai Stakes", Race-id(2002)) + .set("American JCC", Race-id(2003)) + .set("Kyoto Kinen", Race-id(2004)) + .set("Nakayama Kinen", Race-id(2005)) + .set("Yayoi Sho", Race-id(2006)) + .set("Kinko Sho", Race-id(2007)) + .set("Fillies' Revue", Race-id(2008)) + .set("Hanshin Daishoten", Race-id(2009)) + .set("Spring Stakes", Race-id(2010)) + .set("Nikkei Sho", Race-id(2011)) + .set("Hanshin Umamusume Stakes", Race-id(2012)) + .set("New Zealand Trophy", Race-id(2013)) + .set("Milers Cup", Race-id(2014)) + .set("Flora Stakes", Race-id(2015)) + .set("Aoba Sho", Race-id(2016)) + .set("Kyoto Shimbun Hai", Race-id(2017)) + .set("Keio Hai Spring Cup", Race-id(2018)) + .set("Meguro Kinen", Race-id(2019)) + .set("Sapporo Kinen", Race-id(2020)) + .set("Centaur Stakes", Race-id(2021)) + .set("Rose Stakes", Race-id(2022)) + .set("St. Lite Kinen", Race-id(2023)) + .set("Kobe Shimbun Hai", Race-id(2024)) + .set("All Comers", Race-id(2025)) + .set("Mainichi Okan", Race-id(2026)) + .set("Kyoto Daishoten", Race-id(2027)) + .set("Fuchu Umamusume Stakes", Race-id(2028)) + .set("Swan Stakes", Race-id(2029)) + .set("Keio Hai Junior Stakes", Race-id(2030)) + .set("Copa Republica Argentina", Race-id(2031)) + .set("Daily Hai Junior Stakes", Race-id(2032)) + .set("Stayers Stakes", Race-id(2033)) + .set("Hanshin Cup", Race-id(2034)) + .set("Spring Stakes" ++ " (Alternate)", Race-id(2035)) + .set("Kyoto Kimpai", Race-id(3001)) + .set("Nakayama Kimpai", Race-id(3002)) + .set("Shinzan Kinen", Race-id(3003)) + .set("Fairy Stakes", Race-id(3004)) + .set("Aichi Hai", Race-id(3005)) + .set("Keisei Hai", Race-id(3006)) + .set("Silk Road Stakes", Race-id(3007)) + .set("Negishi Stakes", Race-id(3008)) + .set("Kisaragi Sho", Race-id(3009)) + .set("Tokyo Shimbun Hai", Race-id(3010)) + .set("Queen Cup", Race-id(3011)) + .set("Kyodo News Hai", Race-id(3012)) + .set("Kyoto Umamusume Stakes", Race-id(3013)) + .set("Diamond Stakes", Race-id(3014)) + .set("Kokura Daishoten", Race-id(3015)) + .set("Arlington Cup", Race-id(3016)) + .set("Hankyu Hai", Race-id(3017)) + .set("Tulip Sho", Race-id(3018)) + .set("Ocean Stakes", Race-id(3019)) + .set("Nakayama Umamusume Stakes", Race-id(3020)) + .set("Falcon Stakes", Race-id(3021)) + .set("Flower Cup", Race-id(3022)) + .set("Mainichi Hai", Race-id(3023)) + .set("March Stakes", Race-id(3024)) + .set("Lord Derby Challenge Trophy", Race-id(3025)) + .set("Antares Stakes", Race-id(3026)) + .set("Fukushima Umamusume Stakes", Race-id(3027)) + .set("Niigata Daishoten", Race-id(3028)) + .set("Heian Stakes", Race-id(3029)) + .set("Naruo Kinen", Race-id(3030)) + .set("Mermaid Stakes", Race-id(3031)) + .set("Epsom Cup", Race-id(3032)) + .set("Unicorn Stakes", Race-id(3033)) + .set("Hakodate Sprint Stakes", Race-id(3034)) + .set("CBC Sho", Race-id(3035)) + .set("Radio Nikkei Sho", Race-id(3036)) + .set("Procyon Stakes", Race-id(3037)) + .set("Tanabata Sho", Race-id(3038)) + .set("Hakodate Kinen", Race-id(3039)) + .set("Chukyo Kinen", Race-id(3040)) + .set("Hakodate Junior Stakes", Race-id(3041)) + .set("Ibis Summer Dash", Race-id(3042)) + .set("Queen Stakes", Race-id(3043)) + .set("Kokura Kinen", Race-id(3044)) + .set("Leopard Stakes", Race-id(3045)) + .set("Sekiya Kinen", Race-id(3046)) + .set("Elm Stakes", Race-id(3047)) + .set("Kitakyushu Kinen", Race-id(3048)) + .set("Niigata Junior Stakes", Race-id(3049)) + .set("Keeneland Cup", Race-id(3050)) + .set("Sapporo Junior Stakes", Race-id(3051)) + .set("Kokura Junior Stakes", Race-id(3052)) + .set("Niigata Kinen", Race-id(3053)) + .set("Shion Stakes", Race-id(3054)) + .set("Keisei Hai Autumn Handicap", Race-id(3055)) + .set("Sirius Stakes", Race-id(3056)) + .set("Saudi Arabia Royal Cup", Race-id(3057)) + .set("Fuji Stakes", Race-id(3058)) + .set("Artemis Stakes", Race-id(3059)) + .set("Fantasy Stakes", Race-id(3060)) + .set("Miyako Stakes", Race-id(3061)) + .set("Musashino Stakes", Race-id(3062)) + .set("Fukushima Kinen", Race-id(3063)) + .set("Tokyo Sports Hai Junior Stakes", Race-id(3064)) + .set("Kyoto Junior Stakes", Race-id(3065)) + .set("Keihan Hai", Race-id(3066)) + .set("Challenge Cup", Race-id(3067)) + .set("Chunichi Shimbun Hai", Race-id(3068)) + .set("Capella Stakes", Race-id(3069)) + .set("Turquoise Stakes", Race-id(3070)) + .set("Manyo Stakes", Race-id(4001)) + .set("Junior Cup", Race-id(4002)) + .set("Yodo Tankyori Stakes", Race-id(4003)) + .set("Pollux Stakes", Race-id(4004)) + .set("January Stakes", Race-id(4005)) + .set("New Year Stakes", Race-id(4006)) + .set("Kobai Stakes", Race-id(4007)) + .set("Subaru Stakes", Race-id(4008)) + .set("Wakagoma Stakes", Race-id(4009)) + .set("Carbuncle Stakes", Race-id(4010)) + .set("Shirafuji Stakes", Race-id(4011)) + .set("Crocus Stakes", Race-id(4012)) + .set("Yamato Stakes", Race-id(4013)) + .set("Elfin Stakes", Race-id(4014)) + .set("Rakuyo Stakes", Race-id(4015)) + .set("Aldebaran Stakes", Race-id(4016)) + .set("Valentine Stakes", Race-id(4017)) + .set("Hyacinth Stakes", Race-id(4018)) + .set("Sobu Stakes", Race-id(4019)) + .set("Sumire Stakes", Race-id(4020)) + .set("Osakajo Stakes", Race-id(4021)) + .set("Polaris Stakes", Race-id(4022)) + .set("Nigawa Stakes", Race-id(4023)) + .set("Anemone Stakes", Race-id(4024)) + .set("Shoryu Stakes", Race-id(4025)) + .set("Kochi Stakes", Race-id(4026)) + .set("Wakaba Stakes", Race-id(4027)) + .set("Chiba Stakes", Race-id(4028)) + .set("Rokko Stakes", Race-id(4030)) + .set("Coral Stakes", Race-id(4031)) + .set("Marguerite Stakes", Race-id(4032)) + .set("Fukuryu Stakes", Race-id(4033)) + .set("Wasurenagusa Sho", Race-id(4035)) + .set("Keiyo Stakes", Race-id(4036)) + .set("Shunrai Stakes", Race-id(4037)) + .set("Fukushima Mimpo Hai", Race-id(4038)) + .set("Tachibana Stakes", Race-id(4039)) + .set("Oasis Stakes", Race-id(4040)) + .set("Tennozan Stakes", Race-id(4041)) + .set("Tango Stakes", Race-id(4042)) + .set("Sweetpea Stakes", Race-id(4043)) + .set("Tanigawadake Stakes", Race-id(4044)) + .set("Principal Stakes", Race-id(4045)) + .set("Metropolitan Stakes", Race-id(4046)) + .set("Kurama Stakes", Race-id(4047)) + .set("Brilliant Stakes", Race-id(4048)) + .set("Miyakooji Stakes", Race-id(4049)) + .set("Aoi Stakes", Race-id(4050)) + .set("Ritto Stakes", Race-id(4051)) + .set("Seiryu Stakes", Race-id(4052)) + .set("May Stakes", Race-id(4053)) + .set("Hosu Stakes", Race-id(4054)) + .set("Idaten Stakes", Race-id(4055)) + .set("Shirayuri Stakes", Race-id(4056)) + .set("Keyaki Stakes", Race-id(4057)) + .set("Azuchijo Stakes", Race-id(4058)) + .set("Akhalteke Stakes", Race-id(4059)) + .set("Tempozan Stakes", Race-id(4060)) + .set("Yonago Stakes", Race-id(4061)) + .set("Onuma Stakes", Race-id(4062)) + .set("Paradise Stakes", Race-id(4063)) + .set("Tomoe Sho", Race-id(4064)) + .set("Marine Stakes", Race-id(4065)) + .set("Meitetsu Hai", Race-id(4066)) + .set("Chukyo Junior Stakes", Race-id(4068)) + .set("Fukushima TV Open", Race-id(4069)) + .set("Dahlia Sho", Race-id(4070)) + .set("Sapporo Nikkei Open", Race-id(4071)) + .set("UHB Sho", Race-id(4072)) + .set("Aso Stakes", Race-id(4073)) + .set("Phoenix Sho", Race-id(4074)) + .set("Cosmos Sho", Race-id(4075)) + .set("NST Sho", Race-id(4076)) + .set("Clover Sho", Race-id(4077)) + .set("Himawari Sho", Race-id(4078)) + .set("BSN Sho", Race-id(4079)) + .set("Kokura Nikkei Open", Race-id(4080)) + .set("Toki Stakes", Race-id(4081)) + .set("Tancho Stakes", Race-id(4082)) + .set("Suzuran Sho", Race-id(4083)) + .set("Enif Stakes", Race-id(4084)) + .set("Nojigiku Stakes", Race-id(4085)) + .set("Radio Nippon Sho", Race-id(4086)) + .set("Kikyo Stakes", Race-id(4087)) + .set("Fuyo Stakes", Race-id(4088)) + .set("Canna Stakes", Race-id(4089)) + .set("Port Island Stakes", Race-id(4090)) + .set("Opal Stakes", Race-id(4091)) + .set("Green Channel Cup", Race-id(4092)) + .set("Momiji Stakes", Race-id(4093)) + .set("October Stakes", Race-id(4094)) + .set("Shinetsu Stakes", Race-id(4095)) + .set("Ivy Stakes", Race-id(4096)) + .set("Muromachi Stakes", Race-id(4097)) + .set("Brazil Cup", Race-id(4098)) + .set("Hagi Stakes", Race-id(4099)) + .set("Cassiopeia Stakes", Race-id(4100)) + .set("Lumiere Autumn Dash", Race-id(4101)) + .set("Oro Cup", Race-id(4102)) + .set("Fukushima Junior Stakes", Race-id(4103)) + .set("Andromeda Stakes", Race-id(4104)) + .set("Shimotsuki Stakes", Race-id(4105)) + .set("Fukushima Minyu Cup", Race-id(4106)) + .set("Capital Stakes", Race-id(4107)) + .set("Autumn Leaf Stakes", Race-id(4108)) + .set("Lapis Lazuli Stakes", Race-id(4109)) + .set("Shiwasu Stakes", Race-id(4110)) + .set("Rigel Stakes", Race-id(4111)) + .set("Tanzanite Stakes", Race-id(4112)) + .set("December Stakes", Race-id(4113)) + .set("Christmas Rose Stakes", Race-id(4114)) + .set("Galaxy Stakes", Race-id(4115)) + .set("Betelgeuse Stakes", Race-id(4116)) + .set("Kitakyushu Tankyori Stakes", Race-id(4118)) + .set("Azumakofuji Stakes", Race-id(4119)) + .set("Sleipnir Stakes", Race-id(4120)) + .set("Sannomiya Stakes", Race-id(4121)) + .set("Kanetsu Stakes", Race-id(4122)) + .set("Nagatsuki Stakes", Race-id(4123)) + .set("Uzumasa Stakes", Race-id(4124)) + .set("Aster Sho", Race-id(4501)) + .set("Saffron Sho", Race-id(4502)) + .set("Rindo Sho", Race-id(4503)) + .set("Shigiku Sho", Race-id(4504)) + .set("Platanus Sho", Race-id(4505)) + .set("Nadeshiko Sho", Race-id(4506)) + .set("Hyakunichiso Tokubetsu", Race-id(4507)) + .set("Kimmokusei Tokubetsu", Race-id(4508)) + .set("Oxalis Sho", Race-id(4509)) + .set("Kigiku Sho", Race-id(4510)) + .set("Mochinoki Sho", Race-id(4511)) + .set("Akamatsu Sho", Race-id(4512)) + .set("Shumeigiku Sho", Race-id(4513)) + .set("Cattleya Sho", Race-id(4514)) + .set("Begonia Sho", Race-id(4515)) + .set("Shiragiku Sho", Race-id(4516)) + .set("Habotan Sho", Race-id(4517)) + .set("Koyamaki Sho", Race-id(4518)) + .set("Manryo Sho", Race-id(4519)) + .set("Kuromatsu Sho", Race-id(4520)) + .set("Erica Sho", Race-id(4521)) + .set("Tsuwabuki Sho", Race-id(4522)) + .set("Hiiragi Sho", Race-id(4523)) + .set("Sazanka Sho", Race-id(4524)) + .set("Kantsubaki Sho", Race-id(4525)) + .set("Senryo Sho", Race-id(4526)) + +// Get the race ID that has the given exact name. +// Alternate versions of races have " (Alternate)" in their names. +// If no race matches the name, the result is an invalid ID. +pub fun from-name(name: string): race-id + name2id.lookup(name).default(Race-id(0)) + +// Get the name for a race. +// Alternate versions of races have " (Alternate)" in their names. +// If no race matches the ID, the result is the numeric ID. +pub fun show(r: race-id): string + match r.game-id + 1001 -> "February Stakes" + 1002 -> "Takamatsunomiya Kinen" + 1003 -> "Osaka Hai" + 1004 -> "Oka Sho" + 1005 -> "Satsuki Sho" + 1006 -> "Tenno Sho (Spring)" + 1007 -> "NHK Mile Cup" + 1008 -> "Victoria Mile" + 1009 -> "Japanese Oaks" + 1010 -> "Tokyo Yushun (Japanese Derby)" + 1011 -> "Yasuda Kinen" + 1012 -> "Takarazuka Kinen" + 1013 -> "Sprinters Stakes" + 1014 -> "Shuka Sho" + 1015 -> "Kikuka Sho" + 1016 -> "Tenno Sho (Autumn)" + 1017 -> "Queen Elizabeth II Cup" + 1018 -> "Mile Championship" + 1019 -> "Japan Cup" + 1020 -> "Champions Cup" + 1021 -> "Hanshin Juvenile Fillies" + 1022 -> "Asahi Hai Futurity Stakes" + 1023 -> "Arima Kinen" + 1024 -> "Hopeful Stakes" + 1025 -> "Takarazuka Kinen" ++ " (Alternate)" + 1026 -> "Kikuka Sho" ++ " (Alternate)" + 1027 -> "Tenno Sho (Spring)" ++ " (Alternate)" + 1101 -> "Teio Sho" + 1102 -> "Japan Dirt Derby" + 1103 -> "JBC Ladies’ Classic" + 1104 -> "JBC Sprint" + 1105 -> "JBC Classic" + 1106 -> "Tokyo Daishoten" + 2001 -> "Nikkei Shinshun Hai" + 2002 -> "Tokai Stakes" + 2003 -> "American JCC" + 2004 -> "Kyoto Kinen" + 2005 -> "Nakayama Kinen" + 2006 -> "Yayoi Sho" + 2007 -> "Kinko Sho" + 2008 -> "Fillies' Revue" + 2009 -> "Hanshin Daishoten" + 2010 -> "Spring Stakes" + 2011 -> "Nikkei Sho" + 2012 -> "Hanshin Umamusume Stakes" + 2013 -> "New Zealand Trophy" + 2014 -> "Milers Cup" + 2015 -> "Flora Stakes" + 2016 -> "Aoba Sho" + 2017 -> "Kyoto Shimbun Hai" + 2018 -> "Keio Hai Spring Cup" + 2019 -> "Meguro Kinen" + 2020 -> "Sapporo Kinen" + 2021 -> "Centaur Stakes" + 2022 -> "Rose Stakes" + 2023 -> "St. Lite Kinen" + 2024 -> "Kobe Shimbun Hai" + 2025 -> "All Comers" + 2026 -> "Mainichi Okan" + 2027 -> "Kyoto Daishoten" + 2028 -> "Fuchu Umamusume Stakes" + 2029 -> "Swan Stakes" + 2030 -> "Keio Hai Junior Stakes" + 2031 -> "Copa Republica Argentina" + 2032 -> "Daily Hai Junior Stakes" + 2033 -> "Stayers Stakes" + 2034 -> "Hanshin Cup" + 2035 -> "Spring Stakes" ++ " (Alternate)" + 3001 -> "Kyoto Kimpai" + 3002 -> "Nakayama Kimpai" + 3003 -> "Shinzan Kinen" + 3004 -> "Fairy Stakes" + 3005 -> "Aichi Hai" + 3006 -> "Keisei Hai" + 3007 -> "Silk Road Stakes" + 3008 -> "Negishi Stakes" + 3009 -> "Kisaragi Sho" + 3010 -> "Tokyo Shimbun Hai" + 3011 -> "Queen Cup" + 3012 -> "Kyodo News Hai" + 3013 -> "Kyoto Umamusume Stakes" + 3014 -> "Diamond Stakes" + 3015 -> "Kokura Daishoten" + 3016 -> "Arlington Cup" + 3017 -> "Hankyu Hai" + 3018 -> "Tulip Sho" + 3019 -> "Ocean Stakes" + 3020 -> "Nakayama Umamusume Stakes" + 3021 -> "Falcon Stakes" + 3022 -> "Flower Cup" + 3023 -> "Mainichi Hai" + 3024 -> "March Stakes" + 3025 -> "Lord Derby Challenge Trophy" + 3026 -> "Antares Stakes" + 3027 -> "Fukushima Umamusume Stakes" + 3028 -> "Niigata Daishoten" + 3029 -> "Heian Stakes" + 3030 -> "Naruo Kinen" + 3031 -> "Mermaid Stakes" + 3032 -> "Epsom Cup" + 3033 -> "Unicorn Stakes" + 3034 -> "Hakodate Sprint Stakes" + 3035 -> "CBC Sho" + 3036 -> "Radio Nikkei Sho" + 3037 -> "Procyon Stakes" + 3038 -> "Tanabata Sho" + 3039 -> "Hakodate Kinen" + 3040 -> "Chukyo Kinen" + 3041 -> "Hakodate Junior Stakes" + 3042 -> "Ibis Summer Dash" + 3043 -> "Queen Stakes" + 3044 -> "Kokura Kinen" + 3045 -> "Leopard Stakes" + 3046 -> "Sekiya Kinen" + 3047 -> "Elm Stakes" + 3048 -> "Kitakyushu Kinen" + 3049 -> "Niigata Junior Stakes" + 3050 -> "Keeneland Cup" + 3051 -> "Sapporo Junior Stakes" + 3052 -> "Kokura Junior Stakes" + 3053 -> "Niigata Kinen" + 3054 -> "Shion Stakes" + 3055 -> "Keisei Hai Autumn Handicap" + 3056 -> "Sirius Stakes" + 3057 -> "Saudi Arabia Royal Cup" + 3058 -> "Fuji Stakes" + 3059 -> "Artemis Stakes" + 3060 -> "Fantasy Stakes" + 3061 -> "Miyako Stakes" + 3062 -> "Musashino Stakes" + 3063 -> "Fukushima Kinen" + 3064 -> "Tokyo Sports Hai Junior Stakes" + 3065 -> "Kyoto Junior Stakes" + 3066 -> "Keihan Hai" + 3067 -> "Challenge Cup" + 3068 -> "Chunichi Shimbun Hai" + 3069 -> "Capella Stakes" + 3070 -> "Turquoise Stakes" + 4001 -> "Manyo Stakes" + 4002 -> "Junior Cup" + 4003 -> "Yodo Tankyori Stakes" + 4004 -> "Pollux Stakes" + 4005 -> "January Stakes" + 4006 -> "New Year Stakes" + 4007 -> "Kobai Stakes" + 4008 -> "Subaru Stakes" + 4009 -> "Wakagoma Stakes" + 4010 -> "Carbuncle Stakes" + 4011 -> "Shirafuji Stakes" + 4012 -> "Crocus Stakes" + 4013 -> "Yamato Stakes" + 4014 -> "Elfin Stakes" + 4015 -> "Rakuyo Stakes" + 4016 -> "Aldebaran Stakes" + 4017 -> "Valentine Stakes" + 4018 -> "Hyacinth Stakes" + 4019 -> "Sobu Stakes" + 4020 -> "Sumire Stakes" + 4021 -> "Osakajo Stakes" + 4022 -> "Polaris Stakes" + 4023 -> "Nigawa Stakes" + 4024 -> "Anemone Stakes" + 4025 -> "Shoryu Stakes" + 4026 -> "Kochi Stakes" + 4027 -> "Wakaba Stakes" + 4028 -> "Chiba Stakes" + 4030 -> "Rokko Stakes" + 4031 -> "Coral Stakes" + 4032 -> "Marguerite Stakes" + 4033 -> "Fukuryu Stakes" + 4035 -> "Wasurenagusa Sho" + 4036 -> "Keiyo Stakes" + 4037 -> "Shunrai Stakes" + 4038 -> "Fukushima Mimpo Hai" + 4039 -> "Tachibana Stakes" + 4040 -> "Oasis Stakes" + 4041 -> "Tennozan Stakes" + 4042 -> "Tango Stakes" + 4043 -> "Sweetpea Stakes" + 4044 -> "Tanigawadake Stakes" + 4045 -> "Principal Stakes" + 4046 -> "Metropolitan Stakes" + 4047 -> "Kurama Stakes" + 4048 -> "Brilliant Stakes" + 4049 -> "Miyakooji Stakes" + 4050 -> "Aoi Stakes" + 4051 -> "Ritto Stakes" + 4052 -> "Seiryu Stakes" + 4053 -> "May Stakes" + 4054 -> "Hosu Stakes" + 4055 -> "Idaten Stakes" + 4056 -> "Shirayuri Stakes" + 4057 -> "Keyaki Stakes" + 4058 -> "Azuchijo Stakes" + 4059 -> "Akhalteke Stakes" + 4060 -> "Tempozan Stakes" + 4061 -> "Yonago Stakes" + 4062 -> "Onuma Stakes" + 4063 -> "Paradise Stakes" + 4064 -> "Tomoe Sho" + 4065 -> "Marine Stakes" + 4066 -> "Meitetsu Hai" + 4068 -> "Chukyo Junior Stakes" + 4069 -> "Fukushima TV Open" + 4070 -> "Dahlia Sho" + 4071 -> "Sapporo Nikkei Open" + 4072 -> "UHB Sho" + 4073 -> "Aso Stakes" + 4074 -> "Phoenix Sho" + 4075 -> "Cosmos Sho" + 4076 -> "NST Sho" + 4077 -> "Clover Sho" + 4078 -> "Himawari Sho" + 4079 -> "BSN Sho" + 4080 -> "Kokura Nikkei Open" + 4081 -> "Toki Stakes" + 4082 -> "Tancho Stakes" + 4083 -> "Suzuran Sho" + 4084 -> "Enif Stakes" + 4085 -> "Nojigiku Stakes" + 4086 -> "Radio Nippon Sho" + 4087 -> "Kikyo Stakes" + 4088 -> "Fuyo Stakes" + 4089 -> "Canna Stakes" + 4090 -> "Port Island Stakes" + 4091 -> "Opal Stakes" + 4092 -> "Green Channel Cup" + 4093 -> "Momiji Stakes" + 4094 -> "October Stakes" + 4095 -> "Shinetsu Stakes" + 4096 -> "Ivy Stakes" + 4097 -> "Muromachi Stakes" + 4098 -> "Brazil Cup" + 4099 -> "Hagi Stakes" + 4100 -> "Cassiopeia Stakes" + 4101 -> "Lumiere Autumn Dash" + 4102 -> "Oro Cup" + 4103 -> "Fukushima Junior Stakes" + 4104 -> "Andromeda Stakes" + 4105 -> "Shimotsuki Stakes" + 4106 -> "Fukushima Minyu Cup" + 4107 -> "Capital Stakes" + 4108 -> "Autumn Leaf Stakes" + 4109 -> "Lapis Lazuli Stakes" + 4110 -> "Shiwasu Stakes" + 4111 -> "Rigel Stakes" + 4112 -> "Tanzanite Stakes" + 4113 -> "December Stakes" + 4114 -> "Christmas Rose Stakes" + 4115 -> "Galaxy Stakes" + 4116 -> "Betelgeuse Stakes" + 4118 -> "Kitakyushu Tankyori Stakes" + 4119 -> "Azumakofuji Stakes" + 4120 -> "Sleipnir Stakes" + 4121 -> "Sannomiya Stakes" + 4122 -> "Kanetsu Stakes" + 4123 -> "Nagatsuki Stakes" + 4124 -> "Uzumasa Stakes" + 4501 -> "Aster Sho" + 4502 -> "Saffron Sho" + 4503 -> "Rindo Sho" + 4504 -> "Shigiku Sho" + 4505 -> "Platanus Sho" + 4506 -> "Nadeshiko Sho" + 4507 -> "Hyakunichiso Tokubetsu" + 4508 -> "Kimmokusei Tokubetsu" + 4509 -> "Oxalis Sho" + 4510 -> "Kigiku Sho" + 4511 -> "Mochinoki Sho" + 4512 -> "Akamatsu Sho" + 4513 -> "Shumeigiku Sho" + 4514 -> "Cattleya Sho" + 4515 -> "Begonia Sho" + 4516 -> "Shiragiku Sho" + 4517 -> "Habotan Sho" + 4518 -> "Koyamaki Sho" + 4519 -> "Manryo Sho" + 4520 -> "Kuromatsu Sho" + 4521 -> "Erica Sho" + 4522 -> "Tsuwabuki Sho" + 4523 -> "Hiiragi Sho" + 4524 -> "Sazanka Sho" + 4525 -> "Kantsubaki Sho" + 4526 -> "Senryo Sho" + x -> "race " ++ x.show + +// Get the grade for a race. +// If no race matches the ID, the result is Pre-OP. +pub fun grade(r: race-id): grade + match r.game-id + 1001 -> G1 + 1002 -> G1 + 1003 -> G1 + 1004 -> G1 + 1005 -> G1 + 1006 -> G1 + 1007 -> G1 + 1008 -> G1 + 1009 -> G1 + 1010 -> G1 + 1011 -> G1 + 1012 -> G1 + 1013 -> G1 + 1014 -> G1 + 1015 -> G1 + 1016 -> G1 + 1017 -> G1 + 1018 -> G1 + 1019 -> G1 + 1020 -> G1 + 1021 -> G1 + 1022 -> G1 + 1023 -> G1 + 1024 -> G1 + 1025 -> G1 + 1026 -> G1 + 1027 -> G1 + 1101 -> G1 + 1102 -> G1 + 1103 -> G1 + 1104 -> G1 + 1105 -> G1 + 1106 -> G1 + 2001 -> G2 + 2002 -> G2 + 2003 -> G2 + 2004 -> G2 + 2005 -> G2 + 2006 -> G2 + 2007 -> G2 + 2008 -> G2 + 2009 -> G2 + 2010 -> G2 + 2011 -> G2 + 2012 -> G2 + 2013 -> G2 + 2014 -> G2 + 2015 -> G2 + 2016 -> G2 + 2017 -> G2 + 2018 -> G2 + 2019 -> G2 + 2020 -> G2 + 2021 -> G2 + 2022 -> G2 + 2023 -> G2 + 2024 -> G2 + 2025 -> G2 + 2026 -> G2 + 2027 -> G2 + 2028 -> G2 + 2029 -> G2 + 2030 -> G2 + 2031 -> G2 + 2032 -> G2 + 2033 -> G2 + 2034 -> G2 + 2035 -> G2 + 3001 -> G3 + 3002 -> G3 + 3003 -> G3 + 3004 -> G3 + 3005 -> G3 + 3006 -> G3 + 3007 -> G3 + 3008 -> G3 + 3009 -> G3 + 3010 -> G3 + 3011 -> G3 + 3012 -> G3 + 3013 -> G3 + 3014 -> G3 + 3015 -> G3 + 3016 -> G3 + 3017 -> G3 + 3018 -> G2 + 3019 -> G3 + 3020 -> G3 + 3021 -> G3 + 3022 -> G3 + 3023 -> G3 + 3024 -> G3 + 3025 -> G3 + 3026 -> G3 + 3027 -> G3 + 3028 -> G3 + 3029 -> G3 + 3030 -> G3 + 3031 -> G3 + 3032 -> G3 + 3033 -> G3 + 3034 -> G3 + 3035 -> G3 + 3036 -> G3 + 3037 -> G3 + 3038 -> G3 + 3039 -> G3 + 3040 -> G3 + 3041 -> G3 + 3042 -> G3 + 3043 -> G3 + 3044 -> G3 + 3045 -> G3 + 3046 -> G3 + 3047 -> G3 + 3048 -> G3 + 3049 -> G3 + 3050 -> G3 + 3051 -> G3 + 3052 -> G3 + 3053 -> G3 + 3054 -> G3 + 3055 -> G3 + 3056 -> G3 + 3057 -> G3 + 3058 -> G2 + 3059 -> G3 + 3060 -> G3 + 3061 -> G3 + 3062 -> G3 + 3063 -> G3 + 3064 -> G3 + 3065 -> G3 + 3066 -> G3 + 3067 -> G3 + 3068 -> G3 + 3069 -> G3 + 3070 -> G3 + 4001 -> OP + 4002 -> OP + 4003 -> OP + 4004 -> OP + 4005 -> OP + 4006 -> OP + 4007 -> OP + 4008 -> OP + 4009 -> OP + 4010 -> OP + 4011 -> OP + 4012 -> OP + 4013 -> OP + 4014 -> OP + 4015 -> OP + 4016 -> OP + 4017 -> OP + 4018 -> OP + 4019 -> OP + 4020 -> OP + 4021 -> OP + 4022 -> OP + 4023 -> OP + 4024 -> OP + 4025 -> OP + 4026 -> OP + 4027 -> OP + 4028 -> OP + 4030 -> OP + 4031 -> OP + 4032 -> OP + 4033 -> OP + 4035 -> OP + 4036 -> OP + 4037 -> OP + 4038 -> OP + 4039 -> OP + 4040 -> OP + 4041 -> OP + 4042 -> OP + 4043 -> OP + 4044 -> OP + 4045 -> OP + 4046 -> OP + 4047 -> OP + 4048 -> OP + 4049 -> OP + 4050 -> G3 + 4051 -> OP + 4052 -> OP + 4053 -> OP + 4054 -> OP + 4055 -> OP + 4056 -> OP + 4057 -> OP + 4058 -> OP + 4059 -> OP + 4060 -> OP + 4061 -> OP + 4062 -> OP + 4063 -> OP + 4064 -> OP + 4065 -> OP + 4066 -> OP + 4068 -> OP + 4069 -> OP + 4070 -> OP + 4071 -> OP + 4072 -> OP + 4073 -> OP + 4074 -> OP + 4075 -> OP + 4076 -> OP + 4077 -> OP + 4078 -> OP + 4079 -> OP + 4080 -> OP + 4081 -> OP + 4082 -> OP + 4083 -> OP + 4084 -> OP + 4085 -> OP + 4086 -> OP + 4087 -> OP + 4088 -> OP + 4089 -> OP + 4090 -> OP + 4091 -> OP + 4092 -> OP + 4093 -> OP + 4094 -> OP + 4095 -> OP + 4096 -> OP + 4097 -> OP + 4098 -> OP + 4099 -> OP + 4100 -> OP + 4101 -> OP + 4102 -> OP + 4103 -> OP + 4104 -> OP + 4105 -> OP + 4106 -> OP + 4107 -> OP + 4108 -> OP + 4109 -> OP + 4110 -> OP + 4111 -> OP + 4112 -> OP + 4113 -> OP + 4114 -> OP + 4115 -> OP + 4116 -> OP + 4118 -> OP + 4119 -> OP + 4120 -> OP + 4121 -> OP + 4122 -> OP + 4123 -> OP + 4124 -> OP + 4501 -> Pre-OP + 4502 -> Pre-OP + 4503 -> Pre-OP + 4504 -> Pre-OP + 4505 -> Pre-OP + 4506 -> Pre-OP + 4507 -> Pre-OP + 4508 -> Pre-OP + 4509 -> Pre-OP + 4510 -> Pre-OP + 4511 -> Pre-OP + 4512 -> Pre-OP + 4513 -> Pre-OP + 4514 -> Pre-OP + 4515 -> Pre-OP + 4516 -> Pre-OP + 4517 -> Pre-OP + 4518 -> Pre-OP + 4519 -> Pre-OP + 4520 -> Pre-OP + 4521 -> Pre-OP + 4522 -> Pre-OP + 4523 -> Pre-OP + 4524 -> Pre-OP + 4525 -> Pre-OP + 4526 -> Pre-OP + _ -> Pre-OP + +// Get the thumbnail ID for a race. +// If no race matches the ID, the result is an invalid ID. +pub fun thumbnail(r: race-id): race-thumbnail-id + match r.game-id + 1001 -> Race-thumbnail-id(1001) + 1002 -> Race-thumbnail-id(1002) + 1003 -> Race-thumbnail-id(1003) + 1004 -> Race-thumbnail-id(1004) + 1005 -> Race-thumbnail-id(1005) + 1006 -> Race-thumbnail-id(1006) + 1007 -> Race-thumbnail-id(1007) + 1008 -> Race-thumbnail-id(1008) + 1009 -> Race-thumbnail-id(1009) + 1010 -> Race-thumbnail-id(1010) + 1011 -> Race-thumbnail-id(1011) + 1012 -> Race-thumbnail-id(1012) + 1013 -> Race-thumbnail-id(1013) + 1014 -> Race-thumbnail-id(1014) + 1015 -> Race-thumbnail-id(1015) + 1016 -> Race-thumbnail-id(1016) + 1017 -> Race-thumbnail-id(1017) + 1018 -> Race-thumbnail-id(1018) + 1019 -> Race-thumbnail-id(1019) + 1020 -> Race-thumbnail-id(1020) + 1021 -> Race-thumbnail-id(1021) + 1022 -> Race-thumbnail-id(1022) + 1023 -> Race-thumbnail-id(1023) + 1024 -> Race-thumbnail-id(1024) + 1025 -> Race-thumbnail-id(1012) + 1026 -> Race-thumbnail-id(1015) + 1027 -> Race-thumbnail-id(1027) + 1101 -> Race-thumbnail-id(1101) + 1102 -> Race-thumbnail-id(1102) + 1103 -> Race-thumbnail-id(1103) + 1104 -> Race-thumbnail-id(1104) + 1105 -> Race-thumbnail-id(1105) + 1106 -> Race-thumbnail-id(1106) + 2001 -> Race-thumbnail-id(2001) + 2002 -> Race-thumbnail-id(2002) + 2003 -> Race-thumbnail-id(2003) + 2004 -> Race-thumbnail-id(2004) + 2005 -> Race-thumbnail-id(2005) + 2006 -> Race-thumbnail-id(2006) + 2007 -> Race-thumbnail-id(2007) + 2008 -> Race-thumbnail-id(2008) + 2009 -> Race-thumbnail-id(2009) + 2010 -> Race-thumbnail-id(2010) + 2011 -> Race-thumbnail-id(2011) + 2012 -> Race-thumbnail-id(2012) + 2013 -> Race-thumbnail-id(2013) + 2014 -> Race-thumbnail-id(2014) + 2015 -> Race-thumbnail-id(2015) + 2016 -> Race-thumbnail-id(2016) + 2017 -> Race-thumbnail-id(2017) + 2018 -> Race-thumbnail-id(2018) + 2019 -> Race-thumbnail-id(2019) + 2020 -> Race-thumbnail-id(2020) + 2021 -> Race-thumbnail-id(2021) + 2022 -> Race-thumbnail-id(2022) + 2023 -> Race-thumbnail-id(2023) + 2024 -> Race-thumbnail-id(2024) + 2025 -> Race-thumbnail-id(2025) + 2026 -> Race-thumbnail-id(2026) + 2027 -> Race-thumbnail-id(2027) + 2028 -> Race-thumbnail-id(2028) + 2029 -> Race-thumbnail-id(2029) + 2030 -> Race-thumbnail-id(2030) + 2031 -> Race-thumbnail-id(2031) + 2032 -> Race-thumbnail-id(2032) + 2033 -> Race-thumbnail-id(2033) + 2034 -> Race-thumbnail-id(2034) + 2035 -> Race-thumbnail-id(2010) + 3001 -> Race-thumbnail-id(3001) + 3002 -> Race-thumbnail-id(3002) + 3003 -> Race-thumbnail-id(3003) + 3004 -> Race-thumbnail-id(3004) + 3005 -> Race-thumbnail-id(3005) + 3006 -> Race-thumbnail-id(3006) + 3007 -> Race-thumbnail-id(3007) + 3008 -> Race-thumbnail-id(3008) + 3009 -> Race-thumbnail-id(3009) + 3010 -> Race-thumbnail-id(3010) + 3011 -> Race-thumbnail-id(3011) + 3012 -> Race-thumbnail-id(3012) + 3013 -> Race-thumbnail-id(3013) + 3014 -> Race-thumbnail-id(3014) + 3015 -> Race-thumbnail-id(3015) + 3016 -> Race-thumbnail-id(3016) + 3017 -> Race-thumbnail-id(3017) + 3018 -> Race-thumbnail-id(3018) + 3019 -> Race-thumbnail-id(3019) + 3020 -> Race-thumbnail-id(3020) + 3021 -> Race-thumbnail-id(3021) + 3022 -> Race-thumbnail-id(3022) + 3023 -> Race-thumbnail-id(3023) + 3024 -> Race-thumbnail-id(3024) + 3025 -> Race-thumbnail-id(3025) + 3026 -> Race-thumbnail-id(3026) + 3027 -> Race-thumbnail-id(3027) + 3028 -> Race-thumbnail-id(3028) + 3029 -> Race-thumbnail-id(3029) + 3030 -> Race-thumbnail-id(3030) + 3031 -> Race-thumbnail-id(3031) + 3032 -> Race-thumbnail-id(3032) + 3033 -> Race-thumbnail-id(3033) + 3034 -> Race-thumbnail-id(3034) + 3035 -> Race-thumbnail-id(3035) + 3036 -> Race-thumbnail-id(3036) + 3037 -> Race-thumbnail-id(3037) + 3038 -> Race-thumbnail-id(3038) + 3039 -> Race-thumbnail-id(3039) + 3040 -> Race-thumbnail-id(3040) + 3041 -> Race-thumbnail-id(3041) + 3042 -> Race-thumbnail-id(3042) + 3043 -> Race-thumbnail-id(3043) + 3044 -> Race-thumbnail-id(3044) + 3045 -> Race-thumbnail-id(3045) + 3046 -> Race-thumbnail-id(3046) + 3047 -> Race-thumbnail-id(3047) + 3048 -> Race-thumbnail-id(3048) + 3049 -> Race-thumbnail-id(3049) + 3050 -> Race-thumbnail-id(3050) + 3051 -> Race-thumbnail-id(3051) + 3052 -> Race-thumbnail-id(3052) + 3053 -> Race-thumbnail-id(3053) + 3054 -> Race-thumbnail-id(3054) + 3055 -> Race-thumbnail-id(3055) + 3056 -> Race-thumbnail-id(3056) + 3057 -> Race-thumbnail-id(3057) + 3058 -> Race-thumbnail-id(3058) + 3059 -> Race-thumbnail-id(3059) + 3060 -> Race-thumbnail-id(3060) + 3061 -> Race-thumbnail-id(3061) + 3062 -> Race-thumbnail-id(3062) + 3063 -> Race-thumbnail-id(3063) + 3064 -> Race-thumbnail-id(3064) + 3065 -> Race-thumbnail-id(3065) + 3066 -> Race-thumbnail-id(3066) + 3067 -> Race-thumbnail-id(3067) + 3068 -> Race-thumbnail-id(3068) + 3069 -> Race-thumbnail-id(3069) + 3070 -> Race-thumbnail-id(3070) + 4001 -> Race-thumbnail-id(4001) + 4002 -> Race-thumbnail-id(4002) + 4003 -> Race-thumbnail-id(4003) + 4004 -> Race-thumbnail-id(4004) + 4005 -> Race-thumbnail-id(4005) + 4006 -> Race-thumbnail-id(4006) + 4007 -> Race-thumbnail-id(4007) + 4008 -> Race-thumbnail-id(4008) + 4009 -> Race-thumbnail-id(4009) + 4010 -> Race-thumbnail-id(4010) + 4011 -> Race-thumbnail-id(4011) + 4012 -> Race-thumbnail-id(4012) + 4013 -> Race-thumbnail-id(4013) + 4014 -> Race-thumbnail-id(4014) + 4015 -> Race-thumbnail-id(4015) + 4016 -> Race-thumbnail-id(4016) + 4017 -> Race-thumbnail-id(4017) + 4018 -> Race-thumbnail-id(4018) + 4019 -> Race-thumbnail-id(4019) + 4020 -> Race-thumbnail-id(4020) + 4021 -> Race-thumbnail-id(4021) + 4022 -> Race-thumbnail-id(4022) + 4023 -> Race-thumbnail-id(4023) + 4024 -> Race-thumbnail-id(4024) + 4025 -> Race-thumbnail-id(4025) + 4026 -> Race-thumbnail-id(4026) + 4027 -> Race-thumbnail-id(4027) + 4028 -> Race-thumbnail-id(4028) + 4030 -> Race-thumbnail-id(4030) + 4031 -> Race-thumbnail-id(4031) + 4032 -> Race-thumbnail-id(4032) + 4033 -> Race-thumbnail-id(4033) + 4035 -> Race-thumbnail-id(4035) + 4036 -> Race-thumbnail-id(4036) + 4037 -> Race-thumbnail-id(4037) + 4038 -> Race-thumbnail-id(4038) + 4039 -> Race-thumbnail-id(4039) + 4040 -> Race-thumbnail-id(4040) + 4041 -> Race-thumbnail-id(4041) + 4042 -> Race-thumbnail-id(4042) + 4043 -> Race-thumbnail-id(4043) + 4044 -> Race-thumbnail-id(4044) + 4045 -> Race-thumbnail-id(4045) + 4046 -> Race-thumbnail-id(4046) + 4047 -> Race-thumbnail-id(4047) + 4048 -> Race-thumbnail-id(4048) + 4049 -> Race-thumbnail-id(4049) + 4050 -> Race-thumbnail-id(4050) + 4051 -> Race-thumbnail-id(4051) + 4052 -> Race-thumbnail-id(4052) + 4053 -> Race-thumbnail-id(4053) + 4054 -> Race-thumbnail-id(4054) + 4055 -> Race-thumbnail-id(4055) + 4056 -> Race-thumbnail-id(4056) + 4057 -> Race-thumbnail-id(4057) + 4058 -> Race-thumbnail-id(4058) + 4059 -> Race-thumbnail-id(4059) + 4060 -> Race-thumbnail-id(4060) + 4061 -> Race-thumbnail-id(4061) + 4062 -> Race-thumbnail-id(4062) + 4063 -> Race-thumbnail-id(4063) + 4064 -> Race-thumbnail-id(4064) + 4065 -> Race-thumbnail-id(4065) + 4066 -> Race-thumbnail-id(4066) + 4068 -> Race-thumbnail-id(4068) + 4069 -> Race-thumbnail-id(4069) + 4070 -> Race-thumbnail-id(4070) + 4071 -> Race-thumbnail-id(4071) + 4072 -> Race-thumbnail-id(4072) + 4073 -> Race-thumbnail-id(4073) + 4074 -> Race-thumbnail-id(4074) + 4075 -> Race-thumbnail-id(4075) + 4076 -> Race-thumbnail-id(4076) + 4077 -> Race-thumbnail-id(4077) + 4078 -> Race-thumbnail-id(4078) + 4079 -> Race-thumbnail-id(4079) + 4080 -> Race-thumbnail-id(4080) + 4081 -> Race-thumbnail-id(4081) + 4082 -> Race-thumbnail-id(4082) + 4083 -> Race-thumbnail-id(4083) + 4084 -> Race-thumbnail-id(4084) + 4085 -> Race-thumbnail-id(4085) + 4086 -> Race-thumbnail-id(4086) + 4087 -> Race-thumbnail-id(4087) + 4088 -> Race-thumbnail-id(4088) + 4089 -> Race-thumbnail-id(4089) + 4090 -> Race-thumbnail-id(4090) + 4091 -> Race-thumbnail-id(4091) + 4092 -> Race-thumbnail-id(4092) + 4093 -> Race-thumbnail-id(4093) + 4094 -> Race-thumbnail-id(4094) + 4095 -> Race-thumbnail-id(4095) + 4096 -> Race-thumbnail-id(4096) + 4097 -> Race-thumbnail-id(4097) + 4098 -> Race-thumbnail-id(4098) + 4099 -> Race-thumbnail-id(4099) + 4100 -> Race-thumbnail-id(4100) + 4101 -> Race-thumbnail-id(4101) + 4102 -> Race-thumbnail-id(4102) + 4103 -> Race-thumbnail-id(4103) + 4104 -> Race-thumbnail-id(4104) + 4105 -> Race-thumbnail-id(4105) + 4106 -> Race-thumbnail-id(4106) + 4107 -> Race-thumbnail-id(4107) + 4108 -> Race-thumbnail-id(4108) + 4109 -> Race-thumbnail-id(4109) + 4110 -> Race-thumbnail-id(4110) + 4111 -> Race-thumbnail-id(4111) + 4112 -> Race-thumbnail-id(4112) + 4113 -> Race-thumbnail-id(4113) + 4114 -> Race-thumbnail-id(4114) + 4115 -> Race-thumbnail-id(4115) + 4116 -> Race-thumbnail-id(4116) + 4118 -> Race-thumbnail-id(4117) + 4119 -> Race-thumbnail-id(4118) + 4120 -> Race-thumbnail-id(4119) + 4121 -> Race-thumbnail-id(4120) + 4122 -> Race-thumbnail-id(4121) + 4123 -> Race-thumbnail-id(4122) + 4124 -> Race-thumbnail-id(4123) + 4501 -> Race-thumbnail-id(4501) + 4502 -> Race-thumbnail-id(4502) + 4503 -> Race-thumbnail-id(4503) + 4504 -> Race-thumbnail-id(4504) + 4505 -> Race-thumbnail-id(4505) + 4506 -> Race-thumbnail-id(4506) + 4507 -> Race-thumbnail-id(4507) + 4508 -> Race-thumbnail-id(4508) + 4509 -> Race-thumbnail-id(4509) + 4510 -> Race-thumbnail-id(4510) + 4511 -> Race-thumbnail-id(4511) + 4512 -> Race-thumbnail-id(4512) + 4513 -> Race-thumbnail-id(4513) + 4514 -> Race-thumbnail-id(4514) + 4515 -> Race-thumbnail-id(4515) + 4516 -> Race-thumbnail-id(4516) + 4517 -> Race-thumbnail-id(4517) + 4518 -> Race-thumbnail-id(4518) + 4519 -> Race-thumbnail-id(4519) + 4520 -> Race-thumbnail-id(4520) + 4521 -> Race-thumbnail-id(4521) + 4522 -> Race-thumbnail-id(4522) + 4523 -> Race-thumbnail-id(4523) + 4524 -> Race-thumbnail-id(4524) + 4525 -> Race-thumbnail-id(4525) + 4526 -> Race-thumbnail-id(4526) + _ -> Race-thumbnail-id(0) + +// Get the primary ID for a race. +// For races which are the primary version, or if no race matches the given ID, +// the result is the input. +pub fun primary(r: race-id): race-id + match r.game-id + 1025 -> Race-id(1012) + 1026 -> Race-id(1015) + 1027 -> Race-id(1006) + 2035 -> Race-id(2010) + _ -> r diff --git a/horse/race.go b/horse/race.go new file mode 100644 index 0000000..b6bc6ae --- /dev/null +++ b/horse/race.go @@ -0,0 +1,17 @@ +package horse + +type RaceID int32 + +// Race is the internal data about a race. +// +// Races may be offered multiple times in a career in different years. +// Each separate offering is a different race instance of the same race. +type Race struct { + ID RaceID + Name string + Thumbnail int + // 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 +} diff --git a/horse/race.kk b/horse/race.kk index 62f1906..4379b38 100644 --- a/horse/race.kk +++ b/horse/race.kk @@ -1,426 +1,30 @@ module horse/race import std/data/linearset +import horse/game-id -// Exhaustive enumeration of graded races that can be run in career. -// Races that can be run in multiple years are listed only once. -pub type career-race - February-Stakes - Takamatsunomiya-Kinen - Osaka-Hai - Oka-Sho - Satsuki-Sho - Tenno-Sho-Spring - NHK-Mile-Cup - Victoria-Mile - Japanese-Oaks - Japanese-Derby - Yasuda-Kinen - Takarazuka-Kinen - Sprinters-Stakes - Shuka-Sho - Kikuka-Sho - Tenno-Sho-Autumn - Queen-Elizabeth-II-Cup - Mile-Championship - Japan-Cup - Champions-Cup - Hanshin-Juvenile-Fillies - Asahi-Hai-Futurity-Stakes - Arima-Kinen - Hopeful-Stakes - Tokyo-Daishoten - JBC-Classic - JBC-Sprint - JBC-Ladies-Classic - Japan-Dirt-Derby - Teio-Sho - Nikkei-Shinshun-Hai - Tokai-Stakes - American-Jockey-Club-Cup - Kyoto-Kinen - Nakayama-Kinen - Tulip-Sho - Yayoi-Sho - Kinko-Sho - Fillies-Revue - Hanshin-Daishoten - Spring-Stakes - Nikkei-Sho - Hanshin-Umamusume-Stakes - New-Zealand-Trophy - Yomiuri-Milers-Cup - Flora-Stakes - Aoba-Sho - Kyoto-Shimbun-Hai - Keio-Hai-Spring-Cup - Meguro-Kinen - Sapporo-Kinen - Centaur-Stakes - Rose-Stakes - St-Lite-Kinen - Kobe-Shimbun-Hai - All-Comers - Mainichi-Okan - Kyoto-Daishoten - Fuchu-Umamusume-Stakes - Fuji-Stakes - Swan-Stakes - Keio-Hai-Junior-Stakes - Copa-Republica-Argentina - Daily-Hai-Junior-Stakes - Stayers-Stakes - Hanshin-Cup - Kyoto-Kimpai - Nakayama-Kimpai - Shinzan-Kinen - Fairy-Stakes - Aichi-Hai - Keisei-Hai - Silk-Road-Stakes - Negishi-Stakes - Kisaragi-Sho - Tokyo-Shimbun-Hai - Queen-Cup - Kyodo-News-Hai - Kyoto-Umamusume-Stakes - Diamond-Stakes - Kokura-Daishoten - Arlington-Cup - Hankyu-Hai - Ocean-Stakes - Nakayama-Umamusume-Stakes - Falcon-Stakes - Flower-Cup - Mainichi-Hai - March-Stakes - Lord-Derby-Challenge-Trophy - Antares-Stakes - Fukushima-Umamusume-Stakes - Niigata-Daishoten - Heian-Stakes - Aoi-Stakes - Naruo-Kinen - Mermaid-Stakes - Epsom-Cup - Unicorn-Stakes - Hakodate-Sprint-Stakes - CBC-Sho - Radio-Nikkei-Sho - Procyon-Stakes - Tanabata-Sho - Hakodate-Kinen - Chukyo-Kinen - Hakodate-Junior-Stakes - Ibis-Summer-Dash - Queen-Stakes - Kokura-Kinen - Leopard-Stakes - Sekiya-Kinen - Elm-Stakes - Kitakyushu-Kinen - Niigata-Junior-Stakes - Keeneland-Cup - Sapporo-Junior-Stakes - Kokura-Junior-Stakes - Niigata-Kinen - Shion-Stakes - Keisei-Hai-Autumn-Handicap - Sirius-Stakes - Saudi-Arabia-Royal-Cup - Artemis-Stakes - Fantasy-Stakes - Miyako-Stakes - Musashino-Stakes - Fukushima-Kinen - Tokyo-Sports-Hai-Junior-Stakes - Kyoto-Junior-Stakes - Keihan-Hai - Challenge-Cup - Chunichi-Shimbun-Hai - Capella-Stakes - Turquoise-Stakes +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 -// Automatically generated. -// Shows a string representation of the `career-race` type. -pub fun career-race/show(this : career-race) : e string - match this - February-Stakes -> "February Stakes" - Takamatsunomiya-Kinen -> "Takamatsunomiya Kinen" - Osaka-Hai -> "Osaka Hai" - Oka-Sho -> "Oka Sho" - Satsuki-Sho -> "Satsuki Sho" - Tenno-Sho-Spring -> "Tenno Sho Spring" - NHK-Mile-Cup -> "NHK Mile Cup" - Victoria-Mile -> "Victoria Mile" - Japanese-Oaks -> "Japanese Oaks" - Japanese-Derby -> "Japanese Derby" - Yasuda-Kinen -> "Yasuda Kinen" - Takarazuka-Kinen -> "Takarazuka Kinen" - Sprinters-Stakes -> "Sprinters Stakes" - Shuka-Sho -> "Shuka Sho" - Kikuka-Sho -> "Kikuka Sho" - Tenno-Sho-Autumn -> "Tenno Sho Autumn" - Queen-Elizabeth-II-Cup -> "Queen Elizabeth II Cup" - Mile-Championship -> "Mile Championship" - Japan-Cup -> "Japan Cup" - Champions-Cup -> "Champions Cup" - Hanshin-Juvenile-Fillies -> "Hanshin Juvenile Fillies" - Asahi-Hai-Futurity-Stakes -> "Asahi Hai Futurity Stakes" - Arima-Kinen -> "Arima Kinen" - Hopeful-Stakes -> "Hopeful Stakes" - Tokyo-Daishoten -> "Tokyo Daishoten" - JBC-Classic -> "JBC Classic" - JBC-Sprint -> "JBC Sprint" - JBC-Ladies-Classic -> "JBC Ladies Classic" - Japan-Dirt-Derby -> "Japan Dirt Derby" - Teio-Sho -> "Teio Sho" - Nikkei-Shinshun-Hai -> "Nikkei Shinshun Hai" - Tokai-Stakes -> "Tokai Stakes" - American-Jockey-Club-Cup -> "American Jockey Club Cup" - Kyoto-Kinen -> "Kyoto Kinen" - Nakayama-Kinen -> "Nakayama Kinen" - Tulip-Sho -> "Tulip Sho" - Yayoi-Sho -> "Yayoi Sho" - Kinko-Sho -> "Kinko Sho" - Fillies-Revue -> "Fillies Revue" - Hanshin-Daishoten -> "Hanshin Daishoten" - Spring-Stakes -> "Spring Stakes" - Nikkei-Sho -> "Nikkei Sho" - Hanshin-Umamusume-Stakes -> "Hanshin Umamusume Stakes" - New-Zealand-Trophy -> "New Zealand Trophy" - Yomiuri-Milers-Cup -> "Yomiuri Milers Cup" - Flora-Stakes -> "Flora Stakes" - Aoba-Sho -> "Aoba Sho" - Kyoto-Shimbun-Hai -> "Kyoto Shimbun Hai" - Keio-Hai-Spring-Cup -> "Keio Hai Spring Cup" - Meguro-Kinen -> "Meguro Kinen" - Sapporo-Kinen -> "Sapporo Kinen" - Centaur-Stakes -> "Centaur Stakes" - Rose-Stakes -> "Rose Stakes" - St-Lite-Kinen -> "St Lite Kinen" - Kobe-Shimbun-Hai -> "Kobe Shimbun Hai" - All-Comers -> "All Comers" - Mainichi-Okan -> "Mainichi Okan" - Kyoto-Daishoten -> "Kyoto Daishoten" - Fuchu-Umamusume-Stakes -> "Fuchu Umamusume Stakes" - Fuji-Stakes -> "Fuji Stakes" - Swan-Stakes -> "Swan Stakes" - Keio-Hai-Junior-Stakes -> "Keio Hai Junior Stakes" - Copa-Republica-Argentina -> "Copa Republica Argentina" - Daily-Hai-Junior-Stakes -> "Daily Hai Junior Stakes" - Stayers-Stakes -> "Stayers Stakes" - Hanshin-Cup -> "Hanshin Cup" - Kyoto-Kimpai -> "Kyoto Kimpai" - Nakayama-Kimpai -> "Nakayama Kimpai" - Shinzan-Kinen -> "Shinzan Kinen" - Fairy-Stakes -> "Fairy Stakes" - Aichi-Hai -> "Aichi Hai" - Keisei-Hai -> "Keisei Hai" - Silk-Road-Stakes -> "Silk Road Stakes" - Negishi-Stakes -> "Negishi Stakes" - Kisaragi-Sho -> "Kisaragi Sho" - Tokyo-Shimbun-Hai -> "Tokyo Shimbun Hai" - Queen-Cup -> "Queen Cup" - Kyodo-News-Hai -> "Kyodo News Hai" - Kyoto-Umamusume-Stakes -> "Kyoto Umamusume Stakes" - Diamond-Stakes -> "Diamond Stakes" - Kokura-Daishoten -> "Kokura Daishoten" - Arlington-Cup -> "Arlington Cup" - Hankyu-Hai -> "Hankyu Hai" - Ocean-Stakes -> "Ocean Stakes" - Nakayama-Umamusume-Stakes -> "Nakayama Umamusume Stakes" - Falcon-Stakes -> "Falcon Stakes" - Flower-Cup -> "Flower Cup" - Mainichi-Hai -> "Mainichi Hai" - March-Stakes -> "March Stakes" - Lord-Derby-Challenge-Trophy -> "Lord Derby Challenge Trophy" - Antares-Stakes -> "Antares Stakes" - Fukushima-Umamusume-Stakes -> "Fukushima Umamusume Stakes" - Niigata-Daishoten -> "Niigata Daishoten" - Heian-Stakes -> "Heian Stakes" - Aoi-Stakes -> "Aoi Stakes" - Naruo-Kinen -> "Naruo Kinen" - Mermaid-Stakes -> "Mermaid Stakes" - Epsom-Cup -> "Epsom Cup" - Unicorn-Stakes -> "Unicorn Stakes" - Hakodate-Sprint-Stakes -> "Hakodate Sprint Stakes" - CBC-Sho -> "CBC Sho" - Radio-Nikkei-Sho -> "Radio Nikkei Sho" - Procyon-Stakes -> "Procyon Stakes" - Tanabata-Sho -> "Tanabata Sho" - Hakodate-Kinen -> "Hakodate Kinen" - Chukyo-Kinen -> "Chukyo Kinen" - Hakodate-Junior-Stakes -> "Hakodate Junior Stakes" - Ibis-Summer-Dash -> "Ibis Summer Dash" - Queen-Stakes -> "Queen Stakes" - Kokura-Kinen -> "Kokura Kinen" - Leopard-Stakes -> "Leopard Stakes" - Sekiya-Kinen -> "Sekiya Kinen" - Elm-Stakes -> "Elm Stakes" - Kitakyushu-Kinen -> "Kitakyushu Kinen" - Niigata-Junior-Stakes -> "Niigata Junior Stakes" - Keeneland-Cup -> "Keeneland Cup" - Sapporo-Junior-Stakes -> "Sapporo Junior Stakes" - Kokura-Junior-Stakes -> "Kokura Junior Stakes" - Niigata-Kinen -> "Niigata Kinen" - Shion-Stakes -> "Shion Stakes" - Keisei-Hai-Autumn-Handicap -> "Keisei Hai Autumn Handicap" - Sirius-Stakes -> "Sirius Stakes" - Saudi-Arabia-Royal-Cup -> "Saudi Arabia Royal Cup" - Artemis-Stakes -> "Artemis Stakes" - Fantasy-Stakes -> "Fantasy Stakes" - Miyako-Stakes -> "Miyako Stakes" - Musashino-Stakes -> "Musashino Stakes" - Fukushima-Kinen -> "Fukushima Kinen" - Tokyo-Sports-Hai-Junior-Stakes -> "Tokyo Sports Hai Junior Stakes" - Kyoto-Junior-Stakes -> "Kyoto Junior Stakes" - Keihan-Hai -> "Keihan Hai" - Challenge-Cup -> "Challenge Cup" - Chunichi-Shimbun-Hai -> "Chunichi Shimbun Hai" - Capella-Stakes -> "Capella Stakes" - Turquoise-Stakes -> "Turquoise Stakes" +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) -// Automatically generated. -// Equality comparison of the `career-race` type. -pub fun career-race/(==)(this : career-race, other : career-race) : e bool - match (this, other) - (February-Stakes, February-Stakes) -> True - (Takamatsunomiya-Kinen, Takamatsunomiya-Kinen) -> True - (Osaka-Hai, Osaka-Hai) -> True - (Oka-Sho, Oka-Sho) -> True - (Satsuki-Sho, Satsuki-Sho) -> True - (Tenno-Sho-Spring, Tenno-Sho-Spring) -> True - (NHK-Mile-Cup, NHK-Mile-Cup) -> True - (Victoria-Mile, Victoria-Mile) -> True - (Japanese-Oaks, Japanese-Oaks) -> True - (Japanese-Derby, Japanese-Derby) -> True - (Yasuda-Kinen, Yasuda-Kinen) -> True - (Takarazuka-Kinen, Takarazuka-Kinen) -> True - (Sprinters-Stakes, Sprinters-Stakes) -> True - (Shuka-Sho, Shuka-Sho) -> True - (Kikuka-Sho, Kikuka-Sho) -> True - (Tenno-Sho-Autumn, Tenno-Sho-Autumn) -> True - (Queen-Elizabeth-II-Cup, Queen-Elizabeth-II-Cup) -> True - (Mile-Championship, Mile-Championship) -> True - (Japan-Cup, Japan-Cup) -> True - (Champions-Cup, Champions-Cup) -> True - (Hanshin-Juvenile-Fillies, Hanshin-Juvenile-Fillies) -> True - (Asahi-Hai-Futurity-Stakes, Asahi-Hai-Futurity-Stakes) -> True - (Arima-Kinen, Arima-Kinen) -> True - (Hopeful-Stakes, Hopeful-Stakes) -> True - (Tokyo-Daishoten, Tokyo-Daishoten) -> True - (JBC-Classic, JBC-Classic) -> True - (JBC-Sprint, JBC-Sprint) -> True - (JBC-Ladies-Classic, JBC-Ladies-Classic) -> True - (Japan-Dirt-Derby, Japan-Dirt-Derby) -> True - (Teio-Sho, Teio-Sho) -> True - (Nikkei-Shinshun-Hai, Nikkei-Shinshun-Hai) -> True - (Tokai-Stakes, Tokai-Stakes) -> True - (American-Jockey-Club-Cup, American-Jockey-Club-Cup) -> True - (Kyoto-Kinen, Kyoto-Kinen) -> True - (Nakayama-Kinen, Nakayama-Kinen) -> True - (Tulip-Sho, Tulip-Sho) -> True - (Yayoi-Sho, Yayoi-Sho) -> True - (Kinko-Sho, Kinko-Sho) -> True - (Fillies-Revue, Fillies-Revue) -> True - (Hanshin-Daishoten, Hanshin-Daishoten) -> True - (Spring-Stakes, Spring-Stakes) -> True - (Nikkei-Sho, Nikkei-Sho) -> True - (Hanshin-Umamusume-Stakes, Hanshin-Umamusume-Stakes) -> True - (New-Zealand-Trophy, New-Zealand-Trophy) -> True - (Yomiuri-Milers-Cup, Yomiuri-Milers-Cup) -> True - (Flora-Stakes, Flora-Stakes) -> True - (Aoba-Sho, Aoba-Sho) -> True - (Kyoto-Shimbun-Hai, Kyoto-Shimbun-Hai) -> True - (Keio-Hai-Spring-Cup, Keio-Hai-Spring-Cup) -> True - (Meguro-Kinen, Meguro-Kinen) -> True - (Sapporo-Kinen, Sapporo-Kinen) -> True - (Centaur-Stakes, Centaur-Stakes) -> True - (Rose-Stakes, Rose-Stakes) -> True - (St-Lite-Kinen, St-Lite-Kinen) -> True - (Kobe-Shimbun-Hai, Kobe-Shimbun-Hai) -> True - (All-Comers, All-Comers) -> True - (Mainichi-Okan, Mainichi-Okan) -> True - (Kyoto-Daishoten, Kyoto-Daishoten) -> True - (Fuchu-Umamusume-Stakes, Fuchu-Umamusume-Stakes) -> True - (Fuji-Stakes, Fuji-Stakes) -> True - (Swan-Stakes, Swan-Stakes) -> True - (Keio-Hai-Junior-Stakes, Keio-Hai-Junior-Stakes) -> True - (Copa-Republica-Argentina, Copa-Republica-Argentina) -> True - (Daily-Hai-Junior-Stakes, Daily-Hai-Junior-Stakes) -> True - (Stayers-Stakes, Stayers-Stakes) -> True - (Hanshin-Cup, Hanshin-Cup) -> True - (Kyoto-Kimpai, Kyoto-Kimpai) -> True - (Nakayama-Kimpai, Nakayama-Kimpai) -> True - (Shinzan-Kinen, Shinzan-Kinen) -> True - (Fairy-Stakes, Fairy-Stakes) -> True - (Aichi-Hai, Aichi-Hai) -> True - (Keisei-Hai, Keisei-Hai) -> True - (Silk-Road-Stakes, Silk-Road-Stakes) -> True - (Negishi-Stakes, Negishi-Stakes) -> True - (Kisaragi-Sho, Kisaragi-Sho) -> True - (Tokyo-Shimbun-Hai, Tokyo-Shimbun-Hai) -> True - (Queen-Cup, Queen-Cup) -> True - (Kyodo-News-Hai, Kyodo-News-Hai) -> True - (Kyoto-Umamusume-Stakes, Kyoto-Umamusume-Stakes) -> True - (Diamond-Stakes, Diamond-Stakes) -> True - (Kokura-Daishoten, Kokura-Daishoten) -> True - (Arlington-Cup, Arlington-Cup) -> True - (Hankyu-Hai, Hankyu-Hai) -> True - (Ocean-Stakes, Ocean-Stakes) -> True - (Nakayama-Umamusume-Stakes, Nakayama-Umamusume-Stakes) -> True - (Falcon-Stakes, Falcon-Stakes) -> True - (Flower-Cup, Flower-Cup) -> True - (Mainichi-Hai, Mainichi-Hai) -> True - (March-Stakes, March-Stakes) -> True - (Lord-Derby-Challenge-Trophy, Lord-Derby-Challenge-Trophy) -> True - (Antares-Stakes, Antares-Stakes) -> True - (Fukushima-Umamusume-Stakes, Fukushima-Umamusume-Stakes) -> True - (Niigata-Daishoten, Niigata-Daishoten) -> True - (Heian-Stakes, Heian-Stakes) -> True - (Aoi-Stakes, Aoi-Stakes) -> True - (Naruo-Kinen, Naruo-Kinen) -> True - (Mermaid-Stakes, Mermaid-Stakes) -> True - (Epsom-Cup, Epsom-Cup) -> True - (Unicorn-Stakes, Unicorn-Stakes) -> True - (Hakodate-Sprint-Stakes, Hakodate-Sprint-Stakes) -> True - (CBC-Sho, CBC-Sho) -> True - (Radio-Nikkei-Sho, Radio-Nikkei-Sho) -> True - (Procyon-Stakes, Procyon-Stakes) -> True - (Tanabata-Sho, Tanabata-Sho) -> True - (Hakodate-Kinen, Hakodate-Kinen) -> True - (Chukyo-Kinen, Chukyo-Kinen) -> True - (Hakodate-Junior-Stakes, Hakodate-Junior-Stakes) -> True - (Ibis-Summer-Dash, Ibis-Summer-Dash) -> True - (Queen-Stakes, Queen-Stakes) -> True - (Kokura-Kinen, Kokura-Kinen) -> True - (Leopard-Stakes, Leopard-Stakes) -> True - (Sekiya-Kinen, Sekiya-Kinen) -> True - (Elm-Stakes, Elm-Stakes) -> True - (Kitakyushu-Kinen, Kitakyushu-Kinen) -> True - (Niigata-Junior-Stakes, Niigata-Junior-Stakes) -> True - (Keeneland-Cup, Keeneland-Cup) -> True - (Sapporo-Junior-Stakes, Sapporo-Junior-Stakes) -> True - (Kokura-Junior-Stakes, Kokura-Junior-Stakes) -> True - (Niigata-Kinen, Niigata-Kinen) -> True - (Shion-Stakes, Shion-Stakes) -> True - (Keisei-Hai-Autumn-Handicap, Keisei-Hai-Autumn-Handicap) -> True - (Sirius-Stakes, Sirius-Stakes) -> True - (Saudi-Arabia-Royal-Cup, Saudi-Arabia-Royal-Cup) -> True - (Artemis-Stakes, Artemis-Stakes) -> True - (Fantasy-Stakes, Fantasy-Stakes) -> True - (Miyako-Stakes, Miyako-Stakes) -> True - (Musashino-Stakes, Musashino-Stakes) -> True - (Fukushima-Kinen, Fukushima-Kinen) -> True - (Tokyo-Sports-Hai-Junior-Stakes, Tokyo-Sports-Hai-Junior-Stakes) -> True - (Kyoto-Junior-Stakes, Kyoto-Junior-Stakes) -> True - (Keihan-Hai, Keihan-Hai) -> True - (Challenge-Cup, Challenge-Cup) -> True - (Chunichi-Shimbun-Hai, Chunichi-Shimbun-Hai) -> True - (Capella-Stakes, Capella-Stakes) -> True - (Turquoise-Stakes, Turquoise-Stakes) -> True - (_, _) -> False +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 @@ -431,230 +35,9 @@ pub type grade G1 EX -pub fun career-race/grade(r: career-race): grade - match r - February-Stakes -> G1 - Takamatsunomiya-Kinen -> G1 - Osaka-Hai -> G1 - Oka-Sho -> G1 - Satsuki-Sho -> G1 - Tenno-Sho-Spring -> G1 - NHK-Mile-Cup -> G1 - Victoria-Mile -> G1 - Japanese-Oaks -> G1 - Japanese-Derby -> G1 - Yasuda-Kinen -> G1 - Takarazuka-Kinen -> G1 - Sprinters-Stakes -> G1 - Shuka-Sho -> G1 - Kikuka-Sho -> G1 - Tenno-Sho-Autumn -> G1 - Queen-Elizabeth-II-Cup -> G1 - Mile-Championship -> G1 - Japan-Cup -> G1 - Champions-Cup -> G1 - Hanshin-Juvenile-Fillies -> G1 - Asahi-Hai-Futurity-Stakes -> G1 - Arima-Kinen -> G1 - Hopeful-Stakes -> G1 - Tokyo-Daishoten -> G1 - JBC-Classic -> G1 - JBC-Sprint -> G1 - JBC-Ladies-Classic -> G1 - Japan-Dirt-Derby -> G1 - Teio-Sho -> G1 - Nikkei-Shinshun-Hai -> G2 - Tokai-Stakes -> G2 - American-Jockey-Club-Cup -> G2 - Kyoto-Kinen -> G2 - Nakayama-Kinen -> G2 - Tulip-Sho -> G2 - Yayoi-Sho -> G2 - Kinko-Sho -> G2 - Fillies-Revue -> G2 - Hanshin-Daishoten -> G2 - Spring-Stakes -> G2 - Nikkei-Sho -> G2 - Hanshin-Umamusume-Stakes -> G2 - New-Zealand-Trophy -> G2 - Yomiuri-Milers-Cup -> G2 - Flora-Stakes -> G2 - Aoba-Sho -> G2 - Kyoto-Shimbun-Hai -> G2 - Keio-Hai-Spring-Cup -> G2 - Meguro-Kinen -> G2 - Sapporo-Kinen -> G2 - Centaur-Stakes -> G2 - Rose-Stakes -> G2 - St-Lite-Kinen -> G2 - Kobe-Shimbun-Hai -> G2 - All-Comers -> G2 - Mainichi-Okan -> G2 - Kyoto-Daishoten -> G2 - Fuchu-Umamusume-Stakes -> G2 - Fuji-Stakes -> G2 - Swan-Stakes -> G2 - Keio-Hai-Junior-Stakes -> G2 - Copa-Republica-Argentina -> G2 - Daily-Hai-Junior-Stakes -> G2 - Stayers-Stakes -> G2 - Hanshin-Cup -> G2 - Kyoto-Kimpai -> G3 - Nakayama-Kimpai -> G3 - Shinzan-Kinen -> G3 - Fairy-Stakes -> G3 - Aichi-Hai -> G3 - Keisei-Hai -> G3 - Silk-Road-Stakes -> G3 - Negishi-Stakes -> G3 - Kisaragi-Sho -> G3 - Tokyo-Shimbun-Hai -> G3 - Queen-Cup -> G3 - Kyodo-News-Hai -> G3 - Kyoto-Umamusume-Stakes -> G3 - Diamond-Stakes -> G3 - Kokura-Daishoten -> G3 - Arlington-Cup -> G3 - Hankyu-Hai -> G3 - Ocean-Stakes -> G3 - Nakayama-Umamusume-Stakes -> G3 - Falcon-Stakes -> G3 - Flower-Cup -> G3 - Mainichi-Hai -> G3 - March-Stakes -> G3 - Lord-Derby-Challenge-Trophy -> G3 - Antares-Stakes -> G3 - Fukushima-Umamusume-Stakes -> G3 - Niigata-Daishoten -> G3 - Heian-Stakes -> G3 - Aoi-Stakes -> G3 - Naruo-Kinen -> G3 - Mermaid-Stakes -> G3 - Epsom-Cup -> G3 - Unicorn-Stakes -> G3 - Hakodate-Sprint-Stakes -> G3 - CBC-Sho -> G3 - Radio-Nikkei-Sho -> G3 - Procyon-Stakes -> G3 - Tanabata-Sho -> G3 - Hakodate-Kinen -> G3 - Chukyo-Kinen -> G3 - Hakodate-Junior-Stakes -> G3 - Ibis-Summer-Dash -> G3 - Queen-Stakes -> G3 - Kokura-Kinen -> G3 - Leopard-Stakes -> G3 - Sekiya-Kinen -> G3 - Elm-Stakes -> G3 - Kitakyushu-Kinen -> G3 - Niigata-Junior-Stakes -> G3 - Keeneland-Cup -> G3 - Sapporo-Junior-Stakes -> G3 - Kokura-Junior-Stakes -> G3 - Niigata-Kinen -> G3 - Shion-Stakes -> G3 - Keisei-Hai-Autumn-Handicap -> G3 - Sirius-Stakes -> G3 - Saudi-Arabia-Royal-Cup -> G3 - Artemis-Stakes -> G3 - Fantasy-Stakes -> G3 - Miyako-Stakes -> G3 - Musashino-Stakes -> G3 - Fukushima-Kinen -> G3 - Tokyo-Sports-Hai-Junior-Stakes -> G3 - Kyoto-Junior-Stakes -> G3 - Keihan-Hai -> G3 - Challenge-Cup -> G3 - Chunichi-Shimbun-Hai -> G3 - Capella-Stakes -> G3 - Turquoise-Stakes -> G3 - -pub type title - Classic-Triple-Crown - Triple-Tiara - Senior-Spring-Triple-Crown - Senior-Autumn-Triple-Crown - Tenno-Sweep - Dual-Grand-Prix - Dual-Miles - Dual-Sprints - Dual-Dirts - -// Get the titles that a race contributes to. -inline fun career-race/titles(r: career-race): list - match r - Satsuki-Sho -> [Classic-Triple-Crown] - Japanese-Derby -> [Classic-Triple-Crown] - Kikuka-Sho -> [Classic-Triple-Crown] - Oka-Sho -> [Triple-Tiara] - Japanese-Oaks -> [Triple-Tiara] - Shuka-Sho -> [Triple-Tiara] - Osaka-Hai -> [Senior-Spring-Triple-Crown] - Tenno-Sho-Spring -> [Senior-Spring-Triple-Crown, Tenno-Sweep] - Takarazuka-Kinen -> [Senior-Spring-Triple-Crown, Dual-Grand-Prix] - Tenno-Sho-Autumn -> [Senior-Autumn-Triple-Crown, Tenno-Sweep] - Japan-Cup -> [Senior-Autumn-Triple-Crown] - Arima-Kinen -> [Senior-Autumn-Triple-Crown, Dual-Grand-Prix] - Yasuda-Kinen -> [Dual-Miles] - Mile-Championship -> [Dual-Miles] - Takamatsunomiya-Kinen -> [Dual-Sprints] - Sprinters-Stakes -> [Dual-Sprints] - February-Stakes -> [Dual-Dirts] - Champions-Cup -> [Dual-Dirts] - _ -> [] - -// Get the races that a title requires. -inline fun title/races(t: title): list<career-race> - match t - Classic-Triple-Crown -> [Satsuki-Sho, Japanese-Derby, Kikuka-Sho] - Triple-Tiara -> [Oka-Sho, Japanese-Oaks, Shuka-Sho] - Senior-Spring-Triple-Crown -> [Osaka-Hai, Tenno-Sho-Spring, Takarazuka-Kinen] - Senior-Autumn-Triple-Crown -> [Tenno-Sho-Autumn, Japan-Cup, Arima-Kinen] - Tenno-Sweep -> [Tenno-Sho-Spring, Tenno-Sho-Autumn] - Dual-Grand-Prix -> [Takarazuka-Kinen, Arima-Kinen] - Dual-Miles -> [Yasuda-Kinen, Mile-Championship] - Dual-Sprints -> [Takamatsunomiya-Kinen, Sprinters-Stakes] - Dual-Dirts -> [February-Stakes, Champions-Cup] - -// Get all titles earned by an uma. -pub fun career/titles(results: list<race-result>): list<title> - val wins = results.flatmap-maybe() fn(r) (if r.place == 1 then Just(r.race) else Nothing) - val title-wins = wins.filter(_.titles.is-cons).linear-set - val titles = title-wins.list.flatmap(_.titles).linear-set.list - titles.filter(_.races.linear-set.is-subset-of(title-wins)) - -// Automatically generated. -// Equality comparison of the `title` type. -pub fun title/(==)(this : title, other : title) : e bool - match (this, other) - (Classic-Triple-Crown, Classic-Triple-Crown) -> True - (Triple-Tiara, Triple-Tiara) -> True - (Senior-Spring-Triple-Crown, Senior-Spring-Triple-Crown) -> True - (Senior-Autumn-Triple-Crown, Senior-Autumn-Triple-Crown) -> True - (Tenno-Sweep, Tenno-Sweep) -> True - (Dual-Grand-Prix, Dual-Grand-Prix) -> True - (Dual-Miles, Dual-Miles) -> True - (Dual-Sprints, Dual-Sprints) -> True - (Dual-Dirts, Dual-Dirts) -> True - (_, _) -> False - -// Automatically generated. -// Shows a string representation of the `title` type. -pub fun title/show(this : title) : e string - match this - Classic-Triple-Crown -> "Classic Triple Crown" - Triple-Tiara -> "Triple Tiara" - Senior-Spring-Triple-Crown -> "Senior Spring Triple Crown" - Senior-Autumn-Triple-Crown -> "Senior Autumn Triple Crown" - Tenno-Sweep -> "Tenno Sweep" - Dual-Grand-Prix -> "Dual Grand Prix" - Dual-Miles -> "Dual Miles" - Dual-Sprints -> "Dual Sprints" - Dual-Dirts -> "Dual Dirts" - // Graded race that a veteran ran. pub struct race-result - race: career-race + race-id: race-id place: int turn: turn @@ -666,14 +49,14 @@ pub fun race-result/(==)(this : race-result, other : race-result) : e bool // Automatically generated. // Shows a string representation of the `race-result` type. -pub fun race-result/show(this : race-result) : e string +pub fun race-result/show(this : race-result, ?race/show: (race-id) -> string) : e string match this - Race-result(race, place, turn) -> turn.show ++ " " ++ race.show ++ ": " ++ place.show + Race-result(race-id, place, turn) -> turn.show ++ " " ++ race-id.show ++ ": " ++ place.show // Determine whether two race results are for the same race. // This differs from (==) which also requires the race to be on the same turn. -pub fun race-result/same(a: race-result, b: race-result): bool - a.race == b.race +pub fun race-result/same-race(a: race-result, b: race-result): bool + a.race-id == b.race-id // Turn that a race occurred. pub struct turn diff --git a/horsegen/gen.go b/horsegen/gen.go index ef4cb4e..0f6c150 100644 --- a/horsegen/gen.go +++ b/horsegen/gen.go @@ -11,7 +11,7 @@ import ( "unicode" ) -//go:embed character.kk.template skill.kk.template character.go.template skill.go.template +//go:embed character.kk.template skill.kk.template character.go.template skill.go.template race.kk.template race.go.template var templates embed.FS // LoadTemplates sets up templates to render game data to source code. @@ -93,6 +93,21 @@ func ExecSkill(t *template.Template, region string, kk, g io.Writer, groups []Na return err } +func ExecRace(t *template.Template, region string, kk, g io.Writer, races []Race) error { + data := struct { + Region string + Races []Race + }{region, races} + var err error + if kk != nil { + err = errors.Join(err, t.ExecuteTemplate(kk, "koka-race", &data)) + } + if g != nil { + err = errors.Join(err, t.ExecuteTemplate(g, "go-race", &data)) + } + return err +} + const wordSeps = " ,!?/-+();#○☆♡'=♪∀゚∴" var ( @@ -105,11 +120,12 @@ var ( "114th", "Hundred-Fourteenth", "♡ 3D Nail Art", "Nail-Art", ".", "", + "\u2019", "", "&", "-and-", "'s", "s", "ó", "o", "∞", "Infinity", - "×", "x", + "\u00d7", "x", "◎", "Lv2", } for _, c := range wordSeps { @@ -128,10 +144,11 @@ var ( "1st", "First", "♡ 3D Nail Art", "NailArt", ".", "", + "\u2019", "", "&", "And", "'s", "s", "∞", "Infinity", - "×", "X", + "\u00d7", "X", "◎", "Lv2", } for _, c := range wordSeps { diff --git a/horsegen/load.go b/horsegen/load.go index 0580ff2..b9f69c4 100644 --- a/horsegen/load.go +++ b/horsegen/load.go @@ -23,6 +23,9 @@ var skillGroupSQL string //go:embed skill.sql var skillSQL string +//go:embed race.sql +var raceSQL string + type ( Character struct{} SkillGroup struct{} @@ -315,3 +318,44 @@ func Skills(ctx context.Context, db *sqlitex.Pool) ([]Skill, error) { } return r, nil } + +type Race struct { + ID int + Name string + Grade int + ThumbnailID int + Primary int +} + +func Races(ctx context.Context, db *sqlitex.Pool) ([]Race, error) { + conn, err := db.Take(ctx) + defer db.Put(conn) + if err != nil { + return nil, fmt.Errorf("couldn't get connection for races: %w", err) + } + stmt, _, err := conn.PrepareTransient(raceSQL) + if err != nil { + return nil, fmt.Errorf("couldn't prepare statement for races: %w", err) + } + defer stmt.Finalize() + + var r []Race + for { + ok, err := stmt.Step() + if err != nil { + return nil, fmt.Errorf("error stepping races: %w", err) + } + if !ok { + break + } + race := Race{ + ID: stmt.ColumnInt(0), + Name: stmt.ColumnText(1), + Grade: stmt.ColumnInt(2), + ThumbnailID: stmt.ColumnInt(3), + Primary: stmt.ColumnInt(4), + } + r = append(r, race) + } + return r, nil +} diff --git a/horsegen/main.go b/horsegen/main.go index 048e43f..720d263 100644 --- a/horsegen/main.go +++ b/horsegen/main.go @@ -50,6 +50,7 @@ func main() { trios []AffinityRelation sg []NamedID[SkillGroup] skills []Skill + races []Race ) eg.Go(func() error { slog.Info("get characters") @@ -81,6 +82,12 @@ func main() { skills = r return err }) + eg.Go(func() error { + slog.Info("get races") + r, err := Races(ctx, db) + races = r + return err + }) if err := eg.Wait(); err != nil { slog.Error("load", slog.Any("err", err)) os.Exit(1) @@ -116,8 +123,21 @@ func main() { slog.Info("write skills") return ExecSkill(t, region, sf, gf, sg, skills) }) + eg.Go(func() error { + kf, err := os.Create(filepath.Join(out, region, "race.kk")) + if err != nil { + return err + } + gf, err := os.Create(filepath.Join(out, region, "race.go")) + if err != nil { + return err + } + slog.Info("write races") + return ExecRace(t, region, kf, gf, races) + }) if err := eg.Wait(); err != nil { slog.Error("generate", slog.Any("err", err)) + os.Exit(1) } else { slog.Info("done") } diff --git a/horsegen/race.go.template b/horsegen/race.go.template new file mode 100644 index 0000000..731d90f --- /dev/null +++ b/horsegen/race.go.template @@ -0,0 +1,32 @@ +{{- define "go-race" -}} +package {{ $.Region }} + +// Automatically generated with horsegen; DO NOT EDIT + +import . "git.sunturtle.xyz/zephyr/horse/horse" + +const ( + {{- range $r := $.Races }} + Race{{ goenum $r.Name }}{{ if ne $r.Primary $r.ID }}Alternate{{ end }} RaceID = {{ $r.ID }} // {{ $r.Name }} + {{- end }} +) + +var AllRaces = map[RaceID]Race{ + {{- range $r := $.Races }} + Race{{ goenum $r.Name }}{{ if ne $r.Primary $r.ID }}Alternate{{ end }}: { + ID: {{ $r.ID }}, + Name: {{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} + " (Alternate)"{{ end }}, + Thumbnail: {{ $r.ThumbnailID }}, + {{- if ne $r.Primary $r.ID }} + Primary: {{ $r.Primary }}, + {{- end }} + }, + {{- end }} +} + +var RaceNameToID = map[string]RaceID{ + {{- range $r := $.Races }} + {{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} + " (Alternate)"{{ end }}: {{ $r.ID }}, + {{- end }} +} +{{ end }} diff --git a/horsegen/race.kk.template b/horsegen/race.kk.template new file mode 100644 index 0000000..278328f --- /dev/null +++ b/horsegen/race.kk.template @@ -0,0 +1,80 @@ +{{- define "koka-race" -}} +module horse/{{ $.Region }}/race + +// Automatically generated with horsegen; DO NOT EDIT + +import std/data/rb-map +import horse/game-id +pub import horse/race + +// Enumeration of all races for type-safe programming. +pub type race + {{- range $r := $.Races }} + {{ kkenum $r.Name }}{{ if ne $r.Primary $r.ID }}-Alternate{{ end }} + {{- end }} + +// Get the race ID for a race. +pub fun race-id(r: race): race-id + match r + {{- range $r := $.Races }} + {{ kkenum $r.Name }}{{ if ne $r.Primary $r.ID }}-Alternate{{ end }} -> Race-id({{ $r.ID }}) + {{- end }} + +// List of all races in ID order for easy iterating. +pub val all = [ + {{- range $r := $.Races }} + {{ kkenum $r.Name }}{{ if ne $r.Primary $r.ID }}-Alternate{{ end }}, + {{- end }} +] + +val name2id: rbmap<string, race-id> = rb-map/empty() + {{- range $r := $.Races }} + .set({{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} ++ " (Alternate)"{{ end }}, Race-id({{ $r.ID }})) + {{- end }} + +// Get the race ID that has the given exact name. +// Alternate versions of races have " (Alternate)" in their names. +// If no race matches the name, the result is an invalid ID. +pub fun from-name(name: string): race-id + name2id.lookup(name).default(Race-id(0)) + +// Get the name for a race. +// Alternate versions of races have " (Alternate)" in their names. +// If no race matches the ID, the result is the numeric ID. +pub fun show(r: race-id): string + match r.game-id + {{- range $r := $.Races }} + {{ $r.ID }} -> {{ printf "%q" $r.Name }}{{ if ne $r.Primary $r.ID }} ++ " (Alternate)"{{ end }} + {{- end }} + x -> "race " ++ x.show + +// Get the grade for a race. +// If no race matches the ID, the result is Pre-OP. +pub fun grade(r: race-id): grade + match r.game-id + {{- range $r := $.Races }} + {{ $r.ID }} -> {{ if eq $r.Grade 100 }}G1{{ else if eq $r.Grade 200 }}G2{{ else if eq $r.Grade 300 }}G3{{ else if eq $r.Grade 400 }}OP{{ else if eq $r.Grade 700 }}Pre-OP{{ else }}??? $r.Grade={{ $r.Grade }}{{ end }} + {{- end }} + _ -> Pre-OP + +// Get the thumbnail ID for a race. +// If no race matches the ID, the result is an invalid ID. +pub fun thumbnail(r: race-id): race-thumbnail-id + match r.game-id + {{- range $r := $.Races }} + {{ $r.ID }} -> Race-thumbnail-id({{ $r.ThumbnailID }}) + {{- end }} + _ -> Race-thumbnail-id(0) + +// Get the primary ID for a race. +// For races which are the primary version, or if no race matches the given ID, +// the result is the input. +pub fun primary(r: race-id): race-id + match r.game-id + {{- range $r := $.Races }} + {{- if ne $r.ID $r.Primary }} + {{ $r.ID }} -> Race-id({{ $r.Primary }}) + {{- end }} + {{- end }} + _ -> r +{{ end }} diff --git a/horsegen/race.sql b/horsegen/race.sql new file mode 100644 index 0000000..4f4cae7 --- /dev/null +++ b/horsegen/race.sql @@ -0,0 +1,13 @@ +WITH race_names AS ( + SELECT "index" AS id, "text" AS name FROM text_data WHERE category = 33 +) +SELECT + race.id, + race_names.name, + race.grade, + race.thumbnail_id, + MIN(race.id) OVER (PARTITION BY race_names.name) AS "primary" +FROM race + JOIN race_names ON race.id = race_names.id +WHERE race."group" = 1 +ORDER BY race.id