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

import java.util.ArrayList;
import java.util.List;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.types.PenisType;
import com.lilithsthrone.game.character.body.types.VaginaType;
import com.lilithsthrone.game.character.body.valueEnums.BodyHair;
import com.lilithsthrone.game.character.body.valueEnums.Capacity;
import com.lilithsthrone.game.character.body.valueEnums.FluidFlavour;
import com.lilithsthrone.game.character.body.valueEnums.LabiaSize;
import com.lilithsthrone.game.character.body.valueEnums.OrificeElasticity;
import com.lilithsthrone.game.character.body.valueEnums.OrificeModifier;
import com.lilithsthrone.game.character.body.valueEnums.OrificePlasticity;
import com.lilithsthrone.game.character.body.valueEnums.PenisGirth;
import com.lilithsthrone.game.character.body.valueEnums.Wetness;
import com.lilithsthrone.game.character.effects.StatusEffect;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.InventorySlot;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.0
 * @version 0.3.1
 * @author Innoxia
 */
public class Vagina implements BodyPartInterface {

	protected VaginaType type;
	protected Clitoris clitoris;
	protected int labiaSize;
	protected boolean pierced;

	protected OrificeVagina orificeVagina;
	protected FluidGirlCum girlcum;
	protected OrificeVaginaUrethra orificeUrethra;

	public Vagina(VaginaType type, int labiaSize, int clitSize, int wetness, float capacity, int elasticity, int plasticity, boolean virgin) {
		this.type = type;
		this.labiaSize = labiaSize;
		this.clitoris = new Clitoris(clitSize, PenisGirth.TWO_AVERAGE.getValue());
		pierced = false;

		orificeVagina = new OrificeVagina(wetness, capacity, elasticity, plasticity, virgin, type.getDefaultRacialOrificeModifiers());

		orificeUrethra = new OrificeVaginaUrethra(Wetness.TWO_MOIST.getValue(), 0, OrificeElasticity.ZERO_UNYIELDING.getValue(), OrificePlasticity.THREE_RESILIENT.getValue(), true, new ArrayList<>());

		girlcum = new FluidGirlCum(type.getFluidType());
	}

	public OrificeVagina getOrificeVagina() {
		return orificeVagina;
	}

	public FluidGirlCum getGirlcum() {
		return girlcum;
	}

	public OrificeVaginaUrethra getOrificeUrethra() {
		return orificeUrethra;
	}

	@Override
	public VaginaType getType() {
		return type;
	}

	@Override
	public String getDeterminer(GameCharacter gc) {
		return type.getDeterminer(gc);
	}

	@Override
	public String getName(GameCharacter gc) {
		return type.getName(gc);
	}

	@Override
	public String getNameSingular(GameCharacter gc) {
		return type.getNameSingular(gc);
	}

	@Override
	public String getNamePlural(GameCharacter gc) {
		return type.getNamePlural(gc);
	}

	@Override
	public String getDescriptor(GameCharacter owner) {
		List<String> descriptorList = new ArrayList<>();

		for(OrificeModifier om : orificeVagina.getOrificeModifiers()) {
			descriptorList.add(om.getName());
		}

		String wetnessDescriptor = orificeVagina.getWetness(owner).getDescriptor();
		if(Main.game.isInSex() && Sex.getAllParticipants().contains(owner)) {
			if(Sex.hasLubricationTypeFromAnyone(owner, SexAreaOrifice.VAGINA)) {
				wetnessDescriptor = "wet";
			}
		}
		descriptorList.add(wetnessDescriptor);
		if(owner.getPubicHair().getValue()>=BodyHair.FOUR_NATURAL.getValue() && Main.game.isPubicHairEnabled()) {
			descriptorList.add("hairy");
		}

		if(this.getGirlcum().getFlavour()!=FluidFlavour.GIRL_CUM) {
			descriptorList.add(this.getGirlcum().getFlavour().getName()+"-flavoured");
		}

		if(owner.isVaginaBestial()) {
			descriptorList.add(Util.randomItemFrom(Util.newArrayListOfValues(
					(this.getType().getRace()==Race.HORSE_MORPH?"mare":null),
					"feral",
					owner.getVaginaRace().getName(true)+"-",
					"bestial",
					"animalistic")));
		} else {
			descriptorList.add(type.getDescriptor(owner));
		}

		descriptorList.add(Capacity.getCapacityFromValue(orificeVagina.getStretchedCapacity()).getDescriptor().replaceAll(" ", "-"));

		return Util.randomItemFrom(descriptorList);
	}

	public String getUrethraDescriptor(GameCharacter owner) {
		List<String> descriptorList = new ArrayList<>();

		for(OrificeModifier om : orificeUrethra.getOrificeModifiers()) {
			descriptorList.add(om.getName());
		}

		descriptorList.add(type.getDescriptor(owner));

		descriptorList.add(Capacity.getCapacityFromValue(orificeUrethra.getStretchedCapacity()).getDescriptor().replaceAll(" ", "-"));

		return Util.randomItemFrom(descriptorList);
	}

	public String setType(GameCharacter owner, VaginaType type) {
		return setType(owner, type, false);
	}

