code:
package com.lilithsthrone.game.sex.positions;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.Arm;
import com.lilithsthrone.game.character.body.BodyPartInterface;
import com.lilithsthrone.game.character.body.Tail;
import com.lilithsthrone.game.character.body.Tentacle;
import com.lilithsthrone.game.character.body.valueEnums.LegConfiguration;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexActionInteractions;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.sexActions.SexActionPresets;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * AbstractSexPositions for taurs, including taur-biped interactions.
 *
 * @since 0.3.1
 * @version 0.3.1
 * @author Innoxia
 */
public class SexPositionOther {

	public static final AbstractSexPosition STANDING = new AbstractSexPosition("Standing",
			true,
			SexActionPresets.positioningActionsNew,
			new ArrayList<>(),
			null) {
		@Override
		public String getDescription() {
			StringBuilder sb = new StringBuilder();
			if(Sex.getSubmissiveParticipants().size()==2) {
				sb.append(UtilText.parse(Sex.getCharacterInPosition(SexSlotOther.STANDING_SUBMISSIVE), Sex.getCharacterInPosition(SexSlotOther.STANDING_SUBMISSIVE_TWO),
					"[npc.Name] and [npc2.name] are standing side-by-side, facing"));
			} else {
				sb.append(UtilText.parse(Sex.getCharacterInPosition(SexSlotOther.STANDING_SUBMISSIVE),
						"[npc.NameIsFull] standing face-to-face with"));
			}
			if(Sex.getDominantParticipants().size()==2) {
				sb.append(UtilText.parse(Sex.getCharacterInPosition(SexSlotOther.STANDING_DOMINANT), Sex.getCharacterInPosition(SexSlotOther.STANDING_DOMINANT_TWO),
						" [npc.name] and [npc2.name]."));
			} else {
				sb.append(UtilText.parse(Sex.getCharacterInPosition(SexSlotOther.STANDING_DOMINANT),
						" [npc.name]."));
			}
			return sb.toString();
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			if(Sex.getCharacterInPosition(SexSlotOther.STANDING_SUBMISSIVE_TWO)!=null) {
				if(Sex.getCharacterInPosition(SexSlotOther.STANDING_DOMINANT_TWO)!=null) {
					return generateSlotTargetsMap(Util.newArrayListOfValues(
							StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_DOMINANT, SexSlotOther.STANDING_SUBMISSIVE),
							StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_DOMINANT_TWO, SexSlotOther.STANDING_SUBMISSIVE_TWO)));
				} else {
					return generateSlotTargetsMap(Util.newArrayListOfValues(
							StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_DOMINANT, SexSlotOther.STANDING_SUBMISSIVE),
							StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_DOMINANT, SexSlotOther.STANDING_SUBMISSIVE_TWO)));
				}
			} else {
				return generateSlotTargetsMap(Util.newArrayListOfValues(
						StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_DOMINANT, SexSlotOther.STANDING_SUBMISSIVE),
						StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_DOMINANT_TWO, SexSlotOther.STANDING_SUBMISSIVE)));
			}
		}
	};

	public static final AbstractSexPosition ORAL = new AbstractSexPosition("Oral",
			true,
			SexActionPresets.positioningActionsNew,
			new ArrayList<>(),
			null) {
		@Override
		public String getDescription() {
			StringBuilder sb = new StringBuilder();
			boolean receivingDom = Sex.isDom(Sex.getCharacterInPosition(SexSlotOther.RECEIVING_ORAL));
			Set<GameCharacter> performers;
			if(receivingDom) {
				performers = Sex.getSubmissiveParticipants().keySet();
			} else {
				performers = Sex.getDominantParticipants().keySet();
			}
			GameCharacter receiving1 = Sex.getCharacterInPosition(SexSlotOther.RECEIVING_ORAL);
			GameCharacter receiving2 = Sex.getCharacterInPosition(SexSlotOther.RECEIVING_ORAL_TWO);
			GameCharacter performing1 = Sex.getCharacterInPosition(SexSlotOther.PERFORMING_ORAL);
			GameCharacter performingBehind1 = Sex.getCharacterInPosition(SexSlotOther.PERFORMING_ORAL_BEHIND);
			GameCharacter performing2 = Sex.getCharacterInPosition(SexSlotOther.PERFORMING_ORAL_TWO);
			GameCharacter performingBehind2 = Sex.getCharacterInPosition(SexSlotOther.PERFORMING_ORAL_BEHIND_TWO);
			GameCharacter standing1 = Sex.getCharacterInPosition(SexSlotOther.STANDING_SUBMISSIVE);
			GameCharacter standing2 = Sex.getCharacterInPosition(SexSlotOther.STANDING_SUBMISSIVE_TWO);

			if(receiving2!=null) {
				sb.append(UtilText.parse(receiving1, receiving2,
						"[npc.Name] and [npc2.name] are standing side-by-side, ready to receive oral from "));

				List<String> names = new ArrayList<>();
				for(GameCharacter performer : performers) {
					names.add(UtilText.parse(performer, "[npc.name]"));
				}
				sb.append(Util.stringsToStringList(names, false)+".");

			} else {
				sb.append(UtilText.parse(receiving1,
						"[npc.NameIsFull] standing before "));
				List<String> names = new ArrayList<>();
				for(GameCharacter performer : performers) {
					names.add(UtilText.parse(performer, "[npc.name]"));
				}
				sb.append(Util.stringsToStringList(names, false)
					+UtilText.parse(receiving1,", and [npc.is] ready to receive oral from ")
					+(performers.size()==1?UtilText.parse(performers.iterator().next(), "[npc.herHim]"):"them")+".");
			}

			if(performing1!=null) {
				sb.append(getPositionDescription(SexSlotOther.PERFORMING_ORAL, performing1, receiving1));
			}
			if(performingBehind1!=null) {
				sb.append(getPositionBehindDescription(SexSlotOther.PERFORMING_ORAL_BEHIND, performingBehind1, receiving1));
			}
			if(receiving2!=null) {
				if(performing2!=null) {
					sb.append(getPositionDescription(SexSlotOther.PERFORMING_ORAL, performing2, receiving2));
				}
				if(performingBehind2!=null) {
					sb.append(getPositionBehindDescription(SexSlotOther.PERFORMING_ORAL_BEHIND, performingBehind2, receiving2));
				}
				if(standing2!=null) {
					sb.append(UtilText.parse(standing2, receiving2," [npc.NameIsFull] standing in front of [npc2.name], ready to busy [npc.herself] with [npc2.namePos] [npc2.breasts+] and mouth."));
				}
			} else {
				if(performing2!=null) {
					sb.append(getPositionDescription(SexSlotOther.PERFORMING_ORAL, performing2, receiving1));
				}
				if(performingBehind2!=null) {
					sb.append(getPositionBehindDescription(SexSlotOther.PERFORMING_ORAL_BEHIND, performingBehind2, receiving1));
				}
			}
			if(standing1!=null) {
				sb.append(UtilText.parse(standing1, receiving1," [npc.NameIsFull] standing in front of [npc2.name], ready to busy [npc.herself] with [npc2.namePos] [npc2.breasts+] and mouth."));
			}

			return sb.toString();
		}
		private String getPositionDescription(SexSlot performingSlot, GameCharacter performer, GameCharacter receiver) {
			return UtilText.parse(performer, receiver,
					receiver.getLegConfiguration().isBipedalPositionedGenitals()
						?" [npc.NameIsFull] "+(performingSlot.isStanding(performer)?"standing":"kneeling")+" in front [npc2.name], ready to put [npc.her] mouth to use on [npc.her] [npc.ass]."
						:" [npc.NameIsFull] "+(performingSlot.isStanding(performer)?"standing":"kneeling")+" beneath [npc2.namePos] feral [npc2.legRace] body, ready to put [npc.her] mouth to use"
						+(receiver.hasPenis()
								?" and suck [npc2.her] [npc2.cock]."
								:receiver.hasBreastsCrotch()
									?" and suckle on [npc2.her] [npc2.crotchBoobs]."
									:"."));
		}
		private String getPositionBehindDescription(SexSlot performingSlot, GameCharacter performer, GameCharacter receiver) {
			return UtilText.parse(performer, receiver,
					receiver.getLegConfiguration().isBipedalPositionedGenitals()
						?" [npc.NameIsFull] "+(performingSlot.isStanding(performer)?"standing":"kneeling")+" behind [npc2.name], ready to put [npc.her] mouth to use on [npc.her] [npc.ass]."
						:" [npc.NameIsFull] "+(performingSlot.isStanding(performer)?"standing":"kneeling")+" behind [npc2.namePos] feral [npc2.legRace] body, ready to put [npc.her] mouth to use"
							+(receiver.hasVagina()
									?" and lick [npc2.her] [npc2.pussy]."
									:" on [npc2.her] [npc2.ass]."));
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			if(Sex.getCharacterInPosition(SexSlotOther.RECEIVING_ORAL_TWO)!=null) {
				return generateSlotTargetsMap(Util.newArrayListOfValues(
						StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.performingOralBehind.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL_BEHIND, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_SUBMISSIVE, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL_TWO, SexSlotOther.RECEIVING_ORAL_TWO),
						StandardSexActionInteractions.performingOralBehind.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL_BEHIND_TWO, SexSlotOther.RECEIVING_ORAL_TWO),
						StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_SUBMISSIVE_TWO, SexSlotOther.RECEIVING_ORAL_TWO)));
			} else {
				return generateSlotTargetsMap(Util.newArrayListOfValues(
						StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL_TWO, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.performingOralBehind.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL_BEHIND, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.performingOralBehind.getSexActionInteractions(SexSlotOther.PERFORMING_ORAL_BEHIND_TWO, SexSlotOther.RECEIVING_ORAL),
						StandardSexActionInteractions.faceToFace.getSexActionInteractions(SexSlotOther.STANDING_SUBMISSIVE, SexSlotOther.RECEIVING_ORAL)));
			}
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvidor) {
			// The character sucking cock can use their arms to force a creampie:
			if((Sex.getSexPositionSlot(cumTarget)==SexSlotOther.PERFORMING_ORAL
					|| Sex.getSexPositionSlot(cumTarget)==SexSlotOther.PERFORMING_ORAL_TWO)
				&& (Sex.getSexPositionSlot(cumProvidor)==SexSlotOther.RECEIVING_ORAL
						|| Sex.getSexPositionSlot(cumProvidor)==SexSlotOther.RECEIVING_ORAL_TWO)) {
				return Util.newHashMapOfValues(
						new Value<>(Arm.class, genericFaceForceCreampieAreas));
			}
			return null;
		}
	};

	public static final AbstractSexPosition ALL_FOURS = new AbstractSexPosition("",
			true,
			SexActionPresets.positioningActionsNew,
			new ArrayList<>(),
			null) {
		@Override
		public String getName() {
			boolean taurs = false;
			for(GameCharacter character : Sex.getAllParticipants(false)) {
				if(character.getLegConfiguration()==LegConfiguration.TAUR) {
					taurs = true;
				}
			}
			if(taurs) {
				return "Mounting";
			} else {
				return "Doggy-style";
			}
		}
		@Override
		public String getDescription() {
			StringBuilder sb = new StringBuilder();

			GameCharacter fucked1 = Sex.getCharacterInPosition(SexSlotOther.ALL_FOURS_FUCKED);
			GameCharacter fucked2 = Sex.getCharacterInPosition(SexSlotOther.ALL_FOURS_FUCKED_TWO);
			GameCharacter fucking1 = Sex.getCharacterInPosition(SexSlotOther.ALL_FOURS_MOUNTING);
			GameCharacter fucking2 = Sex.getCharacterInPosition(SexSlotOther.ALL_FOURS_MOUNTING_TWO);
			GameCharacter inFront1 = Sex.getCharacterInPosition(SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET);
			GameCharacter inFront2 = Sex.getCharacterInPosition(SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET_TWO);

			sb.append(UtilText.parse(fucked1,
					"[npc.NameIsFull] "
					+(SexSlotOther.ALL_FOURS_FUCKED.isStanding(fucked1)
							?"standing upright,"
							:(fucked1.getLegConfiguration().isBipedalPositionedGenitals()?"on all fours,":"lying down on [npc.her] [npc.legRace]'s body,"))));

			if(fucking1!=null) {
				sb.append(UtilText.parse(fucked1, fucking1,
						" presenting [npc.herself] to [npc2.name], "));

				if(inFront1!=null) {
					sb.append(UtilText.parse(fucked1, inFront1,
							"while [npc2.nameIsFull] positioned in front of [npc.herHim], ready to put [npc.her] mouth to use."));
				} else {
					sb.append(UtilText.parse(fucking1,
							fucking1.getLegConfiguration().isBipedalPositionedGenitals()
								?"ready to be fucked by [npc.herHim]."
								:"ready to be mounted and fucked by [npc.herHim]."));
				}

			} else if(inFront1!=null) {
				sb.append(UtilText.parse(fucked1, inFront1,
						" ready to put [npc.her] mouth to use on [npc2.namePos] genitals."));
			}
			if(fucked2!=null) {
				sb.append(UtilText.parse(fucked2,
						"

"
						+ "[npc.NameIsFull] "
						+(SexSlotOther.ALL_FOURS_FUCKED_TWO.isStanding(fucked2)
								?"standing"
								:(fucked2.getLegConfiguration().isBipedalPositionedGenitals()?"on all fours":"lying [npc.her] [npc.legRace]'s body down"))));

				sb.append(UtilText.parse(fucked2, fucked1,
						" beside [npc2.name], and, in a similar manner to [npc.her] partner, is"));

				if(fucking2!=null) {
					sb.append(UtilText.parse(fucked2, fucking2,
							" presenting [npc.herself] to [npc2.name], "));

					if(inFront2!=null) {
						sb.append(UtilText.parse(fucked2, inFront2,
								"while [npc2.nameIsFull] positioned in front of [npc.herHim], ready to use [npc.her] mouth."));
					} else {
						sb.append(UtilText.parse(fucking2,
								fucking2.getLegConfiguration().isBipedalPositionedGenitals()
									?"ready to be fucked by [npc.herHim]."
									:"ready to be mounted and fucked by [npc.herHim]."));
					}

				} else if(inFront2!=null) {
					sb.append(UtilText.parse(fucked2, inFront2,
							" ready to put [npc.her] mouth to use on [npc2.namePos] genitals."));
				}
			}

			return sb.toString();
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			if(Sex.getCharacterInPosition(SexSlotOther.ALL_FOURS_FUCKED_TWO)!=null) {
				return generateSlotTargetsMap(Util.newArrayListOfValues(
						StandardSexActionInteractions.fuckingTaur.getSexActionInteractions(SexSlotOther.ALL_FOURS_MOUNTING, SexSlotOther.ALL_FOURS_FUCKED),
						(Sex.getCharacterInPosition(SexSlotOther.ALL_FOURS_MOUNTING_TWO)!=null
							?StandardSexActionInteractions.fuckingTaur.getSexActionInteractions(SexSlotOther.ALL_FOURS_MOUNTING_TWO, SexSlotOther.ALL_FOURS_FUCKED_TWO)
							:StandardSexActionInteractions.fuckingTaur.getSexActionInteractions(SexSlotOther.ALL_FOURS_MOUNTING, SexSlotOther.ALL_FOURS_FUCKED_TWO)),
						StandardSexActionInteractions.allFoursFrontInteraction.getSexActionInteractions(SexSlotOther.ALL_FOURS_FUCKED, SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET),
						(Sex.getCharacterInPosition(SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET_TWO)!=null
							?StandardSexActionInteractions.allFoursFrontInteraction.getSexActionInteractions(SexSlotOther.ALL_FOURS_FUCKED_TWO, SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET_TWO)
							:StandardSexActionInteractions.allFoursFrontInteraction.getSexActionInteractions(SexSlotOther.ALL_FOURS_FUCKED_TWO, SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET))));

			} else {
				return generateSlotTargetsMap(Util.newArrayListOfValues(
						StandardSexActionInteractions.fuckingTaur.getSexActionInteractions(SexSlotOther.ALL_FOURS_MOUNTING, SexSlotOther.ALL_FOURS_FUCKED),
						StandardSexActionInteractions.allFoursFrontInteraction.getSexActionInteractions(SexSlotOther.ALL_FOURS_FUCKED, SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET)));
			}
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvidor) {
			if((Sex.getSexPositionSlot(cumTarget)==SexSlotOther.ALL_FOURS_FUCKED
					|| Sex.getSexPositionSlot(cumTarget)==SexSlotOther.ALL_FOURS_FUCKED_TWO)) {
				// The character being fucked can use their tails or tentacles to force a creampie:
				if((Sex.getSexPositionSlot(cumProvidor)==SexSlotOther.ALL_FOURS_MOUNTING
						|| Sex.getSexPositionSlot(cumProvidor)==SexSlotOther.ALL_FOURS_MOUNTING_TWO)) {
					return Util.newHashMapOfValues(
							new Value<>(Tail.class, genericGroinForceCreampieAreas),
							new Value<>(Tentacle.class, genericGroinForceCreampieAreas));
				}
				// The character performing oral can use their arm(s) to force a mouth creampie:
				if((Sex.getSexPositionSlot(cumProvidor)==SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET
						|| Sex.getSexPositionSlot(cumProvidor)==SexSlotOther.IN_FRONT_OF_ALL_FOURS_TARGET_TWO)) {
					return Util.newHashMapOfValues(
							new Value<>(Arm.class, genericFaceForceCreampieAreas));
				}
			}
			return null;
		}
	};
}


