code:
package com.lilithsthrone.game.sex.sexActions.submission;

import com.lilithsthrone.game.character.PlayerCharacter;
import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.body.Covering;
import com.lilithsthrone.game.character.body.types.AssType;
import com.lilithsthrone.game.character.body.types.BodyCoveringType;
import com.lilithsthrone.game.character.body.types.BreastType;
import com.lilithsthrone.game.character.body.types.PenisType;
import com.lilithsthrone.game.character.body.types.VaginaType;
import com.lilithsthrone.game.character.body.valueEnums.AssSize;
import com.lilithsthrone.game.character.body.valueEnums.BodySize;
import com.lilithsthrone.game.character.body.valueEnums.Capacity;
import com.lilithsthrone.game.character.body.valueEnums.CupSize;
import com.lilithsthrone.game.character.body.valueEnums.Femininity;
import com.lilithsthrone.game.character.body.valueEnums.FluidExpulsion;
import com.lilithsthrone.game.character.body.valueEnums.HairLength;
import com.lilithsthrone.game.character.body.valueEnums.HipSize;
import com.lilithsthrone.game.character.body.valueEnums.LabiaSize;
import com.lilithsthrone.game.character.body.valueEnums.LipSize;
import com.lilithsthrone.game.character.body.valueEnums.Muscle;
import com.lilithsthrone.game.character.body.valueEnums.OrificeElasticity;
import com.lilithsthrone.game.character.body.valueEnums.OrificePlasticity;
import com.lilithsthrone.game.character.body.valueEnums.PenisGirth;
import com.lilithsthrone.game.character.body.valueEnums.TesticleSize;
import com.lilithsthrone.game.character.body.valueEnums.Wetness;
import com.lilithsthrone.game.character.npc.submission.Lyssieth;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.dialogue.utils.ParserTag;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.inventory.clothing.AbstractClothingType;
import com.lilithsthrone.game.inventory.enchanting.ItemEffect;
import com.lilithsthrone.game.inventory.enchanting.ItemEffectType;
import com.lilithsthrone.game.inventory.enchanting.TFModifier;
import com.lilithsthrone.game.inventory.enchanting.TFPotency;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.SexType;
import com.lilithsthrone.game.sex.managers.submission.SMLyssiethDemonTF;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlotAllFours;
import com.lilithsthrone.game.sex.positions.slots.SexSlotDesk;
import com.lilithsthrone.game.sex.positions.slots.SexSlotLyingDown;
import com.lilithsthrone.game.sex.positions.slots.SexSlotSitting;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionCategory;
import com.lilithsthrone.game.sex.sexActions.SexActionPriority;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3
 * @version 0.3
 * @author Innoxia
 */
public class SALyssiethSpecials {

