diff --git a/doc/README.md b/doc/README.md index 4a79041..fa50e93 100644 --- a/doc/README.md +++ b/doc/README.md @@ -6,7 +6,7 @@ This file is my notes from exploring the database. # text_data categories -- 6 is character names, 4 is [variant] character name, 5 is [variant], 14 is variant +- 6 is character names, 4 is [variant] character name, 5 is [variant], 14 is clothing names - 47 is skill names, 48 is skill descriptions - 75 is support card names incl. variant, 76 is support card variant, 77 is support card character - 147 is spark names, 172 is spark descriptions @@ -64,9 +64,6 @@ effect_id distinguishes possibilities; factors with multiple effects (race and s effect_group_id determines the pmf, but no tables have non-empty joins with the same column name, so the distribution values are mystery. even searching for 51 and 52 (effect group ids for 1\* and 2\* race and scenario sparks) on consecutive lines gives nothing. -sf.grade = 1 unless it is a unique (green) spark, then sf.grade = 2. -=> sf.grade = 2 iff sf.factor_type = 3 - getting all interesting spark data, fully expanded with all effects: ```sql WITH spark AS ( diff --git a/horse/aptitudelevel_string.go b/horse/aptitudelevel_string.go new file mode 100644 index 0000000..269dd8f --- /dev/null +++ b/horse/aptitudelevel_string.go @@ -0,0 +1,31 @@ +// Code generated by "stringer -type AptitudeLevel -trimprefix AptitudeLv"; DO NOT EDIT. + +package horse + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[AptitudeLvG-1] + _ = x[AptitudeLvF-2] + _ = x[AptitudeLvE-3] + _ = x[AptitudeLvD-4] + _ = x[AptitudeLvC-5] + _ = x[AptitudeLvB-6] + _ = x[AptitudeLvA-7] + _ = x[AptitudeLvS-8] +} + +const _AptitudeLevel_name = "GFEDCBAS" + +var _AptitudeLevel_index = [...]uint8{0, 1, 2, 3, 4, 5, 6, 7, 8} + +func (i AptitudeLevel) String() string { + idx := int(i) - 1 + if i < 1 || idx >= len(_AptitudeLevel_index)-1 { + return "AptitudeLevel(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _AptitudeLevel_name[_AptitudeLevel_index[idx]:_AptitudeLevel_index[idx+1]] +} diff --git a/horse/global/uma.go b/horse/global/uma.go new file mode 100644 index 0000000..a381732 --- /dev/null +++ b/horse/global/uma.go @@ -0,0 +1,1686 @@ +package global + +// Automatically generated with horsegen; DO NOT EDIT + +import . "git.sunturtle.xyz/zephyr/horse/horse" + +const ( + SpecialWeekSpecialDreamer UmaID = 100101 // [Special Dreamer] Special Week + SpecialWeekHoppnHappyHeart UmaID = 100102 // [Hopp'n♪Happy Heart] Special Week + SilenceSuzukaInnocentSilence UmaID = 100201 // [Innocent Silence] Silence Suzuka + TokaiTeioPeakJoy UmaID = 100301 // [Peak Joy] Tokai Teio + TokaiTeioBeyondtheHorizon UmaID = 100302 // [Beyond the Horizon] Tokai Teio + MaruzenskyFormulaR UmaID = 100401 // [Formula R] Maruzensky + MaruzenskyHotSummerNight UmaID = 100402 // [Hot☆Summer Night] Maruzensky + FujiKisekiShootingStarRevue UmaID = 100501 // [Shooting Star Revue] Fuji Kiseki + OguriCapStarlightBeat UmaID = 100601 // [Starlight Beat] Oguri Cap + OguriCapAshenMiracle UmaID = 100602 // [Ashen Miracle] Oguri Cap + GoldShipRedStrife UmaID = 100701 // [Red Strife] Gold Ship + VodkaWildTopGear UmaID = 100801 // [Wild Top Gear] Vodka + DaiwaScarletPeakBlue UmaID = 100901 // [Peak Blue] Daiwa Scarlet + TaikiShuttleWildFrontier UmaID = 101001 // [Wild Frontier] Taiki Shuttle + GrassWonderStonePiercingBlue UmaID = 101101 // [Stone-Piercing Blue] Grass Wonder + GrassWonderSaintlyJadeCleric UmaID = 101102 // [Saintly Jade Cleric] Grass Wonder + HishiAmazonAzureAmazon UmaID = 101201 // [Azure Amazon] Hishi Amazon + MejiroMcQueenFrontlineElegance UmaID = 101301 // [Frontline Elegance] Mejiro McQueen + MejiroMcQueenEndoftheSkies UmaID = 101302 // [End of the Skies] Mejiro McQueen + ElCondorPasaElNúmero1 UmaID = 101401 // [El☆Número 1] El Condor Pasa + ElCondorPasaKukulkanWarrior UmaID = 101402 // [Kukulkan Warrior] El Condor Pasa + TMOperaOOSoleSuo UmaID = 101501 // [O Sole Suo!] T.M. Opera O + TMOperaONewYearSameRadiance UmaID = 101502 // [New Year, Same Radiance!] T.M. Opera O + NaritaBrianMaverick UmaID = 101601 // [Maverick] Narita Brian + SymboliRudolfEmperorsPath UmaID = 101701 // [Emperor's Path] Symboli Rudolf + SymboliRudolfArcherbyMoonlight UmaID = 101702 // [Archer by Moonlight] Symboli Rudolf + AirGrooveEmpressRoad UmaID = 101801 // [Empress Road] Air Groove + AirGrooveQuercusCivilis UmaID = 101802 // [Quercus Civilis] Air Groove + AgnesDigitalFullColorFangirling UmaID = 101901 // [Full-Color Fangirling] Agnes Digital + SeiunSkyReelingintheBigOne UmaID = 102001 // [Reeling in the Big One] Seiun Sky + TamamoCrossFastasLightning UmaID = 102101 // [Fast as Lightning] Tamamo Cross + FineMotionNobleSeamair UmaID = 102201 // [Noble Seamair] Fine Motion + BiwaHayahidePfWinningEquation UmaID = 102301 // [pf. Winning Equation...] Biwa Hayahide + BiwaHayahideRougeCaroler UmaID = 102302 // [Rouge Caroler] Biwa Hayahide + MayanoTopGunScrambleZone UmaID = 102401 // [Scramble☆Zone] Mayano Top Gun + MayanoTopGunSunlightBouquet UmaID = 102402 // [Sunlight Bouquet] Mayano Top Gun + ManhattanCafeCreepingShadow UmaID = 102501 // [Creeping Shadow] Manhattan Cafe + MihonoBourbonMB19890425 UmaID = 102601 // [MB-19890425] Mihono Bourbon + MihonoBourbonCODEICING UmaID = 102602 // [CODE: ICING] Mihono Bourbon + MejiroRyanDowntheLine UmaID = 102701 // [Down the Line] Mejiro Ryan + HishiAkebonoBuonoAllaModa UmaID = 102801 // [Buono ☆ Alla Moda] Hishi Akebono + RiceShowerRosyDreams UmaID = 103001 // [Rosy Dreams] Rice Shower + RiceShowerVampireMakeover UmaID = 103002 // [Vampire Makeover!] Rice Shower + AgnesTachyonTachnology UmaID = 103201 // [Tach-nology] Agnes Tachyon + WinningTicketGettoWinning UmaID = 103501 // [Get to Winning!] Winning Ticket + EishinFlashMeisterschaft UmaID = 103701 // [Meisterschaft] Eishin Flash + EishinFlashPreciseChocolatier UmaID = 103702 // [Precise Chocolatier] Eishin Flash + CurrenChanFilleÉclair UmaID = 103801 // [Fille Éclair] Curren Chan + KawakamiPrincessPrincessofPink UmaID = 103901 // [Princess of Pink] Kawakami Princess + GoldCityAuthentic1928 UmaID = 104001 // [Authentic / 1928] Gold City + GoldCityAutumnCosmos UmaID = 104002 // [Autumn Cosmos] Gold City + SakuraBakushinOBlossominLearning UmaID = 104101 // [Blossom in Learning] Sakura Bakushin O + SuperCreekMurmuringStream UmaID = 104501 // [Murmuring Stream] Super Creek + SuperCreekChiffonWrappedMummy UmaID = 104502 // [Chiffon-Wrapped Mummy] Super Creek + SmartFalconLOVE4EVER UmaID = 104601 // [LOVE☆4EVER] Smart Falcon + TosenJordanJokesterVibes UmaID = 104801 // [Jokester ☆ Vibes] Tosen Jordan + NaritaTaishinNevertheless UmaID = 105001 // [Nevertheless] Narita Taishin + HaruUraraBestestPrize UmaID = 105201 // [Bestest Prize ♪] Haru Urara + HaruUraraNewYearNewUrara UmaID = 105202 // [New Year ♪ New Urara!] Haru Urara + MatikanefukukitaruRisingFortune UmaID = 105601 // [Rising☆Fortune] Matikanefukukitaru + MatikanefukukitaruLuckyTidings UmaID = 105602 // [Lucky Tidings] Matikanefukukitaru + MeishoDotoTurbulentBlue UmaID = 105801 // [Turbulent Blue] Meisho Doto + MejiroDoberOfftheLine UmaID = 105901 // [Off the Line] Mejiro Dober + NiceNaturePoinsettiaRibbon UmaID = 106001 // [Poinsettia Ribbon] Nice Nature + KingHaloKingofEmeralds UmaID = 106101 // [King of Emeralds] King Halo + SakuraChiyonoOStrengthinFullBloom UmaID = 106901 // [Strength in Full Bloom] Sakura Chiyono O + MejiroArdanCrystalline UmaID = 107101 // [Crystalline] Mejiro Ardan +) + +var AllUmas = map[UmaID]Uma{ + SpecialWeekSpecialDreamer: { + ID: 100101, + CharacterID: 1001, + Name: "[Special Dreamer] Special Week", + Variant: "[Special Dreamer]", + Sprint: 2, + Mile: 5, + Medium: 7, + Long: 7, + Front: 1, + Pace: 7, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 100011, + Skill1: 200512, + Skill2: 201352, + Skill3: 200732, + SkillPL2: 200162, + SkillPL3: 201351, + SkillPL4: 200612, + SkillPL5: 200511, + }, + SpecialWeekHoppnHappyHeart: { + ID: 100102, + CharacterID: 1001, + Name: "[Hopp'n♪Happy Heart] Special Week", + Variant: "[Hopp'n♪Happy Heart]", + Sprint: 2, + Mile: 5, + Medium: 7, + Long: 7, + Front: 1, + Pace: 7, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 110011, + Skill1: 200462, + Skill2: 200592, + Skill3: 201132, + SkillPL2: 200212, + SkillPL3: 200591, + SkillPL4: 201611, + SkillPL5: 200461, + }, + SilenceSuzukaInnocentSilence: { + ID: 100201, + CharacterID: 1002, + Name: "[Innocent Silence] Silence Suzuka", + Variant: "[Innocent Silence]", + Sprint: 4, + Mile: 7, + Medium: 7, + Long: 3, + Front: 7, + Pace: 5, + Late: 3, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100021, + Skill1: 200432, + Skill2: 200552, + Skill3: 200712, + SkillPL2: 200022, + SkillPL3: 200431, + SkillPL4: 200542, + SkillPL5: 200551, + }, + TokaiTeioPeakJoy: { + ID: 100301, + CharacterID: 1003, + Name: "[Peak Joy] Tokai Teio", + Variant: "[Peak Joy]", + Sprint: 2, + Mile: 3, + Medium: 7, + Long: 6, + Front: 4, + Pace: 7, + Late: 5, + End: 3, + Turf: 7, + Dirt: 1, + Unique: 100031, + Skill1: 200452, + Skill2: 201132, + Skill3: 201332, + SkillPL2: 200502, + SkillPL3: 201331, + SkillPL4: 201142, + SkillPL5: 201131, + }, + TokaiTeioBeyondtheHorizon: { + ID: 100302, + CharacterID: 1003, + Name: "[Beyond the Horizon] Tokai Teio", + Variant: "[Beyond the Horizon]", + Sprint: 2, + Mile: 3, + Medium: 7, + Long: 6, + Front: 4, + Pace: 7, + Late: 5, + End: 3, + Turf: 7, + Dirt: 1, + Unique: 110031, + Skill1: 200452, + Skill2: 201142, + Skill3: 200572, + SkillPL2: 200172, + SkillPL3: 200571, + SkillPL4: 200352, + SkillPL5: 201141, + }, + MaruzenskyFormulaR: { + ID: 100401, + CharacterID: 1004, + Name: "[Formula R] Maruzensky", + Variant: "[Formula R]", + Sprint: 6, + Mile: 7, + Medium: 6, + Long: 5, + Front: 7, + Pace: 3, + Late: 1, + End: 1, + Turf: 7, + Dirt: 4, + Unique: 100041, + Skill1: 200362, + Skill2: 201052, + Skill3: 200532, + SkillPL2: 201062, + SkillPL3: 201051, + SkillPL4: 200432, + SkillPL5: 201061, + }, + MaruzenskyHotSummerNight: { + ID: 100402, + CharacterID: 1004, + Name: "[Hot☆Summer Night] Maruzensky", + Variant: "[Hot☆Summer Night]", + Sprint: 6, + Mile: 7, + Medium: 6, + Long: 5, + Front: 7, + Pace: 3, + Late: 1, + End: 1, + Turf: 7, + Dirt: 4, + Unique: 110041, + Skill1: 200352, + Skill2: 200682, + Skill3: 201282, + SkillPL2: 201571, + SkillPL3: 201281, + SkillPL4: 201082, + SkillPL5: 200681, + }, + FujiKisekiShootingStarRevue: { + ID: 100501, + CharacterID: 1005, + Name: "[Shooting Star Revue] Fuji Kiseki", + Variant: "[Shooting Star Revue]", + Sprint: 6, + Mile: 7, + Medium: 6, + Long: 3, + Front: 5, + Pace: 7, + Late: 5, + End: 1, + Turf: 7, + Dirt: 2, + Unique: 100051, + Skill1: 200771, + Skill2: 201072, + Skill3: 200572, + SkillPL2: 201052, + SkillPL3: 201071, + SkillPL4: 201042, + SkillPL5: 200571, + }, + OguriCapStarlightBeat: { + ID: 100601, + CharacterID: 1006, + Name: "[Starlight Beat] Oguri Cap", + Variant: "[Starlight Beat]", + Sprint: 3, + Mile: 7, + Medium: 7, + Long: 6, + Front: 2, + Pace: 7, + Late: 7, + End: 4, + Turf: 7, + Dirt: 6, + Unique: 100061, + Skill1: 200342, + Skill2: 201062, + Skill3: 201352, + SkillPL2: 200222, + SkillPL3: 201351, + SkillPL4: 200492, + SkillPL5: 200341, + }, + OguriCapAshenMiracle: { + ID: 100602, + CharacterID: 1006, + Name: "[Ashen Miracle] Oguri Cap", + Variant: "[Ashen Miracle]", + Sprint: 3, + Mile: 7, + Medium: 7, + Long: 6, + Front: 2, + Pace: 7, + Late: 7, + End: 4, + Turf: 7, + Dirt: 6, + Unique: 110061, + Skill1: 201621, + Skill2: 200752, + Skill3: 201352, + SkillPL2: 201422, + SkillPL3: 201351, + SkillPL4: 201571, + SkillPL5: 200751, + }, + GoldShipRedStrife: { + ID: 100701, + CharacterID: 1007, + Name: "[Red Strife] Gold Ship", + Variant: "[Red Strife]", + Sprint: 1, + Mile: 5, + Medium: 7, + Long: 7, + Front: 1, + Pace: 6, + Late: 6, + End: 7, + Turf: 7, + Dirt: 1, + Unique: 100071, + Skill1: 201591, + Skill2: 201212, + Skill3: 201472, + SkillPL2: 201482, + SkillPL3: 201471, + SkillPL4: 200622, + SkillPL5: 201481, + }, + VodkaWildTopGear: { + ID: 100801, + CharacterID: 1008, + Name: "[Wild Top Gear] Vodka", + Variant: "[Wild Top Gear]", + Sprint: 2, + Mile: 7, + Medium: 7, + Long: 2, + Front: 5, + Pace: 6, + Late: 7, + End: 2, + Turf: 7, + Dirt: 1, + Unique: 100081, + Skill1: 200382, + Skill2: 200702, + Skill3: 200602, + SkillPL2: 200372, + SkillPL3: 200381, + SkillPL4: 201032, + SkillPL5: 200701, + }, + DaiwaScarletPeakBlue: { + ID: 100901, + CharacterID: 1009, + Name: "[Peak Blue] Daiwa Scarlet", + Variant: "[Peak Blue]", + Sprint: 2, + Mile: 7, + Medium: 7, + Long: 6, + Front: 7, + Pace: 7, + Late: 3, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100091, + Skill1: 200282, + Skill2: 200722, + Skill3: 200572, + SkillPL2: 200562, + SkillPL3: 200721, + SkillPL4: 200582, + SkillPL5: 200571, + }, + TaikiShuttleWildFrontier: { + ID: 101001, + CharacterID: 1010, + Name: "[Wild Frontier] Taiki Shuttle", + Variant: "[Wild Frontier]", + Sprint: 7, + Mile: 7, + Medium: 3, + Long: 1, + Front: 5, + Pace: 7, + Late: 3, + End: 1, + Turf: 7, + Dirt: 6, + Unique: 100101, + Skill1: 200362, + Skill2: 201052, + Skill3: 201532, + SkillPL2: 200682, + SkillPL3: 201051, + SkillPL4: 201032, + SkillPL5: 200681, + }, + GrassWonderStonePiercingBlue: { + ID: 101101, + CharacterID: 1011, + Name: "[Stone-Piercing Blue] Grass Wonder", + Variant: "[Stone-Piercing Blue]", + Sprint: 1, + Mile: 7, + Medium: 6, + Long: 7, + Front: 2, + Pace: 7, + Late: 7, + End: 2, + Turf: 7, + Dirt: 1, + Unique: 100111, + Skill1: 200871, + Skill2: 201152, + Skill3: 200602, + SkillPL2: 200512, + SkillPL3: 201151, + SkillPL4: 200592, + SkillPL5: 200601, + }, + GrassWonderSaintlyJadeCleric: { + ID: 101102, + CharacterID: 1011, + Name: "[Saintly Jade Cleric] Grass Wonder", + Variant: "[Saintly Jade Cleric ]", + Sprint: 1, + Mile: 7, + Medium: 6, + Long: 7, + Front: 2, + Pace: 7, + Late: 7, + End: 2, + Turf: 7, + Dirt: 1, + Unique: 110111, + Skill1: 200472, + Skill2: 200742, + Skill3: 201422, + SkillPL2: 200771, + SkillPL3: 200741, + SkillPL4: 201542, + SkillPL5: 201421, + }, + HishiAmazonAzureAmazon: { + ID: 101201, + CharacterID: 1012, + Name: "[Azure Amazon] Hishi Amazon", + Variant: "[Azure Amazon]", + Sprint: 4, + Mile: 7, + Medium: 7, + Long: 6, + Front: 1, + Pace: 6, + Late: 5, + End: 7, + Turf: 7, + Dirt: 3, + Unique: 100121, + Skill1: 200502, + Skill2: 200632, + Skill3: 200732, + SkillPL2: 201452, + SkillPL3: 200731, + SkillPL4: 201462, + SkillPL5: 200631, + }, + MejiroMcQueenFrontlineElegance: { + ID: 101301, + CharacterID: 1013, + Name: "[Frontline Elegance] Mejiro McQueen", + Variant: "[Frontline Elegance]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 7, + Front: 6, + Pace: 7, + Late: 4, + End: 2, + Turf: 7, + Dirt: 3, + Unique: 100131, + Skill1: 200172, + Skill2: 200562, + Skill3: 201192, + SkillPL2: 201182, + SkillPL3: 201191, + SkillPL4: 201352, + SkillPL5: 200561, + }, + MejiroMcQueenEndoftheSkies: { + ID: 101302, + CharacterID: 1013, + Name: "[End of the Skies] Mejiro McQueen", + Variant: "[End of the Skies]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 7, + Front: 6, + Pace: 7, + Late: 4, + End: 2, + Turf: 7, + Dirt: 3, + Unique: 110131, + Skill1: 200362, + Skill2: 200562, + Skill3: 200742, + SkillPL2: 200192, + SkillPL3: 200741, + SkillPL4: 200462, + SkillPL5: 200361, + }, + ElCondorPasaElNúmero1: { + ID: 101401, + CharacterID: 1014, + Name: "[El☆Número 1] El Condor Pasa", + Variant: "[El☆Número 1]", + Sprint: 2, + Mile: 7, + Medium: 7, + Long: 6, + Front: 3, + Pace: 7, + Late: 7, + End: 5, + Turf: 7, + Dirt: 6, + Unique: 100141, + Skill1: 200362, + Skill2: 201122, + Skill3: 201312, + SkillPL2: 200562, + SkillPL3: 201121, + SkillPL4: 200722, + SkillPL5: 200561, + }, + ElCondorPasaKukulkanWarrior: { + ID: 101402, + CharacterID: 1014, + Name: "[Kukulkan Warrior] El Condor Pasa", + Variant: "[Kukulkan Warrior]", + Sprint: 2, + Mile: 7, + Medium: 7, + Long: 6, + Front: 3, + Pace: 7, + Late: 7, + End: 5, + Turf: 7, + Dirt: 6, + Unique: 110141, + Skill1: 200512, + Skill2: 200702, + Skill3: 200612, + SkillPL2: 201072, + SkillPL3: 200701, + SkillPL4: 201412, + SkillPL5: 200611, + }, + TMOperaOOSoleSuo: { + ID: 101501, + CharacterID: 1015, + Name: "[O Sole Suo!] T.M. Opera O", + Variant: "[O Sole Suo!]", + Sprint: 1, + Mile: 3, + Medium: 7, + Long: 7, + Front: 5, + Pace: 7, + Late: 7, + End: 1, + Turf: 7, + Dirt: 3, + Unique: 100151, + Skill1: 200582, + Skill2: 200722, + Skill3: 200142, + SkillPL2: 200362, + SkillPL3: 200581, + SkillPL4: 200562, + SkillPL5: 200721, + }, + TMOperaONewYearSameRadiance: { + ID: 101502, + CharacterID: 1015, + Name: "[New Year, Same Radiance!] T.M. Opera O", + Variant: "[New Year, Same Radiance!]", + Sprint: 1, + Mile: 3, + Medium: 7, + Long: 7, + Front: 5, + Pace: 7, + Late: 7, + End: 1, + Turf: 7, + Dirt: 3, + Unique: 110151, + Skill1: 201312, + Skill2: 202012, + Skill3: 200352, + SkillPL2: 200252, + SkillPL3: 200351, + SkillPL4: 200202, + SkillPL5: 202011, + }, + NaritaBrianMaverick: { + ID: 101601, + CharacterID: 1016, + Name: "[Maverick] Narita Brian", + Variant: "[Maverick]", + Sprint: 2, + Mile: 6, + Medium: 7, + Long: 7, + Front: 1, + Pace: 7, + Late: 7, + End: 4, + Turf: 7, + Dirt: 1, + Unique: 100161, + Skill1: 200362, + Skill2: 201102, + Skill3: 200572, + SkillPL2: 200512, + SkillPL3: 200361, + SkillPL4: 201641, + SkillPL5: 200511, + }, + SymboliRudolfEmperorsPath: { + ID: 101701, + CharacterID: 1017, + Name: "[Emperor's Path] Symboli Rudolf", + Variant: "[Emperor's Path]", + Sprint: 3, + Mile: 5, + Medium: 7, + Long: 7, + Front: 6, + Pace: 7, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 100171, + Skill1: 200332, + Skill2: 201152, + Skill3: 200572, + SkillPL2: 200891, + SkillPL3: 201151, + SkillPL4: 201322, + SkillPL5: 200331, + }, + SymboliRudolfArcherbyMoonlight: { + ID: 101702, + CharacterID: 1017, + Name: "[Archer by Moonlight] Symboli Rudolf", + Variant: "[Archer by Moonlight]", + Sprint: 3, + Mile: 5, + Medium: 7, + Long: 7, + Front: 6, + Pace: 7, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 110171, + Skill1: 200192, + Skill2: 200752, + Skill3: 200562, + SkillPL2: 201342, + SkillPL3: 200561, + SkillPL4: 201312, + SkillPL5: 200194, + }, + AirGrooveEmpressRoad: { + ID: 101801, + CharacterID: 1018, + Name: "[Empress Road] Air Groove", + Variant: "[Empress Road]", + Sprint: 5, + Mile: 6, + Medium: 7, + Long: 3, + Front: 4, + Pace: 7, + Late: 7, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100181, + Skill1: 200502, + Skill2: 200722, + Skill3: 201372, + SkillPL2: 200941, + SkillPL3: 201371, + SkillPL4: 200931, + SkillPL5: 200501, + }, + AirGrooveQuercusCivilis: { + ID: 101802, + CharacterID: 1018, + Name: "[Quercus Civilis] Air Groove", + Variant: "[Quercus Civilis]", + Sprint: 5, + Mile: 6, + Medium: 7, + Long: 3, + Front: 4, + Pace: 7, + Late: 7, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 110181, + Skill1: 200342, + Skill2: 201072, + Skill3: 201322, + SkillPL2: 201532, + SkillPL3: 201071, + SkillPL4: 200462, + SkillPL5: 200341, + }, + AgnesDigitalFullColorFangirling: { + ID: 101901, + CharacterID: 1019, + Name: "[Full-Color Fangirling] Agnes Digital", + Variant: "[Full-Color Fangirling]", + Sprint: 2, + Mile: 7, + Medium: 7, + Long: 1, + Front: 1, + Pace: 7, + Late: 7, + End: 6, + Turf: 7, + Dirt: 7, + Unique: 100191, + Skill1: 201591, + Skill2: 201682, + Skill3: 201382, + SkillPL2: 200162, + SkillPL3: 201592, + SkillPL4: 201102, + SkillPL5: 201681, + }, + SeiunSkyReelingintheBigOne: { + ID: 102001, + CharacterID: 1020, + Name: "[Reeling in the Big One] Seiun Sky", + Variant: "[Reeling in the Big One]", + Sprint: 1, + Mile: 5, + Medium: 7, + Long: 7, + Front: 7, + Pace: 6, + Late: 4, + End: 3, + Turf: 7, + Dirt: 1, + Unique: 100201, + Skill1: 200881, + Skill2: 201192, + Skill3: 200542, + SkillPL2: 201522, + SkillPL3: 201191, + SkillPL4: 201611, + SkillPL5: 200541, + }, + TamamoCrossFastasLightning: { + ID: 102101, + CharacterID: 1021, + Name: "[Fast as Lightning] Tamamo Cross", + Variant: "[Fast as Lightning]", + Sprint: 1, + Mile: 3, + Medium: 7, + Long: 7, + Front: 1, + Pace: 7, + Late: 7, + End: 7, + Turf: 7, + Dirt: 2, + Unique: 100211, + Skill1: 201611, + Skill2: 201132, + Skill3: 200592, + SkillPL2: 200572, + SkillPL3: 200591, + SkillPL4: 200642, + SkillPL5: 201612, + }, + FineMotionNobleSeamair: { + ID: 102201, + CharacterID: 1022, + Name: "[Noble Seamair] Fine Motion", + Variant: "[Noble Seamair]", + Sprint: 2, + Mile: 7, + Medium: 7, + Long: 5, + Front: 4, + Pace: 7, + Late: 3, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 100221, + Skill1: 200192, + Skill2: 200582, + Skill3: 201112, + SkillPL2: 201342, + SkillPL3: 200581, + SkillPL4: 200012, + SkillPL5: 201341, + }, + BiwaHayahidePfWinningEquation: { + ID: 102301, + CharacterID: 1023, + Name: "[pf. Winning Equation...] Biwa Hayahide", + Variant: "[pf. Winning Equation...]", + Sprint: 2, + Mile: 5, + Medium: 7, + Long: 7, + Front: 3, + Pace: 7, + Late: 6, + End: 3, + Turf: 7, + Dirt: 2, + Unique: 100231, + Skill1: 200162, + Skill2: 200742, + Skill3: 200562, + SkillPL2: 200262, + SkillPL3: 200561, + SkillPL4: 200821, + SkillPL5: 200741, + }, + BiwaHayahideRougeCaroler: { + ID: 102302, + CharacterID: 1023, + Name: "[Rouge Caroler] Biwa Hayahide", + Variant: "[Rouge Caroler]", + Sprint: 2, + Mile: 5, + Medium: 7, + Long: 7, + Front: 3, + Pace: 7, + Late: 6, + End: 3, + Turf: 7, + Dirt: 2, + Unique: 110231, + Skill1: 200512, + Skill2: 201202, + Skill3: 200572, + SkillPL2: 201532, + SkillPL3: 201201, + SkillPL4: 201312, + SkillPL5: 200511, + }, + MayanoTopGunScrambleZone: { + ID: 102401, + CharacterID: 1024, + Name: "[Scramble☆Zone] Mayano Top Gun", + Variant: "[Scramble☆Zone]", + Sprint: 4, + Mile: 4, + Medium: 7, + Long: 7, + Front: 7, + Pace: 7, + Late: 6, + End: 6, + Turf: 7, + Dirt: 3, + Unique: 100241, + Skill1: 200382, + Skill2: 201272, + Skill3: 200742, + SkillPL2: 200492, + SkillPL3: 200381, + SkillPL4: 200502, + SkillPL5: 200491, + }, + MayanoTopGunSunlightBouquet: { + ID: 102402, + CharacterID: 1024, + Name: "[Sunlight Bouquet] Mayano Top Gun", + Variant: "[Sunlight Bouquet]", + Sprint: 4, + Mile: 4, + Medium: 7, + Long: 7, + Front: 7, + Pace: 7, + Late: 6, + End: 6, + Turf: 7, + Dirt: 3, + Unique: 110241, + Skill1: 200352, + Skill2: 201332, + Skill3: 201162, + SkillPL2: 200432, + SkillPL3: 201161, + SkillPL4: 200332, + SkillPL5: 200351, + }, + ManhattanCafeCreepingShadow: { + ID: 102501, + CharacterID: 1025, + Name: "[Creeping Shadow] Manhattan Cafe", + Variant: "[Creeping Shadow]", + Sprint: 1, + Mile: 2, + Medium: 6, + Long: 7, + Front: 1, + Pace: 5, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 100251, + Skill1: 200232, + Skill2: 201222, + Skill3: 201422, + SkillPL2: 201581, + SkillPL3: 201421, + SkillPL4: 201202, + SkillPL5: 201221, + }, + MihonoBourbonMB19890425: { + ID: 102601, + CharacterID: 1026, + Name: "[MB-19890425] Mihono Bourbon", + Variant: "[MB-19890425]", + Sprint: 5, + Mile: 6, + Medium: 7, + Long: 6, + Front: 7, + Pace: 3, + Late: 1, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100261, + Skill1: 200232, + Skill2: 200532, + Skill3: 200712, + SkillPL2: 201242, + SkillPL3: 200531, + SkillPL4: 201252, + SkillPL5: 200711, + }, + MihonoBourbonCODEICING: { + ID: 102602, + CharacterID: 1026, + Name: "[CODE: ICING] Mihono Bourbon", + Variant: "[CODE: ICING]", + Sprint: 5, + Mile: 6, + Medium: 7, + Long: 6, + Front: 7, + Pace: 3, + Late: 1, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 110261, + Skill1: 200432, + Skill2: 200542, + Skill3: 200762, + SkillPL2: 201522, + SkillPL3: 200541, + SkillPL4: 201601, + SkillPL5: 200431, + }, + MejiroRyanDowntheLine: { + ID: 102701, + CharacterID: 1027, + Name: "[Down the Line] Mejiro Ryan", + Variant: "[Down the Line]", + Sprint: 3, + Mile: 5, + Medium: 7, + Long: 6, + Front: 2, + Pace: 7, + Late: 7, + End: 2, + Turf: 7, + Dirt: 1, + Unique: 100271, + Skill1: 200232, + Skill2: 200722, + Skill3: 200612, + SkillPL2: 200472, + SkillPL3: 200721, + SkillPL4: 201102, + SkillPL5: 200611, + }, + HishiAkebonoBuonoAllaModa: { + ID: 102801, + CharacterID: 1028, + Name: "[Buono ☆ Alla Moda] Hishi Akebono", + Variant: "[Buono ☆ Alla Moda]", + Sprint: 7, + Mile: 6, + Medium: 2, + Long: 1, + Front: 6, + Pace: 7, + Late: 5, + End: 1, + Turf: 7, + Dirt: 2, + Unique: 100281, + Skill1: 200212, + Skill2: 201352, + Skill3: 201002, + SkillPL2: 201362, + SkillPL3: 201001, + SkillPL4: 201012, + SkillPL5: 201351, + }, + RiceShowerRosyDreams: { + ID: 103001, + CharacterID: 1030, + Name: "[Rosy Dreams] Rice Shower", + Variant: "[Rosy Dreams]", + Sprint: 3, + Mile: 5, + Medium: 7, + Long: 7, + Front: 6, + Pace: 7, + Late: 5, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100301, + Skill1: 200861, + Skill2: 201342, + Skill3: 200742, + SkillPL2: 201581, + SkillPL3: 201341, + SkillPL4: 201352, + SkillPL5: 200741, + }, + RiceShowerVampireMakeover: { + ID: 103002, + CharacterID: 1030, + Name: "[Vampire Makeover!] Rice Shower", + Variant: "[Vampire Makeover!]", + Sprint: 3, + Mile: 5, + Medium: 7, + Long: 7, + Front: 6, + Pace: 7, + Late: 5, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 110301, + Skill1: 200771, + Skill2: 201172, + Skill3: 200562, + SkillPL2: 200352, + SkillPL3: 200561, + SkillPL4: 200851, + SkillPL5: 200772, + }, + AgnesTachyonTachnology: { + ID: 103201, + CharacterID: 1032, + Name: "[Tach-nology] Agnes Tachyon", + Variant: "[tach-nology]", + Sprint: 1, + Mile: 4, + Medium: 7, + Long: 6, + Front: 3, + Pace: 7, + Late: 6, + End: 2, + Turf: 7, + Dirt: 1, + Unique: 100321, + Skill1: 200132, + Skill2: 201152, + Skill3: 200572, + SkillPL2: 201102, + SkillPL3: 201151, + SkillPL4: 201112, + SkillPL5: 200571, + }, + WinningTicketGettoWinning: { + ID: 103501, + CharacterID: 1035, + Name: "[Get to Winning!] Winning Ticket", + Variant: "[Get to Winning!]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 6, + Front: 1, + Pace: 6, + Late: 7, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100351, + Skill1: 200152, + Skill2: 200732, + Skill3: 201402, + SkillPL2: 200592, + SkillPL3: 201401, + SkillPL4: 201392, + SkillPL5: 200591, + }, + EishinFlashMeisterschaft: { + ID: 103701, + CharacterID: 1037, + Name: "[Meisterschaft] Eishin Flash", + Variant: "[Meisterschaft]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 7, + Front: 1, + Pace: 6, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 100371, + Skill1: 200502, + Skill2: 201542, + Skill3: 201112, + SkillPL2: 200512, + SkillPL3: 200501, + SkillPL4: 200432, + SkillPL5: 200511, + }, + EishinFlashPreciseChocolatier: { + ID: 103702, + CharacterID: 1037, + Name: "[Precise Chocolatier] Eishin Flash", + Variant: "[Precise Chocolatier]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 7, + Front: 1, + Pace: 6, + Late: 7, + End: 5, + Turf: 7, + Dirt: 1, + Unique: 110371, + Skill1: 200302, + Skill2: 200592, + Skill3: 201152, + SkillPL2: 201102, + SkillPL3: 201151, + SkillPL4: 201392, + SkillPL5: 201103, + }, + CurrenChanFilleÉclair: { + ID: 103801, + CharacterID: 1038, + Name: "[Fille Éclair] Curren Chan", + Variant: "[Fille Éclair]", + Sprint: 7, + Mile: 4, + Medium: 1, + Long: 1, + Front: 6, + Pace: 7, + Late: 3, + End: 1, + Turf: 7, + Dirt: 2, + Unique: 100381, + Skill1: 200462, + Skill2: 201372, + Skill3: 201012, + SkillPL2: 201002, + SkillPL3: 201371, + SkillPL4: 200582, + SkillPL5: 201011, + }, + KawakamiPrincessPrincessofPink: { + ID: 103901, + CharacterID: 1039, + Name: "[Princess of Pink] Kawakami Princess", + Variant: "[Princess of Pink]", + Sprint: 4, + Mile: 6, + Medium: 7, + Long: 2, + Front: 1, + Pace: 5, + Late: 7, + End: 4, + Turf: 7, + Dirt: 1, + Unique: 100391, + Skill1: 200492, + Skill2: 201072, + Skill3: 200612, + SkillPL2: 201382, + SkillPL3: 200491, + SkillPL4: 200132, + SkillPL5: 200611, + }, + GoldCityAuthentic1928: { + ID: 104001, + CharacterID: 1040, + Name: "[Authentic / 1928] Gold City", + Variant: "[Authentic / 1928]", + Sprint: 2, + Mile: 7, + Medium: 6, + Long: 6, + Front: 2, + Pace: 7, + Late: 7, + End: 2, + Turf: 7, + Dirt: 4, + Unique: 100401, + Skill1: 200052, + Skill2: 200692, + Skill3: 200602, + SkillPL2: 201651, + SkillPL3: 200691, + SkillPL4: 201062, + SkillPL5: 200601, + }, + GoldCityAutumnCosmos: { + ID: 104002, + CharacterID: 1040, + Name: "[Autumn Cosmos] Gold City", + Variant: "[Autumn Cosmos]", + Sprint: 2, + Mile: 7, + Medium: 6, + Long: 6, + Front: 2, + Pace: 7, + Late: 7, + End: 2, + Turf: 7, + Dirt: 4, + Unique: 110401, + Skill1: 200232, + Skill2: 201092, + Skill3: 201692, + SkillPL2: 201542, + SkillPL3: 201091, + SkillPL4: 201392, + SkillPL5: 201691, + }, + SakuraBakushinOBlossominLearning: { + ID: 104101, + CharacterID: 1041, + Name: "[Blossom in Learning] Sakura Bakushin O", + Variant: "[Blossom in Learning]", + Sprint: 7, + Mile: 6, + Medium: 1, + Long: 1, + Front: 7, + Pace: 7, + Late: 2, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100411, + Skill1: 200841, + Skill2: 201312, + Skill3: 200652, + SkillPL2: 200982, + SkillPL3: 200651, + SkillPL4: 200992, + SkillPL5: 200981, + }, + SuperCreekMurmuringStream: { + ID: 104501, + CharacterID: 1045, + Name: "[Murmuring Stream] Super Creek", + Variant: "[Murmuring Stream]", + Sprint: 1, + Mile: 1, + Medium: 7, + Long: 7, + Front: 4, + Pace: 7, + Late: 6, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100451, + Skill1: 200352, + Skill2: 200742, + Skill3: 201372, + SkillPL2: 200462, + SkillPL3: 201371, + SkillPL4: 200881, + SkillPL5: 200351, + }, + SuperCreekChiffonWrappedMummy: { + ID: 104502, + CharacterID: 1045, + Name: "[Chiffon-Wrapped Mummy] Super Creek", + Variant: "[Chiffon-Wrapped Mummy]", + Sprint: 1, + Mile: 1, + Medium: 7, + Long: 7, + Front: 4, + Pace: 7, + Late: 6, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 110451, + Skill1: 200332, + Skill2: 201162, + Skill3: 201352, + SkillPL2: 201322, + SkillPL3: 200331, + SkillPL4: 201102, + SkillPL5: 201161, + }, + SmartFalconLOVE4EVER: { + ID: 104601, + CharacterID: 1046, + Name: "[LOVE☆4EVER] Smart Falcon", + Variant: "[LOVE☆4EVER]", + Sprint: 6, + Mile: 7, + Medium: 7, + Long: 3, + Front: 7, + Pace: 4, + Late: 1, + End: 1, + Turf: 3, + Dirt: 7, + Unique: 100461, + Skill1: 200452, + Skill2: 201522, + Skill3: 201672, + SkillPL2: 200162, + SkillPL3: 200451, + SkillPL4: 200952, + SkillPL5: 201671, + }, + TosenJordanJokesterVibes: { + ID: 104801, + CharacterID: 1048, + Name: "[Jokester ☆ Vibes] Tosen Jordan", + Variant: "[Jokester ☆ Vibes]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 6, + Front: 5, + Pace: 7, + Late: 6, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100481, + Skill1: 200302, + Skill2: 200602, + Skill3: 201102, + SkillPL2: 200572, + SkillPL3: 200601, + SkillPL4: 201702, + SkillPL5: 200571, + }, + NaritaTaishinNevertheless: { + ID: 105001, + CharacterID: 1050, + Name: "[Nevertheless] Narita Taishin", + Variant: "[Nevertheless]", + Sprint: 2, + Mile: 4, + Medium: 7, + Long: 7, + Front: 1, + Pace: 2, + Late: 6, + End: 7, + Turf: 7, + Dirt: 1, + Unique: 100501, + Skill1: 201641, + Skill2: 200622, + Skill3: 201162, + SkillPL2: 200642, + SkillPL3: 200621, + SkillPL4: 201452, + SkillPL5: 200641, + }, + HaruUraraBestestPrize: { + ID: 105201, + CharacterID: 1052, + Name: "[Bestest Prize ♪] Haru Urara", + Variant: "[Bestest Prize ♪]", + Sprint: 7, + Mile: 6, + Medium: 1, + Long: 1, + Front: 1, + Pace: 1, + Late: 7, + End: 6, + Turf: 1, + Dirt: 7, + Unique: 100521, + Skill1: 200442, + Skill2: 200652, + Skill3: 201412, + SkillPL2: 200472, + SkillPL3: 200441, + SkillPL4: 200302, + SkillPL5: 200471, + }, + HaruUraraNewYearNewUrara: { + ID: 105202, + CharacterID: 1052, + Name: "[New Year ♪ New Urara!] Haru Urara", + Variant: "[New Year ♪ New Urara!]", + Sprint: 7, + Mile: 7, + Medium: 1, + Long: 1, + Front: 1, + Pace: 1, + Late: 7, + End: 6, + Turf: 1, + Dirt: 7, + Unique: 110521, + Skill1: 200452, + Skill2: 201072, + Skill3: 201402, + SkillPL2: 201621, + SkillPL3: 200451, + SkillPL4: 200242, + SkillPL5: 201401, + }, + MatikanefukukitaruRisingFortune: { + ID: 105601, + CharacterID: 1056, + Name: "[Rising☆Fortune] Matikanefukukitaru", + Variant: "[Rising☆Fortune]", + Sprint: 2, + Mile: 5, + Medium: 7, + Long: 7, + Front: 1, + Pace: 6, + Late: 7, + End: 2, + Turf: 7, + Dirt: 2, + Unique: 100561, + Skill1: 201562, + Skill2: 201422, + Skill3: 201232, + SkillPL2: 201571, + SkillPL3: 201231, + SkillPL4: 200781, + SkillPL5: 201561, + }, + MatikanefukukitaruLuckyTidings: { + ID: 105602, + CharacterID: 1056, + Name: "[Lucky Tidings] Matikanefukukitaru", + Variant: "[Lucky Tidings]", + Sprint: 2, + Mile: 5, + Medium: 7, + Long: 7, + Front: 1, + Pace: 6, + Late: 7, + End: 2, + Turf: 7, + Dirt: 2, + Unique: 110561, + Skill1: 200012, + Skill2: 200602, + Skill3: 201212, + SkillPL2: 200752, + SkillPL3: 201211, + SkillPL4: 200062, + SkillPL5: 200751, + }, + MeishoDotoTurbulentBlue: { + ID: 105801, + CharacterID: 1058, + Name: "[Turbulent Blue] Meisho Doto", + Variant: "[Turbulent Blue]", + Sprint: 1, + Mile: 2, + Medium: 7, + Long: 7, + Front: 2, + Pace: 7, + Late: 6, + End: 3, + Turf: 7, + Dirt: 3, + Unique: 100581, + Skill1: 200472, + Skill2: 201112, + Skill3: 200582, + SkillPL2: 200142, + SkillPL3: 200581, + SkillPL4: 200861, + SkillPL5: 200471, + }, + MejiroDoberOfftheLine: { + ID: 105901, + CharacterID: 1059, + Name: "[Off the Line] Mejiro Dober", + Variant: "[Off the Line]", + Sprint: 3, + Mile: 7, + Medium: 7, + Long: 2, + Front: 5, + Pace: 6, + Late: 7, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100591, + Skill1: 200062, + Skill2: 201442, + Skill3: 201142, + SkillPL2: 201382, + SkillPL3: 201441, + SkillPL4: 200722, + SkillPL5: 200064, + }, + NiceNaturePoinsettiaRibbon: { + ID: 106001, + CharacterID: 1060, + Name: "[Poinsettia Ribbon] Nice Nature", + Variant: "[Poinsettia Ribbon]", + Sprint: 1, + Mile: 5, + Medium: 7, + Long: 7, + Front: 2, + Pace: 6, + Late: 7, + End: 4, + Turf: 7, + Dirt: 1, + Unique: 100601, + Skill1: 200122, + Skill2: 201162, + Skill3: 201442, + SkillPL2: 200911, + SkillPL3: 201161, + SkillPL4: 201422, + SkillPL5: 201441, + }, + KingHaloKingofEmeralds: { + ID: 106101, + CharacterID: 1061, + Name: "[King of Emeralds] King Halo", + Variant: "[King of Emeralds]", + Sprint: 7, + Mile: 6, + Medium: 6, + Long: 5, + Front: 1, + Pace: 6, + Late: 7, + End: 4, + Turf: 7, + Dirt: 1, + Unique: 100611, + Skill1: 200262, + Skill2: 200672, + Skill3: 201432, + SkillPL2: 201142, + SkillPL3: 200671, + SkillPL4: 201072, + SkillPL5: 201431, + }, + SakuraChiyonoOStrengthinFullBloom: { + ID: 106901, + CharacterID: 1069, + Name: "[Strength in Full Bloom] Sakura Chiyono O", + Variant: "[Strength in Full Bloom]", + Sprint: 3, + Mile: 7, + Medium: 7, + Long: 3, + Front: 6, + Pace: 7, + Late: 2, + End: 1, + Turf: 7, + Dirt: 1, + Unique: 100691, + Skill1: 200172, + Skill2: 200582, + Skill3: 201112, + SkillPL2: 200342, + SkillPL3: 200581, + SkillPL4: 201532, + SkillPL5: 200174, + }, + MejiroArdanCrystalline: { + ID: 107101, + CharacterID: 1071, + Name: "[Crystalline] Mejiro Ardan", + Variant: "[Crystalline]", + Sprint: 3, + Mile: 6, + Medium: 7, + Long: 4, + Front: 5, + Pace: 7, + Late: 4, + End: 1, + Turf: 7, + Dirt: 2, + Unique: 100711, + Skill1: 200022, + Skill2: 200572, + Skill3: 201702, + SkillPL2: 201322, + SkillPL3: 200571, + SkillPL4: 201142, + SkillPL5: 201701, + }, +} diff --git a/horse/global/uma.kk b/horse/global/uma.kk new file mode 100644 index 0000000..97b542a --- /dev/null +++ b/horse/global/uma.kk @@ -0,0 +1,1550 @@ +module horse/global/uma + +// Automatically generated with horsegen; DO NOT EDIT + +import std/core/delayed +import std/core/vector +import std/core-extras +import horse/game-id +import horse/movement +pub import horse/uma + +extern create-id-table(): vector + c inline "int32_t arr[] = {100101,100102,100201,100301,100302,100401,100402,100501,100601,100602,100701,100801,100901,101001,101101,101102,101201,101301,101302,101401,101402,101501,101502,101601,101701,101702,101801,101802,101901,102001,102101,102201,102301,102302,102401,102402,102501,102601,102602,102701,102801,103001,103002,103201,103501,103701,103702,103801,103901,104001,104002,104101,104501,104502,104601,104801,105001,105201,105202,105601,105602,105801,105901,106001,106101,106901,107101,};\nkk_vector_from_cint32array(arr, (kk_ssize_t)67, kk_context())" + js inline "[100101,100102,100201,100301,100302,100401,100402,100501,100601,100602,100701,100801,100901,101001,101101,101102,101201,101301,101302,101401,101402,101501,101502,101601,101701,101702,101801,101802,101901,102001,102101,102201,102301,102302,102401,102402,102501,102601,102602,102701,102801,103001,103002,103201,103501,103701,103702,103801,103901,104001,104002,104101,104501,104502,104601,104801,105001,105201,105202,105601,105602,105801,105901,106001,106101,106901,107101,]" +// Vector of all Uma IDs in order for easy iterating. +val vall = once(create-id-table) + +// Get the name for an Uma. +// The name includes the costume variant, e.g. `[Special Dreamer] Special Week`. +// If no Uma matches the ID, the result contains the numeric ID. +pub fun show(uma: uma-id): string + match uma.game-id + 100101 -> "[Special Dreamer] Special Week" + 100102 -> "[Hopp'n♪Happy Heart] Special Week" + 100201 -> "[Innocent Silence] Silence Suzuka" + 100301 -> "[Peak Joy] Tokai Teio" + 100302 -> "[Beyond the Horizon] Tokai Teio" + 100401 -> "[Formula R] Maruzensky" + 100402 -> "[Hot☆Summer Night] Maruzensky" + 100501 -> "[Shooting Star Revue] Fuji Kiseki" + 100601 -> "[Starlight Beat] Oguri Cap" + 100602 -> "[Ashen Miracle] Oguri Cap" + 100701 -> "[Red Strife] Gold Ship" + 100801 -> "[Wild Top Gear] Vodka" + 100901 -> "[Peak Blue] Daiwa Scarlet" + 101001 -> "[Wild Frontier] Taiki Shuttle" + 101101 -> "[Stone-Piercing Blue] Grass Wonder" + 101102 -> "[Saintly Jade Cleric] Grass Wonder" + 101201 -> "[Azure Amazon] Hishi Amazon" + 101301 -> "[Frontline Elegance] Mejiro McQueen" + 101302 -> "[End of the Skies] Mejiro McQueen" + 101401 -> "[El☆Número 1] El Condor Pasa" + 101402 -> "[Kukulkan Warrior] El Condor Pasa" + 101501 -> "[O Sole Suo!] T.M. Opera O" + 101502 -> "[New Year, Same Radiance!] T.M. Opera O" + 101601 -> "[Maverick] Narita Brian" + 101701 -> "[Emperor's Path] Symboli Rudolf" + 101702 -> "[Archer by Moonlight] Symboli Rudolf" + 101801 -> "[Empress Road] Air Groove" + 101802 -> "[Quercus Civilis] Air Groove" + 101901 -> "[Full-Color Fangirling] Agnes Digital" + 102001 -> "[Reeling in the Big One] Seiun Sky" + 102101 -> "[Fast as Lightning] Tamamo Cross" + 102201 -> "[Noble Seamair] Fine Motion" + 102301 -> "[pf. Winning Equation...] Biwa Hayahide" + 102302 -> "[Rouge Caroler] Biwa Hayahide" + 102401 -> "[Scramble☆Zone] Mayano Top Gun" + 102402 -> "[Sunlight Bouquet] Mayano Top Gun" + 102501 -> "[Creeping Shadow] Manhattan Cafe" + 102601 -> "[MB-19890425] Mihono Bourbon" + 102602 -> "[CODE: ICING] Mihono Bourbon" + 102701 -> "[Down the Line] Mejiro Ryan" + 102801 -> "[Buono ☆ Alla Moda] Hishi Akebono" + 103001 -> "[Rosy Dreams] Rice Shower" + 103002 -> "[Vampire Makeover!] Rice Shower" + 103201 -> "[Tach-nology] Agnes Tachyon" + 103501 -> "[Get to Winning!] Winning Ticket" + 103701 -> "[Meisterschaft] Eishin Flash" + 103702 -> "[Precise Chocolatier] Eishin Flash" + 103801 -> "[Fille Éclair] Curren Chan" + 103901 -> "[Princess of Pink] Kawakami Princess" + 104001 -> "[Authentic / 1928] Gold City" + 104002 -> "[Autumn Cosmos] Gold City" + 104101 -> "[Blossom in Learning] Sakura Bakushin O" + 104501 -> "[Murmuring Stream] Super Creek" + 104502 -> "[Chiffon-Wrapped Mummy] Super Creek" + 104601 -> "[LOVE☆4EVER] Smart Falcon" + 104801 -> "[Jokester ☆ Vibes] Tosen Jordan" + 105001 -> "[Nevertheless] Narita Taishin" + 105201 -> "[Bestest Prize ♪] Haru Urara" + 105202 -> "[New Year ♪ New Urara!] Haru Urara" + 105601 -> "[Rising☆Fortune] Matikanefukukitaru" + 105602 -> "[Lucky Tidings] Matikanefukukitaru" + 105801 -> "[Turbulent Blue] Meisho Doto" + 105901 -> "[Off the Line] Mejiro Dober" + 106001 -> "[Poinsettia Ribbon] Nice Nature" + 106101 -> "[King of Emeralds] King Halo" + 106901 -> "[Strength in Full Bloom] Sakura Chiyono O" + 107101 -> "[Crystalline] Mejiro Ardan" + x -> "uma " ++ x.show + +// Get the costume variant for an Uma, e.g. `[Special Dreamer]`. +// If no Uma matches the ID, the result contains the numeric ID. +pub fun variant(uma: uma-id): string + match uma.game-id + 100101 -> "[Special Dreamer]" + 100102 -> "[Hopp'n♪Happy Heart]" + 100201 -> "[Innocent Silence]" + 100301 -> "[Peak Joy]" + 100302 -> "[Beyond the Horizon]" + 100401 -> "[Formula R]" + 100402 -> "[Hot☆Summer Night]" + 100501 -> "[Shooting Star Revue]" + 100601 -> "[Starlight Beat]" + 100602 -> "[Ashen Miracle]" + 100701 -> "[Red Strife]" + 100801 -> "[Wild Top Gear]" + 100901 -> "[Peak Blue]" + 101001 -> "[Wild Frontier]" + 101101 -> "[Stone-Piercing Blue]" + 101102 -> "[Saintly Jade Cleric ]" + 101201 -> "[Azure Amazon]" + 101301 -> "[Frontline Elegance]" + 101302 -> "[End of the Skies]" + 101401 -> "[El☆Número 1]" + 101402 -> "[Kukulkan Warrior]" + 101501 -> "[O Sole Suo!]" + 101502 -> "[New Year, Same Radiance!]" + 101601 -> "[Maverick]" + 101701 -> "[Emperor's Path]" + 101702 -> "[Archer by Moonlight]" + 101801 -> "[Empress Road]" + 101802 -> "[Quercus Civilis]" + 101901 -> "[Full-Color Fangirling]" + 102001 -> "[Reeling in the Big One]" + 102101 -> "[Fast as Lightning]" + 102201 -> "[Noble Seamair]" + 102301 -> "[pf. Winning Equation...]" + 102302 -> "[Rouge Caroler]" + 102401 -> "[Scramble☆Zone]" + 102402 -> "[Sunlight Bouquet]" + 102501 -> "[Creeping Shadow]" + 102601 -> "[MB-19890425]" + 102602 -> "[CODE: ICING]" + 102701 -> "[Down the Line]" + 102801 -> "[Buono ☆ Alla Moda]" + 103001 -> "[Rosy Dreams]" + 103002 -> "[Vampire Makeover!]" + 103201 -> "[tach-nology]" + 103501 -> "[Get to Winning!]" + 103701 -> "[Meisterschaft]" + 103702 -> "[Precise Chocolatier]" + 103801 -> "[Fille Éclair]" + 103901 -> "[Princess of Pink]" + 104001 -> "[Authentic / 1928]" + 104002 -> "[Autumn Cosmos]" + 104101 -> "[Blossom in Learning]" + 104501 -> "[Murmuring Stream]" + 104502 -> "[Chiffon-Wrapped Mummy]" + 104601 -> "[LOVE☆4EVER]" + 104801 -> "[Jokester ☆ Vibes]" + 105001 -> "[Nevertheless]" + 105201 -> "[Bestest Prize ♪]" + 105202 -> "[New Year ♪ New Urara!]" + 105601 -> "[Rising☆Fortune]" + 105602 -> "[Lucky Tidings]" + 105801 -> "[Turbulent Blue]" + 105901 -> "[Off the Line]" + 106001 -> "[Poinsettia Ribbon]" + 106101 -> "[King of Emeralds]" + 106901 -> "[Strength in Full Bloom]" + 107101 -> "[Crystalline]" + x -> "uma " ++ x.show + +// Get the character ID for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun character-id(uma: uma-id): character-id + match uma.game-id + 100101 -> Character-id(1001) + 100102 -> Character-id(1001) + 100201 -> Character-id(1002) + 100301 -> Character-id(1003) + 100302 -> Character-id(1003) + 100401 -> Character-id(1004) + 100402 -> Character-id(1004) + 100501 -> Character-id(1005) + 100601 -> Character-id(1006) + 100602 -> Character-id(1006) + 100701 -> Character-id(1007) + 100801 -> Character-id(1008) + 100901 -> Character-id(1009) + 101001 -> Character-id(1010) + 101101 -> Character-id(1011) + 101102 -> Character-id(1011) + 101201 -> Character-id(1012) + 101301 -> Character-id(1013) + 101302 -> Character-id(1013) + 101401 -> Character-id(1014) + 101402 -> Character-id(1014) + 101501 -> Character-id(1015) + 101502 -> Character-id(1015) + 101601 -> Character-id(1016) + 101701 -> Character-id(1017) + 101702 -> Character-id(1017) + 101801 -> Character-id(1018) + 101802 -> Character-id(1018) + 101901 -> Character-id(1019) + 102001 -> Character-id(1020) + 102101 -> Character-id(1021) + 102201 -> Character-id(1022) + 102301 -> Character-id(1023) + 102302 -> Character-id(1023) + 102401 -> Character-id(1024) + 102402 -> Character-id(1024) + 102501 -> Character-id(1025) + 102601 -> Character-id(1026) + 102602 -> Character-id(1026) + 102701 -> Character-id(1027) + 102801 -> Character-id(1028) + 103001 -> Character-id(1030) + 103002 -> Character-id(1030) + 103201 -> Character-id(1032) + 103501 -> Character-id(1035) + 103701 -> Character-id(1037) + 103702 -> Character-id(1037) + 103801 -> Character-id(1038) + 103901 -> Character-id(1039) + 104001 -> Character-id(1040) + 104002 -> Character-id(1040) + 104101 -> Character-id(1041) + 104501 -> Character-id(1045) + 104502 -> Character-id(1045) + 104601 -> Character-id(1046) + 104801 -> Character-id(1048) + 105001 -> Character-id(1050) + 105201 -> Character-id(1052) + 105202 -> Character-id(1052) + 105601 -> Character-id(1056) + 105602 -> Character-id(1056) + 105801 -> Character-id(1058) + 105901 -> Character-id(1059) + 106001 -> Character-id(1060) + 106101 -> Character-id(1061) + 106901 -> Character-id(1069) + 107101 -> Character-id(1071) + _ -> Character-id(0) + +// Get the sprint aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun sprint(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> F + 100102 -> F + 100201 -> D + 100301 -> F + 100302 -> F + 100401 -> B + 100402 -> B + 100501 -> B + 100601 -> E + 100602 -> E + 100701 -> G + 100801 -> F + 100901 -> F + 101001 -> A + 101101 -> G + 101102 -> G + 101201 -> D + 101301 -> G + 101302 -> G + 101401 -> F + 101402 -> F + 101501 -> G + 101502 -> G + 101601 -> F + 101701 -> E + 101702 -> E + 101801 -> C + 101802 -> C + 101901 -> F + 102001 -> G + 102101 -> G + 102201 -> F + 102301 -> F + 102302 -> F + 102401 -> D + 102402 -> D + 102501 -> G + 102601 -> C + 102602 -> C + 102701 -> E + 102801 -> A + 103001 -> E + 103002 -> E + 103201 -> G + 103501 -> G + 103701 -> G + 103702 -> G + 103801 -> A + 103901 -> D + 104001 -> F + 104002 -> F + 104101 -> A + 104501 -> G + 104502 -> G + 104601 -> B + 104801 -> G + 105001 -> F + 105201 -> A + 105202 -> A + 105601 -> F + 105602 -> F + 105801 -> G + 105901 -> E + 106001 -> G + 106101 -> A + 106901 -> E + 107101 -> E + _ -> G + +// Get the mile aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun mile(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> C + 100102 -> C + 100201 -> A + 100301 -> E + 100302 -> E + 100401 -> A + 100402 -> A + 100501 -> A + 100601 -> A + 100602 -> A + 100701 -> C + 100801 -> A + 100901 -> A + 101001 -> A + 101101 -> A + 101102 -> A + 101201 -> A + 101301 -> F + 101302 -> F + 101401 -> A + 101402 -> A + 101501 -> E + 101502 -> E + 101601 -> B + 101701 -> C + 101702 -> C + 101801 -> B + 101802 -> B + 101901 -> A + 102001 -> C + 102101 -> E + 102201 -> A + 102301 -> C + 102302 -> C + 102401 -> D + 102402 -> D + 102501 -> F + 102601 -> B + 102602 -> B + 102701 -> C + 102801 -> B + 103001 -> C + 103002 -> C + 103201 -> D + 103501 -> F + 103701 -> F + 103702 -> F + 103801 -> D + 103901 -> B + 104001 -> A + 104002 -> A + 104101 -> B + 104501 -> G + 104502 -> G + 104601 -> A + 104801 -> F + 105001 -> D + 105201 -> B + 105202 -> A + 105601 -> C + 105602 -> C + 105801 -> F + 105901 -> A + 106001 -> C + 106101 -> B + 106901 -> A + 107101 -> B + _ -> G + +// Get the medium aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun medium(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> A + 100102 -> A + 100201 -> A + 100301 -> A + 100302 -> A + 100401 -> B + 100402 -> B + 100501 -> B + 100601 -> A + 100602 -> A + 100701 -> A + 100801 -> A + 100901 -> A + 101001 -> E + 101101 -> B + 101102 -> B + 101201 -> A + 101301 -> A + 101302 -> A + 101401 -> A + 101402 -> A + 101501 -> A + 101502 -> A + 101601 -> A + 101701 -> A + 101702 -> A + 101801 -> A + 101802 -> A + 101901 -> A + 102001 -> A + 102101 -> A + 102201 -> A + 102301 -> A + 102302 -> A + 102401 -> A + 102402 -> A + 102501 -> B + 102601 -> A + 102602 -> A + 102701 -> A + 102801 -> F + 103001 -> A + 103002 -> A + 103201 -> A + 103501 -> A + 103701 -> A + 103702 -> A + 103801 -> G + 103901 -> A + 104001 -> B + 104002 -> B + 104101 -> G + 104501 -> A + 104502 -> A + 104601 -> A + 104801 -> A + 105001 -> A + 105201 -> G + 105202 -> G + 105601 -> A + 105602 -> A + 105801 -> A + 105901 -> A + 106001 -> A + 106101 -> B + 106901 -> A + 107101 -> A + _ -> G + +// Get the long aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun long(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> A + 100102 -> A + 100201 -> E + 100301 -> B + 100302 -> B + 100401 -> C + 100402 -> C + 100501 -> E + 100601 -> B + 100602 -> B + 100701 -> A + 100801 -> F + 100901 -> B + 101001 -> G + 101101 -> A + 101102 -> A + 101201 -> B + 101301 -> A + 101302 -> A + 101401 -> B + 101402 -> B + 101501 -> A + 101502 -> A + 101601 -> A + 101701 -> A + 101702 -> A + 101801 -> E + 101802 -> E + 101901 -> G + 102001 -> A + 102101 -> A + 102201 -> C + 102301 -> A + 102302 -> A + 102401 -> A + 102402 -> A + 102501 -> A + 102601 -> B + 102602 -> B + 102701 -> B + 102801 -> G + 103001 -> A + 103002 -> A + 103201 -> B + 103501 -> B + 103701 -> A + 103702 -> A + 103801 -> G + 103901 -> F + 104001 -> B + 104002 -> B + 104101 -> G + 104501 -> A + 104502 -> A + 104601 -> E + 104801 -> B + 105001 -> A + 105201 -> G + 105202 -> G + 105601 -> A + 105602 -> A + 105801 -> A + 105901 -> F + 106001 -> A + 106101 -> C + 106901 -> E + 107101 -> D + _ -> G + +// Get the front runner aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun front-runner(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> G + 100102 -> G + 100201 -> A + 100301 -> D + 100302 -> D + 100401 -> A + 100402 -> A + 100501 -> C + 100601 -> F + 100602 -> F + 100701 -> G + 100801 -> C + 100901 -> A + 101001 -> C + 101101 -> F + 101102 -> F + 101201 -> G + 101301 -> B + 101302 -> B + 101401 -> E + 101402 -> E + 101501 -> C + 101502 -> C + 101601 -> G + 101701 -> B + 101702 -> B + 101801 -> D + 101802 -> D + 101901 -> G + 102001 -> A + 102101 -> G + 102201 -> D + 102301 -> E + 102302 -> E + 102401 -> A + 102402 -> A + 102501 -> G + 102601 -> A + 102602 -> A + 102701 -> F + 102801 -> B + 103001 -> B + 103002 -> B + 103201 -> E + 103501 -> G + 103701 -> G + 103702 -> G + 103801 -> B + 103901 -> G + 104001 -> F + 104002 -> F + 104101 -> A + 104501 -> D + 104502 -> D + 104601 -> A + 104801 -> C + 105001 -> G + 105201 -> G + 105202 -> G + 105601 -> G + 105602 -> G + 105801 -> F + 105901 -> C + 106001 -> F + 106101 -> G + 106901 -> B + 107101 -> C + _ -> G + +// Get the pace chaser aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun pace-chaser(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> A + 100102 -> A + 100201 -> C + 100301 -> A + 100302 -> A + 100401 -> E + 100402 -> E + 100501 -> A + 100601 -> A + 100602 -> A + 100701 -> B + 100801 -> B + 100901 -> A + 101001 -> A + 101101 -> A + 101102 -> A + 101201 -> B + 101301 -> A + 101302 -> A + 101401 -> A + 101402 -> A + 101501 -> A + 101502 -> A + 101601 -> A + 101701 -> A + 101702 -> A + 101801 -> A + 101802 -> A + 101901 -> A + 102001 -> B + 102101 -> A + 102201 -> A + 102301 -> A + 102302 -> A + 102401 -> A + 102402 -> A + 102501 -> C + 102601 -> E + 102602 -> E + 102701 -> A + 102801 -> A + 103001 -> A + 103002 -> A + 103201 -> A + 103501 -> B + 103701 -> B + 103702 -> B + 103801 -> A + 103901 -> C + 104001 -> A + 104002 -> A + 104101 -> A + 104501 -> A + 104502 -> A + 104601 -> D + 104801 -> A + 105001 -> F + 105201 -> G + 105202 -> G + 105601 -> B + 105602 -> B + 105801 -> A + 105901 -> B + 106001 -> B + 106101 -> B + 106901 -> A + 107101 -> A + _ -> G + +// Get the late surger aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun late-surger(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> A + 100102 -> A + 100201 -> E + 100301 -> C + 100302 -> C + 100401 -> G + 100402 -> G + 100501 -> C + 100601 -> A + 100602 -> A + 100701 -> B + 100801 -> A + 100901 -> E + 101001 -> E + 101101 -> A + 101102 -> A + 101201 -> C + 101301 -> D + 101302 -> D + 101401 -> A + 101402 -> A + 101501 -> A + 101502 -> A + 101601 -> A + 101701 -> A + 101702 -> A + 101801 -> A + 101802 -> A + 101901 -> A + 102001 -> D + 102101 -> A + 102201 -> E + 102301 -> B + 102302 -> B + 102401 -> B + 102402 -> B + 102501 -> A + 102601 -> G + 102602 -> G + 102701 -> A + 102801 -> C + 103001 -> C + 103002 -> C + 103201 -> B + 103501 -> A + 103701 -> A + 103702 -> A + 103801 -> E + 103901 -> A + 104001 -> A + 104002 -> A + 104101 -> F + 104501 -> B + 104502 -> B + 104601 -> G + 104801 -> B + 105001 -> B + 105201 -> A + 105202 -> A + 105601 -> A + 105602 -> A + 105801 -> B + 105901 -> A + 106001 -> A + 106101 -> A + 106901 -> F + 107101 -> D + _ -> G + +// Get the end closer aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun end-closer(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> C + 100102 -> C + 100201 -> G + 100301 -> E + 100302 -> E + 100401 -> G + 100402 -> G + 100501 -> G + 100601 -> D + 100602 -> D + 100701 -> A + 100801 -> F + 100901 -> G + 101001 -> G + 101101 -> F + 101102 -> F + 101201 -> A + 101301 -> F + 101302 -> F + 101401 -> C + 101402 -> C + 101501 -> G + 101502 -> G + 101601 -> D + 101701 -> C + 101702 -> C + 101801 -> G + 101802 -> G + 101901 -> B + 102001 -> E + 102101 -> A + 102201 -> C + 102301 -> E + 102302 -> E + 102401 -> B + 102402 -> B + 102501 -> C + 102601 -> G + 102602 -> G + 102701 -> F + 102801 -> G + 103001 -> G + 103002 -> G + 103201 -> F + 103501 -> G + 103701 -> C + 103702 -> C + 103801 -> G + 103901 -> D + 104001 -> F + 104002 -> F + 104101 -> G + 104501 -> G + 104502 -> G + 104601 -> G + 104801 -> G + 105001 -> A + 105201 -> B + 105202 -> B + 105601 -> F + 105602 -> F + 105801 -> E + 105901 -> G + 106001 -> D + 106101 -> D + 106901 -> G + 107101 -> G + _ -> G + +// Get the turf aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun turf(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> A + 100102 -> A + 100201 -> A + 100301 -> A + 100302 -> A + 100401 -> A + 100402 -> A + 100501 -> A + 100601 -> A + 100602 -> A + 100701 -> A + 100801 -> A + 100901 -> A + 101001 -> A + 101101 -> A + 101102 -> A + 101201 -> A + 101301 -> A + 101302 -> A + 101401 -> A + 101402 -> A + 101501 -> A + 101502 -> A + 101601 -> A + 101701 -> A + 101702 -> A + 101801 -> A + 101802 -> A + 101901 -> A + 102001 -> A + 102101 -> A + 102201 -> A + 102301 -> A + 102302 -> A + 102401 -> A + 102402 -> A + 102501 -> A + 102601 -> A + 102602 -> A + 102701 -> A + 102801 -> A + 103001 -> A + 103002 -> A + 103201 -> A + 103501 -> A + 103701 -> A + 103702 -> A + 103801 -> A + 103901 -> A + 104001 -> A + 104002 -> A + 104101 -> A + 104501 -> A + 104502 -> A + 104601 -> E + 104801 -> A + 105001 -> A + 105201 -> G + 105202 -> G + 105601 -> A + 105602 -> A + 105801 -> A + 105901 -> A + 106001 -> A + 106101 -> A + 106901 -> A + 107101 -> A + _ -> G + +// Get the dirt aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun dirt(uma: uma-id): aptitude-level + match uma.game-id + 100101 -> G + 100102 -> G + 100201 -> G + 100301 -> G + 100302 -> G + 100401 -> D + 100402 -> D + 100501 -> F + 100601 -> B + 100602 -> B + 100701 -> G + 100801 -> G + 100901 -> G + 101001 -> B + 101101 -> G + 101102 -> G + 101201 -> E + 101301 -> E + 101302 -> E + 101401 -> B + 101402 -> B + 101501 -> E + 101502 -> E + 101601 -> G + 101701 -> G + 101702 -> G + 101801 -> G + 101802 -> G + 101901 -> A + 102001 -> G + 102101 -> F + 102201 -> G + 102301 -> F + 102302 -> F + 102401 -> E + 102402 -> E + 102501 -> G + 102601 -> G + 102602 -> G + 102701 -> G + 102801 -> F + 103001 -> G + 103002 -> G + 103201 -> G + 103501 -> G + 103701 -> G + 103702 -> G + 103801 -> F + 103901 -> G + 104001 -> D + 104002 -> D + 104101 -> G + 104501 -> G + 104502 -> G + 104601 -> A + 104801 -> G + 105001 -> G + 105201 -> A + 105202 -> A + 105601 -> F + 105602 -> F + 105801 -> E + 105901 -> G + 106001 -> G + 106101 -> G + 106901 -> G + 107101 -> F + _ -> G + +// Get the unique skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun unique(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(100011) + 100102 -> Skill-id(110011) + 100201 -> Skill-id(100021) + 100301 -> Skill-id(100031) + 100302 -> Skill-id(110031) + 100401 -> Skill-id(100041) + 100402 -> Skill-id(110041) + 100501 -> Skill-id(100051) + 100601 -> Skill-id(100061) + 100602 -> Skill-id(110061) + 100701 -> Skill-id(100071) + 100801 -> Skill-id(100081) + 100901 -> Skill-id(100091) + 101001 -> Skill-id(100101) + 101101 -> Skill-id(100111) + 101102 -> Skill-id(110111) + 101201 -> Skill-id(100121) + 101301 -> Skill-id(100131) + 101302 -> Skill-id(110131) + 101401 -> Skill-id(100141) + 101402 -> Skill-id(110141) + 101501 -> Skill-id(100151) + 101502 -> Skill-id(110151) + 101601 -> Skill-id(100161) + 101701 -> Skill-id(100171) + 101702 -> Skill-id(110171) + 101801 -> Skill-id(100181) + 101802 -> Skill-id(110181) + 101901 -> Skill-id(100191) + 102001 -> Skill-id(100201) + 102101 -> Skill-id(100211) + 102201 -> Skill-id(100221) + 102301 -> Skill-id(100231) + 102302 -> Skill-id(110231) + 102401 -> Skill-id(100241) + 102402 -> Skill-id(110241) + 102501 -> Skill-id(100251) + 102601 -> Skill-id(100261) + 102602 -> Skill-id(110261) + 102701 -> Skill-id(100271) + 102801 -> Skill-id(100281) + 103001 -> Skill-id(100301) + 103002 -> Skill-id(110301) + 103201 -> Skill-id(100321) + 103501 -> Skill-id(100351) + 103701 -> Skill-id(100371) + 103702 -> Skill-id(110371) + 103801 -> Skill-id(100381) + 103901 -> Skill-id(100391) + 104001 -> Skill-id(100401) + 104002 -> Skill-id(110401) + 104101 -> Skill-id(100411) + 104501 -> Skill-id(100451) + 104502 -> Skill-id(110451) + 104601 -> Skill-id(100461) + 104801 -> Skill-id(100481) + 105001 -> Skill-id(100501) + 105201 -> Skill-id(100521) + 105202 -> Skill-id(110521) + 105601 -> Skill-id(100561) + 105602 -> Skill-id(110561) + 105801 -> Skill-id(100581) + 105901 -> Skill-id(100591) + 106001 -> Skill-id(100601) + 106101 -> Skill-id(100611) + 106901 -> Skill-id(100691) + 107101 -> Skill-id(100711) + _ -> Skill-id(0) + +// Get the first built-in skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill1(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(200512) + 100102 -> Skill-id(200462) + 100201 -> Skill-id(200432) + 100301 -> Skill-id(200452) + 100302 -> Skill-id(200452) + 100401 -> Skill-id(200362) + 100402 -> Skill-id(200352) + 100501 -> Skill-id(200771) + 100601 -> Skill-id(200342) + 100602 -> Skill-id(201621) + 100701 -> Skill-id(201591) + 100801 -> Skill-id(200382) + 100901 -> Skill-id(200282) + 101001 -> Skill-id(200362) + 101101 -> Skill-id(200871) + 101102 -> Skill-id(200472) + 101201 -> Skill-id(200502) + 101301 -> Skill-id(200172) + 101302 -> Skill-id(200362) + 101401 -> Skill-id(200362) + 101402 -> Skill-id(200512) + 101501 -> Skill-id(200582) + 101502 -> Skill-id(201312) + 101601 -> Skill-id(200362) + 101701 -> Skill-id(200332) + 101702 -> Skill-id(200192) + 101801 -> Skill-id(200502) + 101802 -> Skill-id(200342) + 101901 -> Skill-id(201591) + 102001 -> Skill-id(200881) + 102101 -> Skill-id(201611) + 102201 -> Skill-id(200192) + 102301 -> Skill-id(200162) + 102302 -> Skill-id(200512) + 102401 -> Skill-id(200382) + 102402 -> Skill-id(200352) + 102501 -> Skill-id(200232) + 102601 -> Skill-id(200232) + 102602 -> Skill-id(200432) + 102701 -> Skill-id(200232) + 102801 -> Skill-id(200212) + 103001 -> Skill-id(200861) + 103002 -> Skill-id(200771) + 103201 -> Skill-id(200132) + 103501 -> Skill-id(200152) + 103701 -> Skill-id(200502) + 103702 -> Skill-id(200302) + 103801 -> Skill-id(200462) + 103901 -> Skill-id(200492) + 104001 -> Skill-id(200052) + 104002 -> Skill-id(200232) + 104101 -> Skill-id(200841) + 104501 -> Skill-id(200352) + 104502 -> Skill-id(200332) + 104601 -> Skill-id(200452) + 104801 -> Skill-id(200302) + 105001 -> Skill-id(201641) + 105201 -> Skill-id(200442) + 105202 -> Skill-id(200452) + 105601 -> Skill-id(201562) + 105602 -> Skill-id(200012) + 105801 -> Skill-id(200472) + 105901 -> Skill-id(200062) + 106001 -> Skill-id(200122) + 106101 -> Skill-id(200262) + 106901 -> Skill-id(200172) + 107101 -> Skill-id(200022) + _ -> Skill-id(0) + +// Get the second built-in skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill2(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(201352) + 100102 -> Skill-id(200592) + 100201 -> Skill-id(200552) + 100301 -> Skill-id(201132) + 100302 -> Skill-id(201142) + 100401 -> Skill-id(201052) + 100402 -> Skill-id(200682) + 100501 -> Skill-id(201072) + 100601 -> Skill-id(201062) + 100602 -> Skill-id(200752) + 100701 -> Skill-id(201212) + 100801 -> Skill-id(200702) + 100901 -> Skill-id(200722) + 101001 -> Skill-id(201052) + 101101 -> Skill-id(201152) + 101102 -> Skill-id(200742) + 101201 -> Skill-id(200632) + 101301 -> Skill-id(200562) + 101302 -> Skill-id(200562) + 101401 -> Skill-id(201122) + 101402 -> Skill-id(200702) + 101501 -> Skill-id(200722) + 101502 -> Skill-id(202012) + 101601 -> Skill-id(201102) + 101701 -> Skill-id(201152) + 101702 -> Skill-id(200752) + 101801 -> Skill-id(200722) + 101802 -> Skill-id(201072) + 101901 -> Skill-id(201682) + 102001 -> Skill-id(201192) + 102101 -> Skill-id(201132) + 102201 -> Skill-id(200582) + 102301 -> Skill-id(200742) + 102302 -> Skill-id(201202) + 102401 -> Skill-id(201272) + 102402 -> Skill-id(201332) + 102501 -> Skill-id(201222) + 102601 -> Skill-id(200532) + 102602 -> Skill-id(200542) + 102701 -> Skill-id(200722) + 102801 -> Skill-id(201352) + 103001 -> Skill-id(201342) + 103002 -> Skill-id(201172) + 103201 -> Skill-id(201152) + 103501 -> Skill-id(200732) + 103701 -> Skill-id(201542) + 103702 -> Skill-id(200592) + 103801 -> Skill-id(201372) + 103901 -> Skill-id(201072) + 104001 -> Skill-id(200692) + 104002 -> Skill-id(201092) + 104101 -> Skill-id(201312) + 104501 -> Skill-id(200742) + 104502 -> Skill-id(201162) + 104601 -> Skill-id(201522) + 104801 -> Skill-id(200602) + 105001 -> Skill-id(200622) + 105201 -> Skill-id(200652) + 105202 -> Skill-id(201072) + 105601 -> Skill-id(201422) + 105602 -> Skill-id(200602) + 105801 -> Skill-id(201112) + 105901 -> Skill-id(201442) + 106001 -> Skill-id(201162) + 106101 -> Skill-id(200672) + 106901 -> Skill-id(200582) + 107101 -> Skill-id(200572) + _ -> Skill-id(0) + +// Get the third built-in skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill3(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(200732) + 100102 -> Skill-id(201132) + 100201 -> Skill-id(200712) + 100301 -> Skill-id(201332) + 100302 -> Skill-id(200572) + 100401 -> Skill-id(200532) + 100402 -> Skill-id(201282) + 100501 -> Skill-id(200572) + 100601 -> Skill-id(201352) + 100602 -> Skill-id(201352) + 100701 -> Skill-id(201472) + 100801 -> Skill-id(200602) + 100901 -> Skill-id(200572) + 101001 -> Skill-id(201532) + 101101 -> Skill-id(200602) + 101102 -> Skill-id(201422) + 101201 -> Skill-id(200732) + 101301 -> Skill-id(201192) + 101302 -> Skill-id(200742) + 101401 -> Skill-id(201312) + 101402 -> Skill-id(200612) + 101501 -> Skill-id(200142) + 101502 -> Skill-id(200352) + 101601 -> Skill-id(200572) + 101701 -> Skill-id(200572) + 101702 -> Skill-id(200562) + 101801 -> Skill-id(201372) + 101802 -> Skill-id(201322) + 101901 -> Skill-id(201382) + 102001 -> Skill-id(200542) + 102101 -> Skill-id(200592) + 102201 -> Skill-id(201112) + 102301 -> Skill-id(200562) + 102302 -> Skill-id(200572) + 102401 -> Skill-id(200742) + 102402 -> Skill-id(201162) + 102501 -> Skill-id(201422) + 102601 -> Skill-id(200712) + 102602 -> Skill-id(200762) + 102701 -> Skill-id(200612) + 102801 -> Skill-id(201002) + 103001 -> Skill-id(200742) + 103002 -> Skill-id(200562) + 103201 -> Skill-id(200572) + 103501 -> Skill-id(201402) + 103701 -> Skill-id(201112) + 103702 -> Skill-id(201152) + 103801 -> Skill-id(201012) + 103901 -> Skill-id(200612) + 104001 -> Skill-id(200602) + 104002 -> Skill-id(201692) + 104101 -> Skill-id(200652) + 104501 -> Skill-id(201372) + 104502 -> Skill-id(201352) + 104601 -> Skill-id(201672) + 104801 -> Skill-id(201102) + 105001 -> Skill-id(201162) + 105201 -> Skill-id(201412) + 105202 -> Skill-id(201402) + 105601 -> Skill-id(201232) + 105602 -> Skill-id(201212) + 105801 -> Skill-id(200582) + 105901 -> Skill-id(201142) + 106001 -> Skill-id(201442) + 106101 -> Skill-id(201432) + 106901 -> Skill-id(201112) + 107101 -> Skill-id(201702) + _ -> Skill-id(0) + +// Get the potential level 2 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl2(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(200162) + 100102 -> Skill-id(200212) + 100201 -> Skill-id(200022) + 100301 -> Skill-id(200502) + 100302 -> Skill-id(200172) + 100401 -> Skill-id(201062) + 100402 -> Skill-id(201571) + 100501 -> Skill-id(201052) + 100601 -> Skill-id(200222) + 100602 -> Skill-id(201422) + 100701 -> Skill-id(201482) + 100801 -> Skill-id(200372) + 100901 -> Skill-id(200562) + 101001 -> Skill-id(200682) + 101101 -> Skill-id(200512) + 101102 -> Skill-id(200771) + 101201 -> Skill-id(201452) + 101301 -> Skill-id(201182) + 101302 -> Skill-id(200192) + 101401 -> Skill-id(200562) + 101402 -> Skill-id(201072) + 101501 -> Skill-id(200362) + 101502 -> Skill-id(200252) + 101601 -> Skill-id(200512) + 101701 -> Skill-id(200891) + 101702 -> Skill-id(201342) + 101801 -> Skill-id(200941) + 101802 -> Skill-id(201532) + 101901 -> Skill-id(200162) + 102001 -> Skill-id(201522) + 102101 -> Skill-id(200572) + 102201 -> Skill-id(201342) + 102301 -> Skill-id(200262) + 102302 -> Skill-id(201532) + 102401 -> Skill-id(200492) + 102402 -> Skill-id(200432) + 102501 -> Skill-id(201581) + 102601 -> Skill-id(201242) + 102602 -> Skill-id(201522) + 102701 -> Skill-id(200472) + 102801 -> Skill-id(201362) + 103001 -> Skill-id(201581) + 103002 -> Skill-id(200352) + 103201 -> Skill-id(201102) + 103501 -> Skill-id(200592) + 103701 -> Skill-id(200512) + 103702 -> Skill-id(201102) + 103801 -> Skill-id(201002) + 103901 -> Skill-id(201382) + 104001 -> Skill-id(201651) + 104002 -> Skill-id(201542) + 104101 -> Skill-id(200982) + 104501 -> Skill-id(200462) + 104502 -> Skill-id(201322) + 104601 -> Skill-id(200162) + 104801 -> Skill-id(200572) + 105001 -> Skill-id(200642) + 105201 -> Skill-id(200472) + 105202 -> Skill-id(201621) + 105601 -> Skill-id(201571) + 105602 -> Skill-id(200752) + 105801 -> Skill-id(200142) + 105901 -> Skill-id(201382) + 106001 -> Skill-id(200911) + 106101 -> Skill-id(201142) + 106901 -> Skill-id(200342) + 107101 -> Skill-id(201322) + _ -> Skill-id(0) + +// Get the potential level 3 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl3(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(201351) + 100102 -> Skill-id(200591) + 100201 -> Skill-id(200431) + 100301 -> Skill-id(201331) + 100302 -> Skill-id(200571) + 100401 -> Skill-id(201051) + 100402 -> Skill-id(201281) + 100501 -> Skill-id(201071) + 100601 -> Skill-id(201351) + 100602 -> Skill-id(201351) + 100701 -> Skill-id(201471) + 100801 -> Skill-id(200381) + 100901 -> Skill-id(200721) + 101001 -> Skill-id(201051) + 101101 -> Skill-id(201151) + 101102 -> Skill-id(200741) + 101201 -> Skill-id(200731) + 101301 -> Skill-id(201191) + 101302 -> Skill-id(200741) + 101401 -> Skill-id(201121) + 101402 -> Skill-id(200701) + 101501 -> Skill-id(200581) + 101502 -> Skill-id(200351) + 101601 -> Skill-id(200361) + 101701 -> Skill-id(201151) + 101702 -> Skill-id(200561) + 101801 -> Skill-id(201371) + 101802 -> Skill-id(201071) + 101901 -> Skill-id(201592) + 102001 -> Skill-id(201191) + 102101 -> Skill-id(200591) + 102201 -> Skill-id(200581) + 102301 -> Skill-id(200561) + 102302 -> Skill-id(201201) + 102401 -> Skill-id(200381) + 102402 -> Skill-id(201161) + 102501 -> Skill-id(201421) + 102601 -> Skill-id(200531) + 102602 -> Skill-id(200541) + 102701 -> Skill-id(200721) + 102801 -> Skill-id(201001) + 103001 -> Skill-id(201341) + 103002 -> Skill-id(200561) + 103201 -> Skill-id(201151) + 103501 -> Skill-id(201401) + 103701 -> Skill-id(200501) + 103702 -> Skill-id(201151) + 103801 -> Skill-id(201371) + 103901 -> Skill-id(200491) + 104001 -> Skill-id(200691) + 104002 -> Skill-id(201091) + 104101 -> Skill-id(200651) + 104501 -> Skill-id(201371) + 104502 -> Skill-id(200331) + 104601 -> Skill-id(200451) + 104801 -> Skill-id(200601) + 105001 -> Skill-id(200621) + 105201 -> Skill-id(200441) + 105202 -> Skill-id(200451) + 105601 -> Skill-id(201231) + 105602 -> Skill-id(201211) + 105801 -> Skill-id(200581) + 105901 -> Skill-id(201441) + 106001 -> Skill-id(201161) + 106101 -> Skill-id(200671) + 106901 -> Skill-id(200581) + 107101 -> Skill-id(200571) + _ -> Skill-id(0) + +// Get the potential level 4 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl4(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(200612) + 100102 -> Skill-id(201611) + 100201 -> Skill-id(200542) + 100301 -> Skill-id(201142) + 100302 -> Skill-id(200352) + 100401 -> Skill-id(200432) + 100402 -> Skill-id(201082) + 100501 -> Skill-id(201042) + 100601 -> Skill-id(200492) + 100602 -> Skill-id(201571) + 100701 -> Skill-id(200622) + 100801 -> Skill-id(201032) + 100901 -> Skill-id(200582) + 101001 -> Skill-id(201032) + 101101 -> Skill-id(200592) + 101102 -> Skill-id(201542) + 101201 -> Skill-id(201462) + 101301 -> Skill-id(201352) + 101302 -> Skill-id(200462) + 101401 -> Skill-id(200722) + 101402 -> Skill-id(201412) + 101501 -> Skill-id(200562) + 101502 -> Skill-id(200202) + 101601 -> Skill-id(201641) + 101701 -> Skill-id(201322) + 101702 -> Skill-id(201312) + 101801 -> Skill-id(200931) + 101802 -> Skill-id(200462) + 101901 -> Skill-id(201102) + 102001 -> Skill-id(201611) + 102101 -> Skill-id(200642) + 102201 -> Skill-id(200012) + 102301 -> Skill-id(200821) + 102302 -> Skill-id(201312) + 102401 -> Skill-id(200502) + 102402 -> Skill-id(200332) + 102501 -> Skill-id(201202) + 102601 -> Skill-id(201252) + 102602 -> Skill-id(201601) + 102701 -> Skill-id(201102) + 102801 -> Skill-id(201012) + 103001 -> Skill-id(201352) + 103002 -> Skill-id(200851) + 103201 -> Skill-id(201112) + 103501 -> Skill-id(201392) + 103701 -> Skill-id(200432) + 103702 -> Skill-id(201392) + 103801 -> Skill-id(200582) + 103901 -> Skill-id(200132) + 104001 -> Skill-id(201062) + 104002 -> Skill-id(201392) + 104101 -> Skill-id(200992) + 104501 -> Skill-id(200881) + 104502 -> Skill-id(201102) + 104601 -> Skill-id(200952) + 104801 -> Skill-id(201702) + 105001 -> Skill-id(201452) + 105201 -> Skill-id(200302) + 105202 -> Skill-id(200242) + 105601 -> Skill-id(200781) + 105602 -> Skill-id(200062) + 105801 -> Skill-id(200861) + 105901 -> Skill-id(200722) + 106001 -> Skill-id(201422) + 106101 -> Skill-id(201072) + 106901 -> Skill-id(201532) + 107101 -> Skill-id(201142) + _ -> Skill-id(0) + +// Get the potential level 5 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl5(uma: uma-id): skill-id + match uma.game-id + 100101 -> Skill-id(200511) + 100102 -> Skill-id(200461) + 100201 -> Skill-id(200551) + 100301 -> Skill-id(201131) + 100302 -> Skill-id(201141) + 100401 -> Skill-id(201061) + 100402 -> Skill-id(200681) + 100501 -> Skill-id(200571) + 100601 -> Skill-id(200341) + 100602 -> Skill-id(200751) + 100701 -> Skill-id(201481) + 100801 -> Skill-id(200701) + 100901 -> Skill-id(200571) + 101001 -> Skill-id(200681) + 101101 -> Skill-id(200601) + 101102 -> Skill-id(201421) + 101201 -> Skill-id(200631) + 101301 -> Skill-id(200561) + 101302 -> Skill-id(200361) + 101401 -> Skill-id(200561) + 101402 -> Skill-id(200611) + 101501 -> Skill-id(200721) + 101502 -> Skill-id(202011) + 101601 -> Skill-id(200511) + 101701 -> Skill-id(200331) + 101702 -> Skill-id(200194) + 101801 -> Skill-id(200501) + 101802 -> Skill-id(200341) + 101901 -> Skill-id(201681) + 102001 -> Skill-id(200541) + 102101 -> Skill-id(201612) + 102201 -> Skill-id(201341) + 102301 -> Skill-id(200741) + 102302 -> Skill-id(200511) + 102401 -> Skill-id(200491) + 102402 -> Skill-id(200351) + 102501 -> Skill-id(201221) + 102601 -> Skill-id(200711) + 102602 -> Skill-id(200431) + 102701 -> Skill-id(200611) + 102801 -> Skill-id(201351) + 103001 -> Skill-id(200741) + 103002 -> Skill-id(200772) + 103201 -> Skill-id(200571) + 103501 -> Skill-id(200591) + 103701 -> Skill-id(200511) + 103702 -> Skill-id(201103) + 103801 -> Skill-id(201011) + 103901 -> Skill-id(200611) + 104001 -> Skill-id(200601) + 104002 -> Skill-id(201691) + 104101 -> Skill-id(200981) + 104501 -> Skill-id(200351) + 104502 -> Skill-id(201161) + 104601 -> Skill-id(201671) + 104801 -> Skill-id(200571) + 105001 -> Skill-id(200641) + 105201 -> Skill-id(200471) + 105202 -> Skill-id(201401) + 105601 -> Skill-id(201561) + 105602 -> Skill-id(200751) + 105801 -> Skill-id(200471) + 105901 -> Skill-id(200064) + 106001 -> Skill-id(201441) + 106101 -> Skill-id(201431) + 106901 -> Skill-id(200174) + 107101 -> Skill-id(201701) + _ -> Skill-id(0) diff --git a/horse/uma.go b/horse/uma.go new file mode 100644 index 0000000..78be7ac --- /dev/null +++ b/horse/uma.go @@ -0,0 +1,32 @@ +package horse + +type UmaID int32 + +type Uma struct { + ID UmaID + CharacterID CharacterID + Name string + Variant string + + Sprint, Mile, Medium, Long AptitudeLevel + Front, Pace, Late, End AptitudeLevel + Turf, Dirt AptitudeLevel + + Unique SkillID + Skill1, Skill2, Skill3 SkillID + SkillPL2, SkillPL3, SkillPL4, SkillPL5 SkillID +} + +type AptitudeLevel int8 + +//go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type AptitudeLevel -trimprefix AptitudeLv +const ( + AptitudeLvG AptitudeLevel = iota + 1 + AptitudeLvF + AptitudeLvE + AptitudeLvD + AptitudeLvC + AptitudeLvB + AptitudeLvA + AptitudeLvS +) diff --git a/horse/uma.kk b/horse/uma.kk index 9b1bddf..aa189b6 100644 --- a/horse/uma.kk +++ b/horse/uma.kk @@ -7,13 +7,21 @@ import horse/movement pub struct uma-detail uma-id: uma-id character-id: character-id - turf: level - dirt: level - sprint: level - mile: level - medium: level - long: level - front-runner: level - pace-chaser: level - late-surger: level - end-closer: level + sprint: aptitude-level + mile: aptitude-level + medium: aptitude-level + long: aptitude-level + front-runner: aptitude-level + pace-chaser: aptitude-level + late-surger: aptitude-level + end-closer: aptitude-level + turf: aptitude-level + dirt: aptitude-level + unique: skill-id + skill1: skill-id + skill2: skill-id + skill3: skill-id + skill-pl2: skill-id + skill-pl3: skill-id + skill-pl4: skill-id + skill-pl5: skill-id diff --git a/horsegen/gen.go b/horsegen/gen.go index 7b81cd6..6ce0115 100644 --- a/horsegen/gen.go +++ b/horsegen/gen.go @@ -159,7 +159,23 @@ func ExecSparks(t *template.Template, region string, kk, g io.Writer, sparks []S return err } -const wordSeps = " ,!?/-+();#○☆♡'=♪∀゚∴" +func ExecUmas(t *template.Template, region string, kk, g io.Writer, umas []Uma) error { + data := struct { + Region string + Umas []Uma + UmaCount int + }{region, umas, len(umas)} + var err error + if kk != nil { + err = errors.Join(err, t.ExecuteTemplate(kk, "koka-uma", &data)) + } + if g != nil { + err = errors.Join(err, t.ExecuteTemplate(g, "go-uma", &data)) + } + return err +} + +const wordSeps = " ,!?/-+();#○☆♡'=♪∀゚∴[]:" var ( kkReplace = func() *strings.Replacer { diff --git a/horsegen/load.go b/horsegen/load.go index 29aedaa..2a82ea9 100644 --- a/horsegen/load.go +++ b/horsegen/load.go @@ -17,6 +17,9 @@ var characterAffinity2SQL string //go:embed character.affinity3.sql var characterAffinity3SQL string +//go:embed uma.sql +var umaSQL string + //go:embed skill-group.sql var skillGroupSQL string @@ -541,3 +544,70 @@ func SparkEffects(ctx context.Context, db *sqlitex.Pool) (map[int]map[int][]Spar } return r, nil } + +type Uma struct { + ID int + CharacterID int + Name string + Variant string + CharacterName string + + Sprint, Mile, Medium, Long int + Front, Pace, Late, End int + Turf, Dirt int + + UniqueID int + Skill1, Skill2, Skill3 int + SkillPL2, SkillPL3, SkillPL4, SkillPL5 int +} + +func Umas(ctx context.Context, db *sqlitex.Pool) ([]Uma, error) { + conn, err := db.Take(ctx) + defer db.Put(conn) + if err != nil { + return nil, fmt.Errorf("couldn't get connection for umas: %w", err) + } + stmt, _, err := conn.PrepareTransient(umaSQL) + if err != nil { + return nil, fmt.Errorf("couldn't prepare statement for umas: %w", err) + } + defer stmt.Finalize() + + var r []Uma + for { + ok, err := stmt.Step() + if err != nil { + return nil, fmt.Errorf("error stepping umas: %w", err) + } + if !ok { + break + } + uma := Uma{ + ID: stmt.ColumnInt(0), + CharacterID: stmt.ColumnInt(1), + Name: stmt.ColumnText(2), + Variant: stmt.ColumnText(3), + CharacterName: stmt.ColumnText(4), + Sprint: stmt.ColumnInt(5), + Mile: stmt.ColumnInt(6), + Medium: stmt.ColumnInt(7), + Long: stmt.ColumnInt(8), + Front: stmt.ColumnInt(9), + Pace: stmt.ColumnInt(10), + Late: stmt.ColumnInt(11), + End: stmt.ColumnInt(12), + Turf: stmt.ColumnInt(13), + Dirt: stmt.ColumnInt(14), + UniqueID: stmt.ColumnInt(15), + Skill1: stmt.ColumnInt(16), + Skill2: stmt.ColumnInt(17), + Skill3: stmt.ColumnInt(18), + SkillPL2: stmt.ColumnInt(19), + SkillPL3: stmt.ColumnInt(20), + SkillPL4: stmt.ColumnInt(21), + SkillPL5: stmt.ColumnInt(22), + } + r = append(r, uma) + } + return r, nil +} diff --git a/horsegen/main.go b/horsegen/main.go index 96cb82f..eca68f9 100644 --- a/horsegen/main.go +++ b/horsegen/main.go @@ -55,6 +55,7 @@ func main() { scens []Scenario sparks []Spark sparkeff map[int]map[int][]SparkEffect + umas []Uma ) eg.Go(func() error { slog.Info("get characters") @@ -116,6 +117,12 @@ func main() { sparkeff = r return err }) + eg.Go(func() error { + slog.Info("get umas") + r, err := Umas(ctx, db) + umas = r + return err + }) if err := eg.Wait(); err != nil { slog.Error("load", slog.Any("err", err)) os.Exit(1) @@ -199,6 +206,18 @@ func main() { slog.Info("write sparks") return ExecSparks(t, region, kf, gf, sparks, sparkeff) }) + eg.Go(func() error { + kf, err := os.Create(filepath.Join(out, region, "uma.kk")) + if err != nil { + return err + } + gf, err := os.Create(filepath.Join(out, region, "uma.go")) + if err != nil { + return err + } + slog.Info("write umas") + return ExecUmas(t, region, kf, gf, umas) + }) if err := eg.Wait(); err != nil { slog.Error("generate", slog.Any("err", err)) os.Exit(1) diff --git a/horsegen/uma.go.template b/horsegen/uma.go.template new file mode 100644 index 0000000..ba37206 --- /dev/null +++ b/horsegen/uma.go.template @@ -0,0 +1,42 @@ +{{- define "go-uma" -}} +package {{ $.Region }} + +// Automatically generated with horsegen; DO NOT EDIT + +import . "git.sunturtle.xyz/zephyr/horse/horse" + +const ( + {{- range $uma := $.Umas }} + {{ goenum $uma.CharacterName }}{{ goenum $uma.Variant }} UmaID = {{ $uma.ID }} // {{ $uma.Name }} + {{- end }} +) + +var AllUmas = map[UmaID]Uma{ + {{- range $uma := $.Umas }} + {{ goenum $uma.CharacterName }}{{ goenum $uma.Variant }}: { + ID: {{ $uma.ID }}, + CharacterID: {{ $uma.CharacterID }}, + Name: {{ printf "%q" $uma.Name }}, + Variant: {{ printf "%q" $uma.Variant }}, + Sprint: {{ $uma.Sprint }}, + Mile: {{ $uma.Mile }}, + Medium: {{ $uma.Medium }}, + Long: {{ $uma.Long }}, + Front: {{ $uma.Front }}, + Pace: {{ $uma.Pace }}, + Late: {{ $uma.Late }}, + End: {{ $uma.End }}, + Turf: {{ $uma.Turf }}, + Dirt: {{ $uma.Dirt }}, + Unique: {{ $uma.UniqueID }}, + Skill1: {{ $uma.Skill1 }}, + Skill2: {{ $uma.Skill2 }}, + Skill3: {{ $uma.Skill3 }}, + SkillPL2: {{ $uma.SkillPL2 }}, + SkillPL3: {{ $uma.SkillPL3 }}, + SkillPL4: {{ $uma.SkillPL4 }}, + SkillPL5: {{ $uma.SkillPL5 }}, + }, + {{- end }} +} +{{ end }} diff --git a/horsegen/uma.kk.template b/horsegen/uma.kk.template new file mode 100644 index 0000000..e612500 --- /dev/null +++ b/horsegen/uma.kk.template @@ -0,0 +1,221 @@ +{{- define "koka-uma" -}} +module horse/{{ $.Region }}/uma + +// Automatically generated with horsegen; DO NOT EDIT + +import std/core/delayed +import std/core/vector +import std/core-extras +import horse/game-id +import horse/movement +pub import horse/uma + +extern create-id-table(): vector + c inline "int32_t arr[] = { {{- range $uma := $.Umas }}{{ $uma.ID }},{{ end -}} };\nkk_vector_from_cint32array(arr, (kk_ssize_t){{ $.UmaCount }}, kk_context())" + js inline "[{{ range $uma := $.Umas }}{{ $uma.ID }},{{ end }}]" +// Vector of all Uma IDs in order for easy iterating. +val vall = once(create-id-table) + +// Get the name for an Uma. +// The name includes the costume variant, e.g. `[Special Dreamer] Special Week`. +// If no Uma matches the ID, the result contains the numeric ID. +pub fun show(uma: uma-id): string + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ printf "%q" $uma.Name }} + {{- end }} + x -> "uma " ++ x.show + +// Get the costume variant for an Uma, e.g. `[Special Dreamer]`. +// If no Uma matches the ID, the result contains the numeric ID. +pub fun variant(uma: uma-id): string + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ printf "%q" $uma.Variant }} + {{- end }} + x -> "uma " ++ x.show + +// Get the character ID for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun character-id(uma: uma-id): character-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Character-id({{ $uma.CharacterID }}) + {{- end }} + _ -> Character-id(0) + +// Get the sprint aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun sprint(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Sprint }} + {{- end }} + _ -> G + +// Get the mile aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun mile(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Mile }} + {{- end }} + _ -> G + +// Get the medium aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun medium(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Medium }} + {{- end }} + _ -> G + +// Get the long aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun long(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Long }} + {{- end }} + _ -> G + +// Get the front runner aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun front-runner(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Front }} + {{- end }} + _ -> G + +// Get the pace chaser aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun pace-chaser(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Pace }} + {{- end }} + _ -> G + +// Get the late surger aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun late-surger(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Late }} + {{- end }} + _ -> G + +// Get the end closer aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun end-closer(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.End }} + {{- end }} + _ -> G + +// Get the turf aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun turf(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Turf }} + {{- end }} + _ -> G + +// Get the dirt aptitude for an Uma. +// If no Uma matches the ID, the result is G. +pub fun dirt(uma: uma-id): aptitude-level + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> {{ template "koka-aptitude-level" $uma.Dirt }} + {{- end }} + _ -> G + +// Get the unique skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun unique(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.UniqueID }}) + {{- end }} + _ -> Skill-id(0) + +// Get the first built-in skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill1(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.Skill1 }}) + {{- end }} + _ -> Skill-id(0) + +// Get the second built-in skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill2(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.Skill2 }}) + {{- end }} + _ -> Skill-id(0) + +// Get the third built-in skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill3(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.Skill3 }}) + {{- end }} + _ -> Skill-id(0) + +// Get the potential level 2 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl2(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.SkillPL2 }}) + {{- end }} + _ -> Skill-id(0) + +// Get the potential level 3 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl3(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.SkillPL3 }}) + {{- end }} + _ -> Skill-id(0) + +// Get the potential level 4 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl4(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.SkillPL4 }}) + {{- end }} + _ -> Skill-id(0) + +// Get the potential level 5 skill for an Uma. +// If no Uma matches the ID, the result is an invalid ID. +pub fun skill-pl5(uma: uma-id): skill-id + match uma.game-id + {{- range $uma := $.Umas }} + {{ $uma.ID }} -> Skill-id({{ $uma.SkillPL5 }}) + {{- end }} + _ -> Skill-id(0) +{{ end }} + +{{- define "koka-aptitude-level" -}} +{{- if eq . 1 -}} G +{{- else if eq . 2 -}} F +{{- else if eq . 3 -}} E +{{- else if eq . 4 -}} D +{{- else if eq . 5 -}} C +{{- else if eq . 6 -}} B +{{- else if eq . 7 -}} A +{{- else if eq . 8 -}} S +{{- else -}} ??? aptitude={{ . }} +{{- end -}} +{{- end -}} diff --git a/horsegen/uma.sql b/horsegen/uma.sql new file mode 100644 index 0000000..637f9b1 --- /dev/null +++ b/horsegen/uma.sql @@ -0,0 +1,59 @@ +WITH uma_name AS ( + SELECT "index" AS id, "text" AS name + FROM text_data + WHERE category = 4 +), uma_variant AS ( + SELECT "index" AS id, "text" AS variant + FROM text_data + WHERE category = 5 +), chara_name AS ( + SELECT "index" AS id, "text" AS name + FROM text_data + WHERE category = 6 +), skills AS ( + SELECT + uma.id, + s.skill_id, + s.need_rank, + ROW_NUMBER() OVER (PARTITION BY s.available_skill_set_id, s.need_rank) AS idx + FROM card_data uma + LEFT JOIN available_skill_set s ON uma.available_skill_set_id = s.available_skill_set_id +) +SELECT + uma.card_id, + card_data.chara_id, + n.name, + v.variant, + c.name AS chara_name, + uma.proper_distance_short, + uma.proper_distance_mile, + uma.proper_distance_middle, + uma.proper_distance_long, + uma.proper_running_style_nige, + uma.proper_running_style_senko, + uma.proper_running_style_sashi, + uma.proper_running_style_oikomi, + uma.proper_ground_turf, + uma.proper_ground_dirt, + su.skill_id1 AS unique_skill, + s1.skill_id AS skill1, + s2.skill_id AS skill2, + s3.skill_id AS skill3, + sp2.skill_id AS skill_pl2, + sp3.skill_id AS skill_pl3, + sp4.skill_id AS skill_pl4, + sp5.skill_id AS skill_pl5 +FROM card_data + JOIN card_rarity_data uma ON card_data.id = uma.card_id + JOIN chara_name c ON card_data.chara_id = c.id + JOIN skill_set su ON uma.skill_set = su.id + JOIN skills s1 ON uma.card_id = s1.id AND s1.need_rank = 0 AND s1.idx = 1 + JOIN skills s2 ON uma.card_id = s2.id AND s2.need_rank = 0 AND s2.idx = 2 + JOIN skills s3 ON uma.card_id = s3.id AND s3.need_rank = 0 AND s3.idx = 3 + JOIN skills sp2 ON uma.card_id = sp2.id AND sp2.need_rank = 2 + JOIN skills sp3 ON uma.card_id = sp3.id AND sp3.need_rank = 3 + JOIN skills sp4 ON uma.card_id = sp4.id AND sp4.need_rank = 4 + JOIN skills sp5 ON uma.card_id = sp5.id AND sp5.need_rank = 5 + LEFT JOIN uma_name n ON uma.card_id = n.id + LEFT JOIN uma_variant v ON uma.card_id = v.id +WHERE uma.rarity = 5 diff --git a/test/global.kk b/test/global.kk index 25861a0..ebcbfa7 100644 --- a/test/global.kk +++ b/test/global.kk @@ -6,6 +6,7 @@ import horse/global/saddle import horse/global/scenario import horse/global/skill import horse/global/spark +import horse/global/uma pub fun main() ()