code:
package com.lilithsthrone.game.sex.positions;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.Arm;
import com.lilithsthrone.game.character.body.BodyPartInterface;
import com.lilithsthrone.game.character.body.Leg;
import com.lilithsthrone.game.character.body.Skin;
import com.lilithsthrone.game.character.body.Tail;
import com.lilithsthrone.game.character.body.Tentacle;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.OrgasmCumTarget;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexActionInteractions;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotUnique;
import com.lilithsthrone.game.sex.sexActions.SexActionInterface;
import com.lilithsthrone.game.sex.sexActions.SexActionPresets;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.game.sex.sexActions.baseActionsMisc.GenericOrgasms;
import com.lilithsthrone.game.sex.sexActions.dominion.CultistSexActions;
import com.lilithsthrone.game.sex.sexActions.dominion.GloryHole;
import com.lilithsthrone.game.sex.sexActions.dominion.PetMounting;
import com.lilithsthrone.game.sex.sexActions.dominion.PetOral;
import com.lilithsthrone.game.sex.sexActions.dominion.PixShower;
import com.lilithsthrone.game.sex.sexActions.dominion.RalphOral;
import com.lilithsthrone.game.sex.sexActions.universal.HandHolding;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 *
 * @since 0.1.97
 * @version 0.3.4
 * @author Innoxia
 */