	public static final void playerGrowDemonicVagina() {
		Main.game.getPlayer().setVaginaType(VaginaType.DEMON_COMMON, true);
		Main.game.getPlayer().setVaginaVirgin(true);
		Main.game.getPlayer().setVaginaLabiaSize(LabiaSize.ZERO_TINY);
		Main.game.getPlayer().setVaginaWetness(Wetness.SEVEN_DROOLING);
		Main.game.getPlayer().setVaginaCapacity(Capacity.ONE_EXTREMELY_TIGHT.getMinimumValue(), true);
		Main.game.getPlayer().setVaginaElasticity(OrificeElasticity.FOUR_LIMBER.getValue());
		Main.game.getPlayer().setVaginaPlasticity(OrificePlasticity.THREE_RESILIENT.getValue());

		Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.VAGINA, Colour.SKIN_RED_DARK), false);
	}

	public static final void playerGrowDemonicPenis() {
		Main.game.getPlayer().setPenisType(PenisType.DEMON_COMMON);
		Main.game.getPlayer().setPenisSize(20);
		Main.game.getPlayer().setPenisGirth(PenisGirth.THREE_THICK.getValue());
		Main.game.getPlayer().setTesticleSize(TesticleSize.THREE_LARGE);
		Main.game.getPlayer().setPenisCumStorage(750);
		Main.game.getPlayer().setPenisCumExpulsion(FluidExpulsion.FOUR_HUGE.getMedianValue());
		Main.game.getPlayer().fillCumToMaxStorage();

		Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.PENIS, Colour.SKIN_RED), false);
	}

	public static final void playerGrowDemonicBreasts(CupSize breastCup, CupSize crotchBreastCup) {
		PlayerCharacter player = Main.game.getPlayer();
		if (player.getBreastCrotchType() != BreastType.NONE) {
			player.setBreastCrotchType(BreastType.DEMON_COMMON);
			if (crotchBreastCup != null) {
				player.setMinimumBreastCrotchSize(crotchBreastCup);
			}
		}
		player.setBreastType(BreastType.DEMON_COMMON);
		if (breastCup != null) {
			player.setMinimumBreastSize(breastCup);
		}

		Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.NIPPLES, Colour.SKIN_RED_DARK), false);
		Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.NIPPLES_CROTCH, Colour.SKIN_RED_DARK), false);
	}

	public static final void playerGrowDemonicBreasts(CupSize breastCup) {
		playerGrowDemonicBreasts(breastCup, null);
	}

	public static final void playerGrowDemonicBreasts() {
		playerGrowDemonicBreasts(null, null);
	}

	public static final SexAction DEMON_TF_STAGE_1_CHOICE_GET_FUCKED = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==1
					&& Sex.getPosition()==SexPosition.STANDING
					&& Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Get fucked";
		}

		@Override
		public String getActionDescription() {
			return "Allow Lyssieth to push you down onto your back over her desk, and let her fuck you.
"
								+ "[style.italicsFeminine(Lyssieth will feminise you and give you a demonic vagina!)]
"
								+ (Main.game.getPlayer().hasPenis()
										?"[style.italicsTfSexual(Lyssieth will also temporarily remove your cock!)]"
										:"");
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_1_CHOICE_GET_FUCKED");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = false;
			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA));

			if(Main.game.getPlayer().getFemininityValue()<75) {
				Main.game.getPlayer().setFemininity(75);
			} else {
				Main.game.getPlayer().incrementFemininity(15);
			}
			Main.game.getPlayer().setHairLength(HairLength.FOUR_MID_BACK.getMedianValue());
			Main.game.getPlayer().setHipSize(HipSize.FIVE_VERY_WIDE);
			Main.game.getPlayer().setAssSize(AssSize.FOUR_LARGE);
			Main.game.getPlayer().setMuscle(Muscle.THREE_MUSCULAR.getMedianValue());
			Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
			Main.game.getPlayer().setHeight(168);
			Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
			Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
			playerGrowDemonicBreasts(CupSize.DD);
			Main.game.getPlayer().setPenisType(PenisType.NONE);
			playerGrowDemonicVagina();

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.OVER_DESK,
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotDesk.BETWEEN_LEGS)),
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_BACK))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	public static final SexAction DEMON_TF_STAGE_1_CHOICE_GET_FUCKED_ANALLY = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==1
					&& Sex.getPosition()==SexPosition.STANDING
					&& Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Ask for anal";
		}

		@Override
		public String getActionDescription() {
			return "Allow Lyssieth to push you down onto your back over her desk, and request that she use your ass.
"
								+ "[style.italicsFeminine(Lyssieth will feminise you!)]
"
								+ (Main.game.getPlayer().hasPenis()
										?"[style.italicsFeminine(Lyssieth will sissify your cock!)]"
										:"");
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_1_CHOICE_GET_FUCKED_ANALLY");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = false;
			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.ANUS));

			if(Main.game.getPlayer().getFemininityValue()<=Femininity.MASCULINE.getMaximumFemininity()) {
				Main.game.getPlayer().setFemininity(50);
				Main.game.getPlayer().setHairLength(HairLength.THREE_SHOULDER_LENGTH.getMedianValue());
				Main.game.getPlayer().setHipSize(HipSize.THREE_GIRLY);
				Main.game.getPlayer().setAssSize(AssSize.THREE_NORMAL);
				Main.game.getPlayer().setMuscle(Muscle.TWO_TONED.getMedianValue());
				Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
				Main.game.getPlayer().setHeight(168);
				Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
				Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
				playerGrowDemonicBreasts(CupSize.AA);
			} else {
				Main.game.getPlayer().incrementFemininity(15);
				Main.game.getPlayer().setHairLength(HairLength.FOUR_MID_BACK.getMedianValue());
				Main.game.getPlayer().setHipSize(HipSize.FIVE_VERY_WIDE);
				Main.game.getPlayer().setAssSize(AssSize.FOUR_LARGE);
				Main.game.getPlayer().setMuscle(Muscle.THREE_MUSCULAR.getMedianValue());
				Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
				Main.game.getPlayer().setHeight(168);
				Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
				Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
				playerGrowDemonicBreasts(CupSize.DD);
			}

			if(Main.game.getPlayer().hasPenis()) {
				Main.game.getPlayer().setPenisType(PenisType.DEMON_COMMON);
				Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.PENIS, Colour.SKIN_RED), false);
				Main.game.getPlayer().setPenisSize(8);
				Main.game.getPlayer().setTesticleSize(TesticleSize.ONE_TINY);
				Main.game.getPlayer().fillCumToMaxStorage();
			}
			if(Main.game.getPlayer().hasVagina()) {
				playerGrowDemonicVagina();
			}

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.OVER_DESK,
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotDesk.BETWEEN_LEGS)),
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_BACK))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	public static final SexAction DEMON_TF_STAGE_1_CHOICE_FUCK_LYSSIETH = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==1
					&& Sex.getPosition()==SexPosition.STANDING
					&& Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Fuck her";
		}

		@Override
		public String getActionDescription() {
			return "You never agreed to let Lyssieth fuck you. Push her down onto her desk and fuck her instead.
"
								+ (!Main.game.getPlayer().isFeminine()
										?"[style.italicsMasculine(Lyssieth will make you more masculine!)]"
										:"[style.italicsDisabled(This will have no extra feminising effect.)]")
								+ (!Main.game.getPlayer().hasPenis()
										?"[style.italicsTfSexual(Lyssieth will give you a cock with which to fuck her!)]"
										:"");
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_1_CHOICE_FUCK_LYSSIETH");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = false;
			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaOrifice.VAGINA, SexAreaPenetration.PENIS));

			playerGrowDemonicPenis();
			Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
			Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
			playerGrowDemonicBreasts();

			if(!Main.game.getPlayer().isFeminine()) {
				Main.game.getPlayer().setHeight(208);
				if(Main.game.getPlayer().getFemininityValue()>25) {
					Main.game.getPlayer().setFemininity(25);
				} else {
					Main.game.getPlayer().incrementFemininity(-15);
				}
				Main.game.getPlayer().setHairLength(HairLength.TWO_SHORT.getMedianValue());
				if(Main.game.getPlayer().getMuscleValue()<Muscle.TWO_TONED.getMedianValue()) {
					Main.game.getPlayer().setMuscle(Muscle.TWO_TONED.getMedianValue());
				} else {
					Main.game.getPlayer().incrementMuscle(25);
				}
				if(Main.game.getPlayer().getBodySizeValue()<BodySize.TWO_AVERAGE.getMedianValue()) {
					Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
				} else {
					Main.game.getPlayer().incrementBodySize(10);
				}
				Main.game.getPlayer().setVaginaType(VaginaType.NONE);
			} else {
				if(Main.game.getPlayer().hasVagina()) {
					playerGrowDemonicVagina();
				}
			}

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.OVER_DESK,
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.BETWEEN_LEGS)),
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotDesk.OVER_DESK_ON_BACK))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	// STAGE 2
	public static boolean specialActionTriggered = false; // OK to use this and not reset it, as the game can't be saved mid-sex, and this sex scene is only ever used once.

	public static final SexAction DEMON_TF_STAGE_2_CHOICE_FUCK_LYSSIETH = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==2
					&& !specialActionTriggered
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getSexTypeCount(Sex.getCharacterPerformingAction(), Main.game.getNpc(Lyssieth.class), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA))==0;
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Fuck her";
		}

		@Override
		public String getActionDescription() {
			return "Allow Lyssieth to get down on her hands and knees, and kneel down behind her to fuck her in the doggy-style position.
"
								+ "[style.italicsDisabled(This will have no extra feminising effect.)]
"
								+ (!Main.game.getPlayer().hasPenis() || Main.game.getPlayer().getPenisType().getRace()!=Race.DEMON
										?"[style.italicsTfSexual(Lyssieth will give you a demonic cock!)]"
										:"");
		}

		@Override
		public String getDescription() {
			if(Main.game.getPlayer().hasPenis() && Main.game.getPlayer().getPenisType().getRace()==Race.DEMON && Main.game.getPlayer().getPenisRawSizeValue()<=4) {
				return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_CHOICE_FUCK_LYSSIETH_AS_SISSY");
			} else {
				return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_CHOICE_FUCK_LYSSIETH");
			}
		}

		@Override
		public void applyEffects() {
			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaOrifice.VAGINA, SexAreaPenetration.PENIS));
			specialActionTriggered = true;

			if(!Main.game.getPlayer().hasPenis() || Main.game.getPlayer().getPenisType().getRace()!=Race.DEMON) {
				playerGrowDemonicPenis();
			}

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.ALL_FOURS,
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotAllFours.BEHIND)),
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotAllFours.ALL_FOURS))));

			Main.game.getPlayer().fillCumToMaxStorage();
			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	public static final SexAction DEMON_TF_STAGE_2_CHOICE_LYSSIETH_ORAL = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==2
					&& !specialActionTriggered
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getSexTypeCount(Sex.getCharacterPerformingAction(), Main.game.getNpc(Lyssieth.class), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA))==0;
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Ask for oral";
		}

		@Override
		public String getActionDescription() {
			return "Ask Lyssieth to service you with her mouth instead.
"
							+ "[style.italicsDisabled(This will have no extra feminising effect.)]";
		}

		@Override
		public String getDescription() {
			if(Main.game.getPlayer().hasPenis() && Main.game.getPlayer().getPenisType().getRace()==Race.DEMON && Main.game.getPlayer().getPenisRawSizeValue()<=4) {
				return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_CHOICE_LYSSIETH_ORAL_AS_SISSY");
			} else {
				return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_CHOICE_LYSSIETH_ORAL");
			}
		}

		@Override
		public void applyEffects() {
			if(Main.game.getPlayer().hasPenis()) {
				Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaOrifice.MOUTH, SexAreaPenetration.PENIS));
			} else {
				Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.TONGUE, SexAreaOrifice.VAGINA));
			}
			specialActionTriggered = true;

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.SITTING,
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotSitting.PERFORMING_ORAL)),
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotSitting.SITTING))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	public static final SexAction DEMON_TF_STAGE_2_ASK_FOR_MORE_GETTING_FUCKED = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==2
					&& !specialActionTriggered
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getSexTypeCount(Sex.getCharacterPerformingAction(), Main.game.getNpc(Lyssieth.class), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA))==0;
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			if(Main.game.getNpc(Lyssieth.class).getForeplayPreference(Main.game.getPlayer()).getTargetedSexArea()==SexAreaOrifice.ANUS) {
				return "More anal";
			}
			return "Ask for more";
		}

		@Override
		public String getActionDescription() {
			if(Main.game.getNpc(Lyssieth.class).getForeplayPreference(Main.game.getPlayer()).getTargetedSexArea()==SexAreaOrifice.ANUS) {
				return "Ask Lyssieth to carry on fucking your ass instead.
"
							+ "[style.italicsFeminine(Lyssieth will fully feminise you!)]"//TODO
							+ (Main.game.getPlayer().hasPenis()
									?"
[style.italicsTfSexual(Lyssieth will also fully sissify your cock!)]"
									:"");
			}
			return "Ask Lyssieth to carry on fucking your pussy instead.
"
						+ "[style.italicsFeminine(Lyssieth will fully feminise you!)]";
		}

		@Override
		public String getDescription() {
			if(Main.game.getNpc(Lyssieth.class).getForeplayPreference(Main.game.getPlayer()).getTargetedSexArea()==SexAreaOrifice.ANUS) {
				return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_ASK_FOR_MORE_GETTING_FUCKED_ANAL");
			}
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_ASK_FOR_MORE_GETTING_FUCKED");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = true;

			Main.game.getPlayer().setFemininity(100);
			Main.game.getPlayer().setHairLength(HairLength.FOUR_MID_BACK.getMaximumValue());
			Main.game.getPlayer().setHipSize(HipSize.FIVE_VERY_WIDE);
			Main.game.getPlayer().setAssSize(AssSize.FOUR_LARGE);
			Main.game.getPlayer().setLipSize(LipSize.THREE_PLUMP);
			Main.game.getPlayer().setMuscle(Muscle.THREE_MUSCULAR.getMedianValue());
			Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
			Main.game.getPlayer().setHeight(168);
			Main.game.getPlayer().setBreastSize(CupSize.F);

			if(Main.game.getNpc(Lyssieth.class).getForeplayPreference(Main.game.getPlayer()).getTargetedSexArea()==SexAreaOrifice.ANUS) {
				if(Main.game.getPlayer().hasPenis()) {
					Main.game.getPlayer().setPenisType(PenisType.DEMON_COMMON);
					Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.PENIS, Colour.SKIN_RED), false);
					Main.game.getPlayer().setPenisSize(3);
					Main.game.getPlayer().setTesticleSize(TesticleSize.ZERO_VESTIGIAL);
					Main.game.getPlayer().fillCumToMaxStorage();
				}
				if(Main.game.getPlayer().hasVagina()) {
					// Add anal-only vagina sticker:
					AbstractClothing pastie = AbstractClothingType.generateClothing("innoxia_vagina_sticker_anal_only", Colour.CLOTHING_PINK_LIGHT, Colour.CLOTHING_PINK_HOT, Colour.CLOTHING_PURPLE_VERY_DARK, false);
					pastie.getEffects().clear();
					pastie.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.CLOTHING_SPECIAL, TFModifier.CLOTHING_SEALING, TFPotency.DRAIN, 0));
					pastie.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BODY_PART, TFModifier.TF_MOD_FETISH_ANAL_RECEIVING, TFPotency.MAJOR_BOOST, 0));
					pastie.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BODY_PART, TFModifier.TF_MOD_FETISH_VAGINAL_RECEIVING, TFPotency.MAJOR_DRAIN, 0));
					pastie.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BEHAVIOUR, TFModifier.TF_MOD_FETISH_SUBMISSIVE, TFPotency.BOOST, 0));
					pastie.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BEHAVIOUR, TFModifier.TF_MOD_FETISH_DOMINANT, TFPotency.DRAIN, 0));
					pastie.setName("Lyssieth's buttslut pastie");
					Main.game.getPlayer().equipClothingFromNowhere(pastie, true, Main.game.getNpc(Lyssieth.class));
				}
				if(Main.game.getPlayer().hasPenis()) {
					// Add chastity cage:
					AbstractClothing cage = AbstractClothingType.generateClothing("innoxia_bdsm_ornate_chastity_cage", Colour.CLOTHING_PINK_LIGHT, Colour.CLOTHING_PINK_HOT, Colour.CLOTHING_GOLD, false);
					cage.getEffects().clear();
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.CLOTHING_SPECIAL, TFModifier.CLOTHING_SEALING, TFPotency.DRAIN, 0));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BODY_PART, TFModifier.TF_MOD_FETISH_PENIS_RECEIVING, TFPotency.MAJOR_BOOST, 0));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BODY_PART, TFModifier.TF_MOD_FETISH_PENIS_GIVING, TFPotency.MAJOR_DRAIN, 0));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BEHAVIOUR, TFModifier.TF_MOD_FETISH_CUM_ADDICT, TFPotency.BOOST, 0));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BEHAVIOUR, TFModifier.TF_MOD_FETISH_CUM_STUD, TFPotency.DRAIN, 0));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE, TFPotency.MAJOR_DRAIN, 1));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE_SECONDARY, TFPotency.MAJOR_DRAIN, 0));
					cage.addEffect(new ItemEffect(ItemEffectType.CLOTHING, TFModifier.TF_MOD_FETISH_BEHAVIOUR, TFModifier.TF_MOD_FETISH_DENIAL_SELF, TFPotency.MAJOR_BOOST, 0));

					cage.setName("Lyssieth's sissy cage");
					Main.game.getPlayer().equipClothingFromNowhere(cage, true, Main.game.getNpc(Lyssieth.class));
				}
			}

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.ALL_FOURS,
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotAllFours.BEHIND)),
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotAllFours.ALL_FOURS))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	// These are for if the player has already fucked Lyssieth:

	public static final SexAction DEMON_TF_STAGE_2_CHOICE_GET_FUCKED = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==2
					&& !specialActionTriggered
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getSexTypeCount(Sex.getCharacterPerformingAction(), Main.game.getNpc(Lyssieth.class), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA))>0;
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Get fucked";
		}

		@Override
		public String getActionDescription() {
			return "Allow Lyssieth to push you down onto your back over her desk, and let her give you a demonic pussy for her to fuck.
"
								+ "[style.italicsFeminine(Lyssieth will feminise you into a futa succubus!)]
"
								+ (!Main.game.getPlayer().hasVagina()
										?"[style.italicsTfSexual(Lyssieth will give you a demonic vagina!)]"
										:"");
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_CHOICE_GET_FUCKED");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = true;

			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA));

			Main.game.getPlayer().setFemininity(75);
			Main.game.getPlayer().setHairLength(HairLength.FOUR_MID_BACK.getMedianValue());
			Main.game.getPlayer().setHipSize(HipSize.FIVE_VERY_WIDE);
			Main.game.getPlayer().setAssSize(AssSize.FOUR_LARGE);
			Main.game.getPlayer().setMuscle(Muscle.THREE_MUSCULAR.getMedianValue());
			Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
			Main.game.getPlayer().setHeight(168);
			Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
			Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
			playerGrowDemonicBreasts(CupSize.F);
			playerGrowDemonicVagina();

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.OVER_DESK,
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotDesk.BETWEEN_LEGS)),
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_BACK))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	public static final SexAction DEMON_TF_STAGE_2_CHOICE_GET_FUCKED_ANALLY = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==2
					&& !specialActionTriggered
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getSexTypeCount(Sex.getCharacterPerformingAction(), Main.game.getNpc(Lyssieth.class), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA))>0;
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Ask for anal";
		}

		@Override
		public String getActionDescription() {
			return "Allow Lyssieth to push you down onto your back over her desk, and request that she use your ass.
"
						+ "[style.italicsFeminine(Lyssieth will feminise you!)]";
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_CHOICE_GET_FUCKED_ANALLY");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = true;

			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.ANUS));

			if(Main.game.getPlayer().isFeminine()) {
				Main.game.getPlayer().incrementFemininity(25);
				Main.game.getPlayer().setHairLength(HairLength.FOUR_MID_BACK.getMedianValue());
				Main.game.getPlayer().setHipSize(HipSize.FIVE_VERY_WIDE);
				Main.game.getPlayer().setAssSize(AssSize.FOUR_LARGE);
				Main.game.getPlayer().setMuscle(Muscle.THREE_MUSCULAR.getMedianValue());
				Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
				Main.game.getPlayer().setHeight(168);
				Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
				Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
				playerGrowDemonicBreasts(CupSize.F);

			} else {
				Main.game.getPlayer().setFemininity(50);
				Main.game.getPlayer().setHairLength(HairLength.THREE_SHOULDER_LENGTH.getMedianValue());
				Main.game.getPlayer().setHipSize(HipSize.THREE_GIRLY);
				Main.game.getPlayer().setAssSize(AssSize.THREE_NORMAL);
				Main.game.getPlayer().setMuscle(Muscle.TWO_TONED.getMedianValue());
				Main.game.getPlayer().setBodySize(BodySize.TWO_AVERAGE.getMedianValue());
				Main.game.getPlayer().setHeight(168);
				Main.game.getPlayer().setAssType(AssType.DEMON_COMMON);
				Main.game.getPlayer().setSkinCovering(new Covering(BodyCoveringType.ANUS, Colour.SKIN_RED_DARK), false);
				playerGrowDemonicBreasts(CupSize.AA);
			}

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.OVER_DESK,
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotDesk.BETWEEN_LEGS)),
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_BACK))));

			Main.game.getNpc(Lyssieth.class).fillCumToMaxStorage();
		}
	};

	public static final SexAction DEMON_TF_STAGE_2_MATING_PRESS = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.FOUR_HIGH,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public SexActionCategory getCategory() {
			return SexActionCategory.MISCELLANEOUS;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexManager() instanceof SMLyssiethDemonTF
					&& Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))==2
					&& !specialActionTriggered
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getSexTypeCount(Sex.getCharacterPerformingAction(), Main.game.getNpc(Lyssieth.class), new SexType(SexParticipantType.NORMAL, SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA))>0;
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "Breed her";
		}

		@Override
		public String getActionDescription() {
			return "There's no way you're going to let Lyssieth fuck you. Wrestle her into the 'mating press' position and give Lilaya a new sister or two.
"
								+ (!Main.game.getPlayer().isFeminine()
										?"[style.italicsMasculine(Lyssieth will turn you into her ideal incubus!)]"
										:"[style.italicsDisabled(This will have no extra feminising effect.)]");
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile(Util.newArrayListOfValues(ParserTag.SEX_ALLOW_MUFFLED_SPEECH), "characters/submission/lyssieth", "DEMON_TF_STAGE_2_MATING_PRESS");
		}

		@Override
		public void applyEffects() {
			specialActionTriggered = true;
			Main.game.getNpc(Lyssieth.class).setForeplayPreference(Main.game.getPlayer(), new SexType(SexParticipantType.NORMAL, SexAreaOrifice.VAGINA, SexAreaPenetration.PENIS));

			if(!Main.game.getPlayer().isFeminine()) {
				Main.game.getPlayer().setHairLength(HairLength.ONE_VERY_SHORT.getMedianValue());
				Main.game.getPlayer().setVaginaType(VaginaType.NONE);
				Main.game.getPlayer().setFemininity(0);
				Main.game.getPlayer().setMuscle(100);
				Main.game.getPlayer().setBodySize(BodySize.THREE_LARGE.getMedianValue());
				Main.game.getPlayer().setPenisSize(35);
				Main.game.getPlayer().setTesticleSize(TesticleSize.FOUR_HUGE);
				Main.game.getPlayer().setPenisCumStorage(2000);
			}

			Main.game.getNpc(Lyssieth.class).setPenisType(PenisType.NONE);
			Main.game.getPlayer().fillCumToMaxStorage();

			Sex.setSexManager(
					new SMLyssiethDemonTF(
							SexPosition.LYING_DOWN,
							Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotLyingDown.MATING_PRESS)),
							Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), SexSlotLyingDown.LYING_DOWN))));

			Sex.applyOngoingAction(Main.game.getPlayer(), SexAreaPenetration.PENIS, Main.game.getNpc(Lyssieth.class), SexAreaOrifice.VAGINA, true);
		}
	};
}


