code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<ThingDef ParentName="OrganicProductBase">
		<defName>MoyoMilk</defName>
		moyo milk
		<description>Milk from a moyo. tainted with traces of deepblue.</description>
		<graphicData>
			<graphicClass>Graphic_StackCount</graphicClass>
			<texPath>Things/Milk/Moyo</texPath>
		</graphicData>
		<socialPropernessMatters>true</socialPropernessMatters>
		<statBases>
			<MarketValue>7.0</MarketValue>
			<Mass>0.045</Mass>
			<MaxHitPoints>60</MaxHitPoints>
			<Flammability>0.2</Flammability>
			<Nutrition>0.4</Nutrition>
			<FoodPoisonChanceFixedHuman>0.01</FoodPoisonChanceFixedHuman>
		</statBases>
		<comps>

				<daysToRotStart>8</daysToRotStart>
				<rotDestroys>true</rotDestroys>

		</comps>
		<ingestible>
			<maxNumToIngestAtOnce>1</maxNumToIngestAtOnce>
			<optimalityOffsetHumanlikes>16</optimalityOffsetHumanlikes>
			<preferability>RawTasty</preferability>
			<foodType>AnimalProduct, Fluid</foodType>
			<outcomeDoers>

					<hediffDef>ShallowBlue</hediffDef>
					<severity>0.015</severity>

			</outcomeDoers>
		</ingestible>
		<thingCategories>

AnimalProductRaw

		</thingCategories>
	</ThingDef>

	<HediffDef>
		<defName>ShallowBlue</defName>
		shallow blue
		<description>A substance found in moyo milk comparable to a light DeepBlue taint in their milk.</description>
		<descriptionHyperlinks>
			<ThingDef>MoyoMilk</ThingDef>

		</descriptionHyperlinks>
		<defaultLabelColor>(0.55,0.55,0.80)</defaultLabelColor>
		<scenarioCanAdd>false</scenarioCanAdd>
		<maxSeverity>1.0</maxSeverity>
		<isBad>false</isBad>
		<hediffClass>HediffWithComps</hediffClass>
		<comps>

				<severityPerDay>-0.01</severityPerDay>
				<showHoursToRecover>true</showHoursToRecover>

		</comps>
		<stages>

				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.005</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.005</offset>

						<capacity>Metabolism</capacity>
						<offset>0.005</offset>

						<capacity>Breathing</capacity>
						<offset>0.005</offset>

				</capMods>

				<minSeverity>0.13</minSeverity>
				<restFallFactor>0.99</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.01</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.01</offset>

						<capacity>Metabolism</capacity>
						<offset>0.009</offset>

						<capacity>Breathing</capacity>
						<offset>0.007</offset>

				</capMods>

				<minSeverity>0.25</minSeverity>
				<restFallFactor>0.98</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.02</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.015</offset>

						<capacity>Metabolism</capacity>
						<offset>0.01</offset>

						<capacity>Breathing</capacity>
						<offset>0.009</offset>

				</capMods>

				<minSeverity>0.50</minSeverity>
				<restFallFactor>0.97</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.05</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.01</offset>

						<capacity>Metabolism</capacity>
						<offset>0.015</offset>

						<capacity>Breathing</capacity>
						<offset>0.01</offset>

				</capMods>

				<minSeverity>0.70</minSeverity>
				<restFallFactor>0.96</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.08</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.017</offset>

						<capacity>Metabolism</capacity>
						<offset>0.025</offset>

						<capacity>Breathing</capacity>
						<offset>0.015</offset>

				</capMods>

				<minSeverity>0.85</minSeverity>
				<restFallFactor>0.95</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.12</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.02</offset>

						<capacity>Metabolism</capacity>
						<offset>0.05</offset>

						<capacity>Breathing</capacity>
						<offset>0.02</offset>

				</capMods>

				<minSeverity>0.9</minSeverity>
				<restFallFactor>0.94</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.15</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.04</offset>

						<capacity>Metabolism</capacity>
						<offset>0.075</offset>

						<capacity>Breathing</capacity>
						<offset>0.04</offset>

				</capMods>

				<minSeverity>0.95</minSeverity>
				<restFallFactor>0.93</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.17</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.07</offset>

						<capacity>Metabolism</capacity>
						<offset>0.1</offset>

						<capacity>Breathing</capacity>
						<offset>0.07</offset>

				</capMods>

				<minSeverity>1.0</minSeverity>
				<restFallFactor>0.92</restFallFactor>
				<capMods>

						<capacity>BloodFiltration</capacity>
						<offset>0.2</offset>

						<capacity>BloodPumping</capacity>
						<offset>0.1</offset>

						<capacity>Metabolism</capacity>
						<offset>0.15</offset>

						<capacity>Breathing</capacity>
						<offset>0.1</offset>

				</capMods>

		</stages>
	</HediffDef>

	<RecipeDef>
		<defName>Distill_MoyoMilk</defName>
		distill moyo milk
		<description>distill moyo milk into Abyss Serum.</description>
		<jobString>distilling moyo milk.</jobString>
		<workAmount>350</workAmount>
		<workSpeedStat>DrugSynthesisSpeed</workSpeedStat>
		<workSkill>Intellectual</workSkill>
		<effectWorking>Cook</effectWorking>
		<soundWorking>Recipe_CookMeal</soundWorking>
		<allowMixingIngredients>false</allowMixingIngredients>

		<recipeUsers>

DrugLab

CraftingSpot

		</recipeUsers>
		<ingredients>

				<filter>
					<thingDefs>

MoyoMilk

					</thingDefs>
				</filter>
				<count>5</count>

		</ingredients>
		<products>
			<AbyssSerum>1</AbyssSerum>
		</products>
		<researchPrerequisite>DeepBlue_Research</researchPrerequisite>
		<skillRequirements>
			<Intellectual>8</Intellectual>
		</skillRequirements>
		<bulkRecipeCount>4</bulkRecipeCount>
	</RecipeDef>
</Defs>

path: Content/Mods/Moyo/Moyo Milk.xml


code:
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
	<Operation Class="PatchOperationFindMod">
		<mods>

Moyo-From the depth

		</mods>
		<match Class="PatchOperationSequence">

			<operations>

					<xpath>Defs/BodyDef[defName = "Moyo_Pressurepod" or defName = "Moyo_Hexapod"]/corePart/parts/li[def = "Genitals" or def = "Chest" or def = "Anus"]</xpath>

					<xpath>Defs/BodyDef[defName = "Moyo_Pressurepod"]/corePart/parts</xpath>
					<value>

							<def>MechGenitals</def>
							<coverage>0.001</coverage>
							<depth>Inside</depth>

					</value>

					<xpath>Defs/BodyDef[defName = "Moyo_Hexapod"]/corePart/parts/li[def = "Hexapod_TentacleJoint"]/parts/li[def = "Hexapod_Tentacle"]</xpath>
					<value>
						<parts>

								<def>MechGenitals</def>
								<coverage>0.001</coverage>
								<depth>Inside</depth>
								<groups>

Tentacle1

								</groups>

						</parts>
					</value>

			</operations>
		</match>
	</Operation>
</Patch>

repo_name: AsmodeusRex/rjw

license: mit


code:
<?xml version="1.0" encoding="utf-8" ?>
<Patch>
	<Operation Class="PatchOperationSequence">
		<operations>

				<xpath>Defs/PawnKindDef[defName="ReviaRaceMarauder"]</xpath>
				<attribute>Name</attribute>
				<value>ReviaRaceMarauder_Standard</value>

				<xpath>Defs/FactionDef[defName="ReviaMarauderFaction"]/pawnGroupMakers/li[2]/options</xpath>
				<value>
					<ReviaRaceMarauder_Herm>1</ReviaRaceMarauder_Herm>
				</value>

				<xpath>Defs/FactionDef[defName="ReviaMarauderFaction"]/pawnGroupMakers/li[3]/options</xpath>
				<value>
					<ReviaRaceMarauder_Herm>1</ReviaRaceMarauder_Herm>
				</value>

				<xpath>Defs/FactionDef[defName="ReviaMarauderFaction"]/pawnGroupMakers/li[4]/options</xpath>
				<value>
					<ReviaRaceMarauder_Herm>2</ReviaRaceMarauder_Herm>
				</value>

				<xpath>Defs/FactionDef[defName="ReviaMarauderFaction"]/pawnGroupMakers/li[5]/options</xpath>
				<value>
					<ReviaRaceMarauder_Herm>4</ReviaRaceMarauder_Herm>
				</value>

				<xpath>Defs/PawnKindDef[defName="ReviaRaceTemplar"]</xpath>
				<attribute>Name</attribute>
				<value>ReviaRaceTemplar_Standard</value>

				<xpath>Defs/FactionDef[defName="ReviaTemplarFaction"]/pawnGroupMakers/li[2]/options</xpath>
				<value>
					<ReviaRaceTemplar_Herm>1</ReviaRaceTemplar_Herm>
				</value>

				<xpath>Defs/FactionDef[defName="ReviaTemplarFaction"]/pawnGroupMakers/li[kindDef="Peaceful"]/options</xpath>
				<value>
					<ReviaRaceTemplar_Herm>1</ReviaRaceTemplar_Herm>
				</value>

				<xpath>Defs/FactionDef[defName="ReviaTemplarFaction"]/pawnGroupMakers/li[kindDef="Trader"]/guards</xpath>
				<value>
					<ReviaRaceTemplar_Herm>2</ReviaRaceTemplar_Herm>
				</value>

				<xpath>Defs/FactionDef[defName="ReviaTemplarFaction"]/pawnGroupMakers/li[kindDef="Settlement"]/options</xpath>
				<value>
					<ReviaRaceTemplar_Herm>5</ReviaRaceTemplar_Herm>
				</value>

		</operations>
	</Operation>