public class SexPositionUnique {

	public static final AbstractSexPosition PET_MOUNTING = new AbstractSexPosition("Mounted",
			2,
			true,
			null, Util.newArrayListOfValues(PetMounting.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			return UtilText.parse(Sex.getCharacterInPosition(SexSlotUnique.PET_MOUNTING_ON_ALL_FOURS), Sex.getCharacterInPosition(SexSlotUnique.PET_MOUNTING_HUMPING),
					"[npc.NameIs] down on all fours, and [npc.has] been mounted by [npc2.name], who's desperate to penetrate and start humping [npc.herHim].");
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.allFoursBehind.getSexActionInteractions(SexSlotUnique.PET_MOUNTING_HUMPING, SexSlotUnique.PET_MOUNTING_ON_ALL_FOURS));
			return generateSlotTargetsMap(interactions);
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvider) {
			// The character being fucked can use their tails or tentacles to force a creampie:
			if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.PET_MOUNTING_ON_ALL_FOURS
				&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.PET_MOUNTING_HUMPING) {
				return Util.newHashMapOfValues(
						new Value<>(Tail.class, genericGroinForceCreampieAreas),
						new Value<>(Tentacle.class, genericGroinForceCreampieAreas));
			}
			return null;
		}
	};

	public static final AbstractSexPosition PET_ORAL = new AbstractSexPosition("Pet Oral",
			2,
			true,
			null, Util.newArrayListOfValues(PetOral.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			return UtilText.parse(Sex.getCharacterInPosition(SexSlotUnique.PET_ORAL_ON_ALL_FOURS), Sex.getCharacterInPosition(SexSlotUnique.PET_ORAL_COCKED_LEG),
					"[npc.NameIs] down on all fours, with [npc2.namePos] [npc2.leg] hooked over [npc.her] neck, leaving [npc.her] face just [unit.sizes] away from [npc2.namePos] [npc2.cock+].");
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotUnique.PET_ORAL_ON_ALL_FOURS, SexSlotUnique.PET_ORAL_COCKED_LEG));
			return generateSlotTargetsMap(interactions);
		}
	};

	public static final AbstractSexPosition UNDER_DESK_RALPH = new AbstractSexPosition("Under desk",
			2,
			false,
			null, Util.newArrayListOfValues(RalphOral.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			return "You're kneeling under Ralph's counter, with your face just [unit.sizes] away from his crotch.";
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.performingOralRalph.getSexActionInteractions(SexSlotUnique.RALPH_SUB, SexSlotUnique.RALPH_DOM));
			return generateSlotTargetsMap(interactions);
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvider) {
			// The character taking oral can use their arms to force a creampie:
			if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.RALPH_SUB
				&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.RALPH_DOM) {
				return Util.newHashMapOfValues(
						new Value<>(Arm.class, genericFaceForceCreampieAreas));
			}
			// The character being fucked can use their legs to force a creampie:
			if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.RALPH_SUB
					&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.RALPH_DOM) {
					return Util.newHashMapOfValues(
							new Value<>(Leg.class, genericGroinForceCreampieAreas));
				}
			return null;
		}
	};

	public static final AbstractSexPosition SHOWER_TIME_PIX = new AbstractSexPosition("Shower sex",
			2,
			false,
			null, Util.newArrayListOfValues(PixShower.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			return "You're standing with your face pressed up against one wall of the shower, and behind you, Pix is growling hungrily into your ear.";
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.standingBehindCharacterFacingWall.getSexActionInteractions(SexSlotUnique.FACE_TO_WALL_FACING_TARGET_SHOWER_PIX, SexSlotUnique.FACE_TO_WALL_AGAINST_WALL_SHOWER_PIX));
			return generateSlotTargetsMap(interactions);
		}
	};

	public static final AbstractSexPosition HANDS_ROSE = new AbstractSexPosition("Hand-holding",
			2,
			false,
			null, Util.newArrayListOfValues(HandHolding.class, GenericOrgasms.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			return "You and the cat-girl maid, Rose, are standing facing one another, ready to perform lewd acts with one another's hands.";
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.handHolding.getSexActionInteractions(SexSlotUnique.HAND_SEX_DOM_ROSE, SexSlotUnique.HAND_SEX_SUB_ROSE));
			interactions.add(StandardSexActionInteractions.handHolding.getSexActionInteractions(SexSlotUnique.HAND_SEX_SUB_ROSE, SexSlotUnique.HAND_SEX_DOM_ROSE));
			return generateSlotTargetsMap(interactions);
		}
	};

	public static final AbstractSexPosition KNEELING_ORAL_CULTIST = new AbstractSexPosition("Kneeling",
			2,
			true,
			null, Util.newArrayListOfValues(CultistSexActions.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			return "You're kneeling at the feet of [npc.name], with your [pc.face+] hovering just [unit.sizes] away from [npc.her] groin.";
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotUnique.KNEELING_PERFORMING_ORAL_CULTIST, SexSlotUnique.KNEELING_RECEIVING_ORAL_CULTIST));
			return generateSlotTargetsMap(interactions);
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvider) {
			// The character taking oral can use their arms to force a creampie:
			if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.KNEELING_PERFORMING_ORAL_CULTIST
				&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.KNEELING_RECEIVING_ORAL_CULTIST) {
				return Util.newHashMapOfValues(
						new Value<>(Arm.class, genericFaceForceCreampieAreas));
			}
			return null;
		}
	};

	public static final AbstractSexPosition MISSIONARY_ALTAR_CULTIST = new AbstractSexPosition("Missionary on altar",
			2,
			true,
			null, Util.newArrayListOfValues(CultistSexActions.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {//TODO
			if(Sex.getSexPositionSlot(Main.game.getPlayer())==SexSlotUnique.MISSIONARY_ALTAR_LYING_ON_ALTAR) {
				if(Sex.getSexPositionSlot(Sex.getTargetedPartner(Main.game.getPlayer()))==SexSlotUnique.MISSIONARY_ALTAR_STANDING_BETWEEN_LEGS) {
					return "You're lying back on top of the chapel's altar, and [npc.namePos] standing between your [pc.legs], ready to have some fun with you in the missionary position.";
				} else {
					return "You're lying back on top of the chapel's altar, and [npc.namePos] kneeling down between your [pc.legs], ready to have some oral fun with you in the missionary position.";
				}

			} else if(Sex.getSexPositionSlot(Main.game.getPlayer())==SexSlotUnique.MISSIONARY_ALTAR_STANDING_BETWEEN_LEGS) {
				return "[npc.Name] is lying back on top of the chapel's altar, and you're standing between [npc.her] [npc.legs], ready to have some fun in the missionary position.";

			} else {
				return "[npc.Name] is lying back on top of the chapel's altar, and you're kneeling down between [npc.her] [npc.legs], ready to have some oral fun in the missionary position.";
			}
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotUnique.MISSIONARY_ALTAR_KNEELING_BETWEEN_LEGS, SexSlotUnique.MISSIONARY_ALTAR_LYING_ON_ALTAR));
			interactions.add(StandardSexActionInteractions.missionary.getSexActionInteractions(SexSlotUnique.MISSIONARY_ALTAR_STANDING_BETWEEN_LEGS, SexSlotUnique.MISSIONARY_ALTAR_LYING_ON_ALTAR));
			return generateSlotTargetsMap(interactions);
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvider) {
			// The character being fucked can use their legs, tails, or tentacles to force a creampie:
			if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.MISSIONARY_ALTAR_LYING_ON_ALTAR
				&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.MISSIONARY_ALTAR_STANDING_BETWEEN_LEGS) {
				return Util.newHashMapOfValues(
						new Value<>(Leg.class, genericGroinForceCreampieAreas),
						new Value<>(Tail.class, genericGroinForceCreampieAreas),
						new Value<>(Tentacle.class, genericGroinForceCreampieAreas));

			// The character on top can use their body weight to force a creampie:
			} else if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.MISSIONARY_ALTAR_STANDING_BETWEEN_LEGS
					&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.MISSIONARY_ALTAR_LYING_ON_ALTAR) {
					return Util.newHashMapOfValues(
							new Value<>(Skin.class, genericGroinForceCreampieAreas));
			}
			return null;
		}
	};

	public static final AbstractSexPosition MISSIONARY_ALTAR_SEALED_CULTIST = new AbstractSexPosition("Missionary on altar",
			2,
			true,
			null, Util.newArrayListOfValues(CultistSexActions.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {//TODO
			if(Sex.getSexPositionSlot(Main.game.getPlayer())==SexSlotUnique.MISSIONARY_ALTAR_SEALED_LYING_ON_ALTAR) {
				return "You're lying back on top of the chapel's altar, and [npc.namePos] standing between your [pc.legs], ready to have some fun with you in the missionary position.";
			} else if(Sex.getSexPositionSlot(Main.game.getPlayer())==SexSlotUnique.MISSIONARY_ALTAR_SEALED_STANDING_BETWEEN_LEGS) {
				return "[npc.Name] is lying back on top of the chapel's altar, and you're standing between [npc.her] [npc.legs], ready to have some fun in the missionary position.";
			} else {
				return "[npc.Name] is lying back on top of the chapel's altar, and you're kneeling down between [npc.her] [npc.legs], ready to have some oral fun in the missionary position.";
			}
		}
		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();
			interactions.add(StandardSexActionInteractions.performingOral.getSexActionInteractions(SexSlotUnique.MISSIONARY_ALTAR_SEALED_KNEELING_BETWEEN_LEGS, SexSlotUnique.MISSIONARY_ALTAR_SEALED_LYING_ON_ALTAR));
			interactions.add(StandardSexActionInteractions.missionary.getSexActionInteractions(SexSlotUnique.MISSIONARY_ALTAR_SEALED_STANDING_BETWEEN_LEGS, SexSlotUnique.MISSIONARY_ALTAR_SEALED_LYING_ON_ALTAR));
			return generateSlotTargetsMap(interactions);
		}
		@Override
		public boolean isActionBlocked(GameCharacter performer, GameCharacter target, SexActionInterface action) {

			if(Sex.getSexPositionSlot(performer) == SexSlotUnique.MISSIONARY_ALTAR_SEALED_LYING_ON_ALTAR) {
				if((action.getActionType()==SexActionType.ONGOING
						|| action.getActionType()==SexActionType.START_ONGOING
						|| action.getActionType()==SexActionType.REQUIRES_NO_PENETRATION
						|| action.getActionType()==SexActionType.REQUIRES_EXPOSED
						|| action.getActionType()==SexActionType.REQUIRES_NO_PENETRATION_AND_EXPOSED)) {
					return true;
				}
			}
			return super.isActionBlocked(performer, target, action);
		}
		@Override
		protected Map<Class<? extends BodyPartInterface>,  List<SexAreaOrifice>> getForcedCreampieMap(GameCharacter cumTarget, GameCharacter cumProvider) {
			// The character on top can use their body weight to force a creampie:
			if(Sex.getSexPositionSlot(cumTarget)==SexSlotUnique.MISSIONARY_ALTAR_SEALED_STANDING_BETWEEN_LEGS
					&& Sex.getSexPositionSlot(cumProvider)==SexSlotUnique.MISSIONARY_ALTAR_SEALED_LYING_ON_ALTAR) {
					return Util.newHashMapOfValues(
							new Value<>(Skin.class, genericGroinForceCreampieAreas));
			}
			return null;
		}
	};

	public static final AbstractSexPosition GLORY_HOLE = new AbstractSexPosition("Glory hole oral",
			3,
			true,
			null, Util.newArrayListOfValues(GloryHole.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			List<GameCharacter> characters = new ArrayList<>();
			characters.add(Sex.getCharacterInPosition(SexSlotUnique.GLORY_HOLE_KNEELING));
			characters.add(Sex.getCharacterInPosition(SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE));

			if(Sex.getTotalParticipantCount(false)==3) {
				characters.add(Sex.getCharacterInPosition(SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_TWO));
				return UtilText.parse(characters,
						"[npc.NameIsFull] kneeling on the floor of the toilet, ready to serve [npc2.namePos] [npc2.cock+] on one side, an [npc3.namePos] [npc3.cock+] on the other.");
			} else {
				return UtilText.parse(characters,
						"[npc.NameIsFull] kneeling on the floor of the toilet, [npc.her] mouth up against the glory hole in preparation to serve whatever set of genitals [npc2.name] [npc2.has].");
			}
		}

		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();

			interactions.add(new Value<>(
					SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE,
					Util.newHashMapOfValues(
					new Value<>(
							SexSlotUnique.GLORY_HOLE_KNEELING,
							new SexActionInteractions(
								Util.mergeMaps(
									SexActionPresets.groinToMouth),
								Util.newArrayListOfValues(
										OrgasmCumTarget.BREASTS,
										OrgasmCumTarget.HAIR,
										OrgasmCumTarget.FACE,
										OrgasmCumTarget.FLOOR))))));

			interactions.add(new Value<>(
					SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_TWO,
					Util.newHashMapOfValues(
					new Value<>(
							SexSlotUnique.GLORY_HOLE_KNEELING,
							new SexActionInteractions(
								Util.mergeMaps(
									SexActionPresets.groinToMouth),
								Util.newArrayListOfValues(
										OrgasmCumTarget.BREASTS,
										OrgasmCumTarget.HAIR,
										OrgasmCumTarget.FACE,
										OrgasmCumTarget.FLOOR))))));

			interactions.add(new Value<>(
					SexSlotUnique.GLORY_HOLE_KNEELING,
					Util.newHashMapOfValues(
					new Value<>(
							SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE,
							new SexActionInteractions(
								Util.mergeMaps(
									SexActionPresets.fingerToPenis,
									SexActionPresets.fingerToVagina),
								Util.newArrayListOfValues(
										OrgasmCumTarget.SELF_STOMACH,
										OrgasmCumTarget.SELF_GROIN,
										OrgasmCumTarget.SELF_LEGS,
										OrgasmCumTarget.FLOOR))),
					new Value<>(
							SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_TWO,
							new SexActionInteractions(
								Util.mergeMaps(
									SexActionPresets.fingerToPenis,
									SexActionPresets.fingerToVagina),
								Util.newArrayListOfValues(
										OrgasmCumTarget.SELF_STOMACH,
										OrgasmCumTarget.SELF_GROIN,
										OrgasmCumTarget.SELF_LEGS,
										OrgasmCumTarget.FLOOR))))));

			return generateSlotTargetsMap(interactions);
		}
	};

	public static final AbstractSexPosition GLORY_HOLE_SEX = new AbstractSexPosition("Glory hole sex",
			3,
			true,
			null, Util.newArrayListOfValues(GloryHole.class)) {
		@Override
		public String getDescription(Map<GameCharacter, SexSlot> occupiedSlots) {
			List<GameCharacter> characters = new ArrayList<>();
			characters.add(Sex.getCharacterInPosition(SexSlotUnique.GLORY_HOLE_FUCKED));
			characters.add(Sex.getCharacterInPosition(SexSlotUnique.GLORY_HOLE_FUCKING));

			if(Sex.getTotalParticipantCount(false)==3) {
				characters.add(Sex.getCharacterInPosition(SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE));
				return UtilText.parse(characters,
						"[npc.NameIsFull] pressing [npc.her] [npc.ass+] up against [npc2.namePos] glory hole, ready to get penetrated by [npc2.her] [npc2.cock+],"
								+ " while bringing [npc.her] mouth down to [npc3.namePos] [npc3.cock+] on the other side of the narrow toilet stall.");

			} else {
				return UtilText.parse(characters,
						"[npc.NameIsFull] pressing [npc.her] [npc.ass+] up against [npc2.namePos] glory hole, ready to get penetrated by [npc2.her] [npc2.cock+].");
			}
		}

		@Override
		public Map<SexSlot, Map<SexSlot, SexActionInteractions>> getSlotTargets() {
			List<Value<SexSlot, Map<SexSlot, SexActionInteractions>>> interactions = new ArrayList<>();

			interactions.add(new Value<>(
					SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE,
					Util.newHashMapOfValues(
					new Value<>(
							SexSlotUnique.GLORY_HOLE_FUCKED,
							new SexActionInteractions(
								Util.mergeMaps(
									SexActionPresets.groinToMouth),
								Util.newArrayListOfValues(
										OrgasmCumTarget.BREASTS,
										OrgasmCumTarget.HAIR,
										OrgasmCumTarget.FACE,
										OrgasmCumTarget.FLOOR))))));

			interactions.add(new Value<>(
					SexSlotUnique.GLORY_HOLE_FUCKING,
					Util.newHashMapOfValues(
					new Value<>(
							SexSlotUnique.GLORY_HOLE_FUCKED,
							new SexActionInteractions(
									SexActionPresets.penisToVagina,
									Util.newArrayListOfValues(
											OrgasmCumTarget.ASS,
											OrgasmCumTarget.GROIN,
											OrgasmCumTarget.LEGS,
											OrgasmCumTarget.FLOOR))))));

			interactions.add(new Value<>(
					SexSlotUnique.GLORY_HOLE_FUCKED,
					Util.newHashMapOfValues(
					new Value<>(
							SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE,
							new SexActionInteractions(
									Util.mergeMaps(
										SexActionPresets.fingerToPenis,
										SexActionPresets.fingerToVagina),
									Util.newArrayListOfValues(
											OrgasmCumTarget.SELF_LEGS,
											OrgasmCumTarget.FLOOR))),
					new Value<>(
							SexSlotUnique.GLORY_HOLE_FUCKING,
							new SexActionInteractions(
									SexActionPresets.anusToPenis,
									Util.newArrayListOfValues(
											OrgasmCumTarget.SELF_LEGS,
											OrgasmCumTarget.FLOOR))))));

			return generateSlotTargetsMap(interactions);
		}
	};

}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.sex.positions;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.SexActionInteractions;
import com.lilithsthrone.game.sex.SexAreaInterface;
import com.lilithsthrone.game.sex.SexType;