	public String setType(GameCharacter owner, VaginaType type, boolean overridePregnancyPrevention) {
		if(this.type==VaginaType.NONE) {
			this.orificeVagina.setStretchedCapacity(this.orificeVagina.getRawCapacityValue());
			this.orificeUrethra.setStretchedCapacity(this.orificeUrethra.getRawCapacityValue());
		}

		if(!Main.game.isStarted() || owner==null) {// This always overrides pregnancy prevention, as the only times where this is true are for utility methods:
			this.type = type;
			this.girlcum.setType(type.getFluidType());
			if(owner!=null) {
				owner.resetAreaKnownByCharacters(CoverableArea.VAGINA);
				owner.postTransformationCalculation();
			}
			return "";
		}

		if (type == owner.getVaginaType()) {
			if(owner.isPlayer()) {
				if(type == VaginaType.NONE) {
					return "
[style.colourDisabled(You already lack a vagina, so nothing happens...)]
";
				} else {
					return "
[style.colourDisabled(You already have [pc.a_vaginaRace]'s pussy, so nothing happens...)]
";
				}

			} else {
				if(type == VaginaType.NONE) {
					return UtilText.parse(owner, "
[style.colourDisabled([npc.Name] already lacks a vagina, so nothing happens...)]
");
				} else {
					return UtilText.parse(owner, "
[style.colourDisabled([npc.Name] already has [npc.a_vaginaRace] pussy, so nothing happens...)]
");
				}
			}
		}

		UtilText.transformationContentSB.setLength(0);

		// Cannot transform if pregnant:
		if (!overridePregnancyPrevention && (owner.isPregnant() || owner.hasStatusEffect(StatusEffect.PREGNANT_0))) {
			if(owner.isPlayer()) {
				UtilText.transformationContentSB.append(
						"
"
							+ "You feel your [pc.pussy+] start to grow hot and sensitive, and you let out a lewd moan as a wave of tingling excitement washes through your lower abdomen."
							+ " Much to your surprise, the feeling fades away almost as quickly as it came, and you realise that "
							+ (owner.hasStatusEffect(StatusEffect.PREGNANT_0)
									?"the possibility of being pregnant has prevented your vagina from transforming!"
									:"your ongoing pregnancy has prevented your vagina from transforming!")
							+ "
"
							+ "Your pussy remains [style.boldTfSex(unchanged)]."
						+ "
");
			} else {
				UtilText.transformationContentSB.append(UtilText.parse(owner,
						"
"
							+ "[npc.Name] lets out a lewd moan as [npc.she] feels [npc.her] [npc.pussy+] starting to grow hot and sensitive,"
								+ " and as a wave of tingling excitement washes through [npc.her] lower abdomen, [npc.her] moan turns into a desperate gasp."
							+ " Much to [npc.her] surprise, the feeling fades away almost as quickly as it came, and with a sigh, [npc.she] realises that "
							+ (owner.hasStatusEffect(StatusEffect.PREGNANT_0)
									?"the possibility of being pregnant has prevented [npc.her] vagina from transforming!"
									:"[npc.her] ongoing pregnancy has prevented [npc.her] vagina from transforming!")
							+ "
"
							+ "[npc.NamePos] pussy remains [style.boldTfSex(unchanged)]."
						+ "
"));
			}
			return UtilText.transformationContentSB.toString()
					+ "
"
						+owner.postTransformationCalculation()
					+"
";
		}

		// If have no vagina:
		if (owner.getVaginaType() == VaginaType.NONE) {
			if (owner.isPlayer()) {
				UtilText.transformationContentSB.append(
						"
"
							+ "You feel a strange heat spreading through your groin, and you let out an involuntary moan as you feel the [pc.skin] between your [pc.legs] starting to cave inwards."
							+ " Within moments, a deep furrow has formed "
							+ (owner.getPenisType() == PenisType.NONE
								? "in the middle of your groin,"
								: "beneath your cock,")
							+ " and you start panting and squirming as the strange feeling shows no sign of stopping there."
							+ " A sudden, penetrating sensation tears through your groin, and while it isn't painful, you still cry out in shock as the groove between your legs splits and forms into a new, virgin pussy."
							+ " As the feeling finally starts to fade away, your new clit and labia finish forming, and a trickle of girl-cum leaks out from your excited slit."
						+ "
"
						+ "
"
							+ "Just as you start thinking that the transformation is over, a warm, tingling feeling shoots up into your lower abdomen,"
								+ " and you can't help but let out a desperate squeal as you feel a full female reproductive system rapidly growing inside of you."
							+ " As your transformation finally comes to an end, you're left panting and covered in sweat, and you feel that your new cunt is already soaking wet from arousal."
							+ "
"
							+ "You now have a [style.boldTfSex(vagina)]!"
						+ "
");

				if(owner.hasFetish(Fetish.FETISH_PURE_VIRGIN)) {
					UtilText.transformationContentSB.append(
							"
"
									+ "[style.boldExcellent(Pure Virgin)]"
							+ "
"
							+ "
"
								+ "You can't remember the last time you felt so good."
								+ " As your new pussy finishes growing, you realise that you're now technically a virgin once more."
								+ " After all, this pussy has never been penetrated before!"
							+ "
"
							+ "
"
								+ "[pc.thought(I-I'm a virgin?!"
								+ "
"
								+ "Yes! I'm a virgin!)]"
							+ "
"
							+ "
"
								+ "The elation you feel at discovering that you're a virgin again is unlike anything you've ever felt before."
								+ " Tears start to well up in your eyes as you find yourself overcome with joy."
							+ "
"
							+ "
"
								+ "You are invincible."
								+ " You can overcome any obstacle that's placed in your way."
								+ " You are..."
							+ "
"
							+ "
"
								+ "[style.boldExcellent(A Pure Virgin!)]"
							+ "
"
							);
				}

			} else {
				UtilText.transformationContentSB.append(UtilText.parse(owner,
						"
"
							+ "[npc.Name] blushes as [npc.she] feels a strange heat spreading through [npc.her] groin,"
								+ " and can't help but let out an involuntary moan as [npc.she] feels the [npc.skin] between [npc.her] [npc.legs] starting to cave inwards."
							+ " Within moments, a deep furrow has formed "
							+ (!owner.hasPenisIgnoreDildo()
								? "in the middle of [npc.her] groin,"
								: (!owner.isTaur()
										?"beneath [npc.her] cock,"
										:"above and behind [npc.her] cock,"))
							+ " and [npc.she] starts panting and squirming as the strange feeling shows no sign of stopping there."
							+ " A sudden, penetrating sensation tears through [npc.her] groin, and while it isn't painful, [npc.she] still cries out in shock as the groove between [npc.her] legs splits and forms into a new, virgin pussy."
							+ " As the feeling finally starts to fade away, [npc.her] new clit and labia finish forming, and a trickle of girl-cum leaks out from [npc.her] excited slit."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts to think that the transformation is over, a warm, tingling feeling shoots up into [npc.her] lower abdomen,"
								+ " and [npc.she] can't help but let out a desperate squeal as [npc.she] feels a full female reproductive system rapidly growing inside of [npc.herHim]."
							+ " As [npc.her] transformation finally comes to an end, [npc.sheIs] left panting and covered in sweat, and [npc.she] lets out a lewd moan as [npc.she] feels that [npc.her] new cunt is already soaking wet from arousal."
							+ "
"
							+ "[npc.Name] now has a [style.boldTfSex(vagina)]!"
						+ "
"));
			}

			this.type = VaginaType.HUMAN;
			owner.resetAreaKnownByCharacters(CoverableArea.VAGINA);

			if(type==VaginaType.HUMAN) {
				this.girlcum.setType(type.getFluidType());
				return UtilText.transformationContentSB.toString()
						+ "
"
							+owner.postTransformationCalculation()
						+"
";
			} else {
				return UtilText.transformationContentSB.toString()
						+ owner.setVaginaType(type);
			}

		} else {
			if (owner.isPlayer()) {
				UtilText.transformationContentSB.append(
						"
"
							+ "A strange heat suddenly washes through your pussy, and you cry out as it starts to transform.");
			} else {
				UtilText.transformationContentSB.append(UtilText.parse(owner,
						"
"
							+"[npc.Name] suddenly blushes and squeezes [npc.her] thighs together as [npc.she] feels [npc.her] pussy starting to transform."));
			}
		}

		this.type = type;
		this.girlcum.setType(type.getFluidType());
		owner.resetAreaKnownByCharacters(CoverableArea.VAGINA);

		switch (type) {
			case NONE:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
								" You feel your pussy suddenly tighten and squeeze shut, and you let out a cry as a strange pressure fills your lower abdomen."
								+ " Thankfully, it doesn't last long, and when the discomfort subsides, you gasp as you suddenly realise that your cunt has vanished, along with all of your female reproductive organs."
								+ "
"
								+ "You have [style.boldSex(lost your vagina)]."
							+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] moans and squirms about as [npc.she] feels [npc.her] pussy suddenly tighten and squeeze shut, and with a desperate cry, a strange pressure washes through [npc.her] lower abdomen."
							+ " Thankfully for [npc.herHim], the feeling fades almost as quickly as it came, and when the discomfort subsides, [npc.she] gasps as [npc.she] suddenly realises that [npc.her] cunt has vanished,"
								+ " along with all of [npc.her] female reproductive organs."
							+ "
"
							+ "[npc.Name] has [style.boldSex(lost [npc.her] vagina)]."
						+ "
"));
				}

				if(owner.isPlayer() && owner.hasFetish(Fetish.FETISH_PURE_VIRGIN)) {
					if(!owner.isVaginaVirgin()) {
						UtilText.transformationContentSB.append(
								"
"
									+ "[style.boldGood(Unbroken Virgin)]"
								+ "
"
								+ "
"
									+ "As the reality of losing your worthless fuck-hole finally sinks in, you start to think of yourself as something more than just a cheap whore."
									+ " After all, if you don't have a pussy, it's technically not possible for you to have lost your virginity!"
								+ "
"
								+ "
"
										+"[pc.thought(I-I'm no longer just a worthless fuck-toy..."
										+ "
"
										+ "It's not possible for me to have lost my virginity if I don't have a vagina!)]"
								+ "
"
								+ "
"
									+ "With a deep sigh, you realise that you no longer have to worry about being a broken-in slut."
									+ " Despite the fact that you can now finally see yourself as a real person again, not having a pussy is making you feel a little restless."
								+ "
"
								+ "
"
									+"[pc.thought(I need to find a way to get a new pussy!"
										+ "
"
										+ "Then I'll be a pure virgin again!)]"
								+ "
"
								+ "
"
									+ "You are [style.boldGood(no longer a)] [style.boldTerrible(Broken Virgin)]!"
								+ "
"
								);
					} else {
						UtilText.transformationContentSB.append(
								"
"
										+ "[style.boldBad(Pure Virgin?)]"
								+ "
"
								+ "
"
									+ "As the reality of losing your vagina finally sinks in, you start to feel a rising panic in the back of your mind."
									+ " After all, if you don't have a pussy, you can't call yourself a pure virgin!"
								+ "
"
								+ "
"
									+ "[pc.thought(~Aah!~ I need to get my pussy back!)]"
								+ "
"
								+ "
"
									+ "Until you get your vagina back, you are [style.boldBad(no longer a)] [style.boldExcellent(Pure Virgin)]!"
								+ "
"
								);
					}
				}

				owner.setVaginaVirgin(true);
				orificeUrethra.setVirgin(true);
				owner.setPiercedVagina(false);
				break;
			case HUMAN:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a regular human vagina."
							+ " As you let out a little sigh, a warm, tingling feeling spreads up through your lower abdomen, and you realise that your internal reproductive organs have also transformed into those of a human."
							+ "
"
							+ "You now have a [style.boldHuman(human vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling starts to fade away, and with a little cry of surprise, [npc.she] discovers that [npc.her] pussy has shaped itself into a regular human vagina."
							+ " A warm, tingling feeling spreads up through [npc.her] lower abdomen, and as the transformation comes to an end, [npc.she] realises that [npc.her] internal reproductive organs have also transformed into those of a human."
							+ "
"
							+ "[npc.Name] now has a [style.boldHuman(human vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case DEMON_COMMON:
				UtilText.transformationContentSB.append(UtilText.parse(owner,
						" [npc.She] [npc.verb(let)] out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] [npc.verb(feel)] [npc.her] slit shifting and contracting with a mind of its own,"
								+ " [npc.she] desperately [npc.verb(clamp)] [npc.her] [npc.legs] shut."
						+ " A strange, bubbling sensation starts running down deep into [npc.her] cunt,"
							+ " and [npc.she] [npc.verb(let)] out a lewd moan as [npc.she] [npc.verb(feel)] rows of little wriggling tentacles grow out to line [npc.her] inner vaginal walls."
						+ " Gasping for breath, [npc.she] [npc.verb(feel)] a new set of muscles forming within [npc.her] pussy, and with an experimental squeeze,"
							+ " [npc.she] [npc.verb(discover)] that [npc.she] has an incredible amount of control over [npc.her] pussy's new additions."
						+ " With one last shiver of pleasure, [npc.her] pussy reshapes its exterior into an absolutely perfect-looking vagina."
					+ "
"
					+ "
"
						+ "Just as [npc.she] [npc.verb(start)] think that the transformation has come to an end, [npc.her] pussy's new tentacles and muscles involuntarily clench down,"
							+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
						+ " Images of fat demonic cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
							+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] [npc.verb(imagine)] them pumping their tainted seed deep into [npc.her] demonic womb."
						+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
							+ " [npc.she] [npc.verb(feel)] [npc.her] female reproductive organs finishing their transformation."
						+ "
"
						+ (!owner.isShortStature()
								?"[npc.Name] now [npc.has] a [style.boldDemon(demonic vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
								:"[npc.Name] now [npc.has] an [style.boldImp(impish vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls.")
					+ "
"));
				break;
			case DOG_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a dog-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of knotted dog-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your canine womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldDogMorph(canine vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a dog-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of knotted dog-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] canine womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldDogMorph(canine vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case FOX_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a fox-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of knotted fox-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your vulpine womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldFoxMorph(vulpine vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a fox-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of knotted fox-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] vulpine womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldFoxMorph(vulpine vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case WOLF_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a wolf-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of knotted wolf-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your lupine womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldWolfMorph(lupine vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a wolf-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of knotted wolf-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] lupine womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldWolfMorph(lupine vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case CAT_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a cat-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of barbed cat-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your feline womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldCatMorph(feline vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a cat-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of barbed cat-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] feline womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldCatMorph(feline vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case SQUIRREL_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a squirrel-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of squirrel-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your rodent womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldSquirrelMorph(squirrel-morph's vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a squirrel-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of squirrel-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] rodent womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldSquirrelMorph(squirrel-morph's vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case RAT_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a rat-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of rat-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your rodent womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldRatMorph(rat-morph's vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a rat-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of rat-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] rodent womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldRatMorph(rat-morph's vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case RABBIT_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a rabbit-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of rabbit-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your fertile womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldRabbitMorph(rabbit-morph's vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a rabbit-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of rabbit-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] fertile womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldRabbitMorph(rabbit-morph's vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case BAT_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a bat-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving your feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of bat-like cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their potent seed deep into your womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldBatMorph(bat-morph's vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a bat-morph."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" fur has grown around it, giving [npc.her] feminine sex a rather animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of bat-like cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldBatMorph(bat-morph's vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case HORSE_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Your pussy lips puff up as your cunt reshapes itself into an animalistic, horse-like vagina."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of huge, flared horse-cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their hot seed deep into your equine womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have an [style.boldHorseMorph(equine vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " [npc.Her] pussy lips puff up, and [npc.she] starts moaning and squirming as [npc.her] cunt reshapes itself into a horse-like vagina, giving [npc.her] feminine sex a very animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of huge, flared horse-cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] equine womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has an [style.boldHorseMorph(equine vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case REINDEER_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your pussy shifting and contracting with a mind of its own."
							+ " Your [pc.labia] puff up as your cunt reshapes itself into an animalistic, reindeer-like vagina."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of huge, flared reindeer-cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their hot seed deep into your rangiferine womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have a [style.boldReindeerMorph(rangiferine vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] pussy shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " [npc.Her] [npc.labia] puff up, and [npc.she] starts moaning and squirming as [npc.her] cunt reshapes itself into a reindeer-like vagina, giving [npc.her] feminine sex a very animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of huge, flared reindeer-cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] rangiferine womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has a [style.boldReindeerMorph(rangiferine vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case COW_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
									+ " Your pussy lips puff up as your cunt reshapes itself into an animalistic, cow-like vagina."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of huge, flared bull-cocks slamming deep into your new pussy flash before your eyes, and your squeal turns into a satisfied moan as you imagine them pumping their hot seed deep into your bovine womb."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have an [style.boldCowMorph(bovine vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " [npc.Her] pussy lips puff up and darken to a deep black, and [npc.she] starts moaning and squirming as [npc.her] cunt reshapes itself into a cow-like vagina, giving [npc.her] feminine sex a very animalistic appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of huge, flared bull-cocks slamming deep into [npc.her] new pussy flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them pumping their potent seed deep into [npc.her] bovine womb."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has an [style.boldCowMorph(bovine vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case ALLIGATOR_MORPH:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has transformed into that of an alligator-morph's."
							+ " Although the shape and structure remains similar to a normal human's pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" scales have grown around it, giving your feminine sex a rather reptilian appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of spreading your legs before huge, throbbing alligator cocks flash before your eyes,"
								+ " and your squeal turns into a satisfied moan as you imagine them thrusting deep inside of you before squirting their hot seed deep into your hungry reptilian cunt."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have an [style.boldGatorMorph(alligator-morph's vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has transformed into that of an alligator-morph's."
							+ " Although the shape and structure remains similar to a normal human's pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" scales have grown around it, giving [npc.her] feminine sex a rather reptilian appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of spreading [npc.her] legs before huge, throbbing alligator cocks flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them thrusting deep inside of [npc.herHim] before squirting their hot seed deep into [npc.her] hungry reptilian cunt."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has an [style.boldGatorMorph(alligator-morph's vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case HARPY:
				if(owner.isPlayer()) {
					UtilText.transformationContentSB.append(
							" You let out a squeal of excitement as a wave of pleasure runs up from your groin, and you feel your slit shifting and contracting with a mind of its own."
							+ " Within moments, the feeling fades away, and you discover that your pussy has shaped itself into a that of a harpy."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" feathers have grown around it, giving your feminine sex a rather avian appearance."
						+ "
"
						+ "
"
							+ "Just as you think that the transformation has come to an end, your pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between your [pc.lips+] as a warm, tingling feeling spreads up through your lower abdomen."
							+ " Images of slamming your pussy down on cute little harpy cocks flash before your eyes, and your squeal turns into a satisfied moan as you imagine them squirting their hot seed deep into your hungry avian cunt."
							+ " Just as quickly as they came, the images fade from your mind, and as one last wave of tingling pleasure washes through your body, you feel your female reproductive organs finishing their transformation."
							+ "
"
							+ "You now have an [style.boldHarpy(avian vagina)], with [pc.pussyColourPrimary(true)] labia and [pc.pussyColourSecondary(true)] internal walls."
						+ "
");
				} else {
					UtilText.transformationContentSB.append(UtilText.parse(owner,
							" [npc.She] lets out a squeal of excitement as a wave of pleasure runs up through [npc.her] groin, and as [npc.she] feels [npc.her] slit shifting and contracting with a mind of its own,"
									+ " [npc.she] desperately clamps [npc.her] [npc.legs] shut."
							+ " Within moments, the feeling fades away, and [npc.she] discovers that [npc.her] pussy has shaped itself into a that of a harpy."
							+ " Although it looks like a normal human pussy, a short layer of soft "+owner.getCovering(type.getBodyCoveringType(owner)).getColourDescriptor(owner, false, false)
								+" feathers have grown around it, giving [npc.her] feminine sex a rather avian appearance."
						+ "
"
						+ "
"
							+ "Just as [npc.she] starts think that the transformation has come to an end, [npc.her] pussy involuntarily clenches down,"
								+ " and a desperate squeal escapes from between [npc.her] [npc.lips+] as a warm, tingling feeling spreads up through [npc.her] lower abdomen."
							+ " Images of slamming [npc.her] pussy down on cute little harpy cocks flash before [npc.her] eyes,"
								+ " and [npc.her] squeal turns into a satisfied moan as [npc.she] imagines them squirting their hot seed deep into [npc.her] hungry avian cunt."
							+ " Just as quickly as they came, the images fade from [npc.her] mind, and as one last wave of tingling pleasure washes through [npc.her] body,"
								+ " [npc.she] feels [npc.her] female reproductive organs finishing their transformation."
							+ "
"
							+ "[npc.Name] now has an [style.boldHarpy(avian vagina)], with [npc.pussyColourPrimary(true)] labia and [npc.pussyColourSecondary(true)] internal walls."
						+ "
"));
				}
				break;
			case ANGEL://TODO
				break;
		}

		orificeVagina.getOrificeModifiers().clear();
		for(OrificeModifier om : type.getDefaultRacialOrificeModifiers()) {
			orificeVagina.addOrificeModifier(owner, om);
		}

		if (owner.isPlayer()) {
			UtilText.transformationContentSB.append(
					"
"
					+ "Any old modifiers that your pussy might have had have [style.boldShrink(transformed away)]!");
		} else {
			UtilText.transformationContentSB.append(
					"
"
					+ "Any old modifiers that [npc.her] pussy might have had have [style.boldShrink(transformed away)]!");
		}

		if(orificeVagina.getOrificeModifiers().isEmpty()) {
			UtilText.transformationContentSB.append("
");
		} else {
			if (owner.isPlayer()) {
				UtilText.transformationContentSB.append(
						"
"
						+ "Instead, your new pussy is:");
			} else {
				UtilText.transformationContentSB.append(
						"
"
						+ "Instead, [npc.her] new pussy is:");
			}

			for(OrificeModifier om : orificeVagina.getOrificeModifiers()) {
				UtilText.transformationContentSB.append("
[style.boldGrow("+Util.capitaliseSentence(om.getName())+")]");
			}
			UtilText.transformationContentSB.append("
");
		}

		return UtilText.transformationContentSB.toString()
				+ "
"
					+ owner.postTransformationCalculation()
				+ "
";
	}

	public LabiaSize getLabiaSize() {
		return LabiaSize.getLabiaSizeFromInt(labiaSize);
	}

	public int getRawLabiaSizeValue() {
		return labiaSize;
	}

	public String setLabiaSize(GameCharacter owner, int labiaSize) {
		if(!owner.hasVagina()) {
			return "
[style.colourDisabled(Nothing happens...)]
";
		}

		int oldSize = this.labiaSize;
		this.labiaSize = Math.max(0, Math.min(labiaSize, LabiaSize.FOUR_MASSIVE.getValue()));
		int sizeChange = this.labiaSize - oldSize;

		if (sizeChange == 0) {
			if(owner.isPlayer()) {
				return "
[style.colourDisabled(The size of your labia doesn't change...)]
";
			} else {
				return UtilText.parse(owner, "
[style.colourDisabled(The size of [npc.namePos] labia doesn't change...)]
");
			}
		} else if (sizeChange > 0) {
			if (owner.isPlayer()) {
				return "
"
							+ "[pc.A_moan+] bursts out from between your [pc.lips+] as you feel a warm tingling sensation run up into your [pc.pussy]."
							+ " Squirming about on the spot, your exclamation turns into a surprised gasp as you feel your labia swell up and [style.boldGrow(grow larger)].
"
							+ "You now have [style.boldSex([pc.labiaSize] labia)]!"
						+ "
";
			} else {
				return UtilText.parse(owner,
						"
"
							+ "[npc.A_moan+] bursts out from between [npc.name] [pc.lips+] as [npc.she] feels a warm tingling sensation run up into [npc.her] [npc.pussy]."
							+ " Squirming about on the spot, [npc.her] exclamation turns into a surprised gasp as [npc.she] feels [npc.her] labia swell up and [style.boldGrow(grow larger)].
"
							+ "[npc.Name] now has [style.boldSex([npc.labiaSize] labia)]!"
						+ "
");
			}
		} else {
			if (owner.isPlayer()) {
				return "
"
						+ "[pc.A_moan+] bursts out from between your [pc.lips+] as you feel a cool tingling sensation spread up into your [pc.pussy]."
						+ " Squirming about on the spot, your exclamation turns into a surprised gasp as you feel your labia shrink down and [style.boldShrink(get smaller)].
"
						+ "You now have [style.boldSex([pc.labiaSize] labia)]!"
					+ "
";
			} else {
				return UtilText.parse(owner,
						"
"
							+ "[npc.A_moan+] bursts out from between [npc.name] [pc.lips+] as [npc.she] feels a cool tingling sensation spread up into [npc.her] [npc.pussy]."
							+ " Squirming about on the spot, [npc.her] exclamation turns into a surprised gasp as [npc.she] feels [npc.her] labia shrink down and [style.boldShrink(get smaller)].
"
							+ "[npc.Name] now has [style.boldSex([npc.labiaSize] labia)]!"
						+ "
");
			}
		}
	}

	public boolean isPierced() {
		return pierced;
	}

	public String setPierced(GameCharacter owner, boolean pierced) {
		if(this.pierced == pierced || !owner.hasVagina()) {
			return "
[style.colourDisabled(Nothing happens...)]
";
		}

		this.pierced = pierced;

		if(pierced) {
			if(owner.isPlayer()) {
				return "
Your [pc.pussy] is now [style.boldGrow(pierced)]!
";
			} else {
				return UtilText.parse(owner,
						"
[npc.NamePos] [npc.pussy] is now [style.boldGrow(pierced)]!
");
			}
		} else {
			AbstractClothing c = owner.getClothingInSlot(InventorySlot.PIERCING_VAGINA);
			String piercingUnequip = "";
			if(c!=null) {
				owner.forceUnequipClothingIntoVoid(owner, c);
				piercingUnequip = owner.addClothing(c, false);
			}

			if(owner.isPlayer()) {
				return "
"
							+ "Your [pc.pussy] is [style.boldShrink(no longer pierced)]!"
						+ "
"
						+piercingUnequip;
			} else {
				return UtilText.parse(owner,
						"
"
								+ "[npc.NamePos] [npc.pussy] is [style.boldShrink(no longer pierced)]!"
						+ "
"
						+piercingUnequip);
			}
		}
	}

	public Clitoris getClitoris() {
		return clitoris;
	}

	@Override
	public boolean isBestial(GameCharacter owner) {
		if(owner==null) {
			return false;
		}
		return owner.getLegConfiguration().getBestialParts().contains(Vagina.class) && getType().getRace().isBestialPartsAvailable();
	}
}


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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.types.WingType;
import com.lilithsthrone.game.character.body.valueEnums.WingSize;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.0
 * @version 0.3.1
 * @author Innoxia
 */
public class Wing implements BodyPartInterface {

	protected WingType type;
	protected int size;

	public Wing(WingType type, int size) {
		this.type = type;
		this.size = size;
	}

	@Override
	public WingType getType() {
		return type;
	}

	@Override
	public String getDeterminer(GameCharacter gc) {
		return type.getDeterminer(gc);
	}

	@Override
	public String getName(GameCharacter gc) {
		return type.getName(gc);
	}

	@Override
	public String getNameSingular(GameCharacter gc) {
		return type.getNameSingular(gc);
	}

	@Override
	public String getNamePlural(GameCharacter gc) {
		return type.getNamePlural(gc);
	}

	@Override
	public String getDescriptor(GameCharacter gc) {
		return type.getDescriptor(gc);
	}

	public String setType(GameCharacter owner, WingType type) {
		if(!Main.game.isStarted() || owner==null) {
			this.type = type;
			if(owner!=null) {
				owner.postTransformationCalculation();
			}
			return "";
		}

		if (type == getType()) {
			if(type == WingType.NONE) {
				return UtilText.parse(owner, "
[style.colourDisabled([npc.Name] already [npc.verb(lack)] wings, so nothing happens...)]
");

			} else {
				return UtilText.parse(owner, "
[style.colourDisabled([npc.Name] already [npc.has] the [npc.wings] of [npc.a_wingRace], so nothing happens...)]
");
			}

		} else {
			UtilText.transformationContentSB.setLength(0);

			if(type != WingType.NONE) {
				UtilText.transformationContentSB.append(
						"
"
							+ "[npc.Name] [npc.verb(try)] to look behind [npc.herHim] as [npc.she] [npc.verb(feel)] a strange bubbling sensation rising up in [npc.her] back, before something starts pushing out from under [npc.her] [npc.skin].");

			} else {
				UtilText.transformationContentSB.append(
						"
"
							+ "[npc.NamePos] [npc.wings] suddenly start to twitch and flap with a mind of their own, and [npc.she] [npc.verb(let)] out a gasp as [npc.she] [npc.verb(feel)] them start to transform.");
			}
		}

		switch (type) {
			case ANGEL:
				if(owner.getLegConfiguration().isWingsOnLegConfiguration()) {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], feathered wings push out from the sides of [npc.her] [npc.legConfiguration] body.
"
							+ "[npc.Name] now [npc.has] [style.boldAngel(angelic, feathered wings)].");
				} else {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], feathered wings push out from [npc.her] shoulder blades.
"
							+ "[npc.Name] now [npc.has] [style.boldAngel(angelic, feathered wings)].");
				}
				break;
			case DEMON_COMMON:
				if(owner.getLegConfiguration().isWingsOnLegConfiguration()) {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], bat-like wings push out from the sides of [npc.her] [npc.legConfiguration] body.
"
							+ (!owner.isShortStature()
									?"[npc.Name] now [npc.has] [style.boldDemon(demonic bat-like wings)]."
									:"[npc.Name] now [npc.has] [style.boldImp(impish bat-like wings)]."));
				} else {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], bat-like wings push out from [npc.her] shoulder blades.
"
							+ (!owner.isShortStature()
									?"[npc.Name] now [npc.has] [style.boldDemon(demonic bat-like wings)]."
									:"[npc.Name] now [npc.has] [style.boldImp(impish bat-like wings)]."));
				}
				break;
			case DEMON_FEATHERED:
				if(owner.getLegConfiguration().isWingsOnLegConfiguration()) {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], feathered wings push out from the sides of [npc.her] [npc.legConfiguration] body.
"
							+ (!owner.isShortStature()
									?"[npc.Name] now [npc.has] [style.boldDemon(demonic feathered wings)]."
									:"[npc.Name] now [npc.has] [style.boldImp(impish feathered wings)]."));
				} else {
					UtilText.transformationContentSB.append(
								" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], feathered wings push out from [npc.her] shoulder blades.
"
								+ (!owner.isShortStature()
										?"[npc.Name] now [npc.has] [style.boldDemon(demonic feathered wings)]."
										:"[npc.Name] now [npc.has] [style.boldImp(impish feathered wings)]."));
				}
				break;
			case NONE:
				if(owner.getLegConfiguration().isWingsOnLegConfiguration()) {
					UtilText.transformationContentSB.append(
							" With a strong tugging sensation, [npc.her] [npc.wings] shrink away and disappear into the sides of [npc.her] [npc.legConfiguration] body."
							+ "
"
							+ "[npc.Name] now [npc.has] [style.boldTfGeneric(no wings)].");
				} else {
					UtilText.transformationContentSB.append(
							" With a strong tugging sensation, [npc.her] [npc.wings] shrink away and disappear into [npc.her] back."
							+ "
"
							+ "[npc.Name] now [npc.has] [style.boldTfGeneric(no wings)].");
				}
				break;
			case PEGASUS:
				if(owner.getLegConfiguration().isWingsOnLegConfiguration()) {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], feathered wings push out from the sides of [npc.her] [npc.legConfiguration] body.
"
							+ "[npc.Name] now [npc.has] the [style.boldPegataur(feathered wings of a pegataur)].");
				} else {
					UtilText.transformationContentSB.append(
							" [npc.She] [npc.verb(bite)] [npc.her] [npc.lip] to try and suppress an unexpected moan of pleasure as a pair of [npc.wingSize], feathered wings push out from [npc.her] shoulder blades.
"
							+ "[npc.Name] now [npc.has] the [style.boldPegataur(feathered wings of a pegataur)].");
				}
				break;
		}

		if(type!=WingType.NONE) {
			if(this.getSize().getValue() >= owner.getLegConfiguration().getMinimumWingSizeForFlight().getValue()) {
				UtilText.transformationContentSB.append("
"
						+ "Giving them an experimental flap, [npc.sheIs] delighted to discover that they're [style.colourGood(powerful enough to enable [npc.herHim] to fly)]!"
						+ "
"
						+ "[style.italics("+Util.capitaliseSentence(owner.getLegConfiguration().getName())+" bodies require wings to be at least '"+owner.getLegConfiguration().getMinimumWingSizeForFlight().getName()+"' to enable flight.)]");
			} else {
				UtilText.transformationContentSB.append("
"
						+ "Giving them an experimental flap, [npc.sheIs] disappointed to discover that they're [style.colourBad(not powerful enough to enable [npc.herHim] to fly)]..."
						+ "
"
						+ "[style.italics("+Util.capitaliseSentence(owner.getLegConfiguration().getName())+" bodies require wings to be at least '"+owner.getLegConfiguration().getMinimumWingSizeForFlight().getName()+"' to enable flight.)]");
			}
		}
		UtilText.transformationContentSB.append("
");

		this.type = type;

		return UtilText.parse(owner, UtilText.transformationContentSB.toString())
				+ "
"
				+ owner.postTransformationCalculation()
				+ "
";
	}

	public WingSize getSize() {
		return WingSize.getWingSizeFromInt(size);
	}

	public int getSizeValue() {
		return size;
	}

	public String setSize(GameCharacter owner, int wingSize) {
		if(owner==null) {
			int effectiveSize = Math.max(0, Math.min(wingSize, WingSize.getLargest()));
			this.size = effectiveSize;
			return "";
		}

		if(owner.getWingType()==WingType.NONE) {
			return UtilText.parse(owner, "
[style.colourDisabled([npc.NamePos] [npc.do]n't have any wings, so nothing happens...)]
");
		}

		int effectiveSize = Math.max(0, Math.min(wingSize, WingSize.getLargest()));
		if(owner.getWingSizeValue() == effectiveSize) {
			return UtilText.parse(owner, "
[style.colourDisabled(The size of [npc.namePos] [npc.wings] doesn't change...)]
");
		}

		UtilText.transformationContentSB.setLength(0);

		if(this.size > effectiveSize) {
			UtilText.transformationContentSB.append(
					UtilText.parse(owner, "
[npc.Name] [npc.verb(let)] out an alarmed cry as [npc.she] [npc.verb(feel)] a soothing coolness rise up into [npc.her] [npc.wings+], before they suddenly [style.boldShrink(shrink)].
"));

		} else {
			UtilText.transformationContentSB.append(
					UtilText.parse(owner, "
[npc.Name] [npc.verb(let)] out an alarmed gasp as [npc.she] [npc.verb(feel)] a pulsating warmth rise up into [npc.her] [npc.wings+], before they suddenly [style.boldGrow(grow larger)].
"));
		}

		this.size = effectiveSize;

		UtilText.transformationContentSB.append(UtilText.parse(owner, "[npc.Name] now [npc.has] [style.boldSex([npc.wingSize] [npc.wings])]!"));

		if(type!=WingType.NONE) {
			if(this.getSize().getValue() >= owner.getLegConfiguration().getMinimumWingSizeForFlight().getValue()) {
				UtilText.transformationContentSB.append("
"
						+ "Giving them an experimental flap, [npc.sheIs] delighted to discover that they're [style.colourGood(powerful enough to enable [npc.herHim] to fly)]!"
						+ "
"
						+ "[style.italics("+Util.capitaliseSentence(owner.getLegConfiguration().getName())+" bodies require wings to be at least '"+owner.getLegConfiguration().getMinimumWingSizeForFlight().getName()+"' to enable flight.)]");
			} else {
				UtilText.transformationContentSB.append("
"
						+ "Giving them an experimental flap, [npc.sheIs] disappointed to discover that they're [style.colourBad(not powerful enough to enable [npc.herHim] to fly)]..."
						+ "
"
						+ "[style.italics("+Util.capitaliseSentence(owner.getLegConfiguration().getName())+" bodies require wings to be at least '"+owner.getLegConfiguration().getMinimumWingSizeForFlight().getName()+"' to enable flight.)]");
			}
		}
		UtilText.transformationContentSB.append("
");

		return UtilText.transformationContentSB.toString();
	}

	@Override
	public boolean isBestial(GameCharacter owner) {
		if(owner==null) {
			return false;
		}
		return owner.getLegConfiguration().getBestialParts().contains(Wing.class) && getType().getRace().isBestialPartsAvailable();
	}
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.character.body.types;

import java.util.List;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.Body;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.3
 * @version 0.3
 * @author Innoxia
 */
public abstract class AbstractArmType implements BodyPartTypeInterface {

	private BodyCoveringType skinType;
	private Race race;

	private String name;
	private String namePlural;

	private String handName;
	private String handNamePlural;
	private List<String> handDescriptorsMasculine;
	private List<String> handDescriptorsFeminine;

	private String fingerName;
	private String fingerNamePlural;
	private List<String> fingerDescriptorsMasculine;
	private List<String> fingerDescriptorsFeminine;

	private List<String> descriptorsMasculine;
	private List<String> descriptorsFeminine;

	private String armTransformationDescription;
	private String armBodyDescription;

	/**
	 * @param skinType What covers this arm type (i.e skin/fur/feather type).
	 * @param race What race has this arm type.
	 * @param name The singular name of the arm. This will usually just be "arm" or "wing".
	 * @param namePlural The plural name of the arm. This will usually just be "arms" or "wings".
	 * @param descriptorsMasculine The descriptors that can be used to describe a masculine form of this arm type.
	 * @param descriptorsFeminine The descriptors that can be used to describe a feminine form of this arm type.
	 * @param handName The singular name of the hands associated with this arm type. This will usually just be "hand".
	 * @param handNamePlural The plural name of the hands associated with this arm type. This will usually just be "hands".
	 * @param handDescriptorsMasculine The descriptors that are applied to a masculine form of this hand.
	 * @param handDescriptorsFeminine The descriptors that are applied to a feminine form of this hand.
	 * @param fingerName The singular name of the fingers associated with this arm type. This will usually just be "finger".
	 * @param fingerNamePlural The plural name of the hands associated with this arm type. This will usually just be "fingers".
	 * @param fingerDescriptorsMasculine The descriptors that are applied to a masculine form of this fingers of this arm type's hand.
	 * @param fingerDescriptorsFeminine The descriptors that are applied to a feminine form of the fingers of this arm type's hand.
	 * @param armTransformationDescription A paragraph describing a character's arms transforming into this arm type. Parsing assumes that the character already has this arm type and associated skin covering.
	 * @param armBodyDescription A sentence or two to describe this arm type, as seen in the character view screen. It should follow the same format as all of the other entries in the ArmType class.
	 */
	public AbstractArmType(BodyCoveringType skinType,
			Race race,
			String name,
			String namePlural,
			List<String> descriptorsMasculine,
			List<String> descriptorsFeminine,
			String handName,
			String handNamePlural,
			List<String> handDescriptorsMasculine,
			List<String> handDescriptorsFeminine,
			String fingerName,
			String fingerNamePlural,
			List<String> fingerDescriptorsMasculine,
			List<String> fingerDescriptorsFeminine,
			String armTransformationDescription,
			String armBodyDescription) {

		this.skinType = skinType;
		this.race = race;

		this.name = name;
		this.namePlural = namePlural;

		this.handName = handName;
		this.handNamePlural = handNamePlural;
		this.handDescriptorsMasculine = handDescriptorsMasculine;
		this.handDescriptorsFeminine = handDescriptorsFeminine;

		this.fingerName = fingerName;
		this.fingerNamePlural = fingerNamePlural;
		this.fingerDescriptorsMasculine = fingerDescriptorsMasculine;
		this.fingerDescriptorsFeminine = fingerDescriptorsFeminine;

		this.descriptorsMasculine = descriptorsMasculine;
		this.descriptorsFeminine = descriptorsFeminine;

		this.armTransformationDescription = armTransformationDescription;
		this.armBodyDescription = armBodyDescription;
	}

	public boolean allowsFlight() {
		return false;
	}

	@Override
	public String getDeterminer(GameCharacter gc) {
		if(gc.getArmRows()==1) {
			return "a pair of";
		} else {
			return Util.intToString(gc.getArmRows())+" pairs of";
		}
	}

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

	@Override
	public String getNameSingular(GameCharacter gc) {
		return name;
	}

	@Override
	public String getNamePlural(GameCharacter gc) {
		return namePlural;
	}

	@Override
	public String getDescriptor(GameCharacter gc) {
		if (gc.isFeminine()) {
			return Util.randomItemFrom(descriptorsFeminine);
		} else {
			return Util.randomItemFrom(descriptorsMasculine);
		}
	}

	@Override
	public BodyCoveringType getBodyCoveringType(Body body) {
		return skinType;
	}

	@Override
	public Race getRace() {
		return race;
	}

	public String getHandsNameSingular(GameCharacter gc) {
		return handName;
	}

	public String getHandsNamePlural(GameCharacter gc) {
		return handNamePlural;
	}

	public String getHandsDescriptor(GameCharacter gc) {
		if (gc.isFeminine()) {
			return Util.randomItemFrom(handDescriptorsFeminine);
		} else {
			return Util.randomItemFrom(handDescriptorsMasculine);
		}
	}

	public String getFingersNameSingular(GameCharacter gc) {
		return fingerName;
	}

	public String getFingersNamePlural(GameCharacter gc) {
		return fingerNamePlural;
	}

	public String getFingersDescriptor(GameCharacter gc) {
		if (gc.isFeminine()) {
			return Util.randomItemFrom(fingerDescriptorsFeminine);
		} else {
			return Util.randomItemFrom(fingerDescriptorsMasculine);
		}
	}

//	@Override
	public String getBodyDescription(GameCharacter owner) {
		return UtilText.parse(owner, armBodyDescription);
	}

//	@Override
	public String getTransformationDescription(GameCharacter owner) {
		return UtilText.parse(owner, armTransformationDescription);
	}
}


code:
package com.lilithsthrone.game.character.body.types;

import java.util.List;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.Body;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.3
 * @version 0.3
 * @author Innoxia
 */
public abstract class AbstractAssType implements BodyPartTypeInterface {

	private BodyCoveringType skinType;
	private Race race;
	private AnusType anusType;

	private List<String> names;
	private List<String> namesPlural;

	private List<String> descriptorsMasculine;
	private List<String> descriptorsFeminine;

	private String assTransformationDescription;
	private String assBodyDescription;

	/**
	 * @param skinType What covers this ass type (i.e skin/fur/feather type). This is never used, as skin type covering ass is determined by torso covering.
	 * @param race What race has this ass type.
	 * @param anusType The type of anus that this ass type has.
	 * @param names A list of singular names for this ass type. Pass in null to use generic names.
	 * @param namesPlural A list of plural names for this ass type. Pass in null to use generic names.
	 * @param descriptorsMasculine The descriptors that can be used to describe a masculine form of this ass type.
	 * @param descriptorsFeminine The descriptors that can be used to describe a feminine form of this ass type.
	 * @param assTransformationDescription A paragraph describing a character's ass transforming into this ass type. Parsing assumes that the character already has this ass type and associated skin covering.
	 * @param assBodyDescription A sentence or two to describe this ass type, as seen in the character view screen. It should follow the same format as all of the other entries in the AssType class.
	 */
	public AbstractAssType(BodyCoveringType skinType,
			Race race,
			AnusType anusType,
			List<String> names,
			List<String> namesPlural,
			List<String> descriptorsMasculine,
			List<String> descriptorsFeminine,
			String assTransformationDescription,
			String assBodyDescription) {

		this.skinType = skinType;
		this.race = race;
		this.anusType = anusType;

		this.names = names;
		this.namesPlural = namesPlural;

		this.descriptorsMasculine = descriptorsMasculine;
		this.descriptorsFeminine = descriptorsFeminine;

		this.assTransformationDescription = assTransformationDescription;
		this.assBodyDescription = assBodyDescription;
	}

	public AnusType getAnusType() {
		return anusType;
	}

	@Override
	public String getDeterminer(GameCharacter gc) {
		return "";
	}

	@Override
	public boolean isDefaultPlural() {
		return false;
	}

	@Override
	public String getNameSingular(GameCharacter gc) {
		if(names==null) {
			return UtilText.returnStringAtRandom("ass", "rear end", "butt", "rump");
		}
		return Util.randomItemFrom(names);
	}

	@Override
	public String getNamePlural(GameCharacter gc) {
		if(namesPlural==null) {
			return UtilText.returnStringAtRandom("asses", "rear ends", "butts", "rumps");
		}
		return Util.randomItemFrom(namesPlural);
	}

	@Override
	public String getDescriptor(GameCharacter gc) {
		if (gc.isFeminine()) {
			return Util.randomItemFrom(descriptorsFeminine);
		} else {
			return Util.randomItemFrom(descriptorsMasculine);
		}
	}

	@Override
	/**
	 * <b>This should never be used - the covering of an ass is determined by the torso's covering!</b>
	 */
	public BodyCoveringType getBodyCoveringType(Body body) {
		if(body!=null) {
			return body.getSkin().getBodyCoveringType(body);
		}
		return skinType;
	}

	@Override
	public Race getRace() {
		return race;
	}

//	@Override
	public String getBodyDescription(GameCharacter owner) {
		return UtilText.parse(owner, assBodyDescription);
	}

//	@Override
	public String getTransformationDescription(GameCharacter owner) {
		return UtilText.parse(owner, assTransformationDescription);
	}
}


code:
package com.lilithsthrone.game.character.body.types;

import java.util.List;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.Body;
import com.lilithsthrone.game.character.body.valueEnums.BreastShape;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.3
 * @version 0.3.1
 * @author Innoxia
 */
public abstract class AbstractBreastType implements BodyPartTypeInterface {

	private BodyCoveringType skinType;
	private Race race;
	private NippleType nippleType;
	private FluidType fluidType;

	private List<String> namesFlat;
	private List<String> namesFlatPlural;
	private List<String> descriptorsFlat;

	private List<String> namesBreasts;
	private List<String> namesBreastsPlural;
	private List<String> descriptorsBreasts;

	private String breastsTransformationDescription;
	private String breastsBodyDescription;
	private String breastsCrotchTransformationDescription;
	private String breastsCrotchBodyDescription;

	/**
	 * @param skinType What covers this breasts type (i.e skin/fur/feather type). This is never used, as skin type covering breasts is determined by torso covering.
	 * @param race What race has this breasts type.
	 * @param nippleType The type of nipples that these breasts have.
	 * @param fluidType The type of milk that these breasts produce.
	 * @param namesFlat A list of singular names for this breasts type for when the character has a flat chest. Pass in null to use generic names.
	 * @param namesFlatPlural A list of plural names for this breasts type for when the character has a flat chest. Pass in null to use generic names.
	 * @param descriptorsFlat The descriptors that can be used to describe this breasts type for when the character has a flat chest.
	 * @param namesBreasts A list of singular names for this breasts type for when the character has breasts, not a flat chest. Pass in null to use generic names.
	 * @param namesBreastsPlural A list of plural names for this breasts type for when the character has breasts, not a flat chest. Pass in null to use generic names.
	 * @param descriptorsBreasts The descriptors that can be used to this breasts type for when the character has breasts, not a flat chest.
	 * @param breastsTransformationDescription A paragraph describing a character's breasts transforming into this breasts type. Parsing assumes that the character already has this breasts type and associated skin covering.
	 * @param breastsBodyDescription A sentence or two to describe this breasts type, as seen in the character view screen. It should follow the same format as all of the other entries in the BreastType class.
	 * @param breastsCrotchTransformationDescription A paragraph describing a character's crotch-boobs transforming into this breasts type. Parsing assumes that the character already has this breasts type and associated skin covering.
	 * @param breastsCrotchBodyDescription A sentence or two to describe this crotch-boob type, as seen in the character view screen. It should follow the same format as all of the other entries in the BreastType class.
	 */
	public AbstractBreastType(BodyCoveringType skinType,
			Race race,
			NippleType nippleType,
			FluidType fluidType, //Should probably be linked to nipples, but as nipples are always the same as breast type, it doesn't make a difference.
			List<String> namesFlat,
			List<String> namesFlatPlural,
			List<String> descriptorsFlat,
			List<String> namesBreasts,
			List<String> namesBreastsPlural,
			List<String> descriptorsBreasts,
			String breastsTransformationDescription,
			String breastsBodyDescription,
			String breastsCrotchTransformationDescription,
			String breastsCrotchBodyDescription) {

		this.skinType = skinType;
		this.race = race;
		this.nippleType = nippleType;
		this.fluidType = fluidType;

		this.namesFlat = namesFlat;
		this.namesFlatPlural = namesFlatPlural;
		this.descriptorsFlat = descriptorsFlat;

		this.namesBreasts = namesBreasts;
		this.namesBreastsPlural = namesBreastsPlural;
		this.descriptorsBreasts = descriptorsBreasts;

		this.breastsTransformationDescription = breastsTransformationDescription;
		this.breastsBodyDescription = breastsBodyDescription;

		this.breastsCrotchTransformationDescription = breastsCrotchTransformationDescription;
		this.breastsCrotchBodyDescription = breastsCrotchBodyDescription;
	}

	public AbstractBreastType(BodyCoveringType skinType,
			Race race,
			NippleType nippleType,
			FluidType fluidType,
			String breastsTransformationDescription,
			String breastsBodyDescription,
			String breastsCrotchTransformationDescription,
			String breastsCrotchBodyDescription) {
		this(skinType,
				race,
				nippleType,
				fluidType,
				null, null, null, null, null, null,
				breastsTransformationDescription,
				breastsBodyDescription,
				breastsCrotchTransformationDescription,
				breastsCrotchBodyDescription);
	}

	public NippleType getNippleType() {
		return nippleType;
	}

	public FluidType getFluidType() {
		return fluidType;
	}

	@Override
	public String getDeterminer(GameCharacter gc) {
		if(gc.getBreastCrotchShape()==BreastShape.UDDERS) {
			return "a set of";
		}
		if(gc.getBreastRows()==1) {
			return "a pair of";
		} else {
			return Util.intToString(gc.getBreastRows())+" pairs of";
		}
	}

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

	@Override
	public String getNameSingular(GameCharacter gc) {
		if (gc.hasBreasts()) {
			if(namesBreasts==null) {
				return UtilText.returnStringAtRandom("breast", "boob", "tit");
			}
			return Util.randomItemFrom(namesBreasts);

		} else {
			if(namesFlat==null) {
				return UtilText.returnStringAtRandom("pec");
			}
			return Util.randomItemFrom(namesFlat);
		}
	}

	@Override
	public String getNamePlural(GameCharacter gc) {
		if (gc.hasBreasts()) {
			if(namesBreastsPlural==null) {
				return UtilText.returnStringAtRandom("breasts", "boobs", "mammaries", "tits");
			}
			return Util.randomItemFrom(namesBreastsPlural);

		} else {
			if(namesFlatPlural==null) {
				return UtilText.returnStringAtRandom("pecs");
			}
			return Util.randomItemFrom(namesFlatPlural);
		}
	}

	@Override
	public String getDescriptor(GameCharacter gc) {
		if (gc.hasBreasts()) {
			if(descriptorsBreasts==null) {
				return "";
			}
			return Util.randomItemFrom(descriptorsBreasts);
		} else {
			if(descriptorsFlat==null) {
				return "";
			}
			return Util.randomItemFrom(descriptorsFlat);
		}
	}

	public String getCrotchNameSingular(GameCharacter gc) {
		return UtilText.returnStringAtRandom("crotch-breast", "crotch-boob", "crotch-boob", "crotch-boob", "crotch-tit");
	}

	public String getCrotchNamePlural(GameCharacter gc) {
		return UtilText.returnStringAtRandom("crotch-breasts", "crotch-boobs", "crotch-boobs", "crotch-boobs", "crotch-tits");
	}

	@Override
	/**
	 * <b>This should never be used - the covering of breasts is determined by the torso's covering!</b>
	 */
	public BodyCoveringType getBodyCoveringType(Body body) {
		if(body!=null) {
			return body.getSkin().getBodyCoveringType(body);
		}
		return skinType;
	}

	@Override
	public Race getRace() {
		return race;
	}

//	@Override
	public String getBodyDescription(GameCharacter owner) {
		return UtilText.parse(owner, breastsBodyDescription);
	}

//	@Override
	public String getTransformationDescription(GameCharacter owner) {
		return UtilText.parse(owner, breastsTransformationDescription);
	}

	public String getTransformationCrotchDescription(GameCharacter owner) {
		return UtilText.parse(owner, breastsCrotchTransformationDescription);
	}

	public String getBodyCrotchDescription(GameCharacter owner) {
		return UtilText.parse(owner, breastsCrotchBodyDescription);
	}

}