use std::collections::HashMap; #[derive(Clone, Debug)] pub struct RaceGroup { pub name: String, pub races: Vec<&'static str>, pub anus: String, pub f_breasts: String, pub m_breasts: String, pub f_genitals: String, pub m_genitals: String, pub tag: String, pub sex_drive: String, pub gendered: bool, pub egg_implant: bool, } impl RaceGroup { fn standard( species: &'static str, races: Vec<&'static str>, tag: &'static str, sex_drive: &'static str, gendered: bool, breasts: &'static str, anus: &'static str, genitals: (&'static str, &'static str) ) -> Self { Self { races, name: format!("{}Person", species), anus: format!("{}Anus", anus), f_breasts: breasts.to_string(), m_breasts: breasts.to_string(), f_genitals: format!("{}Vagina", genitals.0), m_genitals: format!("{}Penis", genitals.1), tag: tag.to_string(), sex_drive: sex_drive.to_string(), gendered, egg_implant: false, } } fn standard_animal( species: &'static str, races: Vec<&'static str>, tag: &'static str, sex_drive: &'static str, gendered: bool, breasts: &'static str, anus: &'static str, genitals: (&'static str, &'static str) ) -> Self { Self { races, name: format!("{}Animal", species), anus: format!("{}Anus", anus), f_breasts: breasts.to_string(), m_breasts: breasts.to_string(), f_genitals: format!("{}Vagina", genitals.0), m_genitals: format!("{}Penis", genitals.1), tag: tag.to_string(), sex_drive: sex_drive.to_string(), gendered, egg_implant: false, } } } fn tagify(content: &str, tag: &str) -> String { if content == "" { return format!("<{tag} />"); } format!("<{tag}>
  • {content}
  • ") } pub fn construct_racegroup(group: &RaceGroup) -> String { let mut s = String::from(RACEGROUP_STRING); let mut races = String::new(); for race in &group.races { races.push_str(&format!("\n\t\t\t
  • {race}
  • ")); } let fields = match group.egg_implant { true => "true\n\t\ttrue\n\t\t".to_string(), false => String::new() }; let mut m_breasts = group.m_breasts.clone(); let mut m_genital = group.m_genitals.clone(); let gender = match !group.gendered { true => { m_breasts = String::new(); m_genital = String::new(); format!("\n\t\t{}", !group.gendered) }, false => String::new(), }; let replace = HashMap::from([ ("{name}", group.name.clone()), ("{anus}", tagify(&group.anus, "anuses")), ("{f_breasts}", tagify(&group.f_breasts, "femaleBreasts")), ("{f_genitals}", tagify(&group.f_genitals, "femaleGenitals")), ("{m_breasts}", tagify(&m_breasts, "maleBreasts")), ("{m_genitals}", tagify(&m_genital, "maleGenitals")), ("{tag}", tagify(&group.tag, "tags")), ("{gendered}", gender), ("{sex_drive}", group.sex_drive.clone()), ("{races}", races), ("{fields}", fields) ]); for r in replace { s = s.replace(r.0, &r.1); } s } const RACEGROUP_STRING: &'static str = " {name} {races} {anus} {f_breasts} {f_genitals} {m_breasts} {m_genitals} {tag} {fields}{sex_drive}{gendered} \n"; pub fn racegroup_data_humans() -> Vec { vec![ RaceGroup::standard( "Human", vec![ "AA_Mime", "Alien_Goblin", "Alien_Dirach", "Alien_Fimm", "Alien_Meargh", "Alien_Moyo", "Alien_Shearl", "Alien_Twi'lek", "Alien_Zabrak", "HC_Giant", "PW_Abra", "PW_Alakazam", "PW_Hitmonchan", "PW_Hitmonlee", "PW_Hitmontop", "PW_Jynx", "PW_Kadabra", "PW_Machamp", "PW_Machoke", "PW_Machop", "PW_Mewtwo", "PW_MrMime", "PW_Smoochum", "PW_Snorlax", "PW_Tyrogue", "WMH_Cyclops", "Yokai_Yamanba", "Yokai_YukiShizuku", "DwarfRace", "HorrorsInfestedHuman", "HorrorsOverlord", "Elona_Imouto", "Giant", "Shoujo", "Ooka_Miko", "TrollRace", ], "Skin", "1", true, "Breasts", "", ("", ""), ), RaceGroup::standard( "Arthropod", vec![ "Alien_Beetle", "Alien_Mantis", "Ant_AntiniumRace", "Arachne", "KlickmalaRace", "Poleepkwa", "Races_BlackWidow", "Yokai_JorouGumo", ], "Chitin", "0.8", true, "Breasts", "Insect", ("Ovipore", "Aedeagus"), ), RaceGroup::standard( "Avian", vec![ "ATK_Avianmorph", "Harpy", ], "Feathers", "0.9", true, "FeaturelessChest", "Cloacal", ("Cloacal", "Cloacal"), ), RaceGroup::standard( "Bear", vec![ "WoW_Pandaren", "BearMan", ], "Fur", "0.9", true, "Breasts", "", ("", "Bear"), ), RaceGroup::standard( "Canine", vec![ "ATK_Caninemorph", "WoW_Worgen", "Lupaios", "kuro", "siro", "WolfMan", ], "Fur", "1", true, "Breasts", "", ("Dog", "Dog"), ), // For foxes, hyenas, werewolves, etc (hyenas are felines oops) RaceGroup::standard( "CanineHighSex", vec![ "ATK_Gnollmorph", "ATK_Vulpinemorph", "Alien_Fennex", "Alien_Frijjid", "StarWarsRaces_Wookie", "WMH_Werewolf", "Yokai_NineTail", "Yokai_NineTailWhite", "FoxMan", ], "Fur", "1.3", true, "Breasts", "", ("Dog", "Dog"), ), RaceGroup::standard( "Crocodilian", vec![ "Alien_Argonian", "SSD_DeathclawRace", "Races_Lizardman", ], "Scales", "0.9", true, "ScaleBreasts", "Cloacal", ("Cloacal", "Crocodilian"), ), RaceGroup::standard( "Deer", vec![ "ATK_Cervinemorph", "CamelMan", "CamelPerson", "ElkMan", "GazelleMan", "Lliscean", ], "Fur", "1", true, "Breasts", "", ("Narrow", "Needle"), ), RaceGroup::standard( "Dino", vec![ "Raptor", "Tyrannosaur", ], "Scales", "0.9", true, "ScaleBreasts", "Cloacal", ("Cloacal", "Dino"), ), RaceGroup::standard( "Dragon", vec![ "ATK_Dragomorph", "WMH_Basilisk", "WMH_Wyvern", "Yokai_Dragon_MoonDragon", "Yokai_Dragon_Pekodra", "Yokai_Dragon_Redra", "Yokai_Dragon_Shiro", "Yokai_Raid_Mdra", "Yokai_Raid_Pekodra", "Yokai_Raid_Redra", "Yokai_Tenaga", "Yokai_TenagaH", "Yokai_TubakiAnimal", "HalfDragon", "Dragon_Kilhn", "ALapelli", "yuki", ], "Scales", "1.2", true, "ScaleBreasts", "Cloacal", ("Cloacal", "Dragon") ), RaceGroup::standard( "Elephant", vec![ "ElephantMan", ], "Fur", "1", true, "Breasts", "", ("Elephant", "Elephant"), ), RaceGroup::standard( "FoxGirl", vec![ "Alien_Hisa", "kon", "Vulpes", ], "Fur", "1.3", true, "Petite_FoxGirl_Breasts", "Petite_FoxGirl_", ("Petite_FoxGirl_", ""), ), RaceGroup::standard( "Elf", vec![ "AS_WHE_Race", "Alien_Astoriel", "Alien_Drow_Otto", "Alien_Eldar", "O21_Alien_DarkElf", "O21_Alien_MoonElf", "O21_Alien_SunElf", "O21_Alien_WoodElf", "O21_FR_DarkElf", "O21_FR_MoonElf", "O21_FR_SunElf", "O21_FR_WoodElf", "PW_Celebi", "PW_Clefable", "PW_Clefairy", "PW_Cleffa", "PW_Igglybuff", "PW_Jigglypuff", "PW_Togepi", "PW_Togetic", "PW_Wigglytuff", "Sandy_Angel", "WoW_BloodElf", "WoW_ForsakenHighElf", "WoW_ForsakenNightElf", "WoW_HighElf", "WoW_NightElf", "ElfRace", ], "Skin", "1.1", true, "Breasts", "Elf", ("Elf", "Elf"), ), RaceGroup::standard( "Feline", vec![ "Alien_Nyaron", "ATK_Felinemorph", "YanzihkoCheetah", "YanzihkoJaguar", "YanzihkoLeo", "YanzihkoPanther", "YanzihkoTigris", "Yokai_NekoMusume", "GuardianBast", "LynxMan", "Maidnukos", "miko", ], "Fur", "1", true, "Breasts", "Feline", ("Cat", "Cat"), ), RaceGroup::standard( "Fish", vec![ "Alien_NiHal", "Alien_Quarren", "Alien_MonCalamari", "PW_Corsola", "PW_Goldeen", "PW_Gyarados", "PW_Horsea", "PW_Kingdra", "PW_Lanturn", "PW_Magikarp", "PW_Mantine", "PW_Qwilfish", "PW_Remoraid", "PW_Seadra", "PW_Seaking", "PW_Starmie", "PW_Staryu", "IkquanRace", ], "Scales", "0.8", true, "FeaturelessChest", "Cloacal", ("Cloacal", "Marine"), ), RaceGroup::standard( "Ghost", vec![ "DRSKT_Race", "HPLovecraft_MistCreature", "MM_WillOWisp", "PW_Gastly", "PW_Gengar", "PW_Haunter", "PW_Misdreavus", "WoW_Skeleton", ], "Demon", "0.5", true, "GhostBreasts", "Ghost", ("Ghost", "Ghost"), ), RaceGroup::standard( "Ghoul", vec![ "Ghoul", "GlowingGhoul", ], "Demon", "0.5", true, "GhoulBreasts", "Ghoul", ("Ghoul", "Ghoul"), ), RaceGroup::standard( "Horny", vec![ "Alien_Kijin", ], "Skin", "1.4", true, "Horny_Breasts", "", ("Horny_", "Horny_"), ), RaceGroup::standard( "Orc", vec![ "Alien_Orc", "O21_Alien_Orc", "O21_FR_Orc", "OG_Alien_Ork", "OG_Cyborg_Ork", "OrcRace", "Ork_Warboss", "Ork_Nob", "Ork_Eavy_Nob", "Ork_Boy", "Ork_Eavy_Boy", "Ork_Grot", "OG_Alien_Grot", "WoW_Orc", ], "Skin", "1.3", true, "OrcBreasts", "Orc", ("Orc", "Orc"), ), RaceGroup::standard( "Horse", vec![ "Alien_Bullgor", "Alien_Equium", "Alien_DonkEquium", "Alien_UniEquium", "Alien_ZEquium", "Alien_PEquium", "Alien_DonkPEquium", "Alien_UniPEquium", "Alien_ZPEquium", "WoW_Draenei", ], "Fur", "1.2", true, "Breasts", "Horse", ("Horse", "Horse"), ), RaceGroup::standard( "Pig", vec![ "PigMan", ], "Fur", "1", true, "Breasts", "", ("Pig", "Pig"), ), RaceGroup::standard( "Raccoon", vec![ "RaccoonMan", "StarWarsRaces_Ewok", ], "Fur", "1.1", true, "Breasts", "", ("", "Raccoon"), ), RaceGroup::standard( "Reptile", vec![ "O21_Alien_Kobold", "O21_FR_Kobold", "Pawnbold_bold", "StarWarsRaces_Rodian", "Yokai_Lamia", "Yokai_Samia", "Naga", ], "Scales", "0.9", true, "ScaleBreasts", "Cloacal", ("Cloacal", "Hemi"), ), RaceGroup::standard( "Rodent", vec![ "ATK_Lagomorph", "Alien_Skaven", "Alien_SkavenStorm", "Alien_SkavenMoulder", "Alien_HornedSkaven", "RK_KingHamster", "Yokai_Kamaitachi", "hana", "Ratkin", "Ratkin_Su", "Rotti", "Rabbie", ], "Fur", "1.3", true, "Petite_Breasts", "Petite_", ("Rodent", "Rodent"), ), RaceGroup::standard( "Thrumbo", vec![ "Thrumkin", ], "Fur", "1.2", true, "Breasts", "Cloacal", ("Cloacal", "Dragon") ), RaceGroup::standard( "Tree", vec![ "Alien_Dryad", "Alien_DryadWild", "Alien_Tree", "PW_Bayleef", "PW_Bellossom", "PW_Bellsprout", "PW_Bulbasaur", "PW_Chikorita", "PW_Gloom", "PW_Hoppip", "PW_Ivysaur", "PW_Jumpluff", "PW_Meganium", "PW_Oddish", "PW_Skiploom", "PW_Sudowoodo", "PW_Sunflora", "PW_Sunkern", "PW_Tangela", "PW_Venusaur", "PW_Victreebel", "PW_Vileplume", "PW_Weepinbell", ], "Plant", "1", true, "TreeBreasts", "Tree", ("Tree", "Tree"), ), RaceGroup { races: vec![ "ATK_Bovinemorph", "Alien_Gor", "Alien_Ungor", "WoW_Tauren", "WMH_Chort", "WMH_Fiend", "akame", "aome", ], name: "Bovine".to_string(), anus: "Anus".to_string(), f_breasts: "UdderBreasts".to_string(), m_breasts: "Breasts".to_string(), f_genitals: "BovineVagina".to_string(), m_genitals: "BovinePenis".to_string(), tag: "Fur".to_string(), sex_drive: "1".to_string(), gendered: true, egg_implant: false, }, RaceGroup { races: vec![ "Alien_Slime", "Alien_Slug", "Mincho_ThingDef", "PW_Ditto", "PW_Grimer", "PW_Magcargo", "PW_Muk", "PW_Slugma", "Yokai_HihiiroKabe", "Slime", ], name: "Slime".to_string(), anus: "SlimeAnus".to_string(), f_breasts: "SlimeBreasts".to_string(), m_breasts: "SlimeBreasts".to_string(), f_genitals: "SlimeVagina".to_string(), m_genitals: "SlimeTentacles".to_string(), tag: "Slime".to_string(), sex_drive: "1".to_string(), gendered: true, egg_implant: false, }, ] } pub fn racegroup_data_animals() -> Vec { vec![ RaceGroup::standard_animal( "GenericMammal", vec![ "Megasloth", "ACPRedPanda", "AEXP_Pangolin", "AEXP_RedPanda", "Yokai_IssunAnimal", "Andrewsarchus", ], "Fur", "1", true, "MammalBreasts", "Mammal", ("Mammal", "Mammal"), ), RaceGroup::standard_animal( "Ape", vec![ "Monkey", "AEXP_Gorilla", "AEXP_Mandrill", "AEXP_Lemur", "AEXP_Bonobo", "GR_ParagonHumanoid", "PW_Aipom", "PW_Electabuzz", "PW_Lickitung", "PW_Magmar", "PW_Mankey", "PW_Primeape", "Dinopithecus", "Gigantopithecus", ], "Fur", "1.1", true, "MammalBreasts", "Mammal", ("Mammal", "Monkey"), ), // Arthropods that have aedeagi and ovipores, and reproduce via spermatophores and egg-laying RaceGroup::standard_animal( "Arthropod", vec![ "AA_AngelMoth", "AA_Atispec", "AA_Barbslinger", "AA_BedBug", "AA_Bobeene", "AA_ChemfuelMyrmidon", "AA_CrepuscularBeetle", "AA_Drainer", "AA_FireWasp", "AA_GreatDevourer", "AA_IronhuskBeetle", "AA_LuciferBug", "AA_Metallovore", // AA Crabs "AA_BoulderMit", "AA_CrystalMit", "AA_PebbleMit", "AA_SummitCrab", "ACPSilkspider", "AEXP_Megascorpion", "BWFlooferMoth", "Cults_ByakheeRace", "PW_Cloyster", "PW_Dunsparce", "PW_Forretress", "PW_Kabuto", "PW_Kabutops", "PW_Kingler", "PW_Krabby", "PW_Omanyte", "PW_Omastar", "PW_Shellder", "VAECaves_AncientGiantSpider", "VAECaves_CaveCrawler", "VAECaves_GiantSpider", "VAECaves_GiantSpiderHatchling", "Archospider", "Arthropleura", "Pulmonoscorpius", ], "Chitin", "0.7", true, "", "Insect", ("Ovipore", "Aedeagus"), ), RaceGroup::standard_animal( "Avian", vec![ "Cassowary", "Chicken", "Duck", "Emu", "Goose", "Turkey", "Ostrich", "ACPDuck", "ACPDomesticGoose", "ACPWildGoose", "ACPGreatBustard", "ACPKiwi", "ACPPenguin", "ACPFlamingo", "ACPValleyQuail", "ACPSilkieChicken", "ACPPtarmigan", "AA_DesertAve", "AA_GiantCrownedSilkie", "AA_FrostAve", "AA_MeadowAve", "AA_NightAve", "AA_RoyalAve", "AA_FlamingoPhoenix", "AEXP_Penguin", "AEXP_Moa", "AEXP_RockhopperPenguin", "AEXP_WildGoose", "GR_Chickenbear", "GR_Chickencat", "GR_Chickenffalo", "GR_Chickenlope", "GR_Chickenrabbit", "GR_Chickenwolf", "GR_Manchicken", "GR_ParagonChicken", "GR_Turkeyman", "MM_Fenghuang", "MM_Ieltxu", "MM_Phoenix", "PW_Articuno", "PW_Delibird", "PW_Dodrio", "PW_Doduo", "PW_Farfetchd", "PW_Fearow", "PW_Golduck", "PW_HoOh", "PW_Hoothoot", "PW_Lugia", "PW_Moltres", "PW_Murkrow", "PW_Natu", "PW_Noctowl", "PW_Pidgeot", "PW_Pidgeotto", "PW_Pidgey", "PW_Psyduck", "PW_Skarmory", "PW_Spearow", "PW_Xatu", "PW_Zapdos", "RG-EAP_ArcticDrak", "RG-EAP_Dodo", "Archostrich", "Dinornis", "Palaeeudyptes", "Titanis", ], "Feathers", "0.8", true, "", "Cloacal", ("Cloacal", "Cloacal"), ), RaceGroup::standard_animal( "Canine", vec![ "Fox_Arctic", "Fox_Fennec", "Fox_Red", "Husky", "LabradorRetriever", "Warg", "Wolf_Arctic", "Wolf_Timber", "YorkshireTerrier", "AA_AnimusVox", "AA_Skiphound", "AACP_AnimaFox", "ACPWildDog", "ACPDirewolf", "ACPBlackwolf", "ACPSpiritwolf", "ACPSpiritwolfFF", "AEXP_Coyote", "AEXP_ArcticCoyote", "AEXP_Beagle", "AEXP_Chihuahua", "AEXP_Corgi", "AEXP_FrenchBulldog", "AEXP_GermanShepherd", "AEXP_GreatDane", "AEXP_Poodle", "AEXP_Pug", "AEXP_Rottweiler", "AEXP_Shih-Tzu", "AEXP_WelshTerrier", "AEXP_AfricanWildDog", "ERN_Palamute", "GR_Dogman", "GR_Manwolf", "GR_ParagonWolf", "GR_Wolfalope", "GR_Wolfbear", "GR_Wolfbeaver", "GR_Wolfcat", "GR_Wolfchicken", "GR_Wolffalo", "MM_Ahuizotl", "MM_Cerberus", "MM_Kitsune", "PW_Arcanine", "PW_Eevee", "PW_Entei", "PW_Espeon", "PW_Flareon", "PW_Granbull", "PW_Growlithe", "PW_Houndoom", "PW_Houndour", "PW_Jolteon", "PW_Ninetales", "PW_Raikou", "PW_Snubbull", "PW_Suicune", "PW_Umbreon", "PW_Vaporeon", "PW_Vulpix", "Archomutt", "AnimaWarg", "Abaddog", "Arctivore", "Omnicron", "Fuzztino", ], "Fur", "1", true, "MammalBreasts", "Dog", ("Dog", "Dog"), ), RaceGroup::standard_animal( "CanineSingleGender", vec![ "kon", "konf", "kuro", "Ooka_Miko", "siro", "sirof", ], "Fur", "1", false, "MammalBreasts", "Dog", ("Dog", "Dog"), ), RaceGroup::standard_animal( "CanineSkin", vec![ "AA_RipperHound", ], "Skin", "0.9", true, "MammalBreasts", "Dog", ("Dog", "Dog"), ), // Most even-toed ungulates go here, obviously excluding cetaceans RaceGroup::standard_animal( "Cervine", vec![ "Alpaca", "Deer", "Dromedary", "Elk", "ACPGiraffe", "AEXP_Camel", "AEXP_Giraffe", "AEXP_Moose", "PW_Girafarig", "PW_Stantler", "RG-WF_WastelandDeer", ], "Fur", "1", true, "MammalBreasts", "Mammal", ("Narrow", "Needle"), ), RaceGroup::standard_animal( "Crocodilian", vec![ "AA_RoughPlatedMonitor", "AEXP_Alligator", "AEXP_Crocodile", "PW_Croconaw", "PW_Feraligatr", "PW_Totodile", "Quinkana", "Purussaurus", ], "Scales", "0.8", true, "", "Cloacal", ("Cloacal", "Crocodilian"), ), RaceGroup::standard_animal( "DemonSingleGender", vec![ "eBlackangel", "eExile", "kohime", ], "Demon", "1", false, "Breasts", "", ("Demon", "Demon"), ), RaceGroup::standard_animal( "DinoFeathered", vec![ "AA_PedigreedRaptor", "PW_Aerodactyl", "Dakotaraptor", "Deinocheirus", "Gallimimus", "Gigantoraptor", "Therizinosaurus", "Velociraptor", "Yutyrannus", ], "Feathers", "1", true, "", "Cloacal", ("Cloacal", "Dino"), ), RaceGroup::standard_animal( "DinoScaled", vec![ "PW_Cubone", "PW_Marowak", "PW_Kangaskhan", "PW_Larvitar", "PW_Tyranitar", "Allosaurus", "Ankylosaurus", "Baryonyx", "Brachiosaurus", "Brontosaurus", "Carnotaurus", "Compsognathus", "Corythosaurus", "Dilophosaurus", "Diplodocus", "Doedicurus", "Dryosaurus", "Iguanodon", "Magyarosaurus", "Minmi", "Pachycephalosaurus", "Parasaur", "Protoceratops", "Pteranodon", "Quetzalcoatlus", "Spinosaurus", "Stegosaurus", "Stygimoloch", "Triceratops", "TyrannosaurusRex", "Utahraptor", ], "Scales", "1", true, "", "Cloacal", ("Cloacal", "Dino"), ), RaceGroup::standard_animal( "Dragon", vec![ "AA_Behemoth", "AA_DecayDrake", "MM_LesserWyvern", "MM_Qilin", "PW_Charizard", "PW_Charmander", "PW_Charmeleon", "PW_Dragonair", "PW_Dragonite", "PW_Dratini", "VAECaves_Wyrm", "Yokai_RyuunoIkariAnimal", // Colored dragons "Black_Dragon", "Blue_Dragon", "Gold_Dragon", "Green_Dragon", "Jade_Dragon", "Purple_Dragon", "Red_Dragon", "Royal_Dragon", "Silver_Dragon", "True_Dragon", "White_Dragon", "Yellow_Dragon", "Draclone", "Mystogen", "Voltaic", ], "Scales", "1.2", true, "", "Cloacal", ("Cloacal", "Dragon"), ), RaceGroup::standard_animal( "DragonSingleGender", vec![ "yuki", ], "Scales", "1.2", false, "", "Cloacal", ("Cloacal", "Dragon"), ), RaceGroup::standard_animal( "Elephant", vec![ "Elephant", "AA_Gallatross", "AA_GallatrossMoribund", "AEXP_AsianElephant", "AEXP_IndianElephant", "AEXP_Tapir", "HC_WoollyMammoth", "PW_Donphan", "PW_Drowzee", "PW_Hypno", "PW_Phanpy", "RG-EAP_WoollyMammoth", "Boltusk", "Deinotherium", "Platybelodon", "WoollyMammoth", "Zygolophodon", ], "Fur", "0.9", true, "MammalBreasts", "Mammal", ("Elephant", "Elephant"), ), RaceGroup::standard_animal( "Feline", vec![ "Cat", "Cougar", "Lynx", "Panther", "AA_ArcticLion", "AA_CrystallineCaracal", "AA_DuskProwler", "AA_Genix", "AA_SandLion", "AA_PhoenixOwlcat", "ACPMunchkinCat", "ACPLion", "ACPTiger", "ACPCheetah", "ACPAmurLeopard", "ACPSnowLeopard", "AEXP_Jaguar", "AEXP_Tiger", "AEXP_CatAbyssinian", "AEXP_CatBengal", "AEXP_CatBritishShorthair", "AEXP_CatMaineCoon", "AEXP_CatMunchkin", "AEXP_CatNorwegianForest", "AEXP_CatPersian", "AEXP_CatSiamese", "AEXP_CatSomali", "AEXP_CatSphynx", "AEXP_Lion", "AEXP_Cheetah", "AEXP_Thylacine", "GR_Catbear", "GR_Catalope", "GR_Catchicken", "GR_Catffalo", "GR_Catrabbit", "GR_Catwolf", "GR_Catman", "GR_ParagonFeline", "MM_Chimera", "MM_Griffin", "MM_Manticore", "MM_Xiezhi", "PW_Meowth", "PW_Persian", "Carnagrius", "Dinocrocuta", "Jeeta", "Pallas_cat", "Smilodon", "Snow_leopard", ], "Fur", "1", true, "CatBreasts", "Feline", ("Cat", "Cat"), ), RaceGroup::standard_animal( "FelineHorny", vec![ "AEXP_Hyena", ], "Fur", "1.3", true, "CatBreasts", "Feline", ("Cat", "Cat"), ), RaceGroup::standard_animal( "FelineSingleGender", vec![ "eBlackcat", "eYoungercatsister", "miko", ], "Fur", "1", false, "CatBreasts", "Feline", ("Cat", "Cat"), ), // Rhinos belong here, not with elephants, as they are odd-toed ungulates RaceGroup::standard_animal( "Horse", vec![ "Donkey", "Horse", "Rhinoceros", "AA_Thunderox", "ACPHorse", "ACPWoolyHorse", "ACPLlama", "ACPBlackRhinoceros", "ACPWoolyRhino", "AEXP_BlackRhino", "AEXP_Zebra", "AEXP_Quagga", "GR_Bearhorse", "GR_Boomhorse", "GR_Chickenhorse", "GR_Cathorse", "GR_Molehorse", "GR_Wolfhorse", "GR_Muffalohorse", "GR_Crocorse", "GR_Spiderhorse", "GR_Hurseman", "GR_Mancat", "GR_ParagonHorse", "MM_Pegasus", "MM_Unicorn", "PW_Ponyta", "PW_Rapidash", "PW_Rhydon", "PW_Rhyhorn", "RG-EAP_WoollyRhino", "Chalicotherium", "Elasmotherium", "Paraceratherium", "Uintatherium", ], "Fur", "1", true, "MammalBreasts", "Horse", ("Horse", "Horse"), ), RaceGroup::standard_animal( "HumanlikeGenderless", vec![ "eCutefairy", "eDefender", "eGoldenknight", "eGwen", "eYoungersister", "EmperorDragon", "baier", "buer", "jiaer", "juer", "kuoer", "zhuer", ], "Skin", "1", false, "Breasts", "", ("", ""), ), // I know hippos are more closely related to other artiodactyls than to pinnipeds, but their genitalia are strikingly similar due to convergent evolution RaceGroup::standard_animal( "MarineMammal", vec![ "ACPSpottedSeal", "ACPWalrus", "ACPHippopotamus", "AEXP_Seal", "AEXP_Walrus", "PW_Azumarill", "PW_Dewgong", "PW_Marill", "PW_Seel", "Gomphotaria", ], "Fur", "0.9", true, "MammalBreasts", "Mammal", ("Mammal", "Marine"), ), RaceGroup::standard_animal( "Marsupial", vec![ "AEXP_Kangaroo", "Procoptodon", ], "Fur", "1", true, "MammalBreasts", "Cloacal", ("Cloacal", "Cloacal"), ), // Marsupials with a bifurcated penis: All except kangaroos and marsupial moles RaceGroup::standard_animal( "MarsupialBi", vec![ "AEXP_Koala", "AEXP_TasmanianDevil", "PW_Diglett", "PW_Dugtrio", "Diprotodon", ], "Fur", "1", true, "MammalBreasts", "Cloacal", ("Cloacal", "Hemi"), ), // TODO: Should be single gender RaceGroup::standard_animal( "Orc", vec![ "OG_Squig", "OG_Squig_Eatin", "OG_Squig_Oily", "OG_Snotling", ], "Skin", "1", true, "MammalBreasts", "Orc", ("Orc", "Orc"), ), RaceGroup::standard_animal( "Pig", vec![ "Pig", "WildBoar", "AA_Thunderbeast", "AA_WindBeast", "AA_Darkbeast", "AA_DarkVandal", "PW_Piloswine", "PW_Slowbro", "PW_Slowking", "PW_Slowpoke", "PW_Swinub", "ACPTapir", "ACPPeccary", "MM_ErymanthianBoar", "Daeodon", ], "Fur", "1", true, "MammalBreasts", "Mammal", ("Pig", "Pig"), ), RaceGroup::standard_animal( "Platypus", vec![ "ACPDuckBilledPlatypus", "AEXP_Platypus", ], "Fur", "0.9", true, "MammalBreasts", "Cloacal", ("Cloacal", "Cloacal"), ), // Mustelids RaceGroup::standard_animal( "Raccoon", vec![ "Raccoon", "ACPMegaFerret", "ACPMegabadger", "ACPOtter", "ACPFerret", "ACPHoneyBadger", "ACPFishercat", "ACPErmine", "AEXP_MegaWolverine", "AEXP_Otter", "AEXP_Badger", "PW_Smeargle", "PW_Sneasel", "Enhydriodon", ], "Fur", "1", true, "MammalBreasts", "Mammal", ("Mammal", "Raccoon"), ), RaceGroup::standard_animal( "Reptile", vec![ "Cobra", "Iguana", "AA_CrescendoAnole", "AA_Erin", "AA_Lockjaw", "AA_RayHound", "AA_Skyeel", "ACPXenguana", "ACPXGecko", "ACPKomodo", "ACPThornyDevil", "AEXP_Anaconda", "AEXP_Rattlesnake", "AEXP_GilaMonster", "GR_Bearodile", "GR_Boomsnake", "GR_Chickenlizard", "GR_Lizardman", "GR_Muffalokomodo", "GR_ParagonIguana", "GR_Snakecat", "GR_Spidersnake", "GR_Wolfsnake", "MM_LernaeanHydra", "MM_Basilisk", "MM_Salamander", "MM_Tlilcoatl", "PW_Arbok", "PW_Ekans", "RG-WF_WastelandDeathclaw", "VAECaves_BlindSalamander", "Gigantophis", "Megalania", "Rakk", "Titanoboa", ], "Scales", "0.8", true, "", "Cloacal", ("Cloacal", "Hemi"), ), // Rodents and Lagomorphs RaceGroup::standard_animal( "Rodent", vec![ "Alphabeaver", "Boomrat", "Capybara", "Chinchilla", "GuineaPig", "Hare", "Rat", "Snowhare", "Squirrel", "AA_DuskRat", "AA_FrostboundBehemoth", "AA_Frostmite", "AA_Groundrunner", "AA_Razorjack", // AA Lings "AA_OcularNightling", "AA_Murkling", "AA_Nightling", "AA_Frostling", "ACPAngoraRabbit", "ACPChipmunk", "ACPDomesticRabbit", "ACPGuineaPig", "ACPHedgehog", "ACPJackalope", "ACPPorcupine", "AEXP_BlackFootedFerret", "AEXP_Boombat", "AEXP_Hedgehog", "AEXP_Beaver", "AEXP_Porcupine", "GR_Beaverwolf", "GR_Mansquirrel", "GR_Molebear", "GR_Moleman", "GR_ParagonRat", "GR_Rabbitcat", "GR_Rabbitchicken", "GR_Ratffalo", "GR_Squirralope", "PW_Cyndaquil", "PW_Furret", "PW_Mew", "PW_Nidoking", "PW_Nidoqueen", "PW_NidoranF", "PW_NidoranM", "PW_Nidorina", "PW_Nidorino", "PW_Pichu", "PW_Pikachu", "PW_Quilava", "PW_Raichu", "PW_Raticate", "PW_Rattata", "PW_Sandshrew", "PW_Sandslash", "PW_Sentret", "PW_Typhlosion", "RG-WF_WastelandBeaver", "RG-WF_WastelandSquirrel", "Yokai_SpinMouse", "Archojerboa", "Castoroides", "FoxSquirrel", "Josephoartigasia", "Pika", ], "Fur", "1.1", true, "MammalBreasts", "Mammal", ("Mammal", "Rodent"), ), RaceGroup::standard_animal( "RodentSingleGender", vec![ "hana", ], "Fur", "1.1", false, "MammalBreasts", "Mammal", ("Mammal", "Rodent"), ), RaceGroup::standard_animal( "Tentacle", vec![ "AA_Helixien", "AA_Plasmorph", "AA_SandSquid", "AA_TarGuzzler", "PW_Octillery", "PW_Tentacool", "PW_Tentacruel", ], "Slime", "0.8", true, "", "Cloacal", ("Cloacal", "Tentacle"), ), RaceGroup::standard_animal( "Thrumbo", vec![ "Thrumbo", "GR_Thrumbear", "GR_Thrumbalope", "GR_Thrumbochicken", "GR_Thrumffalo", "GR_Thrumwolf", "GR_Thrumbocat", "GR_Thrumbospider", "GR_Thrumbolizard", "GR_Thrumborat", "GR_Thrumhorse", "GR_Thrumboman", "GR_ParagonThrumbo", "Archothrumbo", "RoyalThrumbo", ], "Fur", "1", true, "MammalBreasts", "Cloacal", ("Cloacal", "Dragon"), ), RaceGroup::standard_animal( "Turtle", vec![ "Tortoise", "AEXP_DesertTortoise", "PW_Blastoise", "PW_Lapras", "PW_Shuckle", "PW_Squirtle", "PW_Wartortle", "Archotortoise", "Megalochelys", ], "Scales", "0.8", true, "", "Cloacal", ("Cloacal", "Turtle"), ), RaceGroup::standard_animal( "Ursine", vec![ "Bear", "Bear_Grizzly", "Bear_Polar", "ACPBlackbear", "ACPPanda", "AEXP_BlackBear", "AEXP_Panda", "GR_Bearalope", "GR_Bearcat", "GR_Bearchicken", "GR_Bearffalo", "GR_Bearman", "GR_Bearmole", "GR_Bearwolf", "GR_Manbear", "GR_ParagonBear", "PW_Teddiursa", "PW_Ursaring", "RG-WF_WastelandBear", "VAECaves_CaveBear", "Archopanda", "AnimaBear", "ShortfacedBear", ], "Fur", "1", true, "MammalBreasts", "Mammal", ("Mammal", "Bear"), ), // AA RaceGroup::standard_animal( "AA_SandProwler", vec![ "AA_SandProwler", ], "Scales", "1", true, "CatBreasts", "Feline", ("Cat", "Cat"), ), RaceGroup { races: vec![ "Boomalope", "Bison", "Caribou", "Cow", "Gazelle", "Goat", "Ibex", "Muffalo", "Sheep", "Yak", "AA_ChameleonYak", "AA_DevilSheep", "AA_Gigantelope", "AA_NightMule", "AA_NightRam", "AA_Radyak", "AA_ShadowCharger", "AA_ShockGoat", "AA_SpinedGow", "AA_GreyCoatedMouflon", "AACP_AnimaMuffalo", "ACPBison", "ACPMajoreraGoat", "ACPSheep", "AEXP_Hippopotamus", "AEXP_Muskox", "AEXP_Wildebeest", "GR_Boomabear", "GR_Boomachicken", "GR_Booman", "GR_Boomcat", "GR_Boomffalo", "GR_Boomsquirrel", "GR_Boomwolf", "GR_Manalope", "GR_Manffalo", "GR_Muffalobear", "GR_Muffalocat", "GR_Muffalochicken", "GR_Muffaloman", "GR_Muffalope", "GR_Muffalorat", "GR_Muffalowolf", "GR_ParagonBoomalope", "GR_ParagonMuffalo", "MM_Catoblepas", "MM_CeryneianHind", "MM_WildMinotaur", "PW_Ampharos", "PW_Flaaffy", "PW_Mareep", "PW_Miltank", "PW_Tauros", "RG-EAP-Protoceratidae", "Addax", "AngusCow", "AnkoleWatusiCow", "AnimaYak", "Archoffalo", "Archolope", "AssafSheep", "Aurochs", "AwassiSheep", "BighornSheep", "Bongo", "BoomooCow", "BorderLeicesterSheep", "BrahmanCow", "BravaCow", "BrownSwissCow", "Gemsbok", "HarianaCow", "HerefordCow", "HighlandCow", "HolsteinFriesianCow", "JacobsSheep", "JerseyCow", "LimousinCow", "LonghornCow", "LincolnSheep", "MerinoSheep", "MouflonSheep", "Macrauchenia", "Megaloceros", "Raamu", "Sivatherium", "SuffolkSheep", "WaterDeer", "ZebuCow", ], name: "BovineAnimal".to_string(), anus: "MammalAnus".to_string(), f_breasts: "UdderBreasts".to_string(), m_breasts: "MammalBreasts".to_string(), f_genitals: "BovineVagina".to_string(), m_genitals: "BovinePenis".to_string(), tag: "Fur".to_string(), sex_drive: "1".to_string(), gendered: true, egg_implant: false, }, RaceGroup { races: vec![ "akame", "aome", ], name: "BovineSingleGenderAnimal".to_string(), anus: "MammalAnus".to_string(), f_breasts: "UdderBreasts".to_string(), m_breasts: "MammalBreasts".to_string(), f_genitals: "BovineVagina".to_string(), m_genitals: "BovinePenis".to_string(), tag: "Fur".to_string(), sex_drive: "1".to_string(), gendered: false, egg_implant: false, }, // Arthropods that reproduce through oviposition RaceGroup { races: vec![ "AA_BlackScarab", "AA_BlackSpelopede", "AA_BlackSpider", "AA_BloodShrimp", "AA_MammothWorm", "AA_MegaLouse", "AA_RaptorShrimp", "AA_Ravager", "AA_Thermadon", // AA Lisks "AA_Animalisk", "AA_Blizzarisk", "AA_Cinderlisk", "AA_Dunealisk", "AA_Feralisk", "AA_Junglelisk", "AACP_AnimaMegaspider", "PW_Ariados", "PW_Beedrill", "PW_Butterfree", "PW_Caterpie", "PW_Heracross", "PW_Kakuna", "PW_Ledian", "PW_Ledyba", "PW_Metapod", "PW_Paras", "PW_Parasect", "PW_Pineco", "PW_Pinsir", "PW_Scizor", "PW_Scyther", "PW_Spinarak", "PW_Venomoth", "PW_Venonat", "PW_Weedle", "PW_Yanma", "Meganeura", "Spiderant", ], name: "ArthropodOvipositorAnimal".to_string(), anus: "InsectAnus".to_string(), f_breasts: "".to_string(), m_breasts: "".to_string(), f_genitals: "OvipositorF".to_string(), m_genitals: "OvipositorM".to_string(), tag: "Chitin".to_string(), sex_drive: "1".to_string(), gendered: true, egg_implant: true, }, RaceGroup { races: vec![ "VAECaves_InsectoidHulk", "WMH_KikimoreQueen", ], name: "ArthropodOvipositorHornyAnimal".to_string(), anus: "InsectAnus".to_string(), f_breasts: "".to_string(), m_breasts: "".to_string(), f_genitals: "OvipositorF".to_string(), m_genitals: "OvipositorM".to_string(), tag: "Chitin".to_string(), sex_drive: "1.5".to_string(), gendered: true, egg_implant: true, }, ] }