/**
 * Slots which characters can occupy in sex positions.
 *
 * @since 0.3.1
 * @version 0.3.1
 * @author Innoxia
 */
public class SexSlot {

	private String name;
	private String description;
	private String orgasmDescription;
	private boolean standing;

	public SexSlot(String name, String description, String orgasmDescription, boolean standing) {
		this.name = name;
		this.description = description;
		this.orgasmDescription = orgasmDescription;
		this.standing = standing;
	}

	/**
	 * <b>Should only be used for basic slots!</b> This is due to the fact that the 'name' variable is set via a getName(null) call, and the 'standing' variable is set via a isStanding(null) call.
	 * @param slotToCopy
	 */
	public SexSlot(SexSlot slotToCopy) {
		this.name = slotToCopy.getName(null);
		this.description = slotToCopy.getDescription();
		this.orgasmDescription = slotToCopy.getOrgasmDescription();
		this.standing = slotToCopy.isStanding(null);
	}

	/**
	 * @param target The person in this slot.
	 */
	public String getName(GameCharacter target) {
		return name;
	}

	/**
	 * @param description The description for this slot. Should be unique to sex position so that player knows exactly which slot this is in any tooltips.
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * return The description of the character in this slot orgasming. 'npc' is the parser tag used for the orgasming character, while 'npc2' is for the targeted character that they're interacting with.
	 */
	public String getOrgasmDescription() {
		return orgasmDescription;
	}