</Patch>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<PawnKindDef ParentName="ReviaRaceMarauder_Standard">
		<defName>ReviaRaceMarauder_Herm</defName>
		<combatPower>40</combatPower>
	</PawnKindDef>

	<PawnKindDef ParentName="ReviaRaceTemplar_Standard">
		<defName>ReviaRaceTemplar_Herm</defName>
		<combatPower>40</combatPower>
	</PawnKindDef>

	<PawnKindDef ParentName="RJW_NymphStandard">
		<defName>Nymph_ReviaRaceMarauder</defName>
		nymph
		<combatPower>30</combatPower>
		<race>ReviaRaceAlien</race>
	</PawnKindDef>

	<PawnKindDef ParentName="RJW_NymphStandard">
		<defName>Nymph_ReviaRaceMarauder_Herm</defName>
		nymph
		<combatPower>30</combatPower>
		<race>ReviaRaceAlien</race>
	</PawnKindDef>
</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
	<rjw.RaceGroupDef Name="RJW_Revia_Standard">
		<defName>Revia_Fox_Girl_Race</defName>
		<raceNames>

ReviaRaceAlien

		</raceNames>
		<anuses>

Petite_FoxGirls_Anus

		</anuses>
		<femaleBreasts>

Petite_FoxGirls_Breasts

		</femaleBreasts>
		<femaleGenitals>

Petite_FoxGirls_Vagina

		</femaleGenitals>
		<maleBreasts>

Breasts

		</maleBreasts>
		<maleGenitals>

DogPenis

		</maleGenitals>
		<tags>

Fur

		</tags>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef ParentName="RJW_Revia_Standard">
		<defName>Revia_Fox_Girl_Race_Herm</defName>
		<raceNames Inherit="false" />
		<pawnKindNames>

ReviaRaceMarauder_Herm

ReviaRaceTemplar_Herm

Nymph_ReviaRaceMarauder_Herm

		</pawnKindNames>
		<hasSingleGender>true</hasSingleGender>
	</rjw.RaceGroupDef>

</Defs>


code:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>

	<rjw.RaceGroupDef>
		<defName>VGE_SterileInsect</defName>
		<raceNames>

GR_ParagonInsectoid

GR_Bearscarab

GR_Boombeetle

GR_Chickenspider

GR_Muffalopede

GR_Wolfscarab

GR_Spidercat

GR_Manscarab

		</raceNames>
		<anuses>

InsectAnus

		</anuses>
		<femaleBreasts />
		<femaleGenitals>

OvipositorF

		</femaleGenitals>
		<maleBreasts />
		<maleGenitals>

OvipositorM

		</maleGenitals>
		<tags>

Chitin

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechabear</defName>
		<raceNames>

GR_Mechabear

		</raceNames>
		<anuses>

MammalianAnus

		</anuses>
		<femaleBreasts>

MammalBreasts

		</femaleBreasts>
		<femaleGenitals>

MammalVagina

		</femaleGenitals>
		<maleGenitals>

BearPenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechbovine</defName>
		<raceNames>

GR_Mechalope

GR_Mechamuffalo

		</raceNames>
		<anuses>

MammalianAnus

		</anuses>
		<femaleBreasts>

UdderBreasts

		</femaleBreasts>
		<femaleGenitals>

BovineVagina

		</femaleGenitals>
		<maleGenitals>

BovinePenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechachicken</defName>
		<raceNames>

GR_Mechachicken

		</raceNames>
		<anuses>

CloacalAnus

		</anuses>
		<femaleBreasts />
		<femaleGenitals>

CloacalVagina

		</femaleGenitals>
		<maleGenitals>

CloacalPenis

		</maleGenitals>
		<maleBreasts />
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechaspider</defName>
		<raceNames>

GR_Mechaspider

		</raceNames>
		<anuses>

InsectAnus

		</anuses>
		<femaleBreasts />
		<femaleGenitals>

OvipositorF

		</femaleGenitals>
		<maleBreasts />
		<maleGenitals>

OvipositorM

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mecharat</defName>
		<raceNames>

GR_Mecharat

		</raceNames>
		<anuses>

MammalianAnus

		</anuses>
		<femaleBreasts>

MammalBreasts

		</femaleBreasts>
		<femaleGenitals>

MammalVagina

		</femaleGenitals>
		<maleGenitals>

RodentPenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechaturtle</defName>
		<raceNames>

GR_Mechaturtle

		</raceNames>
		<anuses>

CloacalAnus

		</anuses>
		<femaleBreasts />
		<femaleGenitals>

CloacalVagina

		</femaleGenitals>
		<maleBreasts />
		<maleGenitals>

TurtlePenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechawolf</defName>
		<raceNames>

GR_Mechawolf

		</raceNames>
		<anuses>

MammalianAnus

		</anuses>
		<femaleBreasts>

MammalBreasts

		</femaleBreasts>
		<femaleGenitals>

DogVagina

		</femaleGenitals>
		<maleGenitals>

DogPenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechathrumbo</defName>
		<raceNames>

GR_Mechathrumbo

		</raceNames>
		<anuses>

DragonAnus

		</anuses>
		<femaleBreasts />
		<femaleGenitals>

DragonVagina

		</femaleGenitals>
		<maleBreasts />
		<maleGenitals>

DragonPenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechacat</defName>
		<raceNames>

GR_Mechacat

		</raceNames>
		<anuses>

CatAnus

		</anuses>
		<femaleBreasts>

MammalBreasts

		</femaleBreasts>
		<femaleGenitals>

CatVagina

		</femaleGenitals>
		<maleGenitals>

CatPenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>

	<rjw.RaceGroupDef>
		<defName>VGE_Mechahorse</defName>
		<raceNames>

GR_Mechahorse

		</raceNames>
		<anuses>

MammalianAnus

		</anuses>
		<femaleBreasts>

MammalBreasts

		</femaleBreasts>
		<femaleGenitals>

BovineVagina

		</femaleGenitals>
		<maleGenitals>

HorsePenis

		</maleGenitals>
		<tags>

Robot

		</tags>
		<hasFertility>false</hasFertility>
		<hasPregnancy>false</hasPregnancy>
	</rjw.RaceGroupDef>
</Defs>


code:
* Moved ATK Gnollmorph to feline group
* Added build script


code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loadFolders>
	<v1.3>

Content/Base

Content/Mods/VGE

Content/Mods/Milk

Content/Mods/Moyo

Content/Mods/Revia

	</v1.3>
	<v1.4>

Content/Base

Content/Mods/VGE

Content/Mods/Milk

Content/Mods/Moyo

Content/Mods/Revia

	</v1.4>
</loadFolders>


code:
# RJW Race Support
Provides RJW compatibility for a wide array of mods that add races and animals.

The base RJW mod automatically patches most races in a way that works, but your cat-girls by default will only have normal human genitalia. This mod fixes that, giving the appropriate anatomy to animals and people from numerous mods.

Download: https://gitgud.io/AsmodeusRex/rjw-race-support/-/releases/permalink/latest/downloads/rjw-race-support.zip

This mod requires RJW and must be placed somewhere below it.

