code:
package com.lilithsthrone.game.character.race;

import java.util.List;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.Attribute;
import com.lilithsthrone.game.character.body.valueEnums.LegConfiguration;
import com.lilithsthrone.game.combat.Attack;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.0
 * @version 0.2.11
 * @author Innoxia
 */
public enum Race {

	NONE("none",
			"none",
			Colour.RACE_HUMAN,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(Attack.MAIN),
			0.5f,
			1,
			1,
			Attribute.DAMAGE_HUMAN,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			false),

	// HUMAN:
	HUMAN("human",
			"human",
			Colour.RACE_HUMAN,

			Disposition.CIVILIZED,
			Util.newArrayListOfValues(Attack.MAIN),

			0.5f,
			1,

			1,
			Attribute.DAMAGE_HUMAN,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			false) {
		@Override
		public boolean isBestialPartsAvailable() {
			return false;
		}
	},

	// ANGEL:
	ANGEL("angel",
			"angel",
			Colour.CLOTHING_WHITE,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPELL),
			0.25f,
			1,

			1,
			Attribute.DAMAGE_ANGEL,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			false),

	// DEMON:
	DEMON("demon",
			"demonic-horse",
			Colour.RACE_DEMON,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.SPECIAL_ATTACK,
					Attack.SEDUCTION,
					Attack.SPELL),
			0.75f,
			2,

			3,
			Attribute.DAMAGE_DEMON,
			FurryPreference.MAXIMUM,
			FurryPreference.MAXIMUM,
			false) {
		public String getName(GameCharacter character, boolean bestial) {
			if(bestial) {
				Race r = character.getLegType().getRace();
				return character.getLegConfiguration()!=LegConfiguration.BIPEDAL
						?r==Race.DEMON
							?"demonic-horse"
							:"demonic-"+r.getName(bestial)
						:"demon";
			}
			return "demon";
		}
	},

	// BOVINES:
	COW_MORPH("cow-morph",
			"cow",
			Colour.RACE_COW_MORPH,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			1,
			Attribute.DAMAGE_COW_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	// CANINES:
	DOG_MORPH("dog-morph",
			"dog",
			Colour.RACE_DOG_MORPH,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(Attack.MAIN),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_DOG_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	WOLF_MORPH("wolf-morph",
			"wolf",
			Colour.RACE_WOLF_MORPH,
			Disposition.SAVAGE,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_WOLF_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	FOX_MORPH("fox-morph",
			"fox",
			Colour.RACE_FOX_MORPH,
			Disposition.UNPREDICTABLE,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SEDUCTION,
					Attack.SPELL),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_FOX_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	// FELINES:
	CAT_MORPH("cat-morph",
			"cat",
			Colour.RACE_CAT_MORPH,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.SEDUCTION,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_CAT_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	// EQUINE:
	HORSE_MORPH("horse-morph",
			"horse",
			Colour.RACE_HORSE_MORPH,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			1,
			Attribute.DAMAGE_HORSE_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	 REINDEER_MORPH("reindeer-morph",
			"reindeer",
			Colour.RACE_REINDEER_MORPH,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_REINDEER_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	SQUIRREL_MORPH("squirrel-morph",
			"squirrel",
			Colour.RACE_SQUIRREL_MORPH,
			Disposition.CIVILIZED,
			Util.newArrayListOfValues(
					Attack.MAIN),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_SQUIRREL_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	RAT_MORPH("rat-morph",
			"rat",
			Colour.RACE_RAT_MORPH,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			4,
			Attribute.DAMAGE_RAT_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	RABBIT_MORPH("rabbit-morph",
			"rabbit",
			Colour.RACE_RABBIT_MORPH,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(
					Attack.SEDUCTION,
					Attack.SPECIAL_ATTACK),
			0.5f,
			2,

			8,
			Attribute.DAMAGE_RABBIT_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	BAT_MORPH("bat-morph",
			"bat",
			Colour.RACE_BAT_MORPH,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			2,
			Attribute.DAMAGE_BAT_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	ALLIGATOR_MORPH("alligator-morph",
			"alligator",
			Colour.RACE_ALLIGATOR_MORPH,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SPECIAL_ATTACK),
			0.5f,
			1,

			4,
			Attribute.DAMAGE_ALLIGATOR_MORPH,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			true),

	// SLIME:
	SLIME("slime",
			"slime",
			Colour.RACE_SLIME,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(Attack.SEDUCTION),
			0.5f,
			1,

			1,
			Attribute.DAMAGE_SLIME,
			FurryPreference.MAXIMUM,
			FurryPreference.MAXIMUM,
			false),

	// AVIAN:
	HARPY("harpy",
			"avian",
			Colour.RACE_HARPY,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(
					Attack.SEDUCTION,
					Attack.SPECIAL_ATTACK),
			0.5f,
			3,

			4,
			Attribute.DAMAGE_HARPY,
			FurryPreference.NORMAL,
			FurryPreference.NORMAL,
			false),

	// ELEMENTALS:
//	ELEMENTAL_EARTH("earth elemental",
//			"earth elementals",
//			"earth elemental",
//			"earth elemental",
//			"earth elementals",
//			"earth elementals",
//
//			Colour.SPELL_SCHOOL_EARTH,
//			Disposition.NEUTRAL,
//			Util.newArrayListOfValues(
//					Attack.MAIN,
//					Attack.SPELL),
//			0.5f,
//			1,
//			1,
//			Attribute.DAMAGE_ELEMENTAL_EARTH,
//			Attribute.RESISTANCE_ELEMENTAL_EARTH,
//			FurryPreference.MAXIMUM,
//			FurryPreference.MAXIMUM,
//			false),
//
//	ELEMENTAL_WATER("water elemental",
//			"water elementals",
//			"water elemental",
//			"water elemental",
//			"water elementals",
//			"water elementals",
//
//			Colour.SPELL_SCHOOL_WATER,
//			Disposition.NEUTRAL,
//			Util.newArrayListOfValues(
//					Attack.MAIN,
//					Attack.SPELL),
//			0.5f,
//			1,
//			1,
//			Attribute.DAMAGE_ELEMENTAL_WATER,
//			Attribute.RESISTANCE_ELEMENTAL_WATER,
//			FurryPreference.MAXIMUM,
//			FurryPreference.MAXIMUM,
//			false),
//
//	ELEMENTAL_AIR("air elemental",
//			"air elementals",
//			"air elemental",
//			"air elemental",
//			"air elementals",
//			"air elementals",
//
//			Colour.SPELL_SCHOOL_AIR,
//			Disposition.NEUTRAL,
//			Util.newArrayListOfValues(
//					Attack.MAIN,
//					Attack.SPELL),
//			0.5f,
//			1,
//			1,
//			Attribute.DAMAGE_ELEMENTAL_AIR,
//			Attribute.RESISTANCE_ELEMENTAL_AIR,
//			FurryPreference.MAXIMUM,
//			FurryPreference.MAXIMUM,
//			false),
//
//	ELEMENTAL_FIRE("fire elemental",
//			"fire elementals",
//			"fire elemental",
//			"fire elemental",
//			"fire elementals",
//			"fire elementals",
//
//			Colour.SPELL_SCHOOL_FIRE,
//			Disposition.NEUTRAL,
//			Util.newArrayListOfValues(
//					Attack.MAIN,
//					Attack.SEDUCTION,
//					Attack.SPELL),
//			0.5f,
//			1,
//			1,
//			Attribute.DAMAGE_ELEMENTAL_FIRE,
//			Attribute.RESISTANCE_ELEMENTAL_FIRE,
//			FurryPreference.MAXIMUM,
//			FurryPreference.MAXIMUM,
//			false),
//
//	ELEMENTAL_ARCANE("arcane elemental",
//			"arcane elementals",
//			"arcane elemental",
//			"arcane elemental",
//			"arcane elementals",
//			"arcane elementals",
//
//			Colour.SPELL_SCHOOL_ARCANE,
//			Disposition.NEUTRAL,
//			Util.newArrayListOfValues(
//					Attack.SEDUCTION,
//					Attack.SPELL),
//			0.5f,
//			1,
//			1,
//			Attribute.DAMAGE_ELEMENTAL_ARCANE,
//			Attribute.RESISTANCE_ELEMENTAL_ARCANE,
//			FurryPreference.MAXIMUM,
//			FurryPreference.MAXIMUM,
//			false),

	ELEMENTAL("elemental",
			"elemental",
			Colour.SPELL_SCHOOL_ARCANE,
			Disposition.NEUTRAL,
			Util.newArrayListOfValues(
					Attack.MAIN,
					Attack.SEDUCTION,
					Attack.SPELL),
			0.5f,
			1,

			1,
			Attribute.DAMAGE_ELEMENTAL,
			FurryPreference.MAXIMUM,
			FurryPreference.MAXIMUM,
			false),
	;

	/*
	 * // INSECTS: BEE_MORPH("bee-morph",
	 *
	 * "
Bee-morphs are one of the many demi-human races now populating the world."
	 * +
	 * " The vast majority of bee-morphs live outside of society in huge hives, consisting of up to 200 individuals."
	 * +
	 * " Each hive is governed by a single King or Queen bee, who commands the complete loyalty of the hive's members."
	 * +
	 * " The hive is constructed and guarded by the hive's bee-boys, who will aggressively attack anyone who strays too close.
"
	 *
	 * +
	 * "
Bee-girls are responsible for gathering nectar, which they do by fucking the many phallic demonic plants."
	 * +
	 * " Their body then transforms the nectar into honey-milk, and as it does so, the bee-girl grows incredibly horny."
	 * +
	 * " When her abdomen is swollen with honey-milk, she will return to her hive to be fucked, secreting the sweet liquid from her breasts and pussy.
"
	 *
	 * +
	 * "
Bee-morphs are only aggressive when defending their hive, and will try to avoid contact with strangers wherever possible."
	 * +
	 * " If forced into a fight, they will not hesitate to use the powerful stinger found on the end of their abdomen, the venom of which"
	 * +
	 * " will drive a person into a state of uncontrollable lust. After victory, a female bee-morph will"
	 * +
	 * " use the opportunity to deposit her eggs in the attacker, using an ovipositor located in their abdomen.
"
	 * ,
	 *
	 * "Bee-boys are very rarely seen away from their hive.",
	 *
	 * "Bee-girls can commonly be found gathering nectar near their hive.",
	 *
	 * RacialBody.BEE_MORPH, Genus.INSECT, Disposition.NEUTRAL,
	 * StatusEffect.BEE_MORPH, Utilities.newArrayListOfValues(new
	 * ListValue<Attack>(Attack.SPECIAL_ATTACK), new
	 * ListValue<Attack>(Attack.MELEE), new
	 * ListValue<Attack>(Attack.SEDUCTION)), false), ROYAL_BEE("royal bee",
	 *
	 * "
Royal bees are a humanoid monster race, and are referred to as Queen or King bees."
	 * +
	 * " A Royal bee can be found leading a colony of bee-morphs, and they almost never leave the safety of their hive."
	 * +
	 * " Their responsibility is to keep the hive functioning, and they command the complete loyalty and devotion of their colony."
	 * +
	 * " They spend most of their time seeing to the needs of the hive's bee-girls, and along with the bee-boys, fuck and pleasure the bee-girls in order to collect their honey-milk."
	 * +
	 * " Royal bees are able to convert honey-milk into royal jelly in their abdomens, which they are able to excrete as a thick, sticky cum.
"
	 *
	 * +
	 * "
Royal bees are created by transforming a bee-morph through use of Royal jelly."
	 * +
	 * " When a hive grows too large for one Royal bee to manage, a bee-morph is chosen to be transformed into a new Queen or King bee."
	 * +
	 * " The hive's current Queen or King will mate with the chosen bee-morph, forcing them to drink their Royal jelly."
	 * +
	 * " This causes the chosen bee-morph to transform into a new Royal bee, who will then leave the hive, taking about a third of the colony's members with them.
"
	 *
	 * +
	 * "
Royal bees almost never venture out of their hives, but will attack anyone that manages to break through the colony's bee-boy guards."
	 * +
	 * " Those that are foolish enough to enter an active bee hive are never heard from again. It has been speculated that such intruders are forcefully"
	 * + " transformed into another member of the hive.
",
	 *
	 * "King bees, like all royal bees, will never leave their hive.",
	 *
	 * "Queen bees, like all royal bees, will never leave their hive.",
	 *
	 * RacialBody.ROYAL_BEE, Genus.INSECT, Disposition.SAVAGE,
	 * StatusEffect.ROYAL_BEE, Utilities.newArrayListOfValues(new
	 * ListValue<Attack>(Attack.SPECIAL_ATTACK), new
	 * ListValue<Attack>(Attack.MELEE), new
	 * ListValue<Attack>(Attack.SEDUCTION)), false),
	 */

	/*
	 * TIGER_MORPH("tiger-morph",
	 *
	 * "
Tiger-morphs are a dangerous humanoid monster race, primarily found in the demonic jungle."
	 * +
	 * " Tiger-morphs are extremely aggressive, and as a result have been driven out of Dominion's society."
	 * +
	 * " They spend most of their lives as solitary hunters, and roam their territory looking for individuals to prey upon."
	 * +
	 * " Once a suitable target is found, the tiger-morph will stalk them, remaining concealed until the perfect moment to pounce."
	 * +
	 * " Any unfortunate person falling victim to a tiger-morph will not only be robbed, but will often also be subjected to extremely dominant and humiliating rape.
"
	 *
	 * +
	 * "
Tiger-morphs are always willing to assert their dominance through sex, but females will often prefer to force their prey to pleasure them orally,"
	 * +
	 * " refusing to let them penetrate her. When a magic storm hits, tiger-morphs become extremely promiscuous, and will go on a tireless lust-fuelled rampage,"
	 * + " the females now mating with whatever they can find.
",
	 *
	 * "Tiger-boys will humiliate and rape their prey.",
	 *
	 * "Tiger-girls will force their prey to pleasure them orally.",
	 *
	 * RacialBody.TIGER_MORPH, Genus.FELINE, Disposition.SAVAGE,
	 * StatusEffect.TIGER_MORPH, Utilities.newArrayListOfValues(new
	 * ListValue<Attack>(Attack.SPECIAL_ATTACK), new
	 * ListValue<Attack>(Attack.MELEE), new
	 * ListValue<Attack>(Attack.SEDUCTION)), true),
	 */

	/*
	 * CENTAUR("centaur",
	 *
	 * "
Centaurs are an unpredictable monster race that is rarely seen in Dominion."
	 * +
	 * " Centaurs are usually quite civilized, but they can get extremely territorial, and as a result they don't feel comfortable living in Dominion."
	 * +
	 * " Outside of Dominion, centaurs group up to form herds of up to fifty individuals, although they are rarely all together at once,"
	 * + " instead wandering their territory in search of intruders.
"
	 *
	 * +
	 * "
There will usually only be a handful of males in the herd, who are responsible for taking decisions on behalf of the entire herd."
	 * +
	 * " All the females are part of their harem, and are happy to submit to being bred whenever the males feel like using them."
	 * +
	 * " Centaurs consider horse-morphs as having failed to reach their full potential, and each race strongly dislikes the other.
"
	 *
	 * +
	 * "
Centaurs are very aggressive towards intruders, and will attack anyone they consider to be encroaching on their territory."
	 * +
	 * " When outside of their territory, they are quite civilized, and will prefer to avoid conflict where possible.
"
	 *
	 * +
	 * "
Male centaurs will try and impregnate anything they can catch on their territory, while the females will only want to breed with their herd's leaders."
	 * +
	 * " Centaurs get extremely affected by magic-storms, and females will sink into an extremely powerful heat, desperately seeking anyone and anything to fuck"
	 * +
	 * " her pregnant. Similarly, males will enter a powerful rut, and while under the storm's effects, their only concern is breeding as many people"
	 * + " as they can catch.
",
	 *
	 * "Male centaurs are extremely dominant, and will attack anyone on their territory."
	 * ,
	 *
	 * "Female centaurs are slightly more forgiving than their male counterparts, but will not hesitate to fight any intruders."
	 * ,
	 *
	 * RacialBody.CENTAUR, Genus.EQUINE, Disposition.UNPREDICTABLE,
	 * StatusEffect.CENTAUR, Utilities.newArrayListOfValues(new
	 * ListValue<Attack>(Attack.SPECIAL_ATTACK), new
	 * ListValue<Attack>(Attack.MELEE)), true),
	 */

	/*
	 * SLIME_QUEEN("slime queen",
	 *
	 * "
A slime queen is a dangerous monster, having lost themselves to the desire for more cum."
	 * +
	 * " Slime queens will seek to absorb other slimes into their bodies, breaking their minds and forcing them to become a part of her."
	 * +
	 * " Due to this threat, normal slimes will group together to drive off slime queens, and as a result, slime queens are typically found isolated near bodies of water they have claimed as their home."
	 * +
	 * " Whereas normal slimes are quite stupid, the slime queen is able to harness the intelligence of all the slimes she has absorbed, making her a formidable threat."
	 * +
	 * "A slime queen will wander from her home to hunt down any individual she can find."
	 * +
	 * " Once she has found a victim, she will attempt to smother and seduce her prey and then feed off of them."
	 * +
	 * " Slime queens represent a threat to all races, and as a result Lilith's Enforcers have driven them out of Dominion.
"
	 *
	 * +
	 * "
A slime queen looks like a group of slimes all huddling together, with a particularly attractive individual at the centre."
	 * +
	 * " This is an illusion however, and a closer inspection will reveal all the slimes are linked together into one slime queen."
	 * +
	 * " Each outer slime will take on the appearance of the slime that the queen absorbed, although none are permitted to be more attractive than the queen herself.
"
	 * ,
	 *
	 * "Slime queens are only ever female in appearance.",
	 *
	 * "Slime queens are only ever female in appearance.",
	 *
	 * RacialBody.SLIME_QUEEN, Genus.SLIME, Disposition.SAVAGE,
	 * StatusEffect.SLIME_QUEEN, Utilities.newArrayListOfValues(new
	 * ListValue<Attack>(Attack.SPECIAL_ATTACK), new
	 * ListValue<Attack>(Attack.SEDUCTION)), false),
	 */

	/*
	 * TENGU("tengu", INACCURATE
	 * "
Tengus are a female-only humanoid monster race." +
	 * " Unlike other monster races, tengus have not been driven out of Dominion society, but instead actively choose to live in solitude."
	 * +
	 * " They are, without exception, extremely intelligent, and have an excellent grasp of magic."
	 * +
	 * " They make their nests as high as they can, and try to avoid contact with all other races."
	 * +
	 * " When they are forced to interact with others, tengus display remarkable understanding and kindness, and will almost always avoid conflict where possible.
"
	 * ,
	 *
	 * "Tengu males look like females, but are less attractive and have a small cock."
	 * ,
	 *
	 * "Tengu females are extremely attractive and only really care about themselves."
	 * ,
	 *
	 * RacialBody.TENGU, Genus.AVIAN, Disposition.UNPREDICTABLE,
	 * StatusEffect.TENGU, Utilities.newArrayListOfValues(new
	 * ListValue<Attack>(Attack.SPECIAL_ATTACK), new
	 * ListValue<Attack>(Attack.SEDUCTION)), false);
	 */

	// TODO:
	/*
	 * NOT DONE
	 * -------------------------------------------------------------------------
	 * ------------------------------- // AQUATIC: SHARK_MORPH("shark morph",
	 * "",
	 *
	 * "Shark morphs are a humanoid race most commonly found in the city of Dominion."
	 * +
	 * " Shark morphs are typically very dominant, but can control their aggression."
	 * +
	 * " They like hanging out around bodies of water, as there is almost nothing a shark morph likes more than swimming."
	 * +
	 * " When a shark morph sees something they like, they will do anything it takes to get it."
	 * +
	 * " Male shark morphs will attempt to build a harem of females, having to beat each female he wants to claim in a fight in order to show his dominance."
	 * ,
	 *
	 * "Shark morphs are humanoid, with a human body and face." +
	 * " Their legs and arms are covered in smooth grey skin, ending at the thigh and upper arm."
	 * +
	 * " A huge shark-like tail grows from above their ass, allowing them to swim at incredible speeds."
	 * + " All shark morphs are incredibly fit from all the swimming they do."
	 * + " Shark morphs have sharp pointed teeth that they can retract at will."
	 * +
	 * " Females typically have very small breasts, streamlining them for swimming."
	 * + " Males have a shark-like cock.",
	 *
	 * "Shark morphs are easy to provoke, and are always eager to fight." +
	 * " They typically do not know any magic, and will prefer fighting using brute force."
	 * ,
	 *
	 * "Female shark morphs will typically be part of a harem, being claimed by a strong male."
	 * +
	 * " Females in a harem will only mate with their leader, unless defeated in combat by another individual."
	 * +
	 * " Each shark morph pregnancy will result in up to three shark morphs, which will rapidly reach full maturity and leave to make their own way in Dominion."
	 * ,
	 *
	 * RacialBody.SHARK_MORPH, Genus.AQUATIC, Disposition.CIVILIZED,
	 * StatusEffect.SHARK_MORPH, false, false), TIGER_SHARK("tiger shark", "",
	 *
	 * "Tiger sharks are a humanoid monster race." +
	 * " Tiger sharks are extremely dominant and aggressive, and will attack almost anything on sight."
	 * + " As a result, Tiger sharks have been driven out of Dominion society."
	 * +
	 * " Like shark morphs, they like hanging out around bodies of water, as they love swimming."
	 * +
	 * " They will sometimes lurk just beneath the water, waiting for a clueless passer-by to ambush."
	 * +
	 * " If a harem of hark morphs are foolish enough to stray from the safety of Dominion, a male Tiger shark will seek to defeat their leader and mate with all the harem's females."
	 * +
	 * " The Tiger shark will also typically forcefully transform the harem's male leader into a female shark morph before breeding her."
	 * ,
	 *
	 * "Tiger sharks are humanoid monsters, with smooth shark-like skin covering their entire bodies."
	 * +
	 * " Their stomach and breasts are a creamy-white, while the rest of their skin is grey with dark-grey stripes, like a tiger."
	 * +
	 * " A huge shark-like tail grows from above their ass, allowing them to swim at incredible speeds."
	 * +
	 * " They have an anthropomorphic shark-like face, with sharp pointed teeth that they can retract at will."
	 * +
	 * " Females typically have very small breasts, streamlining them for swimming."
	 * + " Males have a huge shark-like cock.",
	 *
	 * "Tiger sharks will attack almost anything they see." +
	 * " They typically do not know any magic, and will prefer fighting using brute force."
	 * ,
	 *
	 * "Female Tiger sharks will seek to breed with any strong male they can catch."
	 * + " Males will likewise seek to impregnate any female they see." +
	 * " Each Tiger shark pregnancy will result in up to three Tiger sharks, which will rapidly reach full maturity and leave to find a body of water to claim as their own."
	 * ,
	 *
	 * RacialBody.TIGER_SHARK, Genus.AQUATIC, Disposition.SAVAGE,
	 * StatusEffect.TIGER_SHARK, true, false);
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 * MOUSE_MORPH("mouse morph",
	 *
	 * "Mouse-morphs are one of the most common races inhabiting Dominion." +
	 * "Usually found in colonies numbering 10-20 individuals, mouse-morphs typically inhabit basements or burrows that they have dug out themselves."
	 * +
	 * "Mouse-morphs do everything as a cohesive unit with their colony, be it eating, exploring or fucking."
	 * +
	 * " Mouse-morphs are typically quite shy, preferring to avoid any sort of interaction with strangers that isn't completely necessary."
	 * +
	 * "A colony of mouse-morphs will have no clear leader, but work together as a whole to get things done."
	 * ,
	 *
	 * "The average mouse-morph is about 5' tall, and possesses youthful features and a lithe frame."
	 * +
	 * " Like the other morphs inhabiting Dominion, their face and body remain human-looking."
	 * +
	 * "A pair of mouse-like ears and a thin tail are the extremities that betray their race on first glance."
	 * +
	 * "The front teeth of most mouse-morphs are slightly larger than an average human's, although not by much."
	 * +
	 * "Their arms and legs are very delicate, especially on females, and have a soft layer of fur running up to their elbows and inner-thighs."
	 * +
	 * "The hands and feet are humanoid, but with little claws on the end of each digit, and the undersides have pads."
	 * ,
	 *
	 * "Mouse-morphs are very timid, and will usually try to run from combat when able."
	 * + "They are completely unable to harness any demon magic." +
	 * "If forced to fight, a mouse-morph will usually rely on presenting themselves as a submissive sex-toy, hoping to fog the enemies' mind with lust."
	 * ,
	 *
	 * "Mouse-morphs, along with rat-morphs, are the most prolific breeders in Dominion."
	 * +
	 * "Colonies of mouse-morphs are constantly engaged in sexual intercourse, trying to impregnate their friends."
	 * +
	 * "If an individual finds a partner outside of their colony, they will be expected to bring them back to the colony so everyone can try and breed their new partner."
	 * ,
	 *
	 * RacialBody.MOUSE_MORPH, Genus.RODENT, Disposition.CIVILIZED,
	 * StatusEffect.MOUSE_MORPH),
	 *
	 * RAT_MORPH("rat morph",
	 *
	 * "Rat-morphs are the larger and more aggressive cousins of the mouse-morph."
	 * +
	 * " Found primarily in the undercity of Submission, a rat-morph is a rare sight on the surface."
	 * +
	 * " Due to their corrupted and bestial nature, rat-morphs are considered one of the dangerous races."
	 * +
	 * " Despite this, they are the weakest of the dangerous races, and are only a threat when hunting in groups."
	 * +
	 * "Rat-morphs are aggressive, territorial and cunning, and all they ever seem to think about is breeding."
	 * +
	 * " Rat-morphs have a tendency to form gangs around a strong leader, and will submit to their commands for as long as they remain strong."
	 * +
	 * " The surface dwellers of Dominion do not tolerate their presence, and as such, rat-morphs are found almost exclusively in the undercity of Submission."
	 * +
	 * " Occasionally, a gang of rat-morphs will venture to the surface, looking for isolated individuals to overwhelm and rape."
	 * +
	 * " These unlucky victims will be claimed by the leader first, with the rest of the gang soon to follow."
	 * ,
	 *
	 * "A rat-morph usually stands at around 6\", with gang leaders typically being slightly taller."
	 * +
	 * " Rat-morphs are covered in a layer of hair, which thins out on their stomach and chest."
	 * +
	 * " Their feet and hands, although humanoid, end in little claws, and their palms and soles have soft pads."
	 * +
	 * " They possess a thick rat-like tail and their faces and ears are similarly morphed into the look of a rat."
	 * + " Females have three pairs of breasts." +
	 * " The average male cock size is 10\".",
	 *
	 * "Alone, a rat-morph is cowardly, and will likely try to avoid combat." +
	 * " If backed into a corner, however, even a solo rat-morph will fight ferociously."
	 * +
	 * " Most of the time, rat-morphs will be with their gang, and will happily seek out individuals of any species to overwhelm and rape."
	 * +
	 * " Rat-morphs cannot use magic, and will instead rely on physical attacks."
	 * ,
	 *
	 * "Rat-morphs, along with mouse-morphs, are the most prolific breeders." +
	 * "Gangs of rat-morphs are constantly engaged in sexual intercourse, trying to impregnate each other."
	 * +
	 * "Once they grow tired of fucking one another, the gang will seek out other rat-morph gangs to fight and fuck, and will sometimes even venture to the surface to breed an unlucky citizen."
	 * ,
	 *
	 * RacialBody.RAT_MORPH, Genus.RODENT, Disposition.UNPREDICTABLE,
	 * StatusEffect.RAT_MORPH),
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 *
	 * // They bully bee-girls and drink their honey-milk WASP_MORPH(
	 * "wasp morph",
	 *
	 * "Wasp morphs are aggressive monsters that inhabit the jungle." +
	 * " Unlike bee morphs, wasp morphs are exclusively male, except for the colonies' leader, which is female."
	 * +
	 * " Wasp morphs are regarded as annoying pests by every other race, and as such are driven out of Dominion and into the jungle."
	 * +
	 * " Each wasp morph is part of a colony, which will consist of up to fifty individuals, all led by a female queen."
	 * +
	 * " Wasp morphs will typically attack others on sight, but will sometimes avoid individuals that look too strong to fight."
	 * ,
	 *
	 * "Wasp morphs are humanoid monsters, covered in yellow and black chitin."
	 * +
	 * " They have a humanoid face, but have large insect-like eyes and mandibles on either side of their otherwise normal mouth."
	 * +
	 * " The most notable feature of a wasp morph is the huge yellow-and-black abdomen sprouting from above their ass."
	 * +
	 * " A pair of antennae grow from underneath their hair, which is invariably a shiny yellow and black."
	 * + " Wasp morphs have a shiny black penis, typically 12\" long.",
	 *
	 * "Like bee morphs, wasp morphs are unable to use magic, though the queen is able to use some spells."
	 * +
	 * " Wasp morphs will always use physical attacks to attempt to beat down their opponents."
	 * +
	 * " Their abdomen gives them the ability to deliver a powerful sting, which delivers a pain-inducing venom to their victims."
	 * ,
	 *
	 * "Wasp morphs reproduce by willing being filled with eggs from their queen by use of her ovipositor."
	 * +
	 * " The queen fertilises her eggs by selecting members of the colony to fuck."
	 * +
	 * " If anyone is foolish enough to trespass into the colonies' hive, the queen will invariably forcefully transform the trespasser into a wasp morph drone."
	 * ,
	 *
	 * RacialBody.WASP_MORPH, Genus.INSECT, Disposition.SAVAGE,
	 * StatusEffect.WASP_MORPH),
	 *
	 *
	 *
	 * LIZARD_MORPH("lizard morph",
	 *
	 * "Lizard morphs are a humanoid race most commonly found in the city of Dominion."
	 * +
	 * " Lizard morphs are typically very laid back, and are one of the most docile races of Dominion."
	 * +
	 * " They enjoy heat, and will spend a large portion of the day sunbathing."
	 * ,
	 *
	 * "Lizard morphs are humanoid, with a human body and face." +
	 * " Their legs and arms are covered in scaly skin, ending at the thigh and upper arm."
	 * + " A large lizard-like tail grows from above their ass." +
	 * " Females typically have small breasts." +
	 * " Males have a lizard-like cock.",
	 *
	 * "Lizard morphs are slow to anger, but will defend themselves from an attacker."
	 * +
	 * " They typically do not know any magic, and will prefer fighting using brute force or seduction."
	 * ,
	 *
	 * " Lizard morphs breed by laying eggs, that can be fertilised by any race."
	 * +
	 * " Once the eggs hatch, the new Lizard morphs will rapidly reach full maturity and leave to make their own way in Dominion."
	 * ,
	 *
	 * RacialBody.LIZARD_MORPH, Genus.REPTILE, Disposition.CIVILIZED,
	 * StatusEffect.LIZARD_MORPH), LAMIA("lamia",
	 *
	 * "Lamias are a monster found everywhere except Dominion." +
	 * " Lamias are typically very solitary, and the only time they gather is for reproduction."
	 * +
	 * " They are very dangerous and aggressive, and will attack travellers unprovoked."
	 * +
	 * " Lamias are known for using hypnotism to force their prey to do whatever they want."
	 * + " Due to this behaviour, Lamias have been forced out of Dominion.",
	 *
	 * "Lamias are humanoid/animal monsters, having a normal-looking Lizard morph upper body, but instead of legs and a tail they possess the lower body of a snake."
	 * ,
	 *
	 * "Lamias are very aggressive, and will attack anyone they consider to be encroaching on their territory."
	 * +
	 * " They typically know some spells related to mind control, and will prefer to use these and seduction rather than brute force."
	 * ,
	 *
	 * "Female Lamias will use their prey to breed with, forcing them to cum on demand by using hypnotism."
	 * + " Males will try to impregnate anyone they catch.",
	 *
	 * RacialBody.LAMIA, Genus.REPTILE, Disposition.CIVILIZED,
	 * StatusEffect.LAMIA),
	 *
	 *
	 * SPIDER_MORPH("spider morph",
	 *
	 * "Spider morphs are a humanoid race most commonly found in the city of Dominion."
	 * +
	 * " Spider morphs are a sly, tricky race, and have come close the being driven out of Dominion on several occasions due to their predatory ways."
	 * + " They like to spin webs and trick people into them." +
	 * " Once caught, they will inject their victims with venom, causing them to become filled with lust."
	 * + " They will then engage in bondage sex using their webs.",
	 *
	 * "Spider morphs are humanoid, with a human body and face." +
	 * " Their legs and arms are covered in a black chitin, ending at the thigh and upper arm."
	 * +
	 * " The most notable feature of a spider morph is the huge spider-like abdomen sprouting from above their ass."
	 * +
	 * " They have a smaller pair of eyes above their normal eyes, which are typically jet black."
	 * ,
	 *
	 * "Spider morphs are unable to use magic." +
	 * " Spider morphs will typically vary between physical attacks and attempting to seduce their opponents."
	 * +
	 * " Their spider-like abdomen gives them the ability to shoot webs at their opponents."
	 * +
	 * " They also have fangs that inject a lust-inducting venom into their prey."
	 * ,
	 *
	 * "Spider morphs reproduce by depositing eggs in a target host by use of an ovipositor."
	 * +
	 * " They will not lay their eggs in anyone without permission, but after being injected with venom, not many partners refuse."
	 * ,
	 *
	 * RacialBody.SPIDER_MORPH, Genus.ARACHNID, Disposition.CIVILIZED,
	 * StatusEffect.SPIDER_MORPH),
	 *
	 * ARACHNE("arachne",
	 *
	 * "Arachne are a monster race found in the jungle and ruins." +
	 * " Arachne are very aggressive and territorial, and as a result have been driven out of Dominion's society."
	 * +
	 * " They lurk in dark places in the jungle and ruins, waiting for passersby to ensnare in their webs."
	 * + " After catching their prey, Arachne will use them for breeding.",
	 *
	 * "Arachne are humanoid/animal monsters, having a normal-looking spider morph upper body, but instead of legs they possess the body of a spider."
	 * ,
	 *
	 * "Arachne are very aggressive, and will prey on anyone passing near their web."
	 * +
	 * " Arachne will know some spells, and will prefer fighting using magic and seduction."
	 * ,
	 *
	 * "Male Arachne will fuck anything they catch, and will keep females bound in their webs for days, continually breeding them before growing bored and dumping them in the wilderness."
	 * +
	 * " Females will deposit their eggs in whoever they catch, using their prey's cum to fertilise them beforehand."
	 * ,
	 *
	 * RacialBody.ARACHNE, Genus.ARACHNID, Disposition.SAVAGE,
	 * StatusEffect.ARACHNE),
	 *
	 *
	 * WYVERN("wyvern",
	 *
	 * "Wyverns are a humanoid race most commonly found in the city of Dominion."
	 * +
	 * " Wyverns are very arrogant, and will not tolerate any sleights against them."
	 * +
	 * " They resent being treated in a submissive manner, and will always seek to take charge of a situation."
	 * ,
	 *
	 * "Wyverns are humanoid, with a human body and face." +
	 * " The scaly arms of a Wyvern extend into large, leathery wings, giving them the ability to fly."
	 * +
	 * " Their legs are also scaly, starting at mid thigh, and their feet have claws instead of toes."
	 * +
	 * " Wyverns have a crest instead of hair, and they have a long, lizard-like tail."
	 * +
	 * " Scale colour differs from Wyvern to Wyvern, but is usually a shade of red or green."
	 * + " Females have small breasts." + " Males have a lizard-like cock.",
	 *
	 * "Wyverns are not overly aggressive, but will take action against anyone who insults them."
	 * +
	 * " They typically know  small amount of magic, and will prefer fighting using brute force and spells."
	 * ,
	 *
	 * "Wyverns breed by laying eggs that can be fertilised by any race." +
	 * " They will hate-fuck anyone they defeat in combat, with females refusing to become fertilised by what they consider inferior races."
	 * +
	 * " Once fertilised eggs hatch, the new Wyverns will rapidly reach full maturity and leave to make their own way in Dominion."
	 * ,
	 *
	 * RacialBody.WYVERN, Genus.DRAGON, Disposition.CIVILIZED,
	 * StatusEffect.WYVERN),
	 *
	 * DRAGON("dragon",
	 *
	 * "Dragons are a humanoid monster race most commonly found in the ruins." +
	 * " Dragons are extremely proud and arrogant, and will not tolerate any sleights against them."
	 * +
	 * " They are extremely dominant, and will always seek to break their foes into submission."
	 * +
	 * " Dragons are considered the single most dangerous race, as they are extremely strong, tough and intelligent."
	 * +
	 * " They inhabit buildings in the ruins, and will seek to rob travellers and accumulate a hoard of wealth."
	 * +
	 * " Dragons will take a person prisoner, using them to breed and turning them into their submissive partner."
	 * +
	 * " They will quickly replace their partner if they manage to capture a more attractive or more important individual."
	 * ,
	 *
	 * "Dragons are humanoid monsters, covered in hard scales." +
	 * " They have a huge pair of scaly and leathery wings on their back, giving them the ability to fly."
	 * + " Their feet and hands have claws on the end of their digits." +
	 * " Dragons have a crest instead of hair, and they have a long, lizard-like tail."
	 * +
	 * " Scale colour differs from Dragon to Dragon, but is usually a shade of red or green."
	 * + " Females have huge breasts." +
	 * " Males have a gigantic lizard-like cock.",
	 *
	 * "Dragons are extremely aggressive, and will attack anything that comes close to their lair."
	 * +
	 * " They typically know a large amount of magic, and will prefer fighting using brute force and spells."
	 * ,
	 *
	 * "Dragons breed by laying eggs that can be fertilised by any race." +
	 * " They will hate-fuck anyone they defeat in combat, with females refusing to become fertilised by what they consider inferior races."
	 * +
	 * " Once fertilised eggs hatch, the new Dragons will rapidly reach full maturity and leave to make their own way in the ruins."
	 * ,
	 *
	 * RacialBody.DRAGON, Genus.DRAGON, Disposition.UNPREDICTABLE,
	 * StatusEffect.DRAGON),
	 *
	 *
	 * LILIN("lilin",
	 *
	 * "Lilin are a humanoid race found everywhere." +
	 * " Lilin are physically indistinguishable from demons, as both species can alter their bodies at will."
	 * +
	 * " The main difference between the two is that Lilin are able to use far more powerful magic than regular demons, and they have the ability to create new demons."
	 * +
	 * " Their corruptive aura is also far more potent, and any creature not highly resistant to the dark passion will surrender to their will almost instantly."
	 * +
	 * " Lilin are created by Lilith's own hand, being corrupted into her deviant minions."
	 * ,
	 *
	 * "Lilin are humanoid, with a human-like face and body." +
	 * " Their skin will range in colour from dark red to a light lilac." +
	 * " Lilin can change the appearance of their bodies at will, but they will commonly have one or two pairs of horns and a thin spaded tail."
	 * +
	 * " When in succubus form, many Lilin like to morph their legs into black leather reaching up to their thighs, forming their feet into high heels."
	 * +
	 * " They often give themselves up to three pairs of breasts, each pair being at least a DD cup."
	 * +
	 * " When in Incubus form, a Lilin will take on a muscular masculine form, giving themselves a gigantic demonic cock."
	 * +
	 * " Some Lilin prefer to never leave their Succubus form, and when ready to impregnate someone, will simply grow a demonic cock above their pussy."
	 * ,
	 *
	 * "Lilin have the ability to cast extremely powerful spells, being able to corrupt people into demons."
	 * +
	 * " When in combat, a Lilin will mostly use seduction and spells in order to defeat their foe."
	 * ,
	 *
	 * "A Lilin will take on their Succubus form and seek out males of any species to breed with."
	 * +
	 * " Once they have found and seduced a suitable mate, they will present themselves to be fucked, using demonic magic to force their partner to repeatedly orgasm."
	 * +
	 * " After milking their victim of cum, they will move on to their next conquest.
"
	 * +
	 * "The cum that they gather is transformed within their bodies into their own highly corruptive and addictive seed."
	 * +
	 * " Once they have gathered enough cum, they will transform into their Incubus form and seek out a suitable female to breed."
	 * +
	 * " Having located a suitable victim, the Lilin will fuck them, filling them with their corruptive spooge."
	 * +
	 * " Such a union will more often than not result in the female birthing a litter of imps a few days later.
"
	 * +
	 * "Lilin are also able to create new demons by force-feeding them their corruptive cum over the course of a few days."
	 * ,
	 *
	 * RacialBody.DEMON, Genus.DEMON, Disposition.UNPREDICTABLE,
	 * StatusEffect.LILIN);
	 */

	private String name;
	private String nameBestial;
	private Colour colour;
	private Disposition disposition;
	private List<Attack> preferredAttacks;
	private int numberOfOffspringLow;
	private int numberOfOffspringHigh;
	private float chanceForMaleOffspring;
	private Attribute damageMultiplier;
	private FurryPreference defaultFemininePreference;
	private FurryPreference defaultMasculinePreference;
	private boolean affectedByFurryPreference;

	private Race(String name,
			String nameBestial,

			Colour colour,
			Disposition disposition,
			List<Attack> preferredAttacks,
			float chanceForMaleOffspring,
			int numberOfOffspringLow,

			int numberOfOffspringHigh,
			Attribute damageMultiplier,

			FurryPreference defaultFemininePreference,
			FurryPreference defaultMasculinePreference,
			boolean affectedByFurryPreference) {

		this.name = name;
		this.nameBestial = nameBestial;

		this.colour = colour;
		this.disposition = disposition;

		this.preferredAttacks = preferredAttacks;

		this.chanceForMaleOffspring=chanceForMaleOffspring;

		this.numberOfOffspringLow = numberOfOffspringLow;
		this.numberOfOffspringHigh = numberOfOffspringHigh;

		this.damageMultiplier = damageMultiplier;

		this.defaultFemininePreference = defaultFemininePreference;
		this.defaultMasculinePreference = defaultMasculinePreference;

		this.affectedByFurryPreference = affectedByFurryPreference;
	}

	public boolean isBestialPartsAvailable() {
		return true;
	}

	public String getName(GameCharacter character, boolean bestial) {
		if(bestial) {
			return nameBestial;
		}
		return name;
	}

	public String getName(boolean bestial) {
		if(bestial) {
			return nameBestial;
		}
		return name;
	}

	public Disposition getDisposition() {
		return disposition;
	}

	public List<Attack> getPreferredAttacks() {
		return preferredAttacks;
	}

	public int getNumberOfOffspringLow() {
		return numberOfOffspringLow;
	}

	public int getNumberOfOffspringHigh() {
		return numberOfOffspringHigh;
	}

	public Colour getColour() {
		return colour;
	}

	public boolean isAffectedByFurryPreference() {
		return affectedByFurryPreference;
	}

	public float getChanceForMaleOffspring() {
		return chanceForMaleOffspring;
	}

	/**
	 * Should only be used in Subspecies' getDamageMultiplier() method!
	 */
	public Attribute getDefaultDamageMultiplier() {
		return damageMultiplier;
	}

	public FurryPreference getDefaultFemininePreference() {
		return defaultFemininePreference;
	}

	public FurryPreference getDefaultMasculinePreference() {
		return defaultMasculinePreference;
	}

}


code:
package com.lilithsthrone.game.character.race;

import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.0
 * @version 0.2.8
 * @author Innoxia
 */
public enum RaceStage {
	/**No animal-morph parts whatsoever.

	 * "Not furry" by any standard.*/
	HUMAN("", Colour.TRANSFORMATION_HUMAN) {
		@Override
		public boolean isAntennaFurry() {
			return false;
		}
		@Override
		public boolean isArmFurry() {
			return false;
		}
		@Override
		public boolean isAssFurry() {
			return false;
		}
		@Override
		public boolean isBreastFurry() {
			return false;
		}
		@Override
		public boolean isEarFurry() {
			return false;
		}
		@Override
		public boolean isEyeFurry() {
			return false;
		}
		@Override
		public boolean isFaceFurry() {
			return false;
		}
		@Override
		public boolean isHairFurry() {
			return false;
		}
		@Override
		public boolean isHornFurry() {
			return false;
		}
		@Override
		public boolean isLegFurry() {
			return false;
		}
		@Override
		public boolean isPenisFurry() {
			return false;
		}
		@Override
		public boolean isSkinFurry() {
			return false;
		}
		@Override
		public boolean isTailFurry() {
			return false;
		}
		@Override
		public boolean isVaginaFurry() {
			return false;
		}
		@Override
		public boolean isWingFurry() {
			return false;
		}
		@Override
		public boolean isTentacleFurry() {
			return false;
		}
	},

	/**Some minor animal-morph parts.

	 * When used in GameCharacter's setBody() method, will grant only hair, ears, eyes, tail, horns, antenna, and wings (no genitalia).

	 * "Not furry" by most standards.*/
	PARTIAL("partial", Colour.TRANSFORMATION_PARTIAL) {
		@Override
		public boolean isAntennaFurry() {
			return true;
		}
		@Override
		public boolean isArmFurry() {
			return false;
		}
		@Override
		public boolean isAssFurry() {
			return false;
		}
		@Override
		public boolean isBreastFurry() {
			return false;
		}
		@Override
		public boolean isEarFurry() {
			return true;
		}
		@Override
		public boolean isEyeFurry() {
			return true;
		}
		@Override
		public boolean isFaceFurry() {
			return false;
		}
		@Override
		public boolean isHairFurry() {
			return true;
		}
		@Override
		public boolean isHornFurry() {
			return true;
		}
		@Override
		public boolean isLegFurry() {
			return false;
		}
		@Override
		public boolean isPenisFurry() {
			return false;
		}
		@Override
		public boolean isSkinFurry() {
			return false;
		}
		@Override
		public boolean isTailFurry() {
			return true;
		}
		@Override
		public boolean isVaginaFurry() {
			return false;
		}
		@Override
		public boolean isWingFurry() {
			return true;
		}
		@Override
		public boolean isTentacleFurry() {
			return false;
		}
	},

	/**All minor animal-morph parts (including genitalia).

	 * "Borderline furry" by most standards.*/
	PARTIAL_FULL("minor", Colour.TRANSFORMATION_PARTIAL_FULL) {
		@Override
		public boolean isAntennaFurry() {
			return true;
		}
		@Override
		public boolean isArmFurry() {
			return false;
		}
		@Override
		public boolean isAssFurry() {
			return true;
		}
		@Override
		public boolean isBreastFurry() {
			return true;
		}
		@Override
		public boolean isEarFurry() {
			return true;
		}
		@Override
		public boolean isEyeFurry() {
			return true;
		}
		@Override
		public boolean isFaceFurry() {
			return false;
		}
		@Override
		public boolean isHairFurry() {
			return true;
		}
		@Override
		public boolean isHornFurry() {
			return true;
		}
		@Override
		public boolean isLegFurry() {
			return false;
		}
		@Override
		public boolean isPenisFurry() {
			return true;
		}
		@Override
		public boolean isSkinFurry() {
			return false;
		}
		@Override
		public boolean isTailFurry() {
			return true;
		}
		@Override
		public boolean isVaginaFurry() {
			return true;
		}
		@Override
		public boolean isWingFurry() {
			return true;
		}
		@Override
		public boolean isTentacleFurry() {
			return false;
		}
	},

	/**All minor animal-morph parts (including genitalia), plus animal-morph arms and legs.

	 * "Low-level furry" by most standards.*/
	LESSER("lesser", Colour.TRANSFORMATION_LESSER) {
		@Override
		public boolean isAntennaFurry() {
			return true;
		}
		@Override
		public boolean isArmFurry() {
			return true;
		}
		@Override
		public boolean isAssFurry() {
			return true;
		}
		@Override
		public boolean isBreastFurry() {
			return true;
		}
		@Override
		public boolean isEarFurry() {
			return true;
		}
		@Override
		public boolean isEyeFurry() {
			return true;
		}
		@Override
		public boolean isFaceFurry() {
			return false;
		}
		@Override
		public boolean isHairFurry() {
			return true;
		}
		@Override
		public boolean isHornFurry() {
			return true;
		}
		@Override
		public boolean isLegFurry() {
			return true;
		}
		@Override
		public boolean isPenisFurry() {
			return true;
		}
		@Override
		public boolean isSkinFurry() {
			return false;
		}
		@Override
		public boolean isTailFurry() {
			return true;
		}
		@Override
		public boolean isVaginaFurry() {
			return true;
		}
		@Override
		public boolean isWingFurry() {
			return true;
		}
		@Override
		public boolean isTentacleFurry() {
			return false;
		}
	},

	/**All minor animal-morph parts, animal-morph arms and legs, and animal-morph skin and face.

	 * "Furry" by all standards.*/
	GREATER("greater", Colour.TRANSFORMATION_GREATER) {
		@Override
		public boolean isAntennaFurry() {
			return true;
		}
		@Override
		public boolean isArmFurry() {
			return true;
		}
		@Override
		public boolean isAssFurry() {
			return true;
		}
		@Override
		public boolean isBreastFurry() {
			return true;
		}
		@Override
		public boolean isEarFurry() {
			return true;
		}
		@Override
		public boolean isEyeFurry() {
			return true;
		}
		@Override
		public boolean isFaceFurry() {
			return true;
		}
		@Override
		public boolean isHairFurry() {
			return true;
		}
		@Override
		public boolean isHornFurry() {
			return true;
		}
		@Override
		public boolean isLegFurry() {
			return true;
		}
		@Override
		public boolean isPenisFurry() {
			return true;
		}
		@Override
		public boolean isSkinFurry() {
			return true;
		}
		@Override
		public boolean isTailFurry() {
			return true;
		}
		@Override
		public boolean isVaginaFurry() {
			return true;
		}
		@Override
		public boolean isWingFurry() {
			return true;
		}
		@Override
		public boolean isTentacleFurry() {
			return true;
		}
	};

	private String name;
	private Colour colour;

	private RaceStage(String name,Colour colour) {
		this.name = name;
		this.colour = colour;
	}

	public String getName() {
		return name;
	}

	public Colour getColour() {
		return colour;
	}

	public static RaceStage getRaceStageFromUserPreferences(Subspecies subspecies) {
		FurryPreference preference = Main.getProperties().getSubspeciesFeminineFurryPreferencesMap().get(subspecies);

		RaceStage raceStage = RaceStage.PARTIAL;

		switch(preference) {
			case HUMAN:
				return RaceStage.HUMAN;
			case MINIMUM:
				return RaceStage.PARTIAL;
			case REDUCED:
				return Util.randomItemFrom(Util.newArrayListOfValues(RaceStage.PARTIAL, RaceStage.LESSER));
			case NORMAL:
				return Util.randomItemFrom(Util.newArrayListOfValues(RaceStage.PARTIAL, RaceStage.LESSER, RaceStage.GREATER));
			case MAXIMUM:
				return RaceStage.GREATER;
		}

		return raceStage;
	}

	public abstract boolean isAntennaFurry();
	public abstract boolean isArmFurry();
	public abstract boolean isAssFurry();
	public abstract boolean isBreastFurry();
	public abstract boolean isEarFurry();
	public abstract boolean isEyeFurry();
	public abstract boolean isFaceFurry();
	public abstract boolean isHairFurry();
	public abstract boolean isHornFurry();
	public abstract boolean isLegFurry();
	public abstract boolean isPenisFurry();
	public abstract boolean isSkinFurry();
	public abstract boolean isTailFurry();
	public abstract boolean isTentacleFurry();
	public abstract boolean isVaginaFurry();
	public abstract boolean isWingFurry();
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.character.race;

import java.util.HashMap;
import java.util.Map;

import com.lilithsthrone.game.character.body.types.AntennaType;
import com.lilithsthrone.game.character.body.types.ArmType;
import com.lilithsthrone.game.character.body.types.AssType;
import com.lilithsthrone.game.character.body.types.BreastType;
import com.lilithsthrone.game.character.body.types.EarType;
import com.lilithsthrone.game.character.body.types.EyeType;
import com.lilithsthrone.game.character.body.types.FaceType;
import com.lilithsthrone.game.character.body.types.HairType;
import com.lilithsthrone.game.character.body.types.HornType;
import com.lilithsthrone.game.character.body.types.LegType;
import com.lilithsthrone.game.character.body.types.PenisType;
import com.lilithsthrone.game.character.body.types.SkinType;
import com.lilithsthrone.game.character.body.types.TailType;
import com.lilithsthrone.game.character.body.types.TentacleType;
import com.lilithsthrone.game.character.body.types.VaginaType;
import com.lilithsthrone.game.character.body.types.WingType;
import com.lilithsthrone.game.character.body.valueEnums.AreolaeSize;
import com.lilithsthrone.game.character.body.valueEnums.AssSize;
import com.lilithsthrone.game.character.body.valueEnums.BodyMaterial;
import com.lilithsthrone.game.character.body.valueEnums.BodySize;
import com.lilithsthrone.game.character.body.valueEnums.BreastShape;
import com.lilithsthrone.game.character.body.valueEnums.Capacity;
import com.lilithsthrone.game.character.body.valueEnums.ClitorisSize;
import com.lilithsthrone.game.character.body.valueEnums.CumProduction;
import com.lilithsthrone.game.character.body.valueEnums.CupSize;
import com.lilithsthrone.game.character.body.valueEnums.GenitalArrangement;
import com.lilithsthrone.game.character.body.valueEnums.HairLength;
import com.lilithsthrone.game.character.body.valueEnums.HornLength;
import com.lilithsthrone.game.character.body.valueEnums.Lactation;
import com.lilithsthrone.game.character.body.valueEnums.LegConfiguration;
import com.lilithsthrone.game.character.body.valueEnums.LipSize;
import com.lilithsthrone.game.character.body.valueEnums.Muscle;
import com.lilithsthrone.game.character.body.valueEnums.NippleShape;
import com.lilithsthrone.game.character.body.valueEnums.NippleSize;
import com.lilithsthrone.game.character.body.valueEnums.OrificeElasticity;
import com.lilithsthrone.game.character.body.valueEnums.OrificePlasticity;
import com.lilithsthrone.game.character.body.valueEnums.PenisGirth;
import com.lilithsthrone.game.character.body.valueEnums.TesticleSize;
import com.lilithsthrone.game.character.body.valueEnums.Wetness;
import com.lilithsthrone.game.character.body.valueEnums.WingSize;
import com.lilithsthrone.game.character.gender.Gender;
import com.lilithsthrone.game.character.persona.PersonalityCategory;
import com.lilithsthrone.game.character.persona.PersonalityTrait;
import com.lilithsthrone.game.character.persona.SexualOrientation;
import com.lilithsthrone.game.character.persona.SexualOrientationPreference;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.0
 * @version 0.3.1
 * @author Innoxia
 */
public class RacialBody {

	public static AbstractRacialBody HUMAN = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.HUMAN,
			1, AssType.HUMAN,
			AssSize.TWO_SMALL, AssSize.FOUR_LARGE, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.HUMAN,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.NONE,
			BreastShape.getNonUdderBreastShapes(), CupSize.C,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 180,
			25, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.ONE_LIGHTLY_MUSCLED.getMedianValue(), 170,
			75, BodySize.TWO_AVERAGE.getMinimumValue(), Muscle.ONE_LIGHTLY_MUSCLED.getMinimumValue(), EarType.HUMAN,
			EyeType.HUMAN,
			FaceType.HUMAN,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.HUMAN,
			HairLength.TWO_SHORT, HairLength.FOUR_MID_BACK, LegType.HUMAN,
			LegConfiguration.BIPEDAL, SkinType.HUMAN,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY, HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.HUMAN, 15, PenisGirth.TWO_AVERAGE,
			TesticleSize.TWO_AVERAGE, 2, CumProduction.THREE_AVERAGE,
			Util.newArrayListOfValues(TailType.NONE), TentacleType.NONE, VaginaType.HUMAN,
			Wetness.TWO_MOIST,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody ANGEL = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.ANGEL,
			1, AssType.ANGEL,
			AssSize.TWO_SMALL, AssSize.TWO_SMALL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.ANGEL,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.NONE,
			BreastShape.getNonUdderBreastShapes(), CupSize.C,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 170,
			25, BodySize.THREE_LARGE.getMedianValue(), Muscle.FOUR_RIPPED.getMedianValue(), 170,
			95, BodySize.ONE_SLENDER.getMedianValue(), Muscle.FOUR_RIPPED.getMedianValue(), EarType.ANGEL,
			EyeType.ANGEL,
			FaceType.ANGEL,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.ANGEL,
			HairLength.TWO_SHORT, HairLength.FOUR_MID_BACK, LegType.ANGEL,
			LegConfiguration.BIPEDAL, SkinType.ANGEL,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.ANGEL, 13, PenisGirth.TWO_AVERAGE,
			TesticleSize.FOUR_HUGE, 2, CumProduction.SEVEN_MONSTROUS,
			Util.newArrayListOfValues(TailType.NONE), TentacleType.NONE, VaginaType.ANGEL,
			Wetness.ONE_SLIGHTLY_MOIST,
			Capacity.ONE_EXTREMELY_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.SEVEN_ELASTIC, OrificePlasticity.ZERO_RUBBERY, Util.newArrayListOfValues(WingType.ANGEL),
			WingSize.THREE_LARGE, WingSize.THREE_LARGE, GenitalArrangement.NORMAL) {

		@Override
		public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
			Map<PersonalityTrait, Float> map = new HashMap<>();

			for(PersonalityTrait trait : PersonalityTrait.values()) {
				if(trait.getPersonalityCategory()!=PersonalityCategory.SPEECH) { // Angels don't have speech-related traits
					if(trait==PersonalityTrait.BRAVE) {
						map.put(trait, 0.2f);

					} else if(trait==PersonalityTrait.PRUDE) {
						map.put(trait, 0.75f);

					} else if(trait!=PersonalityTrait.LEWD) { // Angels are a proud and noble race
						map.put(trait, 0.05f);
					}
				}
			}

			return map;
		}

		@Override
		public SexualOrientation getSexualOrientation(Gender gender) {
			return SexualOrientationPreference.getSexualOrientationFromUserPreferences(0, 1, 0);
		}
	};

	public static AbstractRacialBody DEMON = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.DEMON_COMMON,
			1, AssType.DEMON_COMMON,
			AssSize.TWO_SMALL, AssSize.FOUR_LARGE, Wetness.FOUR_SLIMY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.SEVEN_ELASTIC, OrificePlasticity.ZERO_RUBBERY, BreastType.DEMON_COMMON,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.SEVEN_ELASTIC, OrificePlasticity.ZERO_RUBBERY, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.F,
			1, Lactation.ZERO_NONE, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.SEVEN_ELASTIC, OrificePlasticity.ZERO_RUBBERY, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.NONE,
			BreastShape.getNonUdderBreastShapes(), CupSize.C,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 190,
			10, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 180,
			90, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), EarType.DEMON_COMMON,
			EyeType.DEMON_COMMON,
			FaceType.DEMON_COMMON,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.DEMON_COMMON,
			HairLength.TWO_SHORT, HairLength.FIVE_ABOVE_ASS, LegType.DEMON_COMMON,
			LegConfiguration.BIPEDAL, SkinType.DEMON_COMMON,
			BodyMaterial.FLESH,
			HornLength.ONE_SMALL,
			HornLength.TWO_LONG, Util.newArrayListOfValues(HornType.CURLED, HornType.SPIRAL, HornType.SWEPT_BACK, HornType.CURVED, HornType.STRAIGHT),
			PenisType.DEMON_COMMON, 25, PenisGirth.THREE_THICK,
			TesticleSize.FOUR_HUGE, 4, CumProduction.SIX_EXTREME,
			Util.newArrayListOfValues(TailType.DEMON_COMMON, TailType.DEMON_HAIR_TIP, TailType.DEMON_HORSE),
			TentacleType.NONE,
			VaginaType.DEMON_COMMON,
			Wetness.SEVEN_DROOLING,
			Capacity.ONE_EXTREMELY_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.SEVEN_ELASTIC, OrificePlasticity.ZERO_RUBBERY, Util.newArrayListOfValues(WingType.DEMON_COMMON, WingType.DEMON_FEATHERED),
			WingSize.THREE_LARGE, WingSize.THREE_LARGE, GenitalArrangement.NORMAL) {

		@Override
		public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
			Map<PersonalityTrait, Float> map = super.getPersonalityTraitChances();
			map.put(PersonalityTrait.LEWD, 0.75f);// Demons are lewd
			return map;
		}

		@Override
		public SexualOrientation getSexualOrientation(Gender gender) {
			return SexualOrientationPreference.getSexualOrientationFromUserPreferences(0, 1, 0);
		}
	};

	public static AbstractRacialBody COW_MORPH = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.COW_MORPH,
			1, AssType.COW_MORPH,
			AssSize.TWO_SMALL, AssSize.FIVE_HUGE, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT,  BreastType.COW_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT,  NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.H,
			1, Lactation.THREE_DECENT_AMOUNT, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT,  NippleSize.THREE_LARGE, NippleShape.NORMAL, AreolaeSize.THREE_LARGE, 4, BreastType.COW_MORPH,
			BreastShape.getUdderBreastShapes(), CupSize.H,
			2, Lactation.FOUR_LARGE_AMOUNT, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT,  NippleSize.FOUR_MASSIVE, NippleShape.NORMAL, AreolaeSize.THREE_LARGE, 4, 195,
			30, BodySize.FOUR_HUGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 185,
			70, BodySize.THREE_LARGE.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.COW_MORPH,
			EyeType.COW_MORPH,
			FaceType.COW_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.COW_MORPH,
			HairLength.TWO_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.COW_MORPH,
			LegConfiguration.BIPEDAL, SkinType.COW_MORPH,
			BodyMaterial.FLESH,
			HornLength.TWO_LONG,
			HornLength.ONE_SMALL, Util.newArrayListOfValues(HornType.BOVINE_CURVED, HornType.BOVINE_STRAIGHT),
			PenisType.BOVINE, 18, PenisGirth.THREE_THICK,
			TesticleSize.THREE_LARGE, 2, CumProduction.FOUR_LARGE,
			Util.newArrayListOfValues(TailType.COW_MORPH), TentacleType.NONE, VaginaType.COW_MORPH,
			Wetness.THREE_WET,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody DOG_MORPH = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.DOG_MORPH,
			1, AssType.DOG_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.DOG_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.DOG_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 185,
			30, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 175,
			70, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.DOG_MORPH,
			EyeType.DOG_MORPH,
			FaceType.DOG_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.DOG_MORPH,
			HairLength.TWO_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.DOG_MORPH,
			LegConfiguration.BIPEDAL, SkinType.DOG_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.CANINE, 15, PenisGirth.TWO_AVERAGE,
			TesticleSize.THREE_LARGE, 2, CumProduction.FOUR_LARGE,
			Util.newArrayListOfValues(TailType.DOG_MORPH), TentacleType.NONE, VaginaType.DOG_MORPH,
			Wetness.THREE_WET,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {

		@Override
		public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
			Map<PersonalityTrait, Float> map = super.getPersonalityTraitChances();
			map.put(PersonalityTrait.CONFIDENT, 0.5f);// Good doggos
			return map;
		}
	};

	public static AbstractRacialBody FOX_MORPH = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.FOX_MORPH,
			1, AssType.FOX_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.FOX_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.FOX_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 170,
			15, BodySize.ONE_SLENDER.getMedianValue(), Muscle.ONE_LIGHTLY_MUSCLED.getMedianValue(), 160,
			75, BodySize.ONE_SLENDER.getMedianValue(), Muscle.ONE_LIGHTLY_MUSCLED.getMinimumValue(), EarType.FOX_MORPH,
			EyeType.FOX_MORPH,
			FaceType.FOX_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.FOX_MORPH,
			HairLength.TWO_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.FOX_MORPH,
			LegConfiguration.BIPEDAL, SkinType.FOX_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.VULPINE, 15, PenisGirth.TWO_AVERAGE,
			TesticleSize.TWO_AVERAGE, 2, CumProduction.FOUR_LARGE,
			Util.newArrayListOfValues(TailType.FOX_MORPH), TentacleType.NONE, VaginaType.FOX_MORPH,
			Wetness.THREE_WET,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody WOLF_MORPH = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.WOLF_MORPH,
			1, AssType.WOLF_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.WOLF_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.WOLF_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 185,
			15, BodySize.THREE_LARGE.getMedianValue(), Muscle.FOUR_RIPPED.getMedianValue(), 175,
			75, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), EarType.LYCAN,
			EyeType.LYCAN,
			FaceType.LYCAN,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.LYCAN,
			HairLength.TWO_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.WOLF_MORPH,
			LegConfiguration.BIPEDAL, SkinType.LYCAN,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.LUPINE, 18, PenisGirth.THREE_THICK,
			TesticleSize.THREE_LARGE, 2, CumProduction.FIVE_HUGE,
			Util.newArrayListOfValues(TailType.LYCAN), TentacleType.NONE, VaginaType.WOLF_MORPH,
			Wetness.FOUR_SLIMY,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody CAT_MORPH = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.CAT_MORPH,
			1, AssType.CAT_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.CAT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.CAT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 175,
			35, BodySize.ONE_SLENDER.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 165,
			85, BodySize.ONE_SLENDER.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.CAT_MORPH,
			EyeType.CAT_MORPH,
			FaceType.CAT_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.CAT_MORPH,
			HairLength.TWO_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.CAT_MORPH,
			LegConfiguration.BIPEDAL, SkinType.CAT_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.FELINE, 13, PenisGirth.TWO_AVERAGE,
			TesticleSize.TWO_AVERAGE, 2, CumProduction.THREE_AVERAGE,
			Util.newArrayListOfValues(TailType.CAT_MORPH), TentacleType.NONE, VaginaType.CAT_MORPH,
			Wetness.TWO_MOIST,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody HORSE_MORPH = new AbstractRacialBody(
			AntennaType.NONE,
			ArmType.HORSE_MORPH,
			1, AssType.HORSE_MORPH,
			AssSize.TWO_SMALL, AssSize.FOUR_LARGE, Wetness.ZERO_DRY, Capacity.THREE_SLIGHTLY_LOOSE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.HORSE_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.DD,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.HORSE_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.B,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 195,
			10, BodySize.THREE_LARGE.getMedianValue(), Muscle.FOUR_RIPPED.getMedianValue(), 180,
			70, BodySize.THREE_LARGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), EarType.HORSE_MORPH,
			EyeType.HORSE_MORPH,
			FaceType.HORSE_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.HORSE_MORPH,
			HairLength.TWO_SHORT, HairLength.FOUR_MID_BACK, LegType.HORSE_MORPH,
			LegConfiguration.BIPEDAL, SkinType.HORSE_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE, HornType.HORSE_STRAIGHT),
			PenisType.EQUINE,
			23, PenisGirth.FOUR_FAT, TesticleSize.FOUR_HUGE, 2, CumProduction.FIVE_HUGE, Util.newArrayListOfValues(TailType.HORSE_MORPH),
			TentacleType.NONE,
			VaginaType.HORSE_MORPH,
			Wetness.THREE_WET,
			Capacity.THREE_SLIGHTLY_LOOSE,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE, WingType.PEGASUS),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody REINDEER_MORPH = new AbstractRacialBody(AntennaType.NONE,
			ArmType.REINDEER_MORPH,
			1, AssType.REINDEER_MORPH,
			AssSize.TWO_SMALL, AssSize.FOUR_LARGE, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.REINDEER_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.D,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.REINDEER_MORPH,
			BreastShape.getUdderBreastShapes(), CupSize.C,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 190,
			10, BodySize.THREE_LARGE.getMedianValue(), Muscle.FOUR_RIPPED.getMedianValue(), 180,
			70, BodySize.THREE_LARGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), EarType.REINDEER_MORPH,
			EyeType.REINDEER_MORPH,
			FaceType.REINDEER_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.REINDEER_MORPH,
			HairLength.TWO_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.REINDEER_MORPH,
			LegConfiguration.BIPEDAL, SkinType.REINDEER_MORPH,
			BodyMaterial.FLESH,
			HornLength.THREE_HUGE,
			HornLength.TWO_LONG, Util.newArrayListOfValues(HornType.REINDEER_RACK),
			PenisType.REINDEER_MORPH, 20, PenisGirth.THREE_THICK,
			TesticleSize.THREE_LARGE, 2, CumProduction.THREE_AVERAGE,
			Util.newArrayListOfValues(TailType.REINDEER_MORPH), TentacleType.NONE, VaginaType.REINDEER_MORPH,
			Wetness.TWO_MOIST,
			Capacity.FOUR_LOOSE,
			ClitorisSize.ONE_BIG, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody ALLIGATOR_MORPH = new AbstractRacialBody(AntennaType.NONE,
		    ArmType.ALLIGATOR_MORPH,
		    1, AssType.ALLIGATOR_MORPH,
		    AssSize.TWO_SMALL, AssSize.TWO_SMALL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.ALLIGATOR_MORPH,
		    BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
		    1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.AA,
		    1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.NONE,
		    BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
		    1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1,
		    185, 25, BodySize.THREE_LARGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(),
		    178, 95, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.ALLIGATOR_MORPH,
		    EyeType.ALLIGATOR_MORPH,
		    FaceType.ALLIGATOR_MORPH,
		    LipSize.ONE_AVERAGE, LipSize.ONE_AVERAGE, HairType.ALLIGATOR_MORPH,
		    HairLength.ZERO_BALD, HairLength.ZERO_BALD, LegType.ALLIGATOR_MORPH,
		    LegConfiguration.BIPEDAL, SkinType.ALLIGATOR_MORPH,
		    BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
		    PenisType.ALLIGATOR_MORPH, 18, PenisGirth.THREE_THICK,
		    TesticleSize.FOUR_HUGE, 2, CumProduction.FIVE_HUGE,
		    Util.newArrayListOfValues(TailType.ALLIGATOR_MORPH), TentacleType.NONE, VaginaType.ALLIGATOR_MORPH,
			Wetness.SEVEN_DROOLING,
			Capacity.ONE_EXTREMELY_TIGHT,
		    ClitorisSize.ZERO_AVERAGE, OrificeElasticity.SEVEN_ELASTIC, OrificePlasticity.ZERO_RUBBERY, Util.newArrayListOfValues(WingType.NONE),
		    WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.CLOACA) {

		@Override
		public boolean isHairTypeLinkedToFaceType() {
			return true;
		}
	};

	public static AbstractRacialBody SQUIRREL_MORPH = new AbstractRacialBody(AntennaType.NONE,
			ArmType.SQUIRREL_MORPH,
			1, AssType.SQUIRREL_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.SQUIRREL_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.SQUIRREL_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 170,
			35, BodySize.ONE_SLENDER.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 160,
			85, BodySize.ONE_SLENDER.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.SQUIRREL_MORPH,
			EyeType.SQUIRREL_MORPH,
			FaceType.SQUIRREL_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.SQUIRREL_MORPH,
			HairLength.ONE_VERY_SHORT, HairLength.TWO_SHORT, LegType.SQUIRREL_MORPH,
			LegConfiguration.BIPEDAL, SkinType.SQUIRREL_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.SQUIRREL, 20, PenisGirth.THREE_THICK,
			TesticleSize.THREE_LARGE, 2, CumProduction.THREE_AVERAGE,
			Util.newArrayListOfValues(TailType.SQUIRREL_MORPH), TentacleType.NONE, VaginaType.SQUIRREL_MORPH,
			Wetness.TWO_MOIST,
			Capacity.THREE_SLIGHTLY_LOOSE,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody RAT_MORPH = new AbstractRacialBody(AntennaType.NONE,
			ArmType.RAT_MORPH,
			1, AssType.RAT_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.RAT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.RAT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 170,
			35, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 160,
			85, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.RAT_MORPH,
			EyeType.RAT_MORPH,
			FaceType.RAT_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.RAT_MORPH,
			HairLength.ONE_VERY_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.RAT_MORPH,
			LegConfiguration.BIPEDAL, SkinType.RAT_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.RAT_MORPH, 15, PenisGirth.TWO_AVERAGE,
			TesticleSize.TWO_AVERAGE, 2, CumProduction.THREE_AVERAGE,
			Util.newArrayListOfValues(TailType.RAT_MORPH), TentacleType.NONE, VaginaType.RAT_MORPH,
			Wetness.TWO_MOIST,
			Capacity.THREE_SLIGHTLY_LOOSE,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {

		@Override
		public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
			Map<PersonalityTrait, Float> map = super.getPersonalityTraitChances();
			map.put(PersonalityTrait.COWARDLY, 0.1f);// Slightly higher chance than normal to be cowardly
			return map;
		}
	};

	public static AbstractRacialBody RABBIT_MORPH = new AbstractRacialBody(AntennaType.NONE,
			ArmType.RABBIT_MORPH,
			1, AssType.RABBIT_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.RABBIT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.C,
			3, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.RABBIT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.AA,
			2, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 170,
			35, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 160,
			85, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.RABBIT_MORPH,
			EyeType.RABBIT_MORPH,
			FaceType.RABBIT_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.RABBIT_MORPH,
			HairLength.ONE_VERY_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.RABBIT_MORPH,
			LegConfiguration.BIPEDAL, SkinType.RABBIT_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.RABBIT_MORPH, 18, PenisGirth.TWO_AVERAGE,
			TesticleSize.TWO_AVERAGE, 2, CumProduction.THREE_AVERAGE,
			Util.newArrayListOfValues(TailType.RABBIT_MORPH), TentacleType.NONE, VaginaType.RABBIT_MORPH,
			Wetness.TWO_MOIST,
			Capacity.THREE_SLIGHTLY_LOOSE,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {
	};

	public static AbstractRacialBody BAT_MORPH = new AbstractRacialBody(AntennaType.NONE,
			ArmType.BAT_MORPH,
			1, AssType.BAT_MORPH,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.BAT_MORPH,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.B,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.NONE,
			BreastShape.getNonUdderBreastShapes(), CupSize.FLAT,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, 170,
			35, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 160,
			85, BodySize.TWO_AVERAGE.getMedianValue(), Muscle.TWO_TONED.getMedianValue(), EarType.BAT_MORPH,
			EyeType.BAT_MORPH,
			FaceType.BAT_MORPH,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.BAT_MORPH,
			HairLength.ONE_VERY_SHORT, HairLength.THREE_SHOULDER_LENGTH, LegType.BAT_MORPH,
			LegConfiguration.BIPEDAL, SkinType.BAT_MORPH,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE), PenisType.BAT_MORPH,
			13, PenisGirth.TWO_AVERAGE, TesticleSize.TWO_AVERAGE, 2, CumProduction.THREE_AVERAGE, Util.newArrayListOfValues(TailType.BAT_MORPH),
			TentacleType.NONE,
			VaginaType.BAT_MORPH,
			Wetness.TWO_MOIST,
			Capacity.THREE_SLIGHTLY_LOOSE,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.NORMAL) {

		@Override
		public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
			Map<PersonalityTrait, Float> map = super.getPersonalityTraitChances();
			map.put(PersonalityTrait.CONFIDENT, 0.15f);// Higher chance than normal to be excitable
			return map;
		}
	};

	public static AbstractRacialBody HARPY = new AbstractRacialBody(AntennaType.NONE,
			ArmType.HARPY,
			1, AssType.HARPY,
			AssSize.TWO_SMALL, AssSize.THREE_NORMAL, Wetness.ZERO_DRY, Capacity.ONE_EXTREMELY_TIGHT, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, BreastType.HARPY,
			BreastShape.getNonUdderBreastShapes(), CupSize.TRAINING_A,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, CupSize.B,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.TWO_BIG, NippleShape.NORMAL, AreolaeSize.TWO_BIG, 1, BreastType.NONE,
			BreastShape.getNonUdderBreastShapes(), CupSize.TRAINING_A,
			1, Lactation.ZERO_NONE, Capacity.ZERO_IMPENETRABLE, OrificeElasticity.THREE_FLEXIBLE, OrificePlasticity.THREE_RESILIENT, NippleSize.ZERO_TINY, NippleShape.NORMAL, AreolaeSize.ZERO_TINY, 1, 150,
			75, BodySize.ZERO_SKINNY.getMedianValue(), Muscle.THREE_MUSCULAR.getMedianValue(), 150,
			95, BodySize.ZERO_SKINNY.getMedianValue(), Muscle.ONE_LIGHTLY_MUSCLED.getMedianValue(), EarType.HARPY,
			EyeType.HARPY,
			FaceType.HARPY,
			LipSize.ONE_AVERAGE, LipSize.TWO_FULL, HairType.HARPY,
			HairLength.THREE_SHOULDER_LENGTH, HairLength.FIVE_ABOVE_ASS, LegType.HARPY,
			LegConfiguration.BIPEDAL, SkinType.HARPY,
			BodyMaterial.FLESH,
			HornLength.ZERO_TINY,
			HornLength.ZERO_TINY, Util.newArrayListOfValues(HornType.NONE),
			PenisType.AVIAN, 5, PenisGirth.ONE_THIN,
			TesticleSize.ZERO_VESTIGIAL, 2, CumProduction.ONE_TRICKLE,
			Util.newArrayListOfValues(TailType.HARPY), TentacleType.NONE, VaginaType.HARPY,
			Wetness.THREE_WET,
			Capacity.TWO_TIGHT,
			ClitorisSize.ZERO_AVERAGE, OrificeElasticity.FOUR_LIMBER, OrificePlasticity.THREE_RESILIENT, Util.newArrayListOfValues(WingType.NONE),
			WingSize.ZERO_TINY, WingSize.ZERO_TINY, GenitalArrangement.CLOACA) {

		@Override
		public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
			Map<PersonalityTrait, Float> map = super.getPersonalityTraitChances();
			map.put(PersonalityTrait.LEWD, 0.25f);
			map.put(PersonalityTrait.COWARDLY, 0.1f);
//			map.put(PersonalityTrait.BIMBO, 0.1f);
			return map;
		}

		@Override
		public SexualOrientation getSexualOrientation(Gender gender) {
			return SexualOrientationPreference.getSexualOrientationFromUserPreferences(95, 5, 0);
		}
	};

	public static AbstractRacialBody valueOfRace(Race race) {
		switch (race) {
			case NONE:
				break;
			case ANGEL:
				return RacialBody.ANGEL;
			case CAT_MORPH:
				return RacialBody.CAT_MORPH;
			case COW_MORPH:
				return RacialBody.COW_MORPH;
			case DEMON:
			case ELEMENTAL:
				return RacialBody.DEMON;
			case DOG_MORPH:
				return RacialBody.DOG_MORPH;
			case FOX_MORPH:
				return RacialBody.FOX_MORPH;
			case ALLIGATOR_MORPH:
				return RacialBody.ALLIGATOR_MORPH;
			case HARPY:
				return RacialBody.HARPY;
			case HORSE_MORPH:
				return RacialBody.HORSE_MORPH;
			case REINDEER_MORPH:
				return RacialBody.REINDEER_MORPH;
			case HUMAN:
				return RacialBody.HUMAN;
			case WOLF_MORPH:
				return RacialBody.WOLF_MORPH;
			case SQUIRREL_MORPH:
				return RacialBody.SQUIRREL_MORPH;
			case SLIME:
				return RacialBody.HUMAN;
			case BAT_MORPH:
				return RacialBody.BAT_MORPH;
			case RAT_MORPH:
				return RacialBody.RAT_MORPH;
			case RABBIT_MORPH:
				return RacialBody.RABBIT_MORPH;
		}
		return RacialBody.HUMAN;
	}

}