	/**
	 * Used to check whether the position can use both feet or just one. (If standing, can only use one.)
	 * @param target The person in this slot.
	 * @return
	 */
	public boolean isStanding(GameCharacter target) {
		return standing;
	}

	public boolean isMeetsPreferenceCriteria(GameCharacter character, AbstractSexPosition position, SexType preference) {
		VariableInteractions.setCharacterForPositionTesting(character);

		if(position.getSlotTargets().containsKey(this)) {
			for(SexActionInteractions value : position.getSlotTargets().get(this).values()) {
				for(Entry<SexAreaInterface, List<SexAreaInterface>> interaction : value.getInteractions().entrySet()) {
					if(interaction.getKey()==preference.getPerformingSexArea() && interaction.getValue().contains(preference.getTargetedSexArea())) {
						return true;
					}
				}
			}
		}
		for(Entry<SexSlot, Map<SexSlot, SexActionInteractions>> value : position.getSlotTargets().entrySet()) {
			for(Entry<SexSlot, SexActionInteractions> entry : value.getValue().entrySet()) {
				if(entry.getKey()==this) {
					for(Entry<SexAreaInterface, List<SexAreaInterface>> interaction : entry.getValue().getInteractions().entrySet()) {
						if(interaction.getKey()==preference.getTargetedSexArea() && interaction.getValue().contains(preference.getPerformingSexArea())) {
							return true;
						}
					}
				}
			}
		}
		return false;
	};

	@Override
	public boolean equals(Object o) {
		if(o instanceof SexSlot){
			if(((SexSlot)o).getDescription().equals(getDescription())){
				return true;
			}
		}
		return false;
	}

	@Override
	public int hashCode() {
		int result = 0;
		result = 31 * result + getDescription().hashCode();
		return result;
	}
}


code:
package com.lilithsthrone.game.sex.positions;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.Sex;

/**
 * @since 0.1.97
 * @version 0.3.1
 * @author Innoxia
 */
public class SexSlotBipeds {

	/**For characters not directly involved in sex.*/
	public static final SexSlot MISC_WATCHING = new SexSlot(
			"Watching",
			"spectating",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and, while watching the lewd display before [npc.herHim], [npc.she] [npc.verb(get)] ready to orgasm.",
			true);

	/* Doggy-style */

	/**The partner who's on all fours, being fucked doggy-style.*/
	public static final SexSlot DOGGY_ON_ALL_FOURS = new SexSlot(
			"On all fours",
			"on all fours",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] on all fours, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	/**The partner who's on all fours, being fucked doggy-style.*/
	public static final SexSlot DOGGY_ON_ALL_FOURS_SECOND = new SexSlot(
			"On all fours (second)",
			"on all fours (second)",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] on all fours, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	/**The partner who's on all fours, being fucked doggy-style.*/
	public static final SexSlot DOGGY_ON_ALL_FOURS_THIRD = new SexSlot(
			"On all fours (third)",
			"on all fours (third)",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] on all fours, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	/**The partner who's on all fours, being fucked doggy-style.*/
	public static final SexSlot DOGGY_ON_ALL_FOURS_FOURTH = new SexSlot(
			"On all fours (fourth)",
			"on all fours (fourth)",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] on all fours, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	/**The partner who's behind the doggy-style target. They are kneeling or standing (SD); and can perform vaginal or anal penetration.*/
	public static final SexSlot DOGGY_BEHIND = new SexSlot(
			"Kneeling behind",
			"kneeling behind",
			"[npc1.Name] [npc1.verb(take)] hold of [npc2.namePos] waist, pulling [npc2.herHim] back into [npc1.her] groin and letting out [npc1.a_moan+].",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = super.getName(target);
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				name = "Standing behind";
			}