code:
package com.lilithsthrone.game.sex.sexActions.submission;

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.body.types.FluidType;
import com.lilithsthrone.game.character.effects.Addiction;
import com.lilithsthrone.game.character.npc.submission.Roxy;
import com.lilithsthrone.game.dialogue.DialogueFlagValue;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.enchanting.ItemEffectType;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexFlags;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionPriority;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;

/**
 * @since 0.2.6
 * @version 0.3.5.5
 * @author Innoxia
 */
public class SARoxySpecials {

	public static final SexAction ROXY_FACE_SITTING_ORGASM = new SexAction(
			SexActionType.ORGASM,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public String getActionTitle() {
			return "Orgasm";
		}

		@Override
		public String getActionDescription() {
			return "You've reached your climax, and can't hold back your orgasm any longer.";
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getDescription() {
			Addiction ratGCumAdd = Main.game.getPlayer().getAddiction(FluidType.GIRL_CUM_RAT_MORPH);

			if(ratGCumAdd!=null && ratGCumAdd.getProviderIDs().contains(Main.game.getNpc(Roxy.class).getId())) {
				return UtilText.parseFromXMLFile("characters/submission/roxy", "ROXY_FACE_SITTING_ORGASM_ALREADY_ADDICTED");

			} else {
				return UtilText.parseFromXMLFile("characters/submission/roxy", "ROXY_FACE_SITTING_ORGASM_NEW_ADDICTION");
			}
		}

		@Override
		public void applyEffects() {
			Main.game.getDialogueFlags().setFlag(DialogueFlagValue.roxyAddicted, true);
		}

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

	public static final SexAction BLOW_SMOKE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.TWO_LOW,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public String getActionTitle() {
			return "Smoke";
		}

		@Override
		public String getActionDescription() {
			return "";
		}

		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile("characters/submission/roxy", "BLOW_SMOKE");
		}

		@Override
		public void applyEffects() {
			ItemEffectType.CIGARETTE.applyEffect(null, null, null, 0, Main.game.getNpc(Roxy.class), Main.game.getNpc(Roxy.class), null);
		}
	};