## Supported Mods
* [Add Elona Imouto Race](https://steamcommunity.com/sharedfiles/filedetails/?id=1863723112)
* [Add Elona Shoujo](https://steamcommunity.com/sharedfiles/filedetails/?id=1500213859)
* [Alpha Animals](https://steamcommunity.com/sharedfiles/filedetails/?id=1541721856)
* [Ancient Species](https://steamcommunity.com/sharedfiles/filedetails/?id=2154569778)
* [Androids](https://steamcommunity.com/sharedfiles/filedetails/?id=2889326293)
* [Anima Animals - Community Pack](https://steamcommunity.com/sharedfiles/filedetails/?id=2488975583)
* [Angels and Devils](https://steamcommunity.com/sharedfiles/filedetails/?id=2048192285)
* [Animal Collab Project](https://steamcommunity.com/sharedfiles/filedetails/?id=2208467668)
* [Antinium (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2209261976)
* [Apini Playable Race, Continued](https://steamcommunity.com/workshop/filedetails/?id=2204437968)
* [Arachne Race (Continued)](https://steamcommunity.com/workshop/filedetails/?id=2571931604)
* [Archotech Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2500371387)
* [Argonians of Blackmarsh (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2263851875)
* [Astoriel](https://steamcommunity.com/sharedfiles/filedetails/?id=1342510409)
* [Barky's Lupaios Race Pack](https://steamcommunity.com/sharedfiles/filedetails/?id=1718452287)
* [Beast Man Tribes](https://steamcommunity.com/sharedfiles/filedetails/?id=1119191638)
* [Beetle People (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2568676996)
* [-Black Widows (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2243686995)
* [+Borderlands: The Rim](https://steamcommunity.com/sharedfiles/filedetails/?id=1911170462)
* [Cactaceae (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2025692982)
* [Call of Cthulhu - Elder Things](https://steamcommunity.com/sharedfiles/filedetails/?id=882126182)
* [Call of Cthulhu - Cosmic Horrors](https://steamcommunity.com/sharedfiles/filedetails/?id=765890823)
* [Call of Cthulhu - Cults](https://steamcommunity.com/sharedfiles/filedetails/?id=815039373)
* [-Callistans (Legacy)](https://steamcommunity.com/sharedfiles/filedetails/?id=1545178908)
* [-Callistan Robotics](https://steamcommunity.com/sharedfiles/filedetails/?id=1661171313)
* [Dinosauria](https://steamcommunity.com/workshop/filedetails/?id=1136958577)
* [Dragon's Descent](https://steamcommunity.com/workshop/filedetails/?id=2026992161)
* [Drow Race Continued](https://steamcommunity.com/sharedfiles/filedetails/?id=2012718526)
* [Emperor of Dragon](https://steamcommunity.com/sharedfiles/filedetails/?id=2033332545)
* [Equiums II](https://steamcommunity.com/sharedfiles/filedetails/?id=2878904290)
* [Erin's Palamutes](https://steamcommunity.com/sharedfiles/filedetails/?id=2485624026)
* [FCP Stupid Sexy Deathclaws](https://steamcommunity.com/sharedfiles/filedetails/?id=2635389101)
* [Fantasy Goblins Updated](https://steamcommunity.com/sharedfiles/filedetails/?id=2011680079)
* [Feles - Felines of the Rim](https://steamcommunity.com/sharedfiles/filedetails/?id=2690125435)
* [Filthy Orc Invasion (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2178698397)
* [-Forgotten Realms](https://steamcommunity.com/sharedfiles/filedetails/?id=2184183669)
* [Gods of Elona](https://steamcommunity.com/sharedfiles/filedetails/?id=1505332648)
* [Half Dragons](https://steamcommunity.com/sharedfiles/filedetails/?id=2556121262)
* [Hisa Faction](https://steamcommunity.com/sharedfiles/filedetails/?id=1617772184)
* [Horrors (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2036315072)
* [House Maid Nukos](https://steamcommunity.com/sharedfiles/filedetails/?id=1418683071)
* [Ikquan Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2489566052)
* [kemomimihouse](https://steamcommunity.com/sharedfiles/filedetails/?id=2075974335)
* [+Kenshi Hiver Race](https://steamcommunity.com/sharedfiles/filedetails/?id=1840737944)
* [+Kenshi Skeleton Race](https://steamcommunity.com/sharedfiles/filedetails/?id=1841876651)
* [Kijin Race 3.0](https://steamcommunity.com/sharedfiles/filedetails/?id=2884551646)
* [Kilhn Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2025689796)
* [Klickmala Race (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2806331695)
* [Kolra's Oni Race Mod (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2411504950)
* [Kurin HAR Edition](https://steamcommunity.com/workshop/filedetails/?id=2326430787)
* [Lapelli Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2025057326)
* [Lizardmen (Continued)](https://steamcommunity.com/workshop/filedetails/?id=2777768013)
* [Lighter Than Fast](https://steamcommunity.com/sharedfiles/filedetails/?id=1240656304)
* [Lliscean](https://steamcommunity.com/sharedfiles/filedetails/?id=2124019366)
* [Megafauna](https://steamcommunity.com/workshop/filedetails/?id=1055485938)
* [Mincho, The Mint Choco Slime ~ HAR ver.](https://steamcommunity.com/sharedfiles/filedetails/?id=2477501851)
* [-Moyo-From the depth](https://steamcommunity.com/sharedfiles/filedetails/?id=2182305386)
* [NewRatkinPlus](https://steamcommunity.com/sharedfiles/filedetails/?id=1578693166)
* [Nexomon](https://steamcommunity.com/sharedfiles/filedetails/?id=2764736074)
* [Ni'Hal](https://steamcommunity.com/sharedfiles/filedetails/?id=1541567184)
* [Nyaron Race](https://steamcommunity.com/sharedfiles/filedetails/?id=1854376306)
* [Oni of the Rim](https://steamcommunity.com/sharedfiles/filedetails/?id=2891432261)
* [Ooka Miko](https://steamcommunity.com/sharedfiles/filedetails/?id=1536817379)
* [Orassans](https://steamcommunity.com/sharedfiles/filedetails/?id=1541519487)
* [Pawnbold Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2104039874)
* [Poleepkwa Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2557294864)
* [Protogen! Marley Race Mod](https://steamcommunity.com/sharedfiles/filedetails/?id=1716136868)
* [Rabbie The Moonrabbit race](https://steamcommunity.com/sharedfiles/filedetails/?id=1837246563)
* [Race to the Rim](https://steamcommunity.com/sharedfiles/filedetails/?id=2325478123)
* [Rakkle 1.4 (unofficial update)](https://steamcommunity.com/sharedfiles/filedetails/?id=2584844208)
* [Raptor Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2566540065)
* [Rimcraft](https://steamcommunity.com/workshop/filedetails/?id=1686288212)
* [RimWorld - Witcher Monster Hunt](https://steamcommunity.com/sharedfiles/filedetails/?id=2008529522)
* [Royal Thrumbos (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2846919540)
* [Save Our Ship 2](https://steamcommunity.com/workshop/filedetails/?id=1909914131)
* [ShadowRimRaces](https://steamcommunity.com/sharedfiles/filedetails/?id=2444008208)
* [Skrix - An Insect-like Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2267078474)
* [SYR Harpy](https://steamcommunity.com/sharedfiles/filedetails/?id=2092823139)
* [SYR Naga](https://steamcommunity.com/sharedfiles/filedetails/?id=1539971494)
* [SYR Thrumkin](https://steamcommunity.com/sharedfiles/filedetails/?id=2017359567)
* [The GiantRace](https://steamcommunity.com/sharedfiles/filedetails/?id=2270904535)
* [Tree People (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2568676212)
* [Twi'lek Race (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2263363126)
* [Tyrannosaur Race](https://steamcommunity.com/sharedfiles/filedetails/?id=2567384337)
* [Vanilla Animals Expanded](https://steamcommunity.com/workshop/filedetails/?id=1884025115)
* [Vanilla Genetics Expanded](https://steamcommunity.com/sharedfiles/filedetails/?id=2801160906)
* [Vulpes - Adorable Foxes!](https://steamcommunity.com/sharedfiles/filedetails/?id=2174717519)
* [Vulpine Race Pack (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2263865049)
* [Wa! Skeleton! (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2159119022)
* [+Warhammer: Daemonettes](https://steamcommunity.com/sharedfiles/filedetails/?id=1659631711)
* [+Warhammer: Fimir](https://steamcommunity.com/sharedfiles/filedetails/?id=1953175950)
* [+Warhammer: Gor](https://steamcommunity.com/sharedfiles/filedetails/?id=1669073318)
* [+Warhammer"ish":Dryad](https://steamcommunity.com/sharedfiles/filedetails/?id=1694750191)
* [Adeptus Xenobiologis: Orkoids](https://steamcommunity.com/workshop/filedetails/?id=1541518264/)
* [Xenohumans - Anthromorphs](https://steamcommunity.com/sharedfiles/filedetails/?id=2349467636)
* [Yokai](https://steamcommunity.com/sharedfiles/filedetails/?id=1532938687)
* [Zabrak Race (Continued)](https://steamcommunity.com/sharedfiles/filedetails/?id=2263389593)

## Plans
* Maintain
### Mod support
* VFE insects
* FCP dogmeat
* Alpha mythology
* Avali
### Test and improve
* Race to the rim
* Dragon's descent crossbreeding

## Thanks
* Ed86 (for Maintaining RJW)
* Glitched Securitron (Preview image)
* Mlie (for keeping so many of these mods alive)
* purplepenguinonion (PokeWorld support)
* MewTopian (for the expansion on RaceSupport)
* DarkSlayerEX (for Traits and Breeders Charm)
* ShauaPuta (Adding Support for their Races, Age Patches)
* Zimtraucher (Megafauna)
* Dark Heretek (Dinosauria)
* rea_jak (Several Race Supports)
* Dahimena (Several Race Supports)
* AnimeScholar (Emperor of Dragon)
* ShauaPuta (Several Race Supports, and his mod)
* Ki_Tarn (Butts)
* Indolent Cat
* Xayrlenk
* Gremilcar (Milk patches)
* Némonian (Textures)
* Caisy Rose (ReGrowth Animals support)
* Natsu_Zirok (Translation Russian)
* AlexDuKaNa (Xenohumans Race Support)
* 𝕶𝖚𝖗𝖔 𝖓𝖔 𝕶𝖊𝖎𝖞𝖆𝖐𝖚𝖘𝖍𝖆 (some races or mods)
* Nejarrie (some races or mods)
* jhagatai (Translation Korean)
* fns (updating Kemomimihouse support)
* Malla (ShadowRim support)
* Mobile Kek Suit (SoS2 Hologram Race Support)
* Hawkeye32 (Some Patches)
* Caufendra Sunclaws (Milk Patches)
* Stormy Rain (Race to the Rim Egg support)

Others that I have not mentioned here.


code:
Set-Location generator
cargo run
Set-Location ..
Copy-Item -Path About/,Content/,LoadFolders.xml,ReadMe.md,changelog.txt -Destination D:\SteamLibrary\steamapps\common\RimWorld\Mods


code:
11.4.1
-Moved ATK Gnollmorph to feline group
-Added build script

11.4.0
-Added deploy script
-Fixed LoadFolders for Revia and Moyo
-Added changelogs to release page

11.3.3
-Added support for DLC races

11.3.2
-Hotfixed Gods of Elona, Ooka miko, KMH

11.3.1
-Fixed Emperor of dragon, Gods of elona, Ooka miko, and kemomimihouse
-Added support for insect girls

11.3.0
-Fixed some viviparous species laying chicken eggs
-Added PokeWorld support
-Improved VAE Caves support

11.2.7
-Fixed Androids race support

11.2.6
-Improved Yokai and AACP support
-Fixed Giant Race
-Removed outdated Nam' Hellhound and Epona support

11.2.5
-Fixed horses not having equine anus
-Fixed race support for Adeptus Xenobiologis: Orkoids
-Removed support for dead Simple Ogre and Momu races

11.2.4
-Fixed an error from HAR apparel support
-Added genderless slime animal group
-Tweaked COC Byakhee race

11.2.3
-Added defs for missing vanilla races

11.2.2
-Beast Man Tribes improvements
-Removed colonist milking from insect and reptile people
-Removed trait stuff as it does not fit the mod's scope

11.2.1
-Removed janky support for AvP
-Removed support for Cribby's Avians
-Fixed some issues with Alpha Animals
-Fixed ACP Red Panda and Megascorpion
-Witcher Monster Hunt improvements
-Archotech group improvements
-Insect person improvements
-Thrumbo group improvements

11.2.0
-1.4 update
-Changed old Forsakens Fauna defs to Alpha Animals
-Fixed some incorrectly ordered defs

11.1.0
-Changed lots of rote and error prone xml defs into a Rust script that generates the files
-Fixed lots of typos
-Removed lots of uses of the "Generic" parts
-Removed dead and unused xmls
-Shuffled around a ton of xmls to be more intuitive and similar to the structure rjw uses

11.0.0
-Takeover by AsmodeusRex.
-Cleaned up lots of formatting and spelling issues.
-Updated support for many mods.
-Reworked most species to be more correct or lore-friendly.
-Removed redundant or outdated support modules
-Removed the single existing hybrid support module pending a more complete solution
-Added support for VE Genetics
-Restored rat gestation time
-Feles - Felines of the Rim support

10.2.0
-Race to the Rim Egg support (Stormy Rain)
-Removed all disabled content

10.1.0
-Merged redraster commits

10.0.0
-Removed several useful patches that do not patch races to Ab Patches.
-Removed Breeders Delight to Ab Patches.
-Removed some patches entirely.
-Cleanup.

9.9.0
-Warhammer Dryad support (ShauaPuta)
-SoS2 Support update (Mobile Kek Suit)
-Disabled several patches {enough fixing other peoples mods}
-Changed Vanilla Animal Support into a Patch
-Clean up

9.8.0
-Arthropods update (ShauaPuta)
-Skrix Race support (ShauaPuta)
-Korean translation upade (jhagatai)

9.7.0
-Mark Steam Milkable colonists incompatible.
-Kobold Milk Patch (Caufendra Sunclaws)
-Argonian Milk Patch (Caufendra Sunclaws)
-Protogen Milk Patch (Caufendra Sunclaws)
-PawnBold Milk Patch (Caufendra Sunclaws)

9.6.0
-Kurin Milk Patch
-Rabbie Milk Patch
-Bun Race Milk Patch (Hawkeye32)
-Ferian Mil Patch (Hawkeye32)

9.5.0
-SoS2 Hologram Race Support (not for Proper Spawn method but rather Dev mode type spawning.)
-Updating and Clean up of Files.
-RatKin Milk patch.

9.4.1
-conditional loading for some folders (Avali and Avians)

9.4.0
-ShadowRim Race Support
-Merged Ed86's changes adding Egg support for Avians and Avali.

9.3.1
-Clean up.

9.3.0
-Xenohumans - Anthromorphs Milk Support.

9.2.2
-update Fogotten realms support
-Marked PC as incompatible

9.2.1
-Update Kemomimihouse Support.

9.2.0
-Infertile Immortals show 0% Fertility

9.1.2
-More Milk Patch sillyness.

9.1.1
-Update Llisceans PawnKind

9.1.0
-Remade the Milk patch. Maybe it works now ?

9.0.4
-Fixed typo in Elder Things Race Support (only affected Unified XML Export)

9.0.3
-Fix Mac Paths

9.0.2
-Fixed Folder strucuter of one Patch set

9.0.1
-Fixed Typo caused by Git bug

9.0.0
-Korean (by: jhagatai)
-Updated Revia Patch
-Updated Milk patch to work better ?
-Fixed Ovipore Private Parts ?
-removed Textures
-Changed folder structure
-Relocated the (3x2) Table

8.10.4
-Better catch all Milk Patch ?
-Changed Revia to no longer spawn Geared Nymphs

8.10.3
-Fix Trait Value patch?

8.10.2
-More cleanup
-Increased Kijin Sex Drive

8.10.1
-Fixed ID detection for SYR Traits

8.10.0
-()()Cribby's Avians()() Race Support
-SYR Traits Mod support
-Editied some patches to be cleaner

8.9.1
-Template clarity update
-Folder structure change

8.9.0
-update ReadMe for contribution
-Added Template file in Contributor content

*Nejarrie
-updated AlphaAnimals Race Support
-added more animals to EarLike Animals
-Palamute Race Support
-Nexomon Race Support

8.8.1
-Clean up and downsizing
-Mincho support update

8.8.0
-Added Angels and Devils Race Support
-Added Rape AI to RoM Vampire Shadow Tentacle monster (maybe it works ?)
-cleaned up code of Race Supports

*ShauaPuta
-Updated WaSkeleton Race Support
*Nejarrie
-Genetic Rim Race Support

8.7.0
-Change Arachne to Birth Young and not use eggs
-cleaned up Androids race Support file
-cleaned up Kolra Oni race support file

 *𝕶𝖚𝖗𝖔 𝖓𝖔 𝕶𝖊𝖎𝖞𝖆𝖐𝖚𝖘𝖍𝖆 (added support for)
-Beetle People
-Epona The centaur Race
-Fantasy Goblin
-The Giant Race
-Nam' Hellhounds Race
-Jello People Race
-Simple Ogre Race
-Tyrannosaur Race
-Raptor Race
-Zabrak Race
-Twi'lek Race
-Momu Race
-Ikquan Race
-Warhammer: Fimir

8.6.0
-Kenshi Support typo fix
-Arthropods Race Support update (ShuaPuta)

*Nejarrie
-Race to the Rim Support
-Updated Magical Menagerie Support
-Updated Alpha Animals Support
-Added Support for some VE stuff

8.5.2
-Giant Milk patch
-Incompatible warnings update
-Revia increased support (Herms are rare but are possible, also Nymphs are out for your booty)
-Eldar Milk Fix ?

8.5.1
-changed traits to use spectrum fields (saves will magically lose the existing traits)
-Xenohumans Race Support
-Changed all Pistols to Pistils (this may cause some Genitals to disapear and have to manually be restored)

8.5.0
-Added support for [Grouped Pawns Lists] for the RJW Brothel Tab

8.4.0
-Caisy Rose (ReGrowth Animals support [merged])
-Natsu_Zirok (Translation Russian + Typo fixes [merged])

8.3.3
-fixed typo in Orc female genitals assignment
-Oglis Orks are fungus and have no sex need or RJW parts, they have other ways to reproduce. If you install parts on them they should still be able to get pregnant and impregnate.
-Got rid of moyo patch error (real fix later)

8.3.2
-Moyo milk redone
-Can now turn Moyo milk into DeepBlue serum in drug lab (crafting spot for low tech people) requires research to make DeepBlue serum
-Nyaron BasePawn fix
-Oglis 40k Orks support maybe (needs changes maybe)?

8.3.1
-Rename some files
-Orassan Milk Patch
-CuteBold Milk Patch

8.3.0
-Part props and Typo Fixes(ShuaPuta).
-Cleaning
-Moyo Milk Support

8.2.2
-Kemomimihouse patch updates
-marked real faction guest incompatible as it can disterbe pregnancy
-Fixed Ferian and Lapelli issues maybe
-if milkable colonists is loaded patch races with milk

8.2.1
-updated rjw-ex plug patch to match latest rjw-ex
-waa skeleton race support ?

8.2.0
-Moyo Mechanoids patch
-Disabled the Breeder charm Race patch
-Updated to match latest HAR code for RJW-Ex wear Apperal patch
-Moved all Orassan RJW Support to the Orassans mod

8.1.2
Bovine Penis multi surgery bow require bovine penis and the label is fixed

8.1.1
-New hediffs Descriptions by ShauaPuta
-Rimcraft Races by ShauaPuta
-A few fixes

8.1.0
-Rakkle big tiddy snake girl race
-More horse people added to the Equims race support
-Roaly Thrumbo race support
-big donged horses ?

8.0.1
-Hybrids (Humans, Orassan, Nyaron, Nukos) Fixed ?
-Added Moyo Race Support
-Added Vulpes Race Support
-Fixed Ewok typo
-improved a few patches

8.0.0
-Test Hybrids (Humans, Orassan, Nyaron, Nukos)
-Nyaron Animation Tail Fix

7.8.1
-Reduced rat gestation to 7 days.

7.8.0
-Folder structure
-Version support
-potential fix for surgery
-If Animatioons is loaded patches.

7.7.4
-Fixed Engi Race (LTF)
-Fixed Aerofleet (AA)
-Added Flat Preset
-Refined Protogen Race Support

7.7.3
-fixed the space elves again
-LTF race support (by ShuaPuta)

7.7.2
-support Ancient Species the race mod
-disabled a number of patches dealing with Races Spawn values and Life stages and litter sizes (these started off as patches taken from BnC when the mod was having many issues working with many lists in 1.0) in favor of the patches in several Children or Pregnancy mods.

7.7.1
-fixed large breastss Display issue
-Avali Dino penis is now gone

7.7.0
-added changelog
-tweak breeders delight
-added length and width to custom parts
-mist men now get parts and gender
-Kijin hot Spring grants 10% fertility


code:
Write-Output "Wait! Did you update LATEST_CHANGELOG?"
pause

$l = ".\LATEST_CHANGELOG"
$c = ".\changelog.txt"
$m = "Update to " + $args[0]

Write-Output ("Deploying version " + $args[0])

$a = Get-Content $l
$b = $a | ForEach-Object { "* " + $_ }
$b | Set-Content $l

Write-Output $b

$(
	($args[0])
	($a | ForEach-Object { "-" + $_ })
	("")
	(Get-Content $c -Raw)
) | Set-Content $c

git add $l $c
git commit -q -m $m
git tag $args[0]
git push origin $args[0]


code:
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3

[[package]]
name = "generator"
version = "1.0.0"


code:
[package]
name = "generator"
version = "1.0.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]


code:
use std::fs::File;
use std::io::{self, Write};

mod parts;
mod racegroups;
mod surgery;
mod things;

use parts::*;
use racegroups::*;
use surgery::*;
use things::*;

const CONTENT_PATH: &str = "../Content/Base/Defs/Generated/";

fn write(path: &'static str, data: &String) -> io::Result<()> {
	std::fs::DirBuilder::new().recursive(true).create(CONTENT_PATH).unwrap();
	let mut f = File::create(format!("{CONTENT_PATH}{path}.xml"))?;
	let s = format!("<?xml version=\"1.0\" encoding=\"utf-8\"?>
<!-- This is an automatically generated file. If you are the end user, this is safe to edit. If you are a contributor, please edit the source files instead. -->
<Defs>{data}</Defs>");
	f.write_all(s.as_bytes())?;
	Ok(())
}

fn main() {
	let animal_parts = part_data_animals();
	let mut animal_hediffs = String::new();
	for part in &animal_parts {
		animal_hediffs.push_str(&(construct_hediff(part, false) + "\n"));
	}

	let mut human_hediffs = String::new();
	let human_parts = part_data_humans();
	for part in &human_parts {
		human_hediffs.push_str(&(construct_hediff(part, true) + "\n"));
	}

	let (breasts, breast_hediffs) = part_data_breasts();
	let (parts, part_hediffs) = part_data_other();

	let mut raceparts = String::new();
	let mut thingdefs = String::new();
	let mut surgeries = String::new();
	for part in animal_parts.iter().chain(human_parts.iter()).chain(breasts.iter()).chain(parts.iter()) {
		raceparts.push_str(&(construct_racepart(part) + "\n"));
		thingdefs.push_str(&(construct_thingdef(part) + "\n"));
		let surg = enumerate_surgeries(&part);
		for surgery in surg {
			surgeries.push_str(&(construct_surgery(&surgery) + "\n"));
		}
	}

	let mut human_races = String::new();
	for group in racegroup_data_humans() {
		human_races.push_str(&construct_racegroup(&group));
	}

	let mut animal_races = String::new();
	for group in racegroup_data_animals() {
		animal_races.push_str(&construct_racegroup(&group));
	}

	write("Hediffs_Animals", &animal_hediffs).unwrap();
	write("Hediffs_Humans", &human_hediffs).unwrap();
	write("Hediffs_Breasts", &breast_hediffs).unwrap();
	write("Hediffs_Misc", &part_hediffs).unwrap();
	write("Parts", &raceparts).unwrap();
	write("Items_BodyParts", &thingdefs).unwrap();
	write("Recipes_Surgery", &surgeries).unwrap();
	write("Races_Humanoids", &human_races).unwrap();
	write("Races_Animals", &animal_races).unwrap();
}


code:
use std::collections::HashMap;

#[derive(Clone, Copy, Debug)]
pub enum PartType {
	Anus,
	Breasts,
	Penis,
	Vagina,
}

#[derive(Clone, Debug)]
pub struct Part {
	pub part_type: PartType,
	pub name:        String,
	pub label:       String,
	pub label_noun:  String,
	pub description: String,
	pub props:   Vec<&'static str>,
}

impl Part {
	fn standard(pre: &'static str, ty: PartType, species: &'static str, desc: &'static str, props: Vec<&'static str>) -> Option<Self> {
		let mut name = species.to_owned() + match ty {
			PartType::Anus =>   "Anus",
			PartType::Breasts => return None,
			PartType::Penis =>  "Penis",
			PartType::Vagina => "Vagina",
		};
		if let Some(c) = name.get_mut(0..1) {
			c.make_ascii_uppercase();
		};

		let label_type = match ty {
			PartType::Anus =>   "anus",
			PartType::Breasts => panic!(),
			PartType::Penis =>  "penis",
			PartType::Vagina => "vagina",
		};
		let label = format!("{species} {label_type}");
		let label_noun = format!("{pre} {species} {label_type}");
		Some(Self {
			part_type: ty,
			name: name,
			label: label,
			label_noun: label_noun,
			description: desc.to_string(),
			props: props
		})
	}
}

pub fn construct_racepart(part: &Part) -> String {
	String::from(RACEPART_STRING).replace("{name}", &part.name)
}

pub fn construct_hediff(part: &Part, human: bool) -> String {
	let mut s = String::from(HEDIFF_STRING);
	let ty = match part.part_type {
		PartType::Anus =>   "Anus",
		PartType::Breasts => return "".to_string(),
		PartType::Penis =>  "Penis",
		PartType::Vagina => "Vagina",
	};
	let mut props = String::new();
	for prop in &part.props {
		props.push_str(&format!("\n\t\t\t\t\t
{prop}
"));
	}
	if human {
		props.push_str(&format!("\n\t\t\t\t\t
Humanlike
"));
	}
	let replace = HashMap::from([
		("{type}",        ty),
		("{name}",        &part.name),
		("{label}",       &part.label),
		("{label_noun}",  &part.label_noun),
		("{description}", &part.description),
		("{props}",       &props),
	]);
	for r in replace {
		s = s.replace(r.0, r.1);
	}
	s
}

const HEDIFF_STRING: &'static str = "
	<rjw.HediffDef_PartBase ParentName=\"NaturalPrivatePart{type}\">
		<defName>{name}</defName>
		{label}
		<labelNoun>{label_noun}</labelNoun>
		<description>{description}</description>
		<descriptionHyperlinks>
			<ThingDef>{name}</ThingDef>
		</descriptionHyperlinks>
		<spawnThingOnRemoved>{name}</spawnThingOnRemoved>
		<modExtensions>

				<props>{props}
				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>";

const HEDIFF_STRING_EXT: &'static str = "
	<rjw.HediffDef_PartBase ParentName=\"NaturalPrivatePart{type}\">
		<defName>{name}</defName>
		{label}
		<labelNoun>{label_noun}</labelNoun>
		<description>{description}</description>
		<descriptionHyperlinks>
			<ThingDef>{name}</ThingDef>
		</descriptionHyperlinks>
		<spawnThingOnRemoved>{name}</spawnThingOnRemoved>
		{fields}<modExtensions>

				<props>{props}
				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>\n";

const HEDIFF_STRING_BREASTS: &'static str = "
	<rjw.HediffDef_PartBase ParentName=\"{type}\">
		<defName>{name}</defName>
		{label}
		<labelNoun>{label_noun}</labelNoun>
		<description>{description}</description>
		<descriptionHyperlinks>
			<ThingDef>{name}</ThingDef>
		</descriptionHyperlinks>
		<spawnThingOnRemoved>{name}</spawnThingOnRemoved>
		{fields}<modExtensions>

				<props>{props}
				</props>

		</modExtensions>
	</rjw.HediffDef_PartBase>\n";

const RACEPART_STRING: &'static str = "
	<rjw.RacePartDef>
	<defName>{name}</defName>
	<hediffName>{name}</hediffName>
	</rjw.RacePartDef>";

pub fn part_data_animals() -> Vec<Part> {
	vec![
		// Mammals
		Part::standard("a", PartType::Penis, "bear",
			"A small penis supported by a bone.",
			vec!["Flared", "Small", "Rigid"]
		).unwrap(),
		Part::standard("a", PartType::Penis, "bovine",
			"A rather long but thin penis with large testicles.",
			vec!["Long", "Sheathed", "Thin"]
		).unwrap(),
		Part::standard("a", PartType::Vagina, "bovine",
			"A rather thin and deep vagina, likely belonging to a large mammal.",
			vec!["Tight", "Deep"]
		).unwrap(),
		Part::standard("a", PartType::Anus, "dog",
			"A canine anus.",
			vec![]
		).unwrap(),
		Part::standard("a", PartType::Penis, "dino",
			"A large tapered penis that is slightly flattened at the top. It looks similar to a large tongue.",
			vec!["Girthy", "Tapered", "Internal"]
		).unwrap(),
		Part::standard("an", PartType::Penis, "elephant",
			"A large and flexible prehensile penis.",
			vec!["Girthy", "Long", "Prehensile", "Sheathed"]
		).unwrap(),
		Part::standard("an", PartType::Vagina, "elephant",
			"The deep vagina of a female elephant.",
			vec!["Deep"]
		).unwrap(),
		Part::standard("a", PartType::Anus, "feline",
			"A feline anus.",
			vec!["Tight"]
		).unwrap(),
		Part::standard("a", PartType::Penis, "monkey",
			"A very thin, but otherwise humanoid-looking penis.",
			vec!["Thin"]
		).unwrap(),
		Part::standard("a", PartType::Penis, "pig",
			"A corkscrew shaped penis.",
			vec!["Long", "Sheathed", "Thin"]
		).unwrap(),
		Part::standard("a", PartType::Vagina, "pig",
			"The foldy vagina of a female pig.",
			vec!["Tight"]
		).unwrap(),
		Part {
			part_type:   PartType::Penis,
			name:        "MammalPenis".to_string(),
			label:       "mammal penis".to_string(),
			label_noun:  "a mammalian penis".to_string(),
			description: "A generic mammalian animal's penis.".to_string(),
			props:       vec![],
		},
		Part {
			part_type:   PartType::Vagina,
			name:        "MammalVagina".to_string(),
			label:       "mammal vagina".to_string(),
			label_noun:  "a mammalian vagina".to_string(),
			description: "A generic vagina that probably belongs to some mammal.".to_string(),
			props:       vec![],
		},
		Part {
			part_type:   PartType::Anus,
			name:        "MammalAnus".to_string(),
			label:       "mammal anus".to_string(),
			label_noun:  "a mammalian anus".to_string(),
			description: "A generic mammalian animal's anus.".to_string(),
			props:       vec![],
		},
		Part {
			part_type:   PartType::Anus,
			name:        "CervineAnus".to_string(),
			label:       "cervine anus".to_string(),
			label_noun:  "a deer anus".to_string(),
			description: "A deer's anus.".to_string(),
			props:       vec![],
		},
		Part {
			part_type:   PartType::Anus,
			name:        "HorseAnus".to_string(),
			label:       "equine anus".to_string(),
			label_noun:  "an quine anus".to_string(),
			description: "An anus shaped like a doughnut.".to_string(),
			props:       vec![],
		},
		Part {
			part_type:   PartType::Vagina,
			name:        "HyenaVagina".to_string(),
			label:       "hyena pseudo-penis".to_string(),
			label_noun:  "a hyena pseudo-penis".to_string(),
			description: "The clitoris of the female spotted hyena is enlarged into a pseudo-penis, through which the female urinates and reproduces. It can even get erect!".to_string(),
			props:       vec!["Barbed", "Deep"],
		},
		Part {
			part_type:   PartType::Penis,
			name:        "MarinePenis".to_string(),
			label:       "marine penis".to_string(),
			label_noun:  "a marine mammal penis".to_string(),
			description: "A girthy, retractable penis that tapers to a point; it likely belongs to a seal, walrus, or hippo.".to_string(),
			props:       vec!["Girthy", "Internal", "Tapered"],
		},
		Part {
			part_type:   PartType::Vagina,
			name:        "MarineVagina".to_string(),
			label:       "marine vagina".to_string(),
			label_noun:  "a marine mammal vagina".to_string(),
			description: "A slippery vagina.".to_string(),
			props:       vec!["Loose"],
		},
		// Non-Mammals
		Part::standard("a", PartType::Penis, "cactoid",
			"A rough plant-like penis, with thorns along the shaft.",
			vec!["Barbed", "Ridged"]
		).unwrap(),
		Part::standard("a", PartType::Vagina, "cactoid",
			"A rough plant-like vagina, with thorns lining the inner walls. The thorns grip male genitals during sex.",
			vec!["Barbed", "Ridged"]
		).unwrap(),
		Part::standard("a", PartType::Anus, "cactoid",
			"A rough plant-like anus. No thorns this time.",
			vec!["Barbed", "Ridged"]
		).unwrap(),
		Part::standard("a", PartType::Penis, "turtle",
			"A large penis with a huge flare at the tip.",
			vec!["Flared", "Girthy", "Internal", "Long"]
		).unwrap(),
		Part {
			part_type:   PartType::Penis,
			name:        "AedeagusPenis".to_string(),
			label:       "aedeagus".to_string(),
			label_noun:  "an aedeagus".to_string(),
			description: "The phallus of a male arthropod, for excreting a spermatophore to inseminate a female arthropod.".to_string(),
			props:       vec!["Rigid"],
		},
		Part {
			part_type:   PartType::Vagina,
			name:        "OviporeVagina".to_string(),
			label:       "ovipore".to_string(),
			label_noun:  "an ovipore".to_string(),
			description: "A pore-like sexual organ of a female arthropod for receiving a spermatophore. Very loosely comparable to a vagina.".to_string(),
			props:       vec!["Rigid"],
		},
		Part {
			part_type:   PartType::Penis,
			name:        "AntherPenis".to_string(),
			label:       "anther".to_string(),
			label_noun:  "a flower's anther".to_string(),
			description: "A flower's male reproductive organ. A long and thin filament, with a large pollen-producing head in the tip.".to_string(),
			props:       vec!["Long", "Thin"],
		},
		Part {
			part_type:   PartType::Vagina,
			name:        "PistilVagina".to_string(),
			label:       "pistil".to_string(),
			label_noun:  "a flower's pistil".to_string(),
			description: "A flower's female reproductive organ. The sticky entrance is connected to the ovaries via a long tube-like structure.".to_string(),
			props:       vec![],
		},
		Part {
			part_type:   PartType::Penis,
			name:        "TentaclePenis".to_string(),
			label:       "tentacles".to_string(),
			label_noun:  "reproductive tentacles".to_string(),
			description: "A mass of tentacle-like penises, capable of both restraining and pleasuring.".to_string(),
			props:       vec!["Long", "Multiple", "Prehensile"],
		},
		Part {
			part_type:   PartType::Penis,
			name:        "VinePenis".to_string(),
			label:       "vines".to_string(),
			label_noun:  "a mass of vines".to_string(),
			description: "A mass of vines where a penis would be.".to_string(),
			props:       vec!["Long", "Multiple", "Prehensile", "Thin"],
		},
	]
}

pub fn part_data_humans() -> Vec<Part> {
	vec![
		Part::standard("a", PartType::Penis, "necro",
			"A disgusting, rotting penis that somehow still works.",
			vec![]
		).unwrap(),
		Part::standard("a", PartType::Vagina, "necro",
			"A disgusting, rotting vagina. Its insides are as cold as a grave.",
			vec!["Loose"]
		).unwrap(),
		Part::standard("a", PartType::Anus, "necro",
			"A disgusting, rotting anus. Its insides are as cold as a grave.",
			vec!["Loose"]
		).unwrap(),
		Part::standard("an", PartType::Penis, "elf",
			"A thinner and longer humanlike penis. Is that glitter?",
			vec!["Long", "Thin"]
		).unwrap(),
		Part::standard("an", PartType::Vagina, "elf",
			"A tighter humanlike vagina. Tastes like oranges.",
			vec!["Tight"]
		).unwrap(),
		Part::standard("an", PartType::Anus, "elf",
			"A tighter humanlike anus. Smells of flowers.",
			vec!["Tight"]
		).unwrap(),
		Part::standard("a", PartType::Penis, "golem",
			"A rough and jagged stone-like penis.",
			vec!["Rigid", "Solid"]
		).unwrap(),
		Part::standard("an", PartType::Penis, "ghoul",
			"A humanlike penis that glows slightly. It's very hot to the touch.",
			vec!["Glowing"]
		).unwrap(),
		Part::standard("a", PartType::Vagina, "ghoul",
			"A humanlike vagina that glows slightly. It is uncomfortably hot inside.",
			vec!["Glowing"]
		).unwrap(),
		Part::standard("a", PartType::Anus, "ghoul",
			"An anus that glows slightly. It is uncomfortably hot inside.",
			vec!["Glowing"]
		).unwrap(),
		Part::standard("an", PartType::Penis, "orc",
			"A girthy penis with a preputial ring, but otherwise similar to a humanoid penis.",
			vec!["Girthy"]
		).unwrap(),
		Part::standard("an", PartType::Vagina, "orc",
			"A loose humanlike vagina with very large lips.",
			vec!["Loose"]
		).unwrap(),
		Part::standard("an", PartType::Anus, "orc",
			"An anus that looks like a mix between an humanlike anus and an equine anus.",
			vec!["Loose"]
		).unwrap(),
		Part {
			part_type:   PartType::Penis,
			name:        "TreePenis".to_string(),
			label:       "bark penis".to_string(),
			label_noun:  "a wooden penis".to_string(),
			description: "A naturally grown wooden penis. The testicles are completely covered in hard, wooden bark, while the texture along the shaft is softer, leaving the tip uncovered.".to_string(),
			props:       vec!["Ridged", "Rigid"],
		},
		Part {
			part_type:   PartType::Vagina,
			name:        "TreeVagina".to_string(),
			label:       "bark vagina".to_string(),
			label_noun:  "a wooden vagina".to_string(),
			description: "A naturally grown wooden vagina. While the outside looks like bark, the inside is soft.".to_string(),
			props:       vec!["Ridged", "Rigid"],
		},
		Part {
			part_type:   PartType::Anus,
			name:        "TreeAnus".to_string(),
			label:       "bark anus".to_string(),
			label_noun:  "a wooden anus".to_string(),
			description: "A naturally grown wooden anus. While the outside looks like bark, the inside is soft.".to_string(),
			props:       vec!["Ridged", "Rigid"],
		},
	]
}

pub fn part_data_breasts() -> (Vec<Part>, String) {
	let breasts = vec![
		(Part {
			part_type:   PartType::Breasts,
			name:        "MammalBreasts".to_string(),
			label:       "mammal breasts".to_string(),
			label_noun:  "a pair of mammalian breasts".to_string(),
			description: "A group of breasts/nipples that mammals use to suckle their young.".to_string(),
			props:       vec![],
		}, "MammalBreastBase", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "CatBreasts".to_string(),
			label:       "kitty titties".to_string(),
			label_noun:  "the kitty's titties".to_string(),
			description: "It's the kitty's titties!".to_string(),
			props:       vec![],
		}, "MammalBreastBase", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "GhostBreasts".to_string(),
			label:       "immaterial breasts".to_string(),
			label_noun:  "a pair of immaterial breasts".to_string(),
			description: "A translucent, almost intangible pair of breasts. Touching them sends chills down the spine.".to_string(),
			props:       vec!["Humanlike"],
		}, "NaturalPrivatePartBreast", Some(
			"<FluidType>Ecto</FluidType>\n\t\t"
		)),
		(Part {
			part_type:   PartType::Breasts,
			name:        "CactoidBreasts".to_string(),
			label:       "cactoid breasts".to_string(),
			label_noun:  "a pair of cactoid breasts".to_string(),
			description: "A pair of rough plant-like breasts, with thorns all around them, and flower-like nipples.".to_string(),
			props:       vec![],
		}, "NaturalPrivatePartBreast", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "GhoulBreasts".to_string(),
			label:       "irradiated breasts".to_string(),
			label_noun:  "a pair of irradiated breasts".to_string(),
			description: "A pair of humanlike breasts that glow slightly. They're very hot to the touch.".to_string(),
			props:       vec!["Humanlike"],
		}, "NaturalPrivatePartBreast", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "NecroBreasts".to_string(),
			label:       "decayed breasts".to_string(),
			label_noun:  "A pair of decayed breasts".to_string(),
			description: "A disgusting, rotting pair of breasts.".to_string(),
			props:       vec!["Humanlike"],
		}, "NaturalPrivatePartBreast", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "OrcBreasts".to_string(),
			label:       "orc breasts".to_string(),
			label_noun:  "a pair of orc breasts".to_string(),
			description: "A pair of humanlike breasts that sag greatly.".to_string(),
			props:       vec!["Humanlike"],
		}, "NaturalPrivatePartBreast", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "ScaleBreasts".to_string(),
			label:       "scaly breasts".to_string(),
			label_noun:  "a pair of scaly breasts".to_string(),
			description: "A pair of scale-covered breasts, without nipples.".to_string(),
			props:       vec!["Humanlike"],
		}, "NaturalPrivatePartBreast", None),
		(Part {
			part_type:   PartType::Breasts,
			name:        "TreeBreasts".to_string(),
			label:       "bark breasts".to_string(),
			label_noun:  "a pair of wooden breasts".to_string(),
			description: "A pair of naturally grown wooden breasts. Hard bark covers the entire outer portion, while leaving the nipples underneath exposed.".to_string(),
			props:       vec!["Humanlike", "Ridged", "Rigid"],
		}, "NaturalPrivatePartBreast", None),
	];

	let mut hediffs = String::new();
	for breast in &breasts {
		let mut s = String::from(HEDIFF_STRING_BREASTS);
		let mut props = String::new();
		for prop in &breast.0.props {
			props.push_str(&format!("\n\t\t\t\t\t
{prop}
"));
		}
		let fields = breast.2.unwrap_or("");
		let replace = HashMap::from([
			("{type}",        breast.1),
			("{name}",        &breast.0.name),
			("{label}",       &breast.0.label),
			("{label_noun}",  &breast.0.label_noun),
			("{description}", &breast.0.description),
			("{fields}",      &fields),
			("{props}",       &props),
		]);
		for r in replace {
			s = s.replace(r.0, r.1);
		}
		hediffs.push_str(&s);
	}
	(breasts.into_iter().map(|x| x.0).collect(), hediffs)
}

pub fn part_data_other() -> (Vec<Part>, String) {
	let parts = vec![
		(Part {
			part_type:   PartType::Penis,
			name:        "GhostPenis".to_string(),
			label:       "immaterial penis".to_string(),
			label_noun:  "an immaterial penis".to_string(),
			description: "A translucent, almost intangible penis. Touching it sends chills down the spine.".to_string(),
			props:       vec!["Humanlike"],
		}, "<FluidType>Ecto</FluidType>\n\t\t".to_string() ),
		(Part {
			part_type:   PartType::Vagina,
			name:        "GhostVagina".to_string(),
			label:       "immaterial vagina".to_string(),
			label_noun:  "an immaterial vagina".to_string(),
			description: "A translucent, almost intangible vagina. Penetrating it sends chills down the spine.".to_string(),
			props:       vec!["Humanlike"],
		}, "<FluidType>Ecto</FluidType>\n\t\t".to_string() ),
		(Part {
			part_type:   PartType::Anus,
			name:        "GhostAnus".to_string(),
			label:       "immaterial anus".to_string(),
			label_noun:  "an immaterial anus".to_string(),
			description: "A translucent, almost intangible anus. Penetrating it sends chills down the spine.".to_string(),
			props:       vec!["Humanlike"],
		}, "<FluidType>Ecto</FluidType>\n\t\t".to_string() ),
		(Part {
			part_type:   PartType::Vagina,
			name:        "DemonTentaclesF".to_string(),
			label:       "demon tentacle".to_string(),
			label_noun:  "a female demon tentacle".to_string(),
			description: "A long and flexible tentacle, capable of laying eggs.".to_string(),
			props:       vec!["Long", "Prehensile"],
		}, "<produceEggs>true</produceEggs>
		<minEggTick>12000</minEggTick>
		<maxEggTick>60000</maxEggTick>
		<FluidType>GR_EldritchInsectJelly</FluidType>\n\t\t".to_string() ),
	];

	let mut hediffs = String::new();
	for part in &parts {
		let mut s = String::from(HEDIFF_STRING_EXT);
		let ty = match part.0.part_type {
			PartType::Anus =>   "Anus",
			PartType::Breasts => panic!(),
			PartType::Penis =>  "Penis",
			PartType::Vagina => "Vagina",
		};
		let mut props = String::new();
		for prop in &part.0.props {
			props.push_str(&format!("\n\t\t\t\t\t
{prop}
"));
		}
		let replace = HashMap::from([
			("{type}",        ty),
			("{name}",        &part.0.name),
			("{label}",       &part.0.label),
			("{label_noun}",  &part.0.label_noun),
			("{description}", &part.0.description),
			("{fields}",      &part.1),
			("{props}",       &props),
		]);
		for r in replace {
			s = s.replace(r.0, r.1);
		}
		hediffs.push_str(&s);
	}
	(parts.into_iter().map(|x| x.0).collect(), hediffs)
}


code:
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}

		</{tag}>")
}

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 => "<oviPregnancy>true</oviPregnancy>\n\t\t<ImplantEggs>true</ImplantEggs>\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<hasSingleGender>{}</hasSingleGender>", !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 = "
	<rjw.RaceGroupDef>
		<defName>{name}</defName>
		<raceNames>{races}
		</raceNames>
		{anus}
		{f_breasts}
		{f_genitals}
		{m_breasts}
		{m_genitals}
		{tag}
		{fields}<raceSexDrive>{sex_drive}</raceSexDrive>{gendered}
	</rjw.RaceGroupDef>\n";

pub fn racegroup_data_humans() -> Vec<RaceGroup> {
	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, werewolves, etc
		RaceGroup::standard(
			"CanineHighSex",
			vec![
				"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(
			"FelineHighSex",
			vec![
				"ATK_Gnollmorph",
			],
			"Fur", "1.3", 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",
			],
			"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<RaceGroup> {
	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"),
		),
		RaceGroup::standard_animal(
			"Orc",
			vec![
				"OG_Squig",
				"OG_Squig_Eatin",
				"OG_Squig_Oily",
				"OG_Snotling",
			],
			"Skin", "1", false,
			"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",
				"WasteRat",
				"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(
			"Tree",
			vec![
				"Dryad_Barkskin",
				"Dryad_Basic",
				"Dryad_Berrymaker",
				"Dryad_Carrier",
				"Dryad_Clawer",
				"Dryad_Gaumaker",
				"Dryad_Medicinemaker",
				"Dryad_Woodmaker",
				"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,
			"",
			"Tree",
			("Tree", "Tree"),
		),
		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",
				"Toxalope",
				"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,
		},
	]
}


code:
use std::collections::HashMap;

use crate::parts::{Part, PartType};

#[derive(Clone, Copy, Debug)]
struct Operation {
	surgery_type: &'static str,
	verbs: (&'static str, &'static str, &'static str),
}

#[derive(Clone, Debug)]
pub struct Surgery {
	part: Part,
	operation: Operation,
}

const SURGERY_STRING: &str = "
	<RecipeDef ParentName=\"{type}\">
		<defName>{type}{name}</defName>
		{verb.0} {label}
		<description>{verb.1} {label_noun}</description>
		<jobString>{verb.2} {label_noun}</jobString>
		<ingredients>

				<filter>
					<categories>

Medicine

					</categories>
				</filter>
				<count>1</count>

				<filter>
					<thingDefs>

{name}

					</thingDefs>
				</filter>
				<count>1</count>

		</ingredients>
		<fixedIngredientFilter>
			<categories>

Medicine

			</categories>
			<thingDefs>

{name}

			</thingDefs>
		</fixedIngredientFilter>
		<addsHediff>{name}</addsHediff>
	</RecipeDef>";

const BREAST_SURGERIES: [Option<Operation>;3] = [
	Some(Operation{
		surgery_type: "MultiBreast",
		verbs: ("add", "Adds", "Adding"),
	}),
	Some(Operation{
		surgery_type: "BreastSurgery",
		verbs: ("attach", "Attaches", "Attaching"),
	}),
	None
];

const PENIS_SURGERIES: [Option<Operation>;3] = [
	Some(Operation{
		surgery_type: "FutaMakingF",
		verbs: ("add", "Adds", "Adding"),
	}),
	Some(Operation{
		surgery_type: "MultiPenis",
		verbs: ("add", "Adds", "Adding"),
	}),
	Some(Operation{
		surgery_type: "SexReassignmentP",
		verbs: ("attach", "Attaches", "Attaching"),
	})
];

const VAGINA_SURGERIES: [Option<Operation>;3] = [
	Some(Operation{
		surgery_type: "FutaMakingM",
		verbs: ("add", "Adds", "Adding"),
	}),
	Some(Operation{
		surgery_type: "MultiVagina",
		verbs: ("add", "Adds", "Adding"),
	}),
	Some(Operation{
		surgery_type: "SexReassignmentV",
		verbs: ("attach", "Attaches", "Attaching"),
	})
];

const ANUS_SURGERIES: [Option<Operation>;3] = [
	Some(Operation{
		surgery_type: "MultiAnus",
		verbs: ("add", "Adds", "Adding"),
	}),
	Some(Operation{
		surgery_type: "AnalSurgery",
		verbs: ("attach", "Attaches", "Attaching"),
	}),
	None
];

pub fn enumerate_surgeries<'a>(part: &Part) -> Vec<Surgery> {
	// Every part should have 2-3 relevant surgeries
	let surgeries = match part.part_type {
		PartType::Anus => ANUS_SURGERIES,
		PartType::Breasts => BREAST_SURGERIES,
		PartType::Penis => PENIS_SURGERIES,
		PartType::Vagina => VAGINA_SURGERIES,
	};

	surgeries.iter().filter(|x| x.is_some()).map(|operation|
		Surgery {
			part: part.clone(),
			operation: operation.unwrap()
		}
	).collect()
}

pub fn construct_surgery(surgery: &Surgery) -> String {
	let mut s = String::from(SURGERY_STRING);
	let replace = HashMap::from([
		("{type}",       surgery.operation.surgery_type),
		("{verb.0}",     surgery.operation.verbs.0),
		("{verb.1}",     surgery.operation.verbs.1),
		("{verb.2}",     surgery.operation.verbs.2),
		("{name}",       &surgery.part.name),
		("{label}",      &surgery.part.label),
		("{label_noun}", &surgery.part.label_noun),
	]);
	for r in replace {
		s = s.replace(r.0, r.1);
	}
	s
}


code:
use std::collections::HashMap;

use crate::parts::{Part, PartType};

const THINGDEF_STRING: &str = "
	<ThingDef ParentName=\"rjw_BodyPartNaturalBase{type}\">
		<defName>{name}</defName>
		<label>{label}</label>
		<description>{description}</description>
		<statBases>
			<MarketValue>{value}</MarketValue>
			<Mass>{mass}</Mass>
		</statBases>
	</ThingDef>";

pub fn construct_thingdef(part: &Part) -> String {
	let mut s = String::from(THINGDEF_STRING);

	let ty = match part.part_type {
		PartType::Anus =>    "Anus",
		PartType::Breasts => "Breast",
		PartType::Penis =>   "GenMale",
		PartType::Vagina =>  "GenFemale",
	};

	let mass = match part.part_type {
		PartType::Anus =>    0.12,
		PartType::Breasts => 0.5,
		PartType::Penis =>   0.16,
		PartType::Vagina =>  0.10,
	};

	let mut mass_mult = 1.;

	for prop in &part.props {
		match *prop {
			// positive
			"Long" =>     mass_mult += 0.5,
			"Girthy" =>   mass_mult += 0.5,
			"Deep" =>     mass_mult += 0.3,
			"Knotted" =>  mass_mult += 0.1,
			"Solid" =>    mass_mult += 1.,
			"Multiple" => mass_mult += 0.2,
			// negative
			"Thin" =>    mass_mult -= 0.3,
			"Small" =>   mass_mult -= 0.5,
			_ => {}
		}
	}

	let m = format!("{:.3}", mass * mass_mult);

	let val = match part.name.as_str() {
		// positive
		"DinoPenis" => "300",
		"DinoVagina" => "300",
		"TentaclePenis" => "350",
		// negative
		"OviporeVagina" => "50",
		"AedeagusPenis" => "50",
		_ => "250",
	};

	let replace = HashMap::from([
		("{type}",        ty),
		("{name}",        &part.name),
		("{label}",       &part.label),
		("{description}", &part.description),
		("{value}",       val),
		("{mass}",        &m),
	]);
	for r in replace {
		s = s.replace(r.0, r.1);
	}
	s
}


code:
*.bat	text eol=crlf
*.tw	text eol=lf
*.sh	text eol=lf
*.py	text eol=lf
*.txt	text eol=lf
compile	text eol=lf
compile-git	text eol=lf
sanityCheck	text eol=lf

repo_name: oxone/fc

path: .gitattributes


code:
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
*.swp
*.swo

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# IPython Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# dotenv
.env

# virtualenv
venv/
ENV/

# Spyder project settings
.spyderproject

# Rope project settings
.ropeproject

# Start.tw
src/config/start.tw

# eslint
.eslintrc.js
node_modules
package-lock.json
package.json

# misc
fc-pregmod
*.outline
*.todo
TODO.txt

path: .gitignore