			if(Sex.getCharacterInPosition(DOGGY_BEHIND_SECOND)!=null) {
				name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]");
			}

			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's behind the second doggy-style target. They are kneeling or standing (SD); and can perform vaginal or anal penetration.*/
	public static final SexSlot DOGGY_BEHIND_SECOND = new SexSlot(
			"Kneeling behind",
			"kneeling behind (second)",
			"[npc1.Name] [npc1.verb(take)] hold of [npc2.namePos] waist, pulling [npc2.herHim] back into [npc1.her] groin and letting out [npc1.a_moan+].",
			false){
		@Override
		public String getName(GameCharacter target) {
			String name = super.getName(target);
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				name = "Standing behind";
			}
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_THIRD)!=null) {
				name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_THIRD), "[npc.name]");
			} else {
				name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]");
			}

			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's behind the doggy-style target. They are also on all fours, and can perform oral on the doggy-style target.*/
	public static final SexSlot DOGGY_BEHIND_ORAL = new SexSlot(
			"On all fours behind",
			"on all fours behind",
			"[npc1.Name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false){
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				return "Kneeling behind";
			}
			return super.getName(target);
		}
	};

	/**The partner who's behind the doggy-style target. They are also on all fours, and can perform oral on the doggy-style target.*/
	public static final SexSlot DOGGY_BEHIND_ORAL_SECOND = new SexSlot(
			"On all fours behind",
			"on all fours behind (second)",
			"[npc1.Name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false){
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				return "Kneeling behind";
			}
			return super.getName(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They can receive oral from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT = new SexSlot(
			"Kneeling in front",
			"kneeling in front",
			"[npc1.Name] [npc1.verb(shuffle)] forwards, pressing [npc1.her] groin up against [npc2.namePos] [npc2.face] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false){
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]");
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They can receive oral from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_TWO = new SexSlot(
			"Kneeling in front",
			"kneeling in front (second)",
			"[npc1.Name] [npc1.verb(shuffle)] forwards, pressing [npc1.her] groin up against [npc2.namePos] [npc2.face] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]");
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They can receive oral from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_SECOND = new SexSlot(
			"Kneeling in front",
			"kneeling in front (third)",
			"[npc1.Name] [npc1.verb(shuffle)] forwards, pressing [npc1.her] groin up against [npc2.namePos] [npc2.face] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]");
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They can receive oral from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_SECOND_TWO = new SexSlot(
			"Kneeling in front",
			"kneeling in front (fourth)",
			"[npc1.Name] [npc1.verb(shuffle)] forwards, pressing [npc1.her] groin up against [npc2.namePos] [npc2.face] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]");
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They are turned around, and can receive anilingus from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_ANAL = new SexSlot(
			"Kneeling in front (anal)",
			"kneeling in front (anal)",
			"[npc1.Name] [npc1.verb(shuffle)] backwards, pressing [npc1.her] [npc1.ass+] up against [npc2.namePos] [npc2.face+] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]")+" (anal)";
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They are turned around, and can receive anilingus from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_ANAL_TWO = new SexSlot(
			"Kneeling in front (anal)",
			"kneeling in front (anal, second)",
			"[npc1.Name] [npc1.verb(shuffle)] backwards, pressing [npc1.her] [npc1.ass+] up against [npc2.namePos] [npc2.face+] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]")+" (anal)";
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They are turned around, and can receive anilingus from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_ANAL_SECOND = new SexSlot(
			"Kneeling in front (anal)",
			"kneeling in front (anal, third)",
			"[npc1.Name] [npc1.verb(shuffle)] backwards, pressing [npc1.her] [npc1.ass+] up against [npc2.namePos] [npc2.face+] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]")+" (anal)";
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's in front of the doggy-style target. They are turned around, and can receive anilingus from the doggy-style target.*/
	public static final SexSlot DOGGY_INFRONT_ANAL_SECOND_TWO = new SexSlot(
			"Kneeling in front (anal)",
			"kneeling in front (anal, fourth)",
			"[npc1.Name] [npc1.verb(shuffle)] backwards, pressing [npc1.her] [npc1.ass+] up against [npc2.namePos] [npc2.face+] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = "Kneeling before";
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				name = "Standing before";
			}
			name+=" "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]")+" (anal)";
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/**The partner who's kneeling behind the doggy-style target. They are using the doggy target's foot.*/
	public static final SexSlot DOGGY_FEET = new SexSlot(
			"Kneeling feet",
			"kneeling at feet",
			"[npc1.Name] [npc1.verb(take)] a firm grip on [npc2.namePos] [npc2.feet], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "Kneeling at [npc.namePos] [npc.feet]");
		}
	};

	/**The partner who's kneeling behind the doggy-style target. They are using the doggy target's foot.*/
	public static final SexSlot DOGGY_FEET_SECOND = new SexSlot(
			"Kneeling feet",
			"kneeling at feet (second)",
			"[npc1.Name] [npc1.verb(take)] a firm grip on [npc2.namePos] [npc2.feet], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "Kneeling at [npc.namePos] [npc.feet]");
		}
	};

	/**Size difference. The partner who's on top of the doggy-style target. They are humping them, and can perform anal penetration.*/
	public static final SexSlot DOGGY_SD_HUMPING = new SexSlot(
			"Humping",
			"humping",
			"[npc1.Name] [npc1.verb(grip)] [npc2.namePos] [npc2.hips+] while continuing to frantically hump [npc2.herHim], before letting out [npc1.a_moan+] as [npc.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Humping "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]");
		}
	};

	/**Size difference. The partner who's on top of the second doggy-style target. They are humping them, and can perform anal penetration.*/
	public static final SexSlot DOGGY_SD_HUMPING_SECOND = new SexSlot(
			"Humping",
			"humping (second)",
			"[npc1.Name] [npc1.verb(grip)] [npc2.namePos] [npc2.hips+] while continuing to frantically hump [npc2.herHim], before letting out [npc1.a_moan+] as [npc.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Humping "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]");
		}
	};

	/**Size difference. The partner who's kneeling beneath the doggy-style target. They are using the doggy target's breasts.*/
	public static final SexSlot DOGGY_SD_UNDER = new SexSlot(
			"Kneeling under",
			"kneeling under",
			"[npc1.Name] [npc1.verb(grope)] [npc2.namePos] [npc2.breasts], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Kneeling under "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS), "[npc.name]");
		}
	};

	/**Size difference. The partner who's kneeling beneath the doggy-style target. They are using the doggy target's breasts.*/
	public static final SexSlot DOGGY_SD_UNDER_SECOND = new SexSlot(
			"Kneeling under",
			"kneeling under (second)",
			"[npc1.Name] [npc1.verb(grope)] [npc2.namePos] [npc2.breasts], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Kneeling under "+UtilText.parse(Sex.getCharacterInPosition(DOGGY_ON_ALL_FOURS_SECOND), "[npc.name]");
		}
	};

	/* Back to wall */

	public static final SexSlot BACK_TO_WALL_AGAINST_WALL = new SexSlot(
			"Back against wall",
			"back against wall",
			"Leaning back, [npc.name] [npc.verb(brace)] [npc.herself] against the wall as [npc.she] [npc.verb(feel)] [npc.herself] reaching [npc.her] climax.",
			true);

	public static final SexSlot BACK_TO_WALL_FACING_TARGET = new SexSlot(
			"Pinning against wall",
			"pinning against wall",
			"Realizing that [npc1.sheIs] about to reach [npc1.her] climax, [npc1.name] [npc1.verb(step)] forwards, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(press)] [npc2.name] back against the wall.",
			true);

	/* Face to wall */

	public static final SexSlot FACE_TO_WALL_AGAINST_WALL = new SexSlot(
			"Facing wall",
			"facing wall",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] against the wall in front of [npc1.herHim], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot FACE_TO_WALL_FACING_TARGET = new SexSlot(
			"Pinning against wall",
			"pinning against wall",
			"[npc1.Name] [npc1.verb(press)] [npc1.herself] into [npc2.namePos] back, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	/* Cowgirl */

	public static final SexSlot COWGIRL_ON_BACK = new SexSlot(
			"On back",
			"on back",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(take)] hold of [npc2.namePos] waist, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot COWGIRL_KNEELING_BEHIND = new SexSlot(
			"Kneeling behind",
			"kneeling behind",
			"[npc1.Name] [npc1.verb(take)] hold of [npc2.namePos] [npc2.hips+], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot COWGIRL_RECEIVING_ORAL = new SexSlot(
			"Receiving oral",
			"receiving oral",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			false);

	public static final SexSlot COWGIRL_RIDING = new SexSlot(
			"Cowgirl (riding)",
			"cowgril (riding)",
			"[npc1.Name] [npc1.verb(look)] down at [npc2.name] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to climax.",
			false);

	/* Face-sitting */

	public static final SexSlot FACE_SITTING_ON_FACE = new SexSlot(
			"Face-sitting",
			"sitting on face",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs+] give out from under [npc.herHim], collapsing down on [npc2.namePos] face as [npc.she] prepares to reach [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_ON_BACK = new SexSlot(
			"Lying on back",
			"lying on back",
			"With [npc2.name] still sitting on [npc.her] face, [npc.name] [npc.verb(let)] out a muffled [npc.moan] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	/* Sixty-nine */

	public static final SexSlot SIXTY_NINE_TOP = new SexSlot(
			"Sixty-nine (top)",
			"sixty-nine (top)",
			"[npc1.Name] [npc1.verb(drop)] [npc1.her] [npc1.face+] down into [npc2.namePos] groin, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot SIXTY_NINE_BOTTOM = new SexSlot(
			"Sixty-nine (bottom)",
			"sixty-nine (bottom)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(grab)] [npc2.namePos] waist, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	/* Kneeling oral */

	public static final SexSlot KNEELING_RECEIVING_ORAL = new SexSlot(
			"Standing",
			"receiving oral",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_RECEIVING_ORAL_TWO = new SexSlot(
			"Standing",
			"receiving oral (second)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_RECEIVING_ORAL_THREE = new SexSlot(
			"Standing",
			"receiving oral (third)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_RECEIVING_ORAL_SECOND = new SexSlot(
			"Standing",
			"receiving oral (fourth)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_RECEIVING_ORAL_SECOND_TWO = new SexSlot(
			"Standing",
			"receiving oral (fifth)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_RECEIVING_ORAL_SECOND_THREE = new SexSlot(
			"Standing",
			"receiving oral (sixth)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_PERFORMING_ORAL = new SexSlot(
			"Kneeling",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = this.isStanding(target)?"Standing":"Kneeling";
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null) {
				name+=" before "+UtilText.parse(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL), "[npc.name]");
			}
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	public static final SexSlot KNEELING_PERFORMING_ORAL_TWO = new SexSlot(
			"Kneeling",
			"performing oral (second)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = this.isStanding(target)?"Standing":"Kneeling";
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null) {
				name+=" before "+UtilText.parse(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL), "[npc.name]");
			}
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	public static final SexSlot KNEELING_PERFORMING_ORAL_THREE = new SexSlot(
			"Kneeling",
			"performing oral (third)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = this.isStanding(target)?"Standing":"Kneeling";
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null) {
				name+=" before "+UtilText.parse(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL), "[npc.name]");
			}
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	public static final SexSlot KNEELING_PERFORMING_ORAL_SECOND = new SexSlot(
			"Kneeling",
			"performing oral (fourth)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = this.isStanding(target)?"Standing":"Kneeling";
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null) {
				name+=" before "+UtilText.parse(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO), "[npc.name]");
			}
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null && Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO).isSizeDifferenceTallerThan(target)) {
				return true;
			} else if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	public static final SexSlot KNEELING_PERFORMING_ORAL_SECOND_TWO = new SexSlot(
			"Kneeling",
			"performing oral (fifth)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = this.isStanding(target)?"Standing":"Kneeling";
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null) {
				name+=" before "+UtilText.parse(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO), "[npc.name]");
			}
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null && Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO).isSizeDifferenceTallerThan(target)) {
				return true;
			} else if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	public static final SexSlot KNEELING_PERFORMING_ORAL_SECOND_THREE = new SexSlot(
			"Kneeling",
			"performing oral (sixth)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			String name = this.isStanding(target)?"Standing":"Kneeling";
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null) {
				name+=" before "+UtilText.parse(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO), "[npc.name]");
			}
			return name;
		}

		@Override
		public boolean isStanding(GameCharacter target) {
			if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO)!=null && Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL_TWO).isSizeDifferenceTallerThan(target)) {
				return true;
			} else if(Sex.getCharacterInPosition(KNEELING_RECEIVING_ORAL).isSizeDifferenceTallerThan(target)) {
				return true;
			}
			return super.isStanding(target);
		}
	};

	/* Standing */

	public static final SexSlot STANDING_DOMINANT = new SexSlot(
			"Standing",
			"standing (dominant)",
			"[npc1.Name] [npc1.verb(reach)] around and [npc1.verb(grab)] [npc2.namePos] [npc2.ass+], pulling [npc2.herHim] into [npc1.herHim] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot STANDING_SUBMISSIVE = new SexSlot(
			"Standing",
			"standing (submissive)",
			"[npc1.Name] [npc.verb(lean)] into [npc2.herHim] and [npc.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot STANDING_DOMINANT_BEHIND = new SexSlot(
			"Standing behind",
			"standing behind (dominant)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(grab)] [npc2.namePos] [npc2.hips+], pulling [npc2.herHim] into [npc1.herHim] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot STANDING_PERFORMING_ORAL_BEHIND = new SexSlot(
			"Kneeling behind",
			"performing oral behind",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(take)] hold [npc2.namePos] [npc2.hips+], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot STANDING_PERFORMING_ORAL = new SexSlot(
			"Kneeling infront",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot STANDING_SD_TALLER = new SexSlot(
			"Standing",
			"standing (taller size-difference)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(grab)] [npc2.namePos] shoulders, pulling [npc2.herHim] into [npc1.herHim] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot STANDING_SD_SMALLER = new SexSlot(
			"Standing",
			"standing (smaller size-difference)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(grab)] [npc2.namePos] [npc2.hips], leaning into [npc2.herHim] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	/* Masturbation */

	public static final SexSlot MASTURBATING_KNEELING = new SexSlot(
			"Kneeling",
			"kneeling (masturbating)",
			"[npc.Name] [npc.verb(bite)] [npc.her] lip and [npc.verb(let)] out out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false);

	/* Chair */

	public static final SexSlot CHAIR_KNEELING = new SexSlot(
			"Kneeling",
			"kneeling in front of chair",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot CHAIR_ORAL_SITTING = new SexSlot(
			"Sitting",
			"sitting on chair (receiving oral)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			false);

	public static final SexSlot CHAIR_TOP = new SexSlot(
			"Sitting in lap",
			"kneeling in lap",
			"With [npc1.a_moan+], [npc1.name] [npc1.verb(sink)] down into [npc2.namePos] lap.",
			false);

	public static final SexSlot CHAIR_BOTTOM = new SexSlot(
			"Sitting",
			"sitting on chair",
			"Wrapping [npc1.her] [npc1.arms+] around [npc2.name], [npc1.name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(pull)] [npc2.herHim] down into [npc.her] lap.",
			false);

	/* Stocks */

	public static final SexSlot STOCKS_LOCKED_IN_STOCKS = new SexSlot(
			"Locked in stocks",
			"locked in stocks",
			"Unable to move, [npc1.name] [npc1.verb(wriggle)] around in the stocks and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot STOCKS_RECEIVING_ORAL = new SexSlot(
			"Receiving oral",
			"locked in stocks (receiving oral)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot STOCKS_PERFORMING_ORAL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot STOCKS_FUCKING = new SexSlot(
			"Standing behind",
			"standing behind",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(grab)] [npc2.namePos] waist, pulling [npc2.herHim] back into [npc1.herHim] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	/* Milking Stall */

	public static final SexSlot MILKING_STALL_LOCKED_IN_MILKING_STALL = new SexSlot(
			"Locked in milking stall",
			"locked in milking stall",
			"Unable to move, [npc1.name] [npc1.verb(wriggle)] around in the stocks and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MILKING_STALL_RECEIVING_ORAL = new SexSlot(
			"Receiving oral",
			"locked in milking stall (receiving oral)",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MILKING_STALL_PERFORMING_ORAL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MILKING_STALL_FUCKING = new SexSlot(
			"Standing behind",
			"standing behind",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(grab)] [npc2.namePos] waist, pulling [npc2.herHim] back into [npc1.herHim] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	/* Missionary */

	public static final SexSlot MISSIONARY_ON_BACK = new SexSlot(
			"Lying back",
			"missionary on back",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and,"
					+ " gazing up at [npc2.namePos] face with lust in [npc.her] [npc.eyes], [npc.she] [npc.verb(spread)] [npc.her] [npc.legs] even wider for [npc2.herHim].",
			false);

	public static final SexSlot MISSIONARY_ON_BACK_SECOND = new SexSlot(
			"Lying back (second)",
			"missionary on back (second)",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and,"
					+ " gazing up at [npc2.namePos] face with lust in [npc.her] [npc.eyes], [npc.she] [npc.verb(spread)] [npc.her] [npc.legs] even wider for [npc2.herHim].",
			false);

	public static final SexSlot MISSIONARY_ON_BACK_THIRD = new SexSlot(
			"Lying back (third)",
			"missionary on back (third)",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and,"
					+ " gazing up at [npc2.namePos] face with lust in [npc.her] [npc.eyes], [npc.she] [npc.verb(spread)] [npc.her] [npc.legs] even wider for [npc2.herHim].",
			false);

	public static final SexSlot MISSIONARY_ON_BACK_FOURTH = new SexSlot(
			"Lying back (fourth)",
			"missionary on back (fourth)",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and,"
					+ " gazing up at [npc2.namePos] face with lust in [npc.her] [npc.eyes], [npc.she] [npc.verb(spread)] [npc.her] [npc.legs] even wider for [npc2.herHim].",
			false);

	public static final SexSlot MISSIONARY_KNEELING_BETWEEN_LEGS = new SexSlot(
			"Kneeling between legs",
			"missionary between legs",
			"",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_KNEELING_BETWEEN_LEGS_SECOND)!=null) {
				if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_THIRD)!=null) {
					return "Kneeling before " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.name]") +" and "+ UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.name]");
				} else {
					return "Kneeling before " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.name]");
				}

			} else {
				return "Kneeling between legs";
			}
		}
		@Override
		public String getOrgasmDescription() {
			if(Sex.getCharacterInPosition(SexSlotBipeds.MISSIONARY_SD_HUMPING)==null
					&& Sex.getCharacterInPosition(SexSlotBipeds.MISSIONARY_SD_PAIZURI)==null
					&& Sex.getCharacterInPosition(SexSlotBipeds.MISSIONARY_FACE_SITTING)==null) {
				return "[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and, leaning down on top of [npc2.name], [npc.she] [npc.verb(gaze)] lustfully down into [npc2.her] [npc2.eyes+].";
			} else {
				return "[npc.Name] [npc.verb(let)] out [npc.a_moan+], and, grinding into [npc2.namePos] groin, [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.";
			}
		}
	};

	public static final SexSlot MISSIONARY_SD_HUMPING = new SexSlot(
			"Humping",
			"missionary humping",
			"[npc1.Name] [npc1.verb(grip)] [npc2.namePos] [npc2.hips+] while continuing to frantically hump [npc2.herHim], before letting out [npc1.a_moan+] as [npc.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND)!=null) {
				return "Humping " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.name]");

			} else {
				return "Humping";
			}
		}
	};

	public static final SexSlot MISSIONARY_SD_PAIZURI = new SexSlot(
			"Straddling chest",
			"missionary on chest",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs+] give out from under [npc.herHim], grinding down on [npc2.namePos] chest as [npc.she] prepares to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND)!=null) {
				return "Straddling " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.namePos]") + " chest";

			} else {
				return "Straddling chest";
			}
		}
	};

	public static final SexSlot MISSIONARY_FACE_SITTING = new SexSlot(
			"Face-sitting",
			"missionary sitting on face",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs+] give out from under [npc.herHim], collapsing down on [npc2.namePos] face as [npc.she] prepares to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND)!=null) {
				return "Face-sitting " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.name]");

			} else {
				return "Face-sitting";
			}
		}
	};

	public static final SexSlot MISSIONARY_KNEELING_BESIDE = new SexSlot(
			"Kneeling beside",
			"missionary beside",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+], and, shuffling forwards to press [npc.herself] against [npc2.name], [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND)!=null) {
				return "Kneeling beside " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.name]");

			} else {
				return "Kneeling beside";
			}
		}
	};

	public static final SexSlot MISSIONARY_KNEELING_BESIDE_TWO = new SexSlot(
			"Kneeling beside (second)",
			"missionary beside (second)",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+], and, shuffling forwards to press [npc.herself] against [npc2.name], [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND)!=null) {
				return "Kneeling beside " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK), "[npc.name]")+" (second)";

			} else {
				return "Kneeling beside (second)";
			}
		}
	};

	public static final SexSlot MISSIONARY_KNEELING_BETWEEN_LEGS_SECOND = new SexSlot(
			"Kneeling between legs",
			"missionary between legs (second)",
			"",
			false) {
		@Override
		public String getName(GameCharacter target) {
			if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_THIRD)!=null) {
				if(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_FOURTH)!=null) {
					return "Kneeling before " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_THIRD), "[npc.name]");
				} else {
					return "Kneeling before " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_THIRD), "[npc.name]") +" and "+ UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_FOURTH), "[npc.name]");
				}
			} else {
				return "Kneeling before " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.name]");
			}
		}
		@Override
		public String getOrgasmDescription() {
			if(Sex.getCharacterInPosition(SexSlotBipeds.MISSIONARY_SD_HUMPING_SECOND)==null
					&& Sex.getCharacterInPosition(SexSlotBipeds.MISSIONARY_SD_PAIZURI_SECOND)==null
					&& Sex.getCharacterInPosition(SexSlotBipeds.MISSIONARY_FACE_SITTING_SECOND)==null) {
				return "[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and, leaning down on top of [npc2.name], [npc.she] [npc.verb(gaze)] lustfully down into [npc2.her] [npc2.eyes+].";
			} else {
				return "[npc.Name] [npc.verb(let)] out [npc.a_moan+], and, grinding into [npc2.namePos] groin, [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.";
			}
		}
	};

	public static final SexSlot MISSIONARY_SD_HUMPING_SECOND = new SexSlot(
			"Humping",
			"missionary humping (second)",
			"[npc1.Name] [npc1.verb(grip)] [npc2.namePos] [npc2.hips+] while continuing to frantically hump [npc2.herHim], before letting out [npc1.a_moan+] as [npc.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Humping " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.name]");
		}
	};

	public static final SexSlot MISSIONARY_SD_PAIZURI_SECOND = new SexSlot(
			"Straddling chest",
			"missionary on chest (second)",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs+] give out from under [npc.herHim], grinding down on [npc2.namePos] chest as [npc.she] prepares to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Straddling " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.namePos]")+" chest";
		}
	};

	public static final SexSlot MISSIONARY_FACE_SITTING_SECOND = new SexSlot(
			"Face-sitting",
			"missionary sitting on face (second)",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs+] give out from under [npc.herHim], collapsing down on [npc2.namePos] face as [npc.she] prepares to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Face-sitting " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.name]");
		}
	};

	public static final SexSlot MISSIONARY_KNEELING_BESIDE_SECOND = new SexSlot(
			"Kneeling beside",
			"missionary beside (third)",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+], and, shuffling forwards to press [npc.herself] against [npc2.name], [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Kneeling beside " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.name]");
		}
	};

	public static final SexSlot MISSIONARY_KNEELING_BESIDE_SECOND_TWO = new SexSlot(
			"Kneeling beside (second)",
			"missionary beside (fourth)",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+], and, shuffling forwards to press [npc.herself] against [npc2.name], [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			return "Kneeling beside " + UtilText.parse(Sex.getCharacterInPosition(MISSIONARY_ON_BACK_SECOND), "[npc.name]")+" (second)";
		}
	};

	/* UNIQUE SEX SCENES */

	public static final SexSlot PET_MOUNTING_ON_ALL_FOURS = new SexSlot(
			"On all fours",
			"on all fours",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] on all fours, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot PET_MOUNTING_HUMPING = new SexSlot(
			"Mounting",
			"mounting",
			"[npc1.Name] [npc1.verb(take)] hold of [npc2.namePos] waist, pulling [npc2.herHim] back into [npc1.her] groin and letting out [npc1.a_moan+].",
			false);

	public static final SexSlot PET_ORAL_ON_ALL_FOURS = new SexSlot(
			"On all fours",
			"on all fours (oral)",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] on all fours, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot PET_ORAL_COCKED_LEG = new SexSlot(
			"Cocked leg",
			"cocked leg",
			"[npc1.Name] [npc1.verb(shuffle)] forwards, pressing [npc1.her] groin up against [npc2.namePos] [npc2.face] and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot KNEELING_RECEIVING_ORAL_RALPH = new SexSlot(
			"Standing",
			"receiving oral",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_PERFORMING_ORAL_RALPH = new SexSlot(
			"Kneeling",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot FACE_TO_WALL_AGAINST_WALL_SHOWER_PIX = new SexSlot(
			"Facing wall",
			"facing wall",
			"[npc1.Name] [npc1.verb(brace)] [npc1.herself] against the wall in front of [npc1.herHim], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot FACE_TO_WALL_FACING_TARGET_SHOWER_PIX = new SexSlot(
			"Pinning against wall",
			"pinning against wall",
			"[npc1.Name] [npc1.verb(press)] [npc1.herself] into [npc2.namePos] back, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot HAND_SEX_DOM_ROSE = new SexSlot(
			"Standing",
			"hand sex (dominant)",
			"[npc1.Name] [npc1.verb(look)] into [npc2.namePos] [npc2.eyes+] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot HAND_SEX_SUB_ROSE = new SexSlot(
			"Standing",
			"hand sex (submissive)",
			"[npc1.Name] [npc1.verb(look)] into [npc2.namePos] [npc2.eyes+] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot MISSIONARY_DESK_SUB = new SexSlot(
			"Lying on desk",
			"lying on desk",
			"[npc1.Name] [npc1.verb(look)] up into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MISSIONARY_DESK_SUB_SECOND = new SexSlot(
			"Lying on desk",
			"lying on desk (second)",
			"[npc1.Name] [npc1.verb(look)] up into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MISSIONARY_DESK_DOM = new SexSlot(
			"Standing between legs",
			"standing between legs",
			"[npc1.Name] [npc1.verb(look)] down into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot MISSIONARY_DESK_DOM_SECOND = new SexSlot(
			"Standing between legs",
			"standing between legs (second)",
			"[npc1.Name] [npc1.verb(look)] down into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot MATING_PRESS_BOTTOM = new SexSlot(
			"On back",
			"mating pressed",
			"[npc1.Name] [npc1.verb(thrust)] [npc.her] [npc.hips] against the glory hole and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MATING_PRESS_TOP = new SexSlot(
			"On top",
			"performing mating press",
			"Looking down into [npc2.namePos] [npc2.eyes] and pressing [npc.her] weight down on top of [npc2.herHim], [npc.name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot KNEELING_RECEIVING_ORAL_CULTIST = new SexSlot(
			"Standing",
			"receiving oral",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(reach)] [npc1.her] climax.",
			true);

	public static final SexSlot KNEELING_PERFORMING_ORAL_CULTIST = new SexSlot(
			"Kneeling",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MISSIONARY_ALTAR_LYING_ON_ALTAR = new SexSlot(
			"Lying on altar",
			"lying on altar",
			"[npc1.Name] [npc1.verb(look)] up into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MISSIONARY_ALTAR_STANDING_BETWEEN_LEGS = new SexSlot(
			"Between legs",
			"between legs",
			"[npc1.Name] [npc1.verb(look)] down into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot MISSIONARY_ALTAR_KNEELING_BETWEEN_LEGS = new SexSlot(
			"Between legs (oral)",
			"between legs (oral)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MISSIONARY_ALTAR_SEALED_LYING_ON_ALTAR = new SexSlot(
			"Lying on altar",
			"lying on altar (sealed)",
			"[npc1.Name] [npc1.verb(look)] up into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot MISSIONARY_ALTAR_SEALED_STANDING_BETWEEN_LEGS = new SexSlot(
			"Between legs",
			"between legs (sealed)",
			"[npc1.Name] [npc1.verb(look)] down into [npc2.namePos] [npc2.eyes] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot MISSIONARY_ALTAR_SEALED_KNEELING_BETWEEN_LEGS = new SexSlot(
			"Between legs (oral)",
			"between legs (oral, sealed)",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc.her] climax.",
			false);

	/* Breeding stalls */

	public static final SexSlot BREEDING_STALL_FRONT = new SexSlot(
			"Lying on stomach",
			"lying on stomach",
			"[npc1.Name] [npc1.verb(spread)] [npc1.her] [npc1.legs] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot BREEDING_STALL_BACK = new SexSlot(
			"Lying on back",
			"lying on back",
			"[npc1.Name] [npc1.verb(spread)] [npc1.her] [npc1.legs] and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot BREEDING_STALL_FUCKING = new SexSlot(
			"Standing",
			"breeding",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(grab)] [npc2.namePos] waist, before stepping forwards and driving [npc1.her] [npc1.cock] deep into [npc2.namePos] [npc2.pussy+]."
				+ " Letting out [npc1.a_moan+], [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax, and pump [npc2.namePos] womb full of [npc1.cum+].",
			true);

	/* Glory hole */

	public static final SexSlot GLORY_HOLE_KNEELING = new SexSlot(
			"Kneeling",
			"glory hole (kneeling)",
			"[npc1.Name] [npc1.verb(look)] back and forth between the two glory holes, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot GLORY_HOLE_FUCKED = new SexSlot(
			"Getting fucked",
			"glory hole (getting fucked)",
			"[npc1.Name] [npc1.verb(push)] [npc.her] [npc.hips] back against the toilet stall's wall and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot GLORY_HOLE_RECEIVING_ORAL_ONE = new SexSlot(
			"Receiving oral",
			"glory hole (receiving oral)",
			"[npc1.Name] [npc1.verb(thrust)] [npc.her] [npc.hips] against the glory hole and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot GLORY_HOLE_RECEIVING_ORAL_TWO = new SexSlot(
			"Receiving oral",
			"glory hole (receiving oral, second)",
			"[npc1.Name] [npc1.verb(thrust)] [npc.her] [npc.hips] against the glory hole and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);

	public static final SexSlot GLORY_HOLE_FUCKING = new SexSlot(
			"Fucking",
			"glory hole (fucking)",
			"[npc1.Name] [npc1.verb(thrust)] [npc.her] [npc.hips] against the glory hole and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true);
	;
}