	public static final SexAction FACE_SITTING_TEASE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.TWO_LOW,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public String getActionTitle() {
			return "Face-sitting tease";
		}

		@Override
		public String getActionDescription() {
			return "";
		}

		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);
			if(Math.random()<0.5f) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/submission/roxy", "FACE_SITTING_TEASE_START"));
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/submission/roxy", "FACE_SITTING_TEASE_END"));
			} else {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/submission/roxy", "FACE_SITTING_ADDICTION_TEASE_START"));
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/submission/roxy", "FACE_SITTING_ADDICTION_TEASE_END"));
			}
			return UtilText.nodeContentSB.toString();
		}
	};

	public static final SexAction CUSTOMER_INTERRUPTION = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.NPC_ONLY;
		}
		@Override
		public boolean isBaseRequirementsMet() {
			return (!SexFlags.genericFlags.containsKey("roxyInterruptedTurn") || Sex.getTurn()-SexFlags.genericFlags.get("roxyInterruptedTurn") > 10) // Make this very infrequent
					&& Sex.getTurn()>4
					&& Main.game.getPlayer().getArousal()<75
					&& Main.game.getNpc(Roxy.class).getArousal()<75
					&& Math.random()<0.25f;
		}
		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}
		@Override
		public String getActionTitle() {
			return "Customer interruption";
		}
		@Override
		public String getActionDescription() {
			return "";
		}
		@Override
		public String getDescription() {
			return UtilText.parseFromXMLFile("characters/submission/roxy", "CUSTOMER_INTERRUPTION");
		}
		@Override
		public void applyEffects() {
			SexFlags.genericFlags.put("roxyInterruptedTurn", Sex.getTurn());
		}
	};
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.sex.sexActions.submission.roxy;

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.body.types.FluidType;
import com.lilithsthrone.game.character.effects.Addiction;
import com.lilithsthrone.game.character.npc.submission.Roxy;
import com.lilithsthrone.game.dialogue.DialogueFlagValue;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionPriority;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;

/**
 * @since 0.2.6
 * @version 0.2.9
 * @author Innoxia
 */
public class SARoxySpecials {

	public static final SexAction ROXY_ORGASM = new SexAction(
			SexActionType.ORGASM,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public String getActionTitle() {
			return "Orgasm";
		}

		@Override
		public String getActionDescription() {
			return "You've reached your climax, and can't hold back your orgasm any longer.";
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getDescription() {
			Addiction ratGCumAdd = Main.game.getPlayer().getAddiction(FluidType.GIRL_CUM_RAT_MORPH);

			if(ratGCumAdd!=null && ratGCumAdd.getProviderIDs().contains(Main.game.getNpc(Roxy.class).getId())) {
				return "Roxy's moans start to increase in volume, and without warning, she suddenly reaches down to grab hold of your head, before letting her legs collapse out from under her."
						+ " Your mouth is completely smothered by her [roxy.pussy+], and as you let out a muffled cry of surprise, the rat-girl screams, [roxy.speechNoEffects(~Aah!~ Yes! Get yer fuckin' tongue in deep! ~Mmm!~ Yes!)]"
						+ "

"
							+ "Doing as she commands, you drive your tongue deep into the rat-girl's [roxy.pussy+], before eagerly starting to eat her out, desperate for another dose of her addictive girlcum."
							+ " Your enthusiastic response causes Roxy to suddenly clamp her thighs down around your head, and you feel her [roxy.pussy] quivering and squeezing down around your tongue as she reaches her orgasm."
							+ " [roxy.speechNoEffects(Fuck! ~Aah!~ Fuck! Yes! ~Aaah!~)]"
						+ "

"
							+ "As Roxy screams, a huge spurt of female ejaculate squirts out from [roxy.her] [roxy.pussy+], directly into your open mouth."
							+ " [roxy.speechNoEffects(~Aah!~)] the rat-girl screams, [roxy.speechNoEffects(Fuckin' drink it down! ~Mmm!~ Yes!)]"
						+ "

"
							+ "Not needing to be told twice, you hungrily gulp down Roxy's addictive juices, thrusting your tongue up into her [roxy.pussy+] to try and get as much of it into your mouth as possible."
							+ " As her slimy girl-cum slides down your throat, the desperate craving starts to creep into your mind once more, and, reaching up to grab Roxy's thighs, you pull her down onto your face."
							+ " As you start to hungrily lick up as much of the rat-girl's juices as you possibly can, she starts to come down from her climax, and, continuing to sit on your face, she starts to laugh,"
								+ " [roxy.speechNoEffects(Heh! That's right, lick it all up! Tastes good, don't it?)]"
						+ "

"
							+ "[pc.speechNoEffects(~Mmm!~ ~Mmmm!~)] you reply, your words muffled into the rat-girl's [roxy.pussy+]."
						+ "

"
							+ "[roxy.speechNoEffects(Fuck, it's fuckin' good to have my own personal pussy licker. Yer just can't get enough o' my sweet fuckin' cunt, can yer?)]"
						+ "

"
							+ "You can't help but let out a desperate, muffled moan into Roxy's [roxy.pussy] as you continue hungrily licking up as much of her girlcum as you possibly can."
						+ "

"
							+ "[roxy.speechNoEffects(I think that'll do fer now.)] Roxy laughs, [roxy.speech(Yer can always come back an give me anotha' thousand flames if yer want more.)]";

			} else {
				return "Roxy's moans start to increase in volume, and without warning, she suddenly reaches down to grab hold of your head, before letting her legs collapse out from under her."
						+ " Your mouth is completely smothered by her [roxy.pussy+], and as you let out a muffled cry of surprise, the rat-girl screams, [roxy.speechNoEffects(~Aah!~ Yes! Get yer fuckin' tongue in deep! ~Mmm!~ Yes!)]"
						+ "

"
							+ "Doing as she commands, you drive your tongue deep into the rat-girl's [roxy.pussy+], before desperately starting to eat her out."
							+ " Your enthusiastic response causes Roxy to suddenly clamp her thighs down around your head, and you feel her [roxy.pussy] quivering and squeezing down around your tongue as she reaches her orgasm."
							+ " [roxy.speechNoEffects(Fuck! ~Aah!~ Fuck! Yes! ~Aaah!~)]"
							+ "

"
							+ "As Roxy screams, a huge spurt of female ejaculate squirts out from [roxy.her] [roxy.pussy+], directly into your open mouth."
							+ " [roxy.speechNoEffects(~Aah!~)] the rat-girl screams, [roxy.speechNoEffects(Fuckin' drink it down! ~Mmm!~ Yes!)]"
						+ "

"
							+ "With little option but to do as she says, you gulp down Roxy's juices, before continuing to thrust your tongue up into her [roxy.pussy+]."
							+ " As her slimy girl-cum slides down your throat, you suddenly find yourself with a desperate craving for more, and, reaching up to grab Roxy's thighs, you pull her down onto your face."
							+ " As you start to hungrily lick up as much of the rat-girl's juices as you possibly can, she starts to come down from her climax, and, continuing to sit on your face, she starts to laugh,"
								+ " [roxy.speechNoEffects(Heh! That's right, lick it all up! Tastes good, don't it?)]"
						+ "

"
							+ "[pc.speechNoEffects(~Mmm!~ ~Mmmm!~)] you reply, your words muffled into the rat-girl's [roxy.pussy+]."
						+ "

"
							+ "[roxy.speechNoEffects(Heh! Probably a bit late now, but I should let yer know sumthin. I went and bought one o' those special potions from some bitch up in Dominion."
								+ " 'Makes yer girlcum real fuckin' addictive,' she said. 'Just get some cunt to eat yer out, and they'll be beggin' to be yer permanent pussy licker,' she said."
								+ " From the way yer actin', it's lookin' like she was tellin' the truth!)]"
						+ "

"
							+ "You can't help but let out a desperate, muffled moan into Roxy's [roxy.pussy] as she reveals this."
							+ " The addictive nature of her girlcum is already having a profound effect on your mind, and even as she reveals the fact that you've been tricked into drinking her addictive juices,"
								+ " you can't help but continue hungrily licking and kissing her pussy."
						+ "

"
							+ "[roxy.speechNoEffects(Fuckin' looks like you're well an' truly addicted to my cunt now, ain't yer?)] Roxy laughs, [roxy.speech(That's enough fer me.)]";
			}
		}

		@Override
		public void applyEffects() {
			Main.game.getDialogueFlags().setFlag(DialogueFlagValue.roxyAddicted, true);
		}

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

}


code:
package com.lilithsthrone.game.sex.sexActions.universal;

/**
 * @since 0.1.69
 * @version 0.1.79
 * @author Innoxia
 */
public class BackToWall {

	// Position-unique actions to be added here.

	//TODO
//	FINGER_INSEMINATION(SexActionType.PLAYER,
//			ArousalIncrease.THREE_NORMAL,
//			ArousalIncrease.THREE_NORMAL,
//			AttributeLevelCorruption.ONE_VANILLA,
//			null,
//			null) {
//		@Override
//		public String getActionTitle() {
//			return "Finger Insemination";
//		}
//
//		@Override
//		public String getActionDescription() {
//			return "Make the "+Sex.getPartner().getName()+" push his cum deep into your pussy.";
//		}
//
//		@Override
//		public boolean isBaseRequirementsMet() {
//			return Sex.getPenetrationTypeInOrifice(Main.game.getPlayer(), OrificeType.VAGINA)==(PenetrationType.FINGER) && partnerCumOnLegs;
//		}
//
//		@Override
//		public String getDescription() {
//			descriptionSB = new StringBuilder();
//
//
//			switch (Sex.getPartner().getRace()) {
//				case DOG_MORPH:
//					descriptionSB.append("As you feel the dog-boy's sticky cum sliding down around the entrance to your pussy, a fun idea suddenly springs into your mind."
//							+ " You reach down and take hold of his hand, grinning devilishly as you pull his fingers out of your slit."
//							+ " Guiding his padded dog-like fingers over your cum-drenched sex, you get him to scoop up all of his sticky white cream."
//							+ " Once you're satisfied that he's collected enough, you guide his digits back into your hungry pussy."
//							+ " You feel a large glob of sperm on his fingers as he pushes deep into your cunt, and you moan and squeal at the feeling as he starts fingering you once again, using his salty seed as lubricant."
//							+ " Grinding your hips against his hand, you see him grinning as he eagerly inseminates you with his potent dog-cum.");
//					break;
//				case WOLF_MORPH:
//					descriptionSB.append("As you feel the wolf-boy's sticky cum sliding down around the entrance to your pussy, a fun idea suddenly springs into your mind."
//							+ " You reach down and take hold of his hand, grinning devilishly as you pull his fingers out of your slit."
//							+ " Guiding his padded wolf-like fingers over your cum-drenched sex, you get him to scoop up all of his sticky white cream."
//							+ " Once you're satisfied that he's collected enough, you guide his digits back into your hungry pussy."
//							+ " You feel a large glob of sperm on his fingers as he pushes deep into your cunt, and you moan and squeal at the feeling as he starts fingering you once again, using his salty seed as lubricant."
//							+ " Grinding your hips against his hand, you see him grinning as he eagerly inseminates you with his potent wolf-cum.");
//					break;
//				case CAT_MORPH:
//					descriptionSB.append("As you feel the cat-boy's sticky cum sliding down around the entrance to your pussy, a fun idea suddenly springs into your mind."
//							+ " You reach down and take hold of his hand, grinning devilishly as you pull his fingers out of your slit."
//							+ " Guiding his padded cat-like fingers over your cum-drenched sex, you get him to scoop up all of his sticky white cream."
//							+ " Once you're satisfied that he's collected enough, you guide his digits back into your hungry pussy."
//							+ " You feel a large glob of sperm on his fingers as he pushes deep into your cunt, and you moan and squeal at the feeling as he starts fingering you once again, using his salty seed as lubricant."
//							+ " Grinding your hips against his hand, you see him grinning as he eagerly inseminates you with his potent cat-cum.");
//					break;
//				case HORSE_MORPH:
//					descriptionSB.append("As you feel the horse-boy's sticky cum sliding down around the entrance to your pussy, a fun idea suddenly springs into your mind."
//							+ " You reach down and take hold of his hand, grinning devilishly as you pull his fingers out of your slit."
//							+ " Guiding his strong, thick fingers over your cum-drenched sex, you get him to scoop up all of his sticky white cream."
//							+ " Once you're satisfied that he's collected enough, you guide his digits back into your hungry pussy."
//							+ " You feel a large glob of sperm on his fingers as he pushes deep into your cunt, and you moan and squeal at the feeling as he starts fingering you once again, using his salty seed as lubricant."
//							+ " Grinding your hips against his hand, you see him grinning as he eagerly inseminates you with his potent horse-cum.");
//					break;
//				default:
//					descriptionSB.append("As you feel the "+Sex.getPartner().getName()+"'s sticky cum sliding down around the entrance to your pussy, a fun idea suddenly springs into your mind."
//							+ " You reach down and take hold of his hand, grinning devilishly as you pull his fingers out of your slit."
//							+ " Guiding his fingers over your cum-drenched sex, you get him to scoop up all of his his sticky white cream."
//							+ " Once you're satisfied that he's collected enough, you guide his digits back into your hungry pussy."
//							+ " You feel a large glob of sperm on his fingers as he pushes deep into your cunt, and you moan and squeal at the feeling as he starts fingering you once again, using his salty seed as lubricant."
//							+ " Grinding your hips against his hand, you see him grinning as he eagerly inseminates you with his potent horse-cum.");
//					break;
//			}
//
//			return descriptionSB.toString();
//		}
//
//		@Override
//		public void applyEffects() {
//			partnerCumOnLegs=false;
//		}
//
//		@Override
//		public List<CoverableArea> getPlayerAreasCummedIn() {
//			return Util.newArrayListOfValues(CoverableArea.VAGINA);
//		}
//	},

}


code:
package com.lilithsthrone.game.sex.sexActions.universal;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.npc.NPC;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotSitting;
import com.lilithsthrone.game.sex.positions.slots.SexSlotStanding;
import com.lilithsthrone.game.sex.sexActions.PositioningData;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionPriority;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.game.sex.sexActions.baseActionsMisc.GenericPositioning;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.8
 * @version 0.3.3.10
 * @author Innoxia
 */
public class ChairSex {

	private static boolean checkBaseRequirements(PositioningData data, boolean request) {
		return Sex.isPositionChangingAllowed(Sex.getCharacterPerformingAction())
				&& !(Sex.getPosition() == data.getPosition()
					&& Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==data.getPerformerSlots().get(0)
					&& Sex.getSexPositionSlot(Sex.getTargetedPartner(Sex.getCharacterPerformingAction()))==data.getPartnerSlots().get(0))
				&& data.getPosition().getMaximumSlots()>=Sex.getTotalParticipantCount(false)
				&& Sex.getTotalParticipantCount(false)<=(data.getPerformerSlots().size()+data.getPartnerSlots().size())
				&& (request
						?Sex.getCharacterPerformingAction().isPlayer() && Sex.getSexControl(Sex.getCharacterPerformingAction())!=SexControl.FULL
						:(Sex.getCharacterPerformingAction().isPlayer()
							?Sex.getSexControl(Sex.getCharacterPerformingAction())==SexControl.FULL
							:!Sex.isCharacterForbiddenByOthersFromPositioning(Sex.getCharacterPerformingAction())))
				&& (!request && !Sex.getCharacterPerformingAction().isPlayer()
						?((NPC) Sex.getCharacterPerformingAction()).isHappyToBeInSlot(data.getPosition(), data.getPerformerSlots().get(0), data.getPartnerSlots().get(0), Sex.getTargetedPartner(Sex.getCharacterPerformingAction()))
						:true);
	}

	private static boolean isSittingAvailable(GameCharacter gettingFucked) {
		return !gettingFucked.isTaur();
	}

	public static final SexAction SWITCH_TO_STANDING = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.STANDING,
				Util.newArrayListOfValues(
						SexSlotStanding.STANDING_DOMINANT,
						SexSlotStanding.STANDING_DOMINANT_TWO,
						SexSlotStanding.STANDING_DOMINANT_THREE,
						SexSlotStanding.STANDING_DOMINANT_FOUR),
				Util.newArrayListOfValues(
						SexSlotStanding.STANDING_SUBMISSIVE,
						SexSlotStanding.STANDING_SUBMISSIVE_TWO,
						SexSlotStanding.STANDING_SUBMISSIVE_THREE,
						SexSlotStanding.STANDING_SUBMISSIVE_FOUR));

		@Override
		public boolean isBaseRequirementsMet() {
			return checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Switch to standing";
		}
		@Override
		public String getActionDescription() {
			return "Get [npc2.name] to join you in standing up, ready to move to a different sex position.";
		}
		@Override
		public String getDescription() {
			return "Deciding that [npc.she] [npc.verb(want)] to switch into a different position, [npc.name] [npc.verb(get)] [npc2.name] to stand up with [npc.herHim]."
					+ " Now face-to-face with [npc.her] partner, [npc.name] [npc.moansVerb], "
					+ "[npc.speech(Let's try something else...)]";
		}
		@Override
		public void applyEffects() {
			GenericPositioning.setNewSexManager(data, false);
		}
	};

	private static void applyChangeSlotEffects(GameCharacter mover, SexSlot moverSlot, GameCharacter partner, SexSlot partnerSlot) {
		if(Sex.getCharacterInPosition(moverSlot)!=null) {
			Sex.swapSexPositionSlots(mover, Sex.getCharacterInPosition(moverSlot));
		}
		if(Sex.getCharacterInPosition(partnerSlot)!=null && !Sex.getCharacterInPosition(partnerSlot).equals(partner)) {
			Sex.swapSexPositionSlots(partner, Sex.getCharacterInPosition(partnerSlot));
		}

		Map<GameCharacter, SexSlot> dominants = new HashMap<>(Sex.getDominantParticipants(true));
		Map<GameCharacter, SexSlot> submissives = new HashMap<>(Sex.getSubmissiveParticipants(true));

		if(Sex.isDom(mover)) {
			dominants.put(mover, moverSlot);
		} else {
			submissives.put(mover, moverSlot);
		}
		if(Sex.isDom(partner)) {
			dominants.put(partner, partnerSlot);
		} else {
			submissives.put(partner, partnerSlot);
		}

		Sex.setSexManager(new SexManagerDefault(
				SexPosition.SITTING,
				dominants,
				submissives){
		});
	}

	public static final SexAction SWITCH_TO_GIVING_ORAL = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.PERFORMING_ORAL),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.getCharacterTargetedForSexAction(this).isTaur()
					&& checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Perform oral";
		}
		@Override
		public String getActionDescription() {
			return "Kneel down in front of [npc2.name] and perform oral on [npc2.herHim].";
		}
		@Override
		public String getDescription() {
			return "Deciding that [npc.she] [npc.verb(want)] to perform oral on [npc2.name], [npc.name] [npc.verb(kneel)] down in front of [npc2.herHim]."
					+ " Bringing [npc.her] mouth up to [npc2.namePos] groin, [npc.she] [npc.moansVerb], "
					+ "[npc.speech(You just sit back and enjoy this!)]";
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.PERFORMING_ORAL,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.SITTING);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction POSITION_GIVING_ORAL_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.PERFORMING_ORAL),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.getCharacterTargetedForSexAction(this).isTaur()
					&& checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Perform oral (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to kneel down in front of [npc2.name] in order to perform oral on [npc2.herHim].";
		}
		@Override
		public String getDescription() {
			return "You try to manoeuvre around in such a way that you'll be able to kneel in front of [npc2.name]. As you do this, you [npc.moan], [npc.speech(Please, I want to use my mouth...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction SWITCH_TO_GIVING_ORAL_TO_TAUR = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING),
				Util.newArrayListOfValues(SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL));

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterTargetedForSexAction(this).isTaur()
					&& checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Perform oral";
		}
		@Override
		public String getActionDescription() {
			return "While sitting down, get [npc2.name] to turn around and back up towards you, presenting [npc.her] animalistic genitals to you so that you can perform oral on [npc2.herHim].";
		}
		@Override
		public String getDescription() {
			return "Deciding that [npc.she] [npc.verb(want)] to perform oral on [npc2.name], [npc.name] [npc.verb(sit)] down, before getting [npc2.name] to turn around and back up so that [npc2.her] animalistic genitals are in front of [npc.her] [npc.face]."
					+ " Bringing [npc.her] mouth up to [npc2.namePos] groin, [npc.she] [npc.moansVerb], "
					+ "[npc.speech(I can't wait to get a taste of you!)]";
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.SITTING,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction POSITION_GIVING_ORAL_TO_TAUR_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING),
				Util.newArrayListOfValues(SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL));

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterTargetedForSexAction(this).isTaur()
					&& checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Perform oral (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to sit down and get [npc2.name] to turn around and back up towards you, presenting [npc.her] animalistic genitals to you so that you can perform oral on [npc2.herHim].";
		}
		@Override
		public String getDescription() {
			return "You try to manoeuvre around in such a way that you'll be able to sit down and get [npc2.name] to present [npc2.her] animalistic genitals to you."
					+ " As you do this, you [npc.moan], [npc.speech(Please, I want to use my mouth...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction SWITCH_TO_RECEIVING_ORAL = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING),
				Util.newArrayListOfValues(SexSlotSitting.PERFORMING_ORAL));

		@Override
		public boolean isBaseRequirementsMet() {
			return isSittingAvailable(Sex.getCharacterPerformingAction())
					&& checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Receive oral";
		}
		@Override
		public String getActionDescription() {
			return "Get [npc2.name] to kneel down in front of you and perform oral.";
		}
		@Override
		public String getDescription() {
			return "Deciding that [npc.she] [npc.verb(want)] to get some oral sex, [npc.name] [npc.verb(get)] [npc2.name] to kneel down in front of [npc.herHim]."
					+ " Looking down into [npc2.her] [npc2.eyes], [npc.name] [npc.moansVerb], "
					+ "[npc.speech(Time to put your mouth to use!)]";
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.SITTING,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.PERFORMING_ORAL);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction POSITION_RECEIVING_ORAL_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING),
				Util.newArrayListOfValues(SexSlotSitting.PERFORMING_ORAL));

		@Override
		public boolean isBaseRequirementsMet() {
			return isSittingAvailable(Sex.getCharacterPerformingAction())
					&& checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Receive oral (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to get [npc2.name] to kneel down in front of you so that [npc2.she] can perform oral on you.";
		}
		@Override
		public String getDescription() {
			return "You try to manoeuvre around in such a way that you'll be able to get [npc2.name] to kneel down in front of you. As you do this, you [npc.moan], [npc.speech(Please, I want you to use your mouth...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction SWITCH_TO_RECEIVING_ORAL_AS_TAUR = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterPerformingAction().isTaur()
					&& checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Receive oral";
		}
		@Override
		public String getActionDescription() {
			return "Turn around and present your animalistic genitals to [npc2.name] so that [npc2.she] can perform oral on you.";
		}
		@Override
		public String getDescription() {
			return "Deciding that [npc.she] [npc.verb(want)] to get some oral sex, [npc.name] [npc.verb(stand)] up [npc.verb(turn)] around, before stepping back and presenting [npc.her] animalistic genitals to [npc2.name]."
					+ " Looking back down over [npc.her] shoulder, [npc.name] [npc.moansVerb], "
					+ "[npc.speech(Time to put your mouth to use!)]";
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.SITTING);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction POSITION_RECEIVING_ORAL_AS_TAUR_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterPerformingAction().isTaur()
					&& checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Receive oral (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to turn around and present your animalistic genitals to [npc2.name] so that [npc2.she] can perform oral on you.";
		}
		@Override
		public String getDescription() {
			return "[npc.Name] [npc.verb(try)] to stand up and turn around in order to present [npc.her] animalistic genitals to [npc2.namePos] mouth."
					+ " As [npc.she] [npc.does] this, [npc.she] [npc.moans], [npc.speech(Please, I want you to use your mouth...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction SWITCH_SITTING_BOTTOM = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING),
				Util.newArrayListOfValues(SexSlotSitting.SITTING_IN_LAP));

		@Override
		public boolean isBaseRequirementsMet() {
			return isSittingAvailable(Sex.getCharacterPerformingAction())
					&& checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Sit (bottom)";
		}
		@Override
		public String getActionDescription() {
			return "Switch position so that you're the one sitting down, with [npc2.name] sitting in your lap.";
		}
		@Override
		public String getDescription() {
			return "[npc.Name] [npc.verb(decide)] to switch positions, and, getting [npc2.name] to stand up, [npc.she] [npc.verb(sit)] down, before pulling [npc2.herHim] down onto [npc.her] lap."
					+ " Looking up into [npc2.her] [npc2.eyes], [npc.she] [npc.moansVerb], "
					+ "[npc.speech(Good [npc2.girl]!)]";
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.SITTING,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.SITTING_IN_LAP);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction POSITION_SITTING_BOTTOM_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING),
				Util.newArrayListOfValues(SexSlotSitting.SITTING_IN_LAP));

		@Override
		public boolean isBaseRequirementsMet() {
			return isSittingAvailable(Sex.getCharacterPerformingAction())
					&& checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Sit (bottom) (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to get [npc2.name] to sit down in your lap.";
		}
		@Override
		public String getDescription() {
			return "You try to manoeuvre around in such a way that you'll be able to get [npc2.name] to sit in your lap. As you do this, you [npc.moan], [npc.speech(Please, I want to be on the bottom...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction SWITCH_SITTING_TOP = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING_IN_LAP),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Sit (top)";
		}
		@Override
		public String getActionDescription() {
			if(!Sex.getCharacterPerformingAction().isTaur()) {
				return "Switch positions so that [npc2.name] is the one sitting down, with you sitting in [npc2.her] lap.";
			} else {
				return "Switch positions so that [npc2.name] is the one sitting down, with you having turned around and lowered your animalistic genitals down into [npc2.her] lap";
			}
		}
		@Override
		public String getDescription() {
			if(!Sex.getCharacterPerformingAction().isTaur()) {
				return "[npc.Name] [npc.verb(decide)] to switch positions, and, getting [npc2.name] to sit down, [npc.she] [npc.verb(sit)] down on [npc2.her] lap."
						+ " Looking down into [npc2.her] [npc2.eyes], [npc.she] [npc.moansVerb], "
						+ "[npc.speech(Good [npc2.girl]!)]";
			} else {
				return "[npc.Name] [npc.verb(decide)] to switch positions, and, getting [npc2.name] to sit down, [npc.she] [npc.verb(stand)] up, [npc.verb(turn)] around, and [npc.verb(lower)] [npc.her] animalistic rear end down into [npc2.namePos] lap."
						+ " Looking back down over [npc.her] shoulder, [npc.name] then [npc.moansVerb], "
						+ "[npc.speech(Time to give you a ride!)]";
			}
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.SITTING_IN_LAP,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.SITTING);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction POSITION_SITTING_TOP_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING_IN_LAP),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Sit (top) (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to sit down in [npc2.namePos] lap.";
		}
		@Override
		public String getDescription() {
			return "You try to manoeuvre around in such a way that you'll be able to sit down in [npc2.namePos] lap. As you do this, you [npc.moan], [npc.speech(Please, I want to be on the top...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction SWITCH_STANDING_BETWEEN_LEGS = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING_BETWEEN_LEGS),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return isSittingAvailable(Sex.getCharacterPerformingAction())
					&& checkBaseRequirements(data, false);
		}
		@Override
		public String getActionTitle() {
			return "Between legs";
		}
		@Override
		public String getActionDescription() {
			return "Switch position so that [npc2.name] is the one sitting down, with you "
					+(SexSlotSitting.SITTING_BETWEEN_LEGS.isStanding(Sex.getCharacterPerformingAction())?"standing":"kneeling")+" between [npc2.her] [npc2.legs], ready to fuck [npc2.herHim].";
		}
		@Override
		public String getDescription() {
			return "[npc.Name] [npc.verb(decide)] to switch positions, and, with [npc2.name] sitting down, [npc.she] [npc.verb(move)] to "
						+(SexSlotSitting.SITTING_BETWEEN_LEGS.isStanding(Sex.getCharacterPerformingAction())?"stand":"kneel")+" between [npc2.her] [npc2.legs]."
					+ " Looking down into [npc2.her] [npc2.eyes], [npc.she] [npc.moansVerb], "
					+ "[npc.speech(Time to give you a good fuck!)]";
		}
		@Override
		public void applyEffects() {
			applyChangeSlotEffects(
					Sex.getCharacterPerformingAction(),
					SexSlotSitting.SITTING_BETWEEN_LEGS,
					Sex.getCharacterTargetedForSexAction(this),
					SexSlotSitting.SITTING);
//			GenericPositioningNew.setNewSexManager(data, false);
		}
	};

	public static final SexAction SWITCH_STANDING_BETWEEN_LEGS_REQUEST = new SexAction(
			SexActionType.POSITIONING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		private PositioningData data = new PositioningData(
				SexPosition.SITTING,
				Util.newArrayListOfValues(SexSlotSitting.SITTING_BETWEEN_LEGS),
				Util.newArrayListOfValues(SexSlotSitting.SITTING));

		@Override
		public boolean isBaseRequirementsMet() {
			return isSittingAvailable(Sex.getCharacterPerformingAction())
					&& checkBaseRequirements(data, true);
		}
		@Override
		public String getActionTitle() {
			return "Between legs (R)";
		}
		@Override
		public String getActionDescription() {
			return "Try to switch position so that [npc2.name] is the one sitting down, with you "
						+(SexSlotSitting.SITTING_BETWEEN_LEGS.isStanding(Sex.getCharacterPerformingAction())?"standing":"kneeling")+" between [npc2.her] [npc2.legs], ready to fuck [npc2.herHim].";
		}
		@Override
		public String getDescription() {
			return "You try to manoeuvre around in such a way that [npc2.nameIsFull] sitting down, with you "
						+(SexSlotSitting.SITTING_BETWEEN_LEGS.isStanding(Sex.getCharacterPerformingAction())?"standing":"kneeling")+" between [npc2.her] [npc2.legs]."
						+ " As you do this, you [npc.moan], [npc.speech(Please, I want to fuck you like this...)]";
		}
		@Override
		public void applyEffects() {
			Sex.setPositionRequest(data);
		}
	};

	public static final SexAction PARTNER_POSITION_RESPONSE = new SexAction(
			SexActionType.SPECIAL,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getPositionRequest()!=null
					&& !Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getActionTitle() {
			return "";
		}

		@Override
		public String getActionDescription() {
			return "";
		}

		@Override
		public String getDescription() {
			boolean isHappy = ((NPC)Sex.getCharacterPerformingAction()).isHappyToBeInSlot(
					Sex.getPositionRequest().getPosition(),
					Sex.getPositionRequest().getPartnerSlots().get(0),
					Sex.getPositionRequest().getPerformerSlots().get(0),
					Main.game.getPlayer());

			if(Sex.getPositionRequest().getPartnerSlots().get(0)==SexSlotSitting.SITTING_IN_LAP) {
				if(isHappy) {
					switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
						case DOM_ROUGH:
							return "Roughly pushing [npc2.name] down, [npc.name] [npc.verb(straddle)] [npc2.her] lap, leaning forwards to glare into [npc2.her] eyes as [npc.she] [npc.moansVerb],"
									+ " [npc.speech(Alright, slut, I'll take you for a ride!)]";
						default:
							return "Pushing [npc2.name] down, [npc.name] steps forwards and [npc.verb(straddle)] [npc2.her] lap, leaning forwards to gaze into [npc2.her] eyes as [npc.she] [npc.moansVerb],"
									+ " [npc.speech(Sure, I'll take you for a ride...)]";
					}

				} else {
					return "Reaching down to grab [npc2.name] by the [npc2.arm], [npc.name] [npc.verb(pull)] [npc2.herHim] back into [npc2.her] old position as [npc.she] angrily scolds [npc2.herHim], "
							+ "[npc.speech(What do you think you're doing?! Don't you <i>dare</i> try that again!)]";
				}

			} else if(Sex.getPositionRequest().getPartnerSlots().get(0)==SexSlotSitting.SITTING) {
				if(Sex.getPositionRequest().getPerformerSlots().get(0)==SexSlotSitting.SITTING_IN_LAP) {
					if(isHappy) {
						switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
							case DOM_ROUGH:
								return "Sitting down, [npc.name] [npc.verb(grab)] hold of [npc2.namePos] [npc2.arm], and with a sharp tug,"
											+ " [npc.she] [npc.verb(pull)] [npc2.herHim] down so that [npc2.sheIs] straddling [npc.her] lap. Leaning forwards to glare into [npc2.her] eyes, [npc.name] [npc.moansVerb],"
										+ " [npc.speech(Alright, slut, you'd better make this good!)]";
							default:
								return "Sitting down, [npc.name] [npc.verb(take)] hold of [npc2.namePos] [npc2.arm], and with a firm tug,"
											+ " [npc.she] [npc.verb(pull)] [npc2.herHim] down so that [npc2.sheIs] straddling [npc.her] lap. Leaning forwards to gaze into [npc2.her] eyes, [npc.name] [npc.moansVerb],"
										+ " [npc.speech(Good [npc2.girl]...)]";
						}

					} else {
						return "Reaching down to grab [npc2.name] by the [npc2.arm], [npc.name] [npc.verb(pull)] [npc2.herHim] back into [npc2.her] old position as [npc.she] angrily scolds [npc2.herHim], "
								+ "[npc.speech(What do you think you're doing?! Don't you <i>dare</i> try that again!)]";
					}

				} else if(Sex.getPositionRequest().getPerformerSlots().get(0)==SexSlotSitting.SITTING_TAUR_PRESENTING_ORAL) {
					if(isHappy) {
						switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
							case DOM_ROUGH:
								return "Letting [npc2.name] finish [npc2.her] manoeuvre, [npc.name] reaches out to grab [npc2.her] hind-legs, before pulling [npc2.her] animalistic groin up to [npc.her] face."
										+ " Giving [npc2.her] rump a sharp slap, [npc.name] then [npc.moansVerb],"
										+ " [npc.speech(Alright, slut, you'd better make this good!)]";
							default:
								return "Letting [npc2.name] finish [npc2.her] manoeuvre, [npc.name] reaches out to grab [npc2.her] hind-legs, before pulling [npc2.her] animalistic groin up to [npc.her] face."
										+ " Giving [npc2.her] rump a playful slap, [npc.name] then [npc.moansVerb],"
										+ " [npc.speech(Good [npc2.girl]...)]";
						}

					} else {
						return "Reaching down to grab [npc2.name] by the [npc2.arm], [npc.name] [npc.verb(pull)] [npc2.herHim] back into [npc2.her] old position as [npc.she] angrily scolds [npc2.herHim], "
								+ "[npc.speech(What do you think you're doing?! Don't you <i>dare</i> try that again!)]";
					}

				} else if(Sex.getPositionRequest().getPerformerSlots().get(0)==SexSlotSitting.SITTING_BETWEEN_LEGS) {
					if(isHappy) {
						switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
							case DOM_ROUGH:
								return "Letting [npc2.name] finish [npc2.her] manoeuvre, [npc.name] sits down, before lifting [npc.her] [np.legs], wrapping them around [npc2.namePos] lower back, and roughly forcing [npc2.herHim] forwards."
										+ " Glaring up at [npc2.herHim], [npc.name] then spreads [npc.her] [npc.legs] and [npc.moansVerb],"
										+ " [npc.speech(Alright, slut, you'd better make this good!)]";
							default:
								return "Letting [npc2.name] finish [npc2.her] manoeuvre, [npc.name] sits down, before lifting [npc.her] [np.legs], wrapping them around [npc2.namePos] lower back, and forcing [npc2.herHim] forwards."
										+ " Smiling up at [npc2.herHim], [npc.name] then spreads [npc.her] [npc.legs] and [npc.moansVerb],"
										+ " [npc.speech(Come on then, fuck me!)]";
						}

					} else {
						return "Reaching down to grab [npc2.name] by the [npc2.arm], [npc.name] [npc.verb(pull)] [npc2.herHim] back into [npc2.her] old position as [npc.she] angrily scolds [npc2.herHim], "
								+ "[npc.speech(What do you think you're doing?! Don't you <i>dare</i> try that again!)]";
					}

				} else {
					if(isHappy) {
						switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
							case DOM_ROUGH:
								return "Sitting down, [npc.name] [npc.verb(grab)] hold of [npc2.namePos] [npc2.arm], and with a sharp tug, [npc.she] [npc.verb(pull)] [npc2.herHim] down onto [npc2.her] knees before [npc.herHim]."
										+ " Leaning forwards to glare down into [npc2.her] eyes, [npc.name] [npc.moansVerb],"
										+ " [npc.speech(Alright, slut, put that mouth of yours to use!)]";
							default:
								return "Sitting down, [npc.name] [npc.verb(take)] hold of [npc2.namePos] [npc2.arm], and with a firm tug, [npc.she] [npc.verb(pull)] [npc2.herHim] down onto [npc2.her] knees before [npc.herHim]."
										+ " Leaning forwards to gaze into [npc2.her] eyes, [npc.name] [npc.moansVerb],"
										+ " [npc.speech(Good [npc2.girl]. Let's put your mouth to use...)]";
						}

					} else {
						return "Reaching down to grab [npc2.name] by the [npc2.arm], [npc.name] [npc.verb(pull)] [npc2.herHim] back into [npc2.her] old position as [npc.she] angrily scolds [npc2.herHim], "
								+ "[npc.speech(What do you think you're doing?! Don't you <i>dare</i> try that again!)]";
					}
				}

			} else if(Sex.getPositionRequest().getPartnerSlots().get(0)==SexSlotSitting.PERFORMING_ORAL) {
				if(isHappy) {
					switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
						case DOM_ROUGH:
							return "Roughly pushing [npc2.name] down, [npc.name] kneels before [npc2.herHim], leaning forwards to glare up into [npc2.her] eyes as [npc.she] [npc.moansVerb],"
									+ " [npc.speech(Alright, slut, you'd better be glad that I like performing oral!)]";
						default:
							return "Pushing [npc2.name] down, [npc.name] kneels before [npc2.herHim], leaning forwards to gaze up into [npc2.her] eyes as [npc.she] [npc.moansVerb],"
									+ " [npc.speech(I love performing oral...)]";
					}

				} else {
					return "Reaching down to grab [npc2.name] by the [npc2.arm], [npc.name] [npc.verb(pull)] [npc2.herHim] back into [npc2.her] old position as [npc.she] angrily scolds [npc2.herHim], "
							+ "[npc.speech(What do you think you're doing?! Don't you <i>dare</i> try that again!)]";
				}
			}

			return "";
		}

		@Override
		public void applyEffects() {
			if(((NPC)Sex.getCharacterPerformingAction()).isHappyToBeInSlot(
					Sex.getPositionRequest().getPosition(),
					Sex.getPositionRequest().getPartnerSlots().get(0),
					Sex.getPositionRequest().getPerformerSlots().get(0),
					Main.game.getPlayer())) {

				applyChangeSlotEffects(
						Sex.getCharacterPerformingAction(),
						Sex.getPositionRequest().getPartnerSlots().get(0),
						Main.game.getPlayer(),
						Sex.getPositionRequest().getPerformerSlots().get(0));

//				GenericPositioningNew.setNewSexManager(Sex.getPositionRequest(), true);
			}

			Sex.setPositionRequest(null);
		}
	};

}