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

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

/**
 * @since 0.3.1
 * @version 0.3.1
 * @author Innoxia
 */
public class SexSlotOther {

	/* STANDING */

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

	public static final SexSlot STANDING_DOMINANT_TWO = new SexSlot(STANDING_DOMINANT);

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

	public static final SexSlot STANDING_SUBMISSIVE_TWO = new SexSlot(STANDING_SUBMISSIVE);

	/* ORAL */

	public static final SexSlot RECEIVING_ORAL = new SexSlot(
			"Standing",
			"receiving oral",
			"With a small thrust of [npc.her] [npc.hips], [npc.name] [npc.verb(push)] [npc.her] groin into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			true);

	public static final SexSlot RECEIVING_ORAL_TWO = new SexSlot(
			"Standing",
			"receiving oral",
			"With a small thrust of [npc.her] [npc.hips], [npc.name] [npc.verb(push)] [npc.her] groin into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			true);

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

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

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

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

	/* MOUTING */

	public static final SexSlot ALL_FOURS_FUCKED = new SexSlot(
			"Standing/On all fours",
			"being fucked",
			"With trembling [npc.legs], [npc.name] [npc.do] [npc.her] best to [npc.verb(steady)] [npc2.herself], and with [npc.a_moan+], [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true){
		@Override
		public String getName(GameCharacter target) {
			return isStanding(target)
					?"Standing"
					:(target.getLegConfiguration()==LegConfiguration.TAUR
						?"Lying down"
						:"On all fours");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = Sex.getCharacterInPosition(ALL_FOURS_MOUNTING);
			if(partner==null || target.getLegConfiguration()!=LegConfiguration.TAUR) {
				return false; // If nobody is fucking them, or they are not a taur, they kneel to perform oral.
			}
			return target.getLegConfiguration()==LegConfiguration.TAUR && partner.getLegConfiguration()==LegConfiguration.TAUR; // Only standing if they are a taurs (so they can get easily mounted by the taur fucking them)
		}
	};

	public static final SexSlot ALL_FOURS_FUCKED_TWO = new SexSlot(
			"Standing/On all fours",
			"being fucked",
			"With trembling [npc.legs], [npc.name] [npc.do] [npc.her] best to [npc.verb(steady)] [npc2.herself], and with [npc.a_moan+], [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true){
		@Override
		public String getName(GameCharacter target) {
			return isStanding(target)
					?"Standing"
					:(target.getLegConfiguration()==LegConfiguration.TAUR
						?"Lying down"
						:"On all fours");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = Sex.getCharacterInPosition(ALL_FOURS_MOUNTING);
			if(partner==null || target.getLegConfiguration()!=LegConfiguration.TAUR) {
				return false; // If nobody is fucking them, or they are not a taur, they kneel to perform oral.
			}
			return target.getLegConfiguration()==LegConfiguration.TAUR && partner.getLegConfiguration()==LegConfiguration.TAUR; // Only standing if they are a taurs (so they can get easily mounted by the taur fucking them)
		}
	};

	public static final SexSlot ALL_FOURS_MOUNTING = new SexSlot(
			"Mounting/Kneeling behind",
			"mounting",
			"[npc.Name] wildly [npc.verb(buck)] [npc.her] [npc.hips] and [npc.verb(press)] [npc.her] weight down on top of [npc2.namePos] body, letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			boolean standing = isStanding(target);
			return (target.getLegConfiguration()==LegConfiguration.TAUR
						?"Mounting"
						:standing?"Standing behind":"Kneeling behind")
					+" "+UtilText.parse(Sex.getTargetedPartner(target), "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = Sex.getCharacterInPosition(ALL_FOURS_FUCKED);
			return partner!=null && (ALL_FOURS_FUCKED.isStanding(partner) || partner.isSizeDifferenceTallerThan(target));
		}
	};

	public static final SexSlot ALL_FOURS_MOUNTING_TWO = new SexSlot(
			"Mounting/Fucking",
			"mounting (second)",
			"[npc.Name] wildly [npc.verb(buck)] [npc.her] [npc.hips] and [npc.verb(press)] [npc.her] weight down on top of [npc2.namePos] body, letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			boolean standing = isStanding(target);
			return (target.getLegConfiguration()==LegConfiguration.TAUR
						?"Mounting"
						:standing?"Standing behind":"Kneeling behind")
					+" "+UtilText.parse(Sex.getTargetedPartner(target), "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = Sex.getCharacterInPosition(ALL_FOURS_FUCKED_TWO);
			return partner!=null && (ALL_FOURS_FUCKED_TWO.isStanding(partner) || partner.isSizeDifferenceTallerThan(target));
		}
	};

	public static final SexSlot IN_FRONT_OF_ALL_FOURS_TARGET = new SexSlot(
			"Standing/kneeling",
			"in front",
			"[npc.Name] [npc.verb(press)] [npc.herself] in against [npc2.namePos] [npc2.breasts], letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			return (this.isStanding(target)?"Standing":"Kneeling")+" before "+UtilText.parse(Sex.getTargetedPartner(target), "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = Sex.getCharacterInPosition(ALL_FOURS_FUCKED);
			return partner!=null && (ALL_FOURS_FUCKED.isStanding(partner) || partner.getLegConfiguration()==LegConfiguration.TAUR || partner.isSizeDifferenceTallerThan(target));
		}
	};

	public static final SexSlot IN_FRONT_OF_ALL_FOURS_TARGET_TWO = new SexSlot(
			"Standing/kneeling",
			"in front",
			"[npc.Name] [npc.verb(press)] [npc.herself] in against [npc2.namePos] [npc2.breasts], letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			return (this.isStanding(target)?"Standing":"Kneeling")+" before "+UtilText.parse(Sex.getTargetedPartner(target), "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = Sex.getCharacterInPosition(ALL_FOURS_FUCKED_TWO);
			return partner!=null && (ALL_FOURS_FUCKED_TWO.isStanding(partner) || partner.getLegConfiguration()==LegConfiguration.TAUR || partner.isSizeDifferenceTallerThan(target));
		}
	};

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.OrgasmCumTarget;
import com.lilithsthrone.game.sex.SexActionInteractions;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotBreedingStall;
import com.lilithsthrone.game.sex.sexActions.SexActionPresets;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * A collection of standard SexActionInteractions classes.
 *
 * @since 0.3.1
 * @version 0.3.4
 * @author Innoxia
 */
public class StandardSexActionInteractions {

	// Misc:

	public static SexActionInteractions spectator = new SexActionInteractions(
		null,
		Util.newArrayListOfValues(
				OrgasmCumTarget.SELF_STOMACH,
				OrgasmCumTarget.SELF_GROIN,
				OrgasmCumTarget.SELF_LEGS,
				OrgasmCumTarget.SELF_FEET,
				OrgasmCumTarget.FLOOR),
		null);

	public static VariableInteractions masturbation = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						null,
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_FEET,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues()))));
			}
	};

	// Sex:

	public static VariableInteractions faceToFace = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);

				if(performer.isSizeDifferenceShorterThan(target)) { // If significantly shorter, they're basically standing to perform oral.
					return performingOral.getSexActionInteractions(performerSlot, targetSlot);
				}
				if(target.isSizeDifferenceShorterThan(performer)) { // If significantly shorter, they're basically standing to perform oral.
					return performingOral.getSexActionInteractions(targetSlot, performerSlot);
				}

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								!target.isTaur() && !performer.isTaur()
									?SexActionPresets.groinToGroin
									:null,
								!target.isTaur()
									?SexActionPresets.appendagesToAllAreas
									:(target.getLegConfiguration().isBipedalPositionedCrotchBoobs()
											?SexActionPresets.appendagesToCrotchBoobs
											:null),
								!performer.isTaur()
									?SexActionPresets.allAreasToAppendages
									:(performer.getLegConfiguration().isBipedalPositionedCrotchBoobs()
											?SexActionPresets.crotchBoobsToAppendages
											:null),
								SexActionPresets.appendagesToUpperHalf,
								SexActionPresets.upperHalfToAppendages,
								SexActionPresets.kissing,
								SexActionPresets.mouthToBreasts,
								SexActionPresets.breastsToMouth),
						Util.newArrayListOfValues(
								OrgasmCumTarget.STOMACH,
								!target.isTaur() && !performer.isTaur()
									?OrgasmCumTarget.GROIN
									:null,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.STOMACH,
								!target.isTaur() && !performer.isTaur()
									?OrgasmCumTarget.GROIN
									:null,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions standingBehind = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			GameCharacter performer = getCharacter(performerSlot);
			GameCharacter target = getCharacter(targetSlot);

			if(performer.isSizeDifferenceShorterThan(target)) { // If significantly shorter, they're basically standing to perform oral.
				return performingOralBehind.getSexActionInteractions(performerSlot, targetSlot);
			}

			return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
					new SexActionInteractions(
					Util.mergeMaps(
							!performer.isTaur()
								?(!target.isTaur()
									?Util.mergeMaps(
											SexActionPresets.kissing,
											SexActionPresets.groinToAss,
											SexActionPresets.penisToVagina,
											SexActionPresets.appendagesToAllAreas,
											SexActionPresets.allAreasToTailAndTentacle,
											SexActionPresets.lowerHalfToFinger)
									:Util.mergeMaps(
											SexActionPresets.allAreasToTailAndTentacle,
											SexActionPresets.appendagesToLowerHalf,
											SexActionPresets.groinToGroin))
								:!target.isTaur()
									?Util.mergeMaps(
											SexActionPresets.kissing,
											SexActionPresets.fingerToUpperTorso,
											SexActionPresets.fingerToLowerHalf,
											SexActionPresets.upperHalfToAppendages)
									:Util.mergeMaps(
											SexActionPresets.appendagesToLowerHalf,
											SexActionPresets.allAreasToTailAndTentacle)),
					Util.newArrayListOfValues(
							OrgasmCumTarget.BACK,
							target.isTaur() && !performer.isTaur()
								?OrgasmCumTarget.GROIN
								:null,
							OrgasmCumTarget.ASS,
							OrgasmCumTarget.LEGS,
							OrgasmCumTarget.FLOOR),
					Util.newArrayListOfValues(
							OrgasmCumTarget.FLOOR)))));
		}
	};

	public static VariableInteractions performingOral = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToPenis,
								SexActionPresets.breastsToPenis,
								!target.isTaur()
									?SexActionPresets.mouthToVagina
									:null,
								SexActionPresets.mouthToCrotchBoobs,
								SexActionPresets.fingerToLowerHalf,
								!target.isTaur()
									?SexActionPresets.mouthToAppendages
									:null,
								SexActionPresets.groinToFeet
								),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_FEET,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions performingOralBehind = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToAss,
								SexActionPresets.mouthToVagina,
								SexActionPresets.fingerToLowerHalf,
								!target.isTaur()
									?SexActionPresets.mouthToAppendages
									:SexActionPresets.mouthToTailAndTentacle,
								SexActionPresets.groinToFeet),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_FEET,
								OrgasmCumTarget.FLOOR),
						null))));
			}
	};

	public static VariableInteractions standingBehindCharacterFacingWall = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);

				if(performer.isSizeDifferenceShorterThan(target)) { // If significantly shorter, they're basically standing to perform oral.
					return performingOralBehind.getSexActionInteractions(performerSlot, targetSlot);
				}
				if(target.isSizeDifferenceShorterThan(performer)) { // If significantly shorter, they're basically standing to perform oral.
					return performingOral.getSexActionInteractions(targetSlot, performerSlot);
				}

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								!target.isTaur()
									?Util.mergeMaps(
											SexActionPresets.kissing,
											SexActionPresets.appendagesToAllAreas)
									:(target.getLegConfiguration().isBipedalPositionedCrotchBoobs()
											?SexActionPresets.appendagesToLowerHalf
											:Util.mergeMaps(
													SexActionPresets.appendagesToCrotchBoobs,
													SexActionPresets.appendagesToLowerHalf)),

								!performer.isTaur()
									?Util.mergeMaps(
											!target.isTaur()
												?Util.mergeMaps(
														SexActionPresets.allAreasToTailAndTentacle,
														SexActionPresets.lowerHalfToFinger)
												:null,
											SexActionPresets.groinToAss,
											SexActionPresets.penisToVagina,
											SexActionPresets.penisToThighs)
									:(performer.getLegConfiguration().isBipedalPositionedCrotchBoobs() && !target.isTaur()
											?Util.mergeMaps(
												SexActionPresets.crotchBoobsToAppendages)
											:null)),
						Util.newArrayListOfValues(
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.WALL,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.WALL,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions standingBehindCharacterBackToWall = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);

				if(performer.isSizeDifferenceShorterThan(target)) { // If significantly shorter, they're basically standing to perform oral.
					return performingOral.getSexActionInteractions(performerSlot, targetSlot);
				}
				if(target.isSizeDifferenceShorterThan(performer)) { // If significantly shorter, they're basically standing to perform oral.
					return performingOral.getSexActionInteractions(targetSlot, performerSlot);
				}

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								!target.isTaur()
									?SexActionPresets.appendagesToAllAreas
									:(target.getLegConfiguration().isBipedalPositionedCrotchBoobs()
										?Util.mergeMaps(
											SexActionPresets.appendagesToUpperHalf,
											SexActionPresets.appendagesToCrotchBoobs)
										:SexActionPresets.appendagesToUpperHalf),
								!performer.isTaur()
									?SexActionPresets.allAreasToAppendages
									:(performer.getLegConfiguration().isBipedalPositionedCrotchBoobs()
											?Util.mergeMaps(
												SexActionPresets.upperHalfToAppendages,
												SexActionPresets.crotchBoobsToAppendages)
											:SexActionPresets.upperHalfToAppendages),
								SexActionPresets.kissing,
								SexActionPresets.mouthToBreasts,
								SexActionPresets.breastsToMouth,
								!performer.isTaur()
									?(!target.isTaur()
										?SexActionPresets.groinToGroin
										:(target.getLegConfiguration().isBipedalPositionedCrotchBoobs()
											?SexActionPresets.groinToCrotchBoobs
											:null))
									:null),
						Util.newArrayListOfValues(
								OrgasmCumTarget.STOMACH,
								!target.isTaur() && !performer.isTaur()
									?OrgasmCumTarget.GROIN
									:null,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.WALL,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.STOMACH,
								!target.isTaur() && !performer.isTaur()
									?OrgasmCumTarget.GROIN
									:null,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions standingBeforeDeskBack = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								!performer.isTaur()
									?Util.mergeMaps(
											SexActionPresets.kissing,
											SexActionPresets.mouthToBreasts,
											SexActionPresets.appendagesToAllAreas,
											SexActionPresets.upperHalfToAppendages)
									:null,
								SexActionPresets.groinToGroin,
								SexActionPresets.groinToCrotchBoobs,
								SexActionPresets.penisToAss),
						Util.newArrayListOfValues(
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions standingBeforeDeskFront = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								!performer.isTaur()
									?Util.mergeMaps(
											SexActionPresets.appendagesToAllAreas,
											SexActionPresets.allAreasToTailAndTentacle)
									:null,
								SexActionPresets.groinToAss,
								SexActionPresets.vaginaToVagina,
								SexActionPresets.penisToVagina,
								SexActionPresets.penisToThighs),
						Util.newArrayListOfValues(
								OrgasmCumTarget.BACK,
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions lyingOnDeskPerformingOral = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								!performer.isTaur()
									?SexActionPresets.mouthToLowerHalf
									:Util.mergeMaps(
											SexActionPresets.kissing,
											SexActionPresets.mouthToBreasts,
											SexActionPresets.breastsToMouth),
								SexActionPresets.fingerToLowerHalf,
								SexActionPresets.mouthToAppendages,
								SexActionPresets.upperHalfToAppendages),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions standingDeskToReceivingOral = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing,
								SexActionPresets.appendagesToUpperHalf,
								SexActionPresets.upperHalfToAppendages),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions fuckingCharacterInStocks = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			GameCharacter performer = getCharacter(performerSlot);

			return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
					new SexActionInteractions(
					Util.mergeMaps(
							SexActionPresets.penisToThighs,
							SexActionPresets.penisToAss,
							SexActionPresets.penisToVagina,
							!performer.isTaur()
								?Util.mergeMaps(
										SexActionPresets.appendagesToLowerHalf,
										SexActionPresets.vaginaToVagina)
								:null),
					Util.newArrayListOfValues(
							OrgasmCumTarget.ASS,
							OrgasmCumTarget.GROIN,
							OrgasmCumTarget.BACK,
							OrgasmCumTarget.LEGS,
							OrgasmCumTarget.FLOOR),
					Util.newArrayListOfValues(
							OrgasmCumTarget.FLOOR)))));
		}
	};

	public static VariableInteractions performingOralOnStocks = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToLowerHalf,
								SexActionPresets.breastsToPenis,
								(!target.isTaur()==target.getLegConfiguration().isBipedalPositionedCrotchBoobs()
									?Util.mergeMaps(
											SexActionPresets.mouthToCrotchBoobs,
											SexActionPresets.appendagesToCrotchBoobs)
									:null),
								SexActionPresets.appendagesToLowerHalf,
								SexActionPresets.groinToFeet),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_FEET,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions stocksCharacterPerformingOral = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToLowerHalf,
								SexActionPresets.mouthToCrotchBoobs,
								SexActionPresets.upperHalfToAppendages),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions allFoursBehind = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);
				boolean isAbleToReachTargetUpperTorso = performer.isTaur()==target.isTaur();

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.penisToThighs,
								SexActionPresets.penisToAss,
								SexActionPresets.penisToVagina,
								SexActionPresets.vaginaToVagina,
								SexActionPresets.tailToLowerHalf,
								SexActionPresets.tentacleToLowerHalf,
								!performer.isTaur()
									?SexActionPresets.fingerToLowerHalf
									:null,
								isAbleToReachTargetUpperTorso
									?SexActionPresets.fingerToUpperTorso
									:null),
						Util.newArrayListOfValues(
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.BACK,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions allFoursBehindToHumping = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			GameCharacter performer = getCharacter(performerSlot);
			GameCharacter target = getCharacter(targetSlot);
			boolean isAbleToReachTargetUpperTorso = performer.isTaur()==target.isTaur();

			return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
					new SexActionInteractions(
					Util.mergeMaps(
							SexActionPresets.penisToThighs,
							SexActionPresets.penisToAss,
							SexActionPresets.penisToVagina,
							SexActionPresets.vaginaToVagina,
							SexActionPresets.tailToLowerHalf,
							SexActionPresets.tentacleToLowerHalf,
							!performer.isTaur()
								?SexActionPresets.fingerToLowerHalf
								:null,
							isAbleToReachTargetUpperTorso
								?SexActionPresets.fingerToUpperTorso
								:null),
					Util.newArrayListOfValues(
							OrgasmCumTarget.ASS,
							OrgasmCumTarget.GROIN,
							OrgasmCumTarget.BACK,
							OrgasmCumTarget.LEGS,
							OrgasmCumTarget.FLOOR),
					Util.newArrayListOfValues(
							OrgasmCumTarget.FLOOR)))));
		}
	};

	public static VariableInteractions allFourscharacterBehindToCharactersFront = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.fingerToUpperTorso,
								SexActionPresets.kissing,
								SexActionPresets.upperHalfToFinger),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions allFoursHumping = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);
				boolean isAbleToReachTargetUpperTorso = !performer.isTaur() || target.isTaur();

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.penisToThighs,
								SexActionPresets.penisToAss,
								SexActionPresets.penisToVagina,
								SexActionPresets.tailToLowerHalf,
								SexActionPresets.tentacleToLowerHalf,
								isAbleToReachTargetUpperTorso
									?SexActionPresets.fingerToUpperTorso
									:null),
						Util.newArrayListOfValues(
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.BACK,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions allFoursFeet = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
					new SexActionInteractions(
					Util.mergeMaps(
							SexActionPresets.groinToFeet),
					Util.newArrayListOfValues(
							OrgasmCumTarget.LEGS,
							OrgasmCumTarget.FEET,
							OrgasmCumTarget.FLOOR),
					Util.newArrayListOfValues(
							OrgasmCumTarget.FLOOR)))));
		}
	};

	public static VariableInteractions allFoursPerformingOral = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToPenis,
								SexActionPresets.mouthToVagina,
								SexActionPresets.mouthToAppendages,
								performer.isTaur()
									?Util.mergeMaps(
											SexActionPresets.breastsToPenis,
											SexActionPresets.fingerToLowerHalf)
									:null,
								SexActionPresets.mouthToCrotchBoobs),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BACK,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions allFoursPerformingOralBehind = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToAss,
								SexActionPresets.mouthToAppendages,
								performer.isTaur()
									?Util.mergeMaps(
											SexActionPresets.fingerToLowerHalf)
									:null,
								SexActionPresets.mouthToCrotchBoobs),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BACK,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions allFoursToAllFours = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						null))));
			}
	};

	public static VariableInteractions fuckingTaur = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);
				boolean isAbleToReachTargetUpperTorso = performer.getLegConfiguration()==target.getLegConfiguration();

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.penisToThighs,
								SexActionPresets.penisToAss,
								SexActionPresets.penisToVagina,
								SexActionPresets.vaginaToVagina,
								SexActionPresets.tailToLowerHalf,
								isAbleToReachTargetUpperTorso
									?SexActionPresets.fingerToUpperTorso
									:null),
						Util.newArrayListOfValues(
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.BACK,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FLOOR),
						null))));
			}
	};

	public static VariableInteractions allFoursFrontInteraction = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				if(performerSlot.isStanding(performer)) {
					return faceToFace.getSexActionInteractions(performerSlot, targetSlot);
				} else {
					return performingOral.getSexActionInteractions(performerSlot, targetSlot);
				}
			}
	};

	public static VariableInteractions sittingInLap = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				if(!performer.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.appendagesToAllAreas,
									SexActionPresets.allAreasToAppendages,
									SexActionPresets.kissing,
									SexActionPresets.breastsToMouth,
									SexActionPresets.vaginaToPenis,
									SexActionPresets.assToGroin),
							Util.newArrayListOfValues(
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.BREASTS,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.SELF_GROIN),
							Util.newArrayListOfValues(
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.ASS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.BREASTS,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.SELF_GROIN)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.vaginaToPenis,
									SexActionPresets.vaginaToVagina,
									SexActionPresets.assToGroin),
							Util.newArrayListOfValues(
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.ASS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR)))));

				}
			}
	};

	public static VariableInteractions sittingBetweenLegs = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing,
								SexActionPresets.appendagesToAllAreas,
								SexActionPresets.allAreasToAppendages,
								SexActionPresets.vaginaToPenis),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN)))));

			}
	};

	/*--- Lying down presets: ---*/

	public static VariableInteractions cowgirlRiding = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			GameCharacter performer = getCharacter(performerSlot);

			if(!performer.isTaur()) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing,
								SexActionPresets.appendagesToAllAreas,
								SexActionPresets.allAreasToAppendages,
								SexActionPresets.vaginaToPenis,
								SexActionPresets.assToGroin),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN)))));
			} else {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.vaginaToPenis,
								SexActionPresets.vaginaToVagina,
								SexActionPresets.assToGroin),
						Util.newArrayListOfValues(
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.SELF_LEGS),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR)))));
			}
		}
	};

	public static VariableInteractions cowgirlReverseRiding = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			GameCharacter performer = getCharacter(performerSlot);

			if(!performer.isTaur()) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.appendagesToLowerHalf,
								SexActionPresets.allAreasToAppendages,
								SexActionPresets.vaginaToPenis,
								SexActionPresets.assToGroin),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN)))));
			} else {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.vaginaToPenis,
								SexActionPresets.vaginaToVagina,
								SexActionPresets.assToGroin),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.SELF_LEGS),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.ASS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR)))));
			}
		}
	};

	public static VariableInteractions faceSittingRiding = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				if(!performer.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.assToMouth,
									SexActionPresets.groinToMouth,
									SexActionPresets.appendagesToUpperHalf),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FACE,
									OrgasmCumTarget.HAIR,
									OrgasmCumTarget.SELF_GROIN,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.assToMouth,
									SexActionPresets.groinToMouth),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FACE,
									OrgasmCumTarget.HAIR,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions faceSittingReverseRiding = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				if(!performer.isTaur()) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.assToMouth,
								SexActionPresets.groinToMouth,
								SexActionPresets.appendagesToAllAreas),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.assToMouth,
									SexActionPresets.groinToMouth),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FACE,
									OrgasmCumTarget.BREASTS,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.SELF_LEGS,
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions sixtyNine = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToVagina,
								SexActionPresets.mouthToPenis,
								SexActionPresets.breastsToPenis,
								SexActionPresets.mouthToCrotchBoobs,
								SexActionPresets.tailToUpperTorso,
								SexActionPresets.tentacleToUpperTorso,
								SexActionPresets.fingerToLowerHalf),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions missionary = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				if(!target.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.kissing,
									SexActionPresets.breastsToMouth,
									SexActionPresets.mouthToBreasts,
									SexActionPresets.groinToAss,
									SexActionPresets.groinToGroin,
									SexActionPresets.tailToLowerHalf,
									SexActionPresets.tentacleToLowerHalf,
									SexActionPresets.appendagesToAllAreas),
							Util.newArrayListOfValues(
									OrgasmCumTarget.ASS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.BREASTS,
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.SELF_FACE,
									OrgasmCumTarget.SELF_BREASTS,
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.groinToAss,
									SexActionPresets.groinToGroin,
									SexActionPresets.tailToLowerHalf,
									SexActionPresets.tentacleToLowerHalf,
									SexActionPresets.appendagesToLowerHalf),
							Util.newArrayListOfValues(
									OrgasmCumTarget.ASS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.SELF_FACE,
									OrgasmCumTarget.SELF_BREASTS,
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions matingPress = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				if(!target.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.groinToAss,
									SexActionPresets.groinToGroin,
									SexActionPresets.tailToLowerHalf,
									SexActionPresets.tentacleToLowerHalf,
									SexActionPresets.appendagesToAllAreas),
							Util.newArrayListOfValues(
									OrgasmCumTarget.ASS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.BREASTS,
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.SELF_FACE,
									OrgasmCumTarget.SELF_BREASTS,
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.groinToAss,
									SexActionPresets.groinToGroin,
									SexActionPresets.tailToLowerHalf,
									SexActionPresets.tentacleToLowerHalf,
									SexActionPresets.appendagesToLowerHalf),
							Util.newArrayListOfValues(
									OrgasmCumTarget.ASS,
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.STOMACH,
									OrgasmCumTarget.LEGS,
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.GROIN,
									OrgasmCumTarget.SELF_FACE,
									OrgasmCumTarget.SELF_BREASTS,
									OrgasmCumTarget.SELF_STOMACH,
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions scissoring = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.groinToGroin,
								SexActionPresets.appendagesToLowerHalf,
								SexActionPresets.lowerHalfToAppendages),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions lapPillow = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.appendagesToAllAreas,
								SexActionPresets.upperHalfToAppendages,
								SexActionPresets.breastsToMouth),
						Util.newArrayListOfValues(
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions performingOralToLyingDown = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToPenis,
								SexActionPresets.breastsToPenis,
								SexActionPresets.mouthToVagina,
								target.getLegConfiguration().isBipedalPositionedCrotchBoobs()!=target.isTaur()
									?SexActionPresets.mouthToCrotchBoobs
									:null,
								SexActionPresets.fingerToLowerHalf,
								!target.isTaur()
									?SexActionPresets.mouthToAppendages
									:SexActionPresets.mouthToTailAndTentacle,
								SexActionPresets.groinToFeet),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_FEET,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions performingOralToSixtyNine = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing,
								SexActionPresets.upperHalfToAppendages,
								SexActionPresets.appendagesToUpperHalf),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						null))));
			}
	};

	public static VariableInteractions characterToCharactersBack = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);

				if(!performer.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.fingerToLowerHalf,
									SexActionPresets.fingerToUpperTorso),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.appendagesToLowerHalf),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions characterToCharactersBackSex = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter performer = getCharacter(performerSlot);
				GameCharacter target = getCharacter(targetSlot);

				if(performer.isTaur() == target.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.fingerToLowerHalf,
									SexActionPresets.fingerToUpperTorso,
									SexActionPresets.groinToAss,
									SexActionPresets.penisToVagina),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.groinToAss,
									SexActionPresets.penisToVagina),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions characterToCharactersFront = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				if(!target.isTaur()) {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.fingerToLowerHalf,
									SexActionPresets.fingerToUpperTorso,
									SexActionPresets.kissing,
									SexActionPresets.lowerHalfToFinger,
									SexActionPresets.upperHalfToFinger),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR)))));
				} else {
					return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
							new SexActionInteractions(
							Util.mergeMaps(
									SexActionPresets.appendagesToLowerHalf),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR),
							Util.newArrayListOfValues(
									OrgasmCumTarget.FLOOR)))));
				}
			}
	};

	public static VariableInteractions besideOneAnotherOnDesk = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing,
								SexActionPresets.upperHalfToAppendages,
								SexActionPresets.appendagesToUpperHalf),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions besideOneAnother = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.kissing,
								SexActionPresets.allAreasToAppendages,
								SexActionPresets.appendagesToAllAreas),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						null))));
			}
	};

	public static VariableInteractions besideLyingDown = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.lowerHalfToAppendages),
						Util.newArrayListOfValues(
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions besideKneeling = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.groinToMouth,
								SexActionPresets.lowerHalfToAppendages),
						Util.newArrayListOfValues(
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET),
						Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions handHolding = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.handHolding),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)))));
			}
	};

	public static VariableInteractions breedingStallFucking = new VariableInteractions() {
		@Override
		public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
			return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
					new SexActionInteractions(
					Util.mergeMaps(
							SexActionPresets.appendagesToLowerHalf,
							SexActionPresets.groinToGroin,
							SexActionPresets.groinToAss,
							SexActionPresets.allAreasToTailAndTentacle),
					Util.newArrayListOfValues(
							OrgasmCumTarget.ASS,
							OrgasmCumTarget.GROIN,
							OrgasmCumTarget.LEGS,
							OrgasmCumTarget.FEET,
							OrgasmCumTarget.FLOOR),
					targetSlot==SexSlotBreedingStall.BREEDING_STALL_FRONT
						?Util.newArrayListOfValues(
								OrgasmCumTarget.FLOOR)
						:Util.newArrayListOfValues(
								OrgasmCumTarget.SELF_STOMACH,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.GROIN,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.FLOOR)))));
		}
	};

	/**
	 * Contains sex actions as well due to how his scene is set up.
	 */
	public static VariableInteractions performingOralRalph = new VariableInteractions() {
			@Override
			public Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot) {
				GameCharacter target = getCharacter(targetSlot);

				return new Value<>(performerSlot, Util.newHashMapOfValues(new Value<>(targetSlot,
						new SexActionInteractions(
						Util.mergeMaps(
								SexActionPresets.mouthToPenis,
								SexActionPresets.breastsToPenis,
								!target.isTaur()
									?SexActionPresets.mouthToVagina
									:null,
								SexActionPresets.mouthToCrotchBoobs,
								SexActionPresets.fingerToLowerHalf,
								SexActionPresets.mouthToAppendages,
								SexActionPresets.groinToFeet,
								SexActionPresets.assToGroin,
								SexActionPresets.groinToGroin),
						Util.newArrayListOfValues(
								OrgasmCumTarget.LEGS,
								OrgasmCumTarget.FEET,
								OrgasmCumTarget.SELF_LEGS,
								OrgasmCumTarget.SELF_GROIN,
								OrgasmCumTarget.SELF_FEET,
								OrgasmCumTarget.FLOOR),
						Util.newArrayListOfValues(
								OrgasmCumTarget.FACE,
								OrgasmCumTarget.HAIR,
								OrgasmCumTarget.BREASTS,
								OrgasmCumTarget.STOMACH,
								OrgasmCumTarget.FLOOR)))));
			}
	};

}

repo_name: klorpa/Pedo

license: unknown


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexActionInteractions;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3.1
 * @version 0.3.1
 * @author Innoxia
 */
public abstract class VariableInteractions {

	private static GameCharacter characterForPositionTesting;

	public static void setCharacterForPositionTesting(GameCharacter characterForPositionTesting) {
		VariableInteractions.characterForPositionTesting = characterForPositionTesting;
	}

	protected static GameCharacter getCharacter(SexSlot slot) {
		GameCharacter performer = Sex.getCharacterInPosition(slot);
		if(performer==null) {
			performer = characterForPositionTesting==null?Main.game.getPlayer():characterForPositionTesting;
		}
		return performer;
	}

	public abstract Value<SexSlot, Map<SexSlot, SexActionInteractions>> getSexActionInteractions(SexSlot performerSlot, SexSlot targetSlot);

}


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

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexActionInteractions;
import com.lilithsthrone.game.sex.SexAreaInterface;
import com.lilithsthrone.game.sex.SexType;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.VariableInteractions;
import com.lilithsthrone.game.sex.sexActions.baseActionsMisc.PositioningMenu;
import com.lilithsthrone.main.Main;

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

	private String name;
	private String description;
	private String orgasmDescription;
	private boolean standing;
	private List<SexSlotTag> tags;

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

	/**
	 * Should only be used for basic slots! 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.orgasmDescription;
		this.standing = slotToCopy.isStanding(null);
		this.tags = new ArrayList<>(slotToCopy.getTags());
	}

	/**
	 * @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.

	 * If orgasmDescription is null, getGenericOrgasmDescription() is returned instead.
	 */
	public String getOrgasmDescription(GameCharacter orgasmingCharacter, GameCharacter targetedCharacter) {
		if(orgasmDescription==null) {
			return getGenericOrgasmDescription(orgasmingCharacter, targetedCharacter);
		}
		return orgasmDescription;
	}

	/**
	 * @return A generic orgasm description, based on who the character in this slot is targeting. Will be returned if orgasmDescription is null.
	 */
	public String getGenericOrgasmDescription(GameCharacter orgasmingCharacter, GameCharacter targetedCharacter) {
		return "Pressing [npc.herself] against [npc2.name], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.";
	}

	/**
	 * 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 List<SexSlotTag> getTags() {
		return tags;
	}

	public boolean hasTag(SexSlotTag tag) {
		return tags.contains(tag);
	}

	protected GameCharacter getCharacterInSlot(SexSlot targetedSlot) {
		if(Main.game.getCurrentDialogueNode()==PositioningMenu.POSITIONING_MENU) {
			for(Entry<GameCharacter, SexSlot> e : PositioningMenu.positioningSlots.entrySet()) {
				if(e.getValue()==targetedSlot) {
					return e.getKey();
				}
			}
		}

		return Sex.getCharacterInPosition(targetedSlot);
	}

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

		if(position.getSlotTargets().containsKey(this)) {
			if(targetedSlot==null) { // If no targeted slot, check all available slots:
				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;
						}
					}
				}

			} else if(position.getSlotTargets().get(this).containsKey(targetedSlot)) {
				for(Entry<SexAreaInterface, List<SexAreaInterface>> interaction : position.getSlotTargets().get(this).get(targetedSlot).getInteractions().entrySet()) {
					if(interaction.getKey()==preference.getPerformingSexArea() && interaction.getValue().contains(preference.getTargetedSexArea())) {
						return true;
					}
				}
			}
		}

		 // Check for the opposite interactions (i.e. the targeted slot interacting with this slot):

		if(targetedSlot==null) { // If no targeted slot, check all available slots:
			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;
							}
						}
					}
				}
			}

		} else if(position.getSlotTargets().containsKey(targetedSlot)) {
			for(Entry<SexSlot, SexActionInteractions> entry : position.getSlotTargets().get(targetedSlot).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;
	};

	// What was this for?
//	@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.slots;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;

/**
 * All SexSlots that are used in the AGAINST_WALL position.
 *
 * @since 0.3.4
 * @version 0.3.4
 * @author Innoxia
 */
public class SexSlotAgainstWall {

	public static final SexSlot FACE_TO_WALL = new SexSlot(
			"Face-to-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,
			SexSlotTag.FACE_TO_WALL);
	public static final SexSlot FACE_TO_WALL_TWO = new SexSlot(FACE_TO_WALL) {
		@Override
		public String getDescription() {
			return "facing wall (2nd)";
		}
	};
	public static final SexSlot FACE_TO_WALL_THREE = new SexSlot(FACE_TO_WALL) {
		@Override
		public String getDescription() {
			return "facing wall (3rd)";
		}
	};
	public static final SexSlot FACE_TO_WALL_FOUR = new SexSlot(FACE_TO_WALL) {
		@Override
		public String getDescription() {
			return "facing wall (4th)";
		}
	};

	public static final SexSlot BACK_TO_WALL = new SexSlot(
			"Back against wall",
			"back to 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,
			SexSlotTag.BACK_TO_WALL);
	public static final SexSlot BACK_TO_WALL_TWO = new SexSlot(BACK_TO_WALL) {
		@Override
		public String getDescription() {
			return "back to wall (2nd)";
		}
	};
	public static final SexSlot BACK_TO_WALL_THREE = new SexSlot(BACK_TO_WALL) {
		@Override
		public String getDescription() {
			return "back to wall (3rd)";
		}
	};
	public static final SexSlot BACK_TO_WALL_FOUR = new SexSlot(BACK_TO_WALL) {
		@Override
		public String getDescription() {
			return "back to wall (4th)";
		}
	};

	public static final SexSlot STANDING_WALL = new SexSlot(
			"Standing",
			"standing",
			"Realising 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] against the wall.",
			true);

	public static final SexSlot STANDING_WALL_TWO = new SexSlot(STANDING_WALL) {
		@Override
		public String getDescription() {
			return "standing (2nd)";
		}
	};
	public static final SexSlot STANDING_WALL_THREE = new SexSlot(STANDING_WALL) {
		@Override
		public String getDescription() {
			return "standing (3rd)";
		}
	};
	public static final SexSlot STANDING_WALL_FOUR = new SexSlot(STANDING_WALL) {
		@Override
		public String getDescription() {
			return "standing (4th)";
		}
	};

	public static final SexSlot PERFORMING_ORAL_WALL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc.Name] [npc.verb(reach)] up and [npc.verb(place)] a [npc.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot PERFORMING_ORAL_WALL_TWO = new SexSlot(
			"Performing oral",
			"performing oral (2nd)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot PERFORMING_ORAL_WALL_THREE = new SexSlot(
			"Performing oral",
			"performing oral (3rd)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot PERFORMING_ORAL_WALL_FOUR = new SexSlot(
			"Performing oral",
			"performing oral (4th)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
}


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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.valueEnums.LegConfiguration;
import com.lilithsthrone.game.dialogue.utils.UtilText;

/**
 * All SexSlots that are used in the ALL_FOURS position.
 *
 * @since 0.3.4
 * @version 0.3.4
 * @author Innoxia
 */
public class SexSlotAllFours {

	public static final SexSlot ALL_FOURS = new SexSlot(
			"Down on all fours",
			"all fours",
			"With trembling [npc.legs], [npc.name] [npc.do] [npc.her] best to steady [npc.herself], and with [npc.a_moan+], [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false,
			SexSlotTag.ALL_FOURS);
	public static final SexSlot ALL_FOURS_TWO = new SexSlot(ALL_FOURS){
		@Override
		public String getDescription() {
			return "all fours (2nd)";
		}
	};
	public static final SexSlot ALL_FOURS_THREE = new SexSlot(ALL_FOURS){
		@Override
		public String getDescription() {
			return "all fours (3rd)";
		}
	};
	public static final SexSlot ALL_FOURS_FOUR = new SexSlot(ALL_FOURS){
		@Override
		public String getDescription() {
			return "all fours (4th)";
		}
	};

	public static final SexSlot BEHIND = new SexSlot(
			"Mounting/Fucking",
			"behind",
			"[npc.Name] [npc.verb(press)] [npc.her] weight down on top of [npc2.namePos] body, letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true,
			SexSlotTag.BEHIND_ALL_FOURS) {
		@Override
		public String getName(GameCharacter target) {
			boolean standing = isStanding(target);
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return (target.getLegConfiguration()==LegConfiguration.TAUR
						?"Mounting"
						:standing?"Standing behind":"Kneeling behind")
					+" "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return partner!=null && (partner.isSizeDifferenceTallerThan(target) || partner.isTaur());
		}
	};
	public static final SexSlot BEHIND_TWO = new SexSlot(
			"Mounting/Fucking",
			"behind (2nd)",
			"[npc.Name] [npc.verb(press)] [npc.her] weight down on top of [npc2.namePos] body, letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true,
			SexSlotTag.BEHIND_ALL_FOURS) {
		@Override
		public String getName(GameCharacter target) {
			boolean standing = isStanding(target);
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return (target.getLegConfiguration()==LegConfiguration.TAUR
						?"Mounting"
						:standing?"Standing behind":"Kneeling behind")
					+" "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			return partner!=null && (partner.isSizeDifferenceTallerThan(target) || partner.isTaur());
		}
	};
	public static final SexSlot BEHIND_THREE = new SexSlot(
			"Mounting/Fucking",
			"behind (3rd)",
			"[npc.Name] [npc.verb(press)] [npc.her] weight down on top of [npc2.namePos] body, letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true,
			SexSlotTag.BEHIND_ALL_FOURS) {
		@Override
		public String getName(GameCharacter target) {
			boolean standing = isStanding(target);
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return (target.getLegConfiguration()==LegConfiguration.TAUR
						?"Mounting"
						:standing?"Standing behind":"Kneeling behind")
					+" "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			return partner!=null && (partner.isSizeDifferenceTallerThan(target) || partner.isTaur());
		}
	};
	public static final SexSlot BEHIND_FOUR = new SexSlot(
			"Mounting/Fucking",
			"behind (4th)",
			"[npc.Name] [npc.verb(press)] [npc.her] weight down on top of [npc2.namePos] body, letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true,
			SexSlotTag.BEHIND_ALL_FOURS) {
		@Override
		public String getName(GameCharacter target) {
			boolean standing = isStanding(target);
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return (target.getLegConfiguration()==LegConfiguration.TAUR
						?"Mounting"
						:standing?"Standing behind":"Kneeling behind")
					+" "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			return partner!=null && (partner.isSizeDifferenceTallerThan(target) || partner.isTaur());
		}
	};

	public static final SexSlot HUMPING = new SexSlot(
			"Humping",
			"humping",
			"[npc.Name] wildly [npc.verb(buck)] [npc.her] [npc.hips] against [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return "Humping "+UtilText.parse(partner, "[npc.name]");
		}
	};
	public static final SexSlot HUMPING_TWO = new SexSlot(
			"Humping",
			"humping (2nd)",
			"[npc.Name] wildly [npc.verb(buck)] [npc.her] [npc.hips] against [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Humping "+UtilText.parse(partner, "[npc.name]");
		}
	};
	public static final SexSlot HUMPING_THREE = new SexSlot(
			"Humping",
			"humping (3rd)",
			"[npc.Name] wildly [npc.verb(buck)] [npc.her] [npc.hips] against [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Humping "+UtilText.parse(partner, "[npc.name]");
		}
	};
	public static final SexSlot HUMPING_FOUR = new SexSlot(
			"Humping",
			"humping (4th)",
			"[npc.Name] wildly [npc.verb(buck)] [npc.her] [npc.hips] against [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Humping "+UtilText.parse(partner, "[npc.name]");
		}
	};

	public static final SexSlot BEHIND_ORAL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc.Name] [npc.verb(reach)] up and [npc.verb(place)] a [npc.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return "Performing oral on "+UtilText.parse(partner, "[npc.name]");
		}
	};
	public static final SexSlot BEHIND_ORAL_TWO = new SexSlot(
			"Performing oral",
			"performing oral (2nd)",
			"[npc.Name] [npc.verb(reach)] up and [npc.verb(place)] a [npc.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Performing oral on "+UtilText.parse(partner, "[npc.name]");
		}
	};
	public static final SexSlot BEHIND_ORAL_THREE = new SexSlot(
			"Performing oral",
			"performing oral (3rd)",
			"[npc.Name] [npc.verb(reach)] up and [npc.verb(place)] a [npc.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Performing oral on "+UtilText.parse(partner, "[npc.name]");
		}
	};
	public static final SexSlot BEHIND_ORAL_FOUR = new SexSlot(
			"Performing oral",
			"performing oral (4th)",
			"[npc.Name] [npc.verb(reach)] up and [npc.verb(place)] a [npc.hand] on one of [npc2.namePos] [npc2.legs], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Performing oral on "+UtilText.parse(partner, "[npc.name]");
		}
	};

	public static final SexSlot USING_FEET = new SexSlot(
			"Using feet",
			"using feet",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return "Using "+UtilText.parse(partner, "[npc.namePos] [npc.feet]");
		}
	};
	public static final SexSlot USING_FEET_TWO = new SexSlot(
			"Using feet",
			"using feet (2nd)",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Using "+UtilText.parse(partner, "[npc.namePos] [npc.feet]");
		}
	};
	public static final SexSlot USING_FEET_THREE = new SexSlot(
			"Using feet",
			"using feet (3rd)",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Using "+UtilText.parse(partner, "[npc.namePos] [npc.feet]");
		}
	};
	public static final SexSlot USING_FEET_FOUR = new SexSlot(
			"Using feet",
			"using feet (4th)",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return "Using "+UtilText.parse(partner, "[npc.namePos] [npc.feet]");
		}
	};

	public static final SexSlot IN_FRONT = new SexSlot(
			"Standing/kneeling",
			"in front",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return (this.isStanding(target)?"Standing":"Kneeling")+" before "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot IN_FRONT_TWO = new SexSlot(
			"Standing/kneeling",
			"in front (2nd)",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return (this.isStanding(target)?"Standing":"Kneeling")+" before "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot IN_FRONT_THREE = new SexSlot(
			"Standing/kneeling",
			"in front (3rd)",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return (this.isStanding(target)?"Standing":"Kneeling")+" before "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot IN_FRONT_FOUR = new SexSlot(
			"Standing/kneeling",
			"in front (4th)",
			"[npc.Name] [npc.verb(shuffle)] forwards in order to get closer to [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return (this.isStanding(target)?"Standing":"Kneeling")+" before "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {partner = getCharacterInSlot(ALL_FOURS);}
			return partner.isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot IN_FRONT_ANAL = new SexSlot(
			"Standing/kneeling",
			"in front (anal)",
			"[npc.Name] [npc.verb(push)] [npc.her] [npc.hips+] back into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return "Presenting ass to "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS);
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot IN_FRONT_ANAL_TWO = new SexSlot(
			"Standing/kneeling",
			"in front (2nd anal)",
			"[npc.Name] [npc.verb(push)] [npc.her] [npc.hips+] back into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			if(partner==null) {
				partner = getCharacterInSlot(ALL_FOURS);
			}
			return "Presenting ass to "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_TWO);
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot IN_FRONT_ANAL_THREE = new SexSlot(
			"Standing/kneeling",
			"in front (3rd anal)",
			"[npc.Name] [npc.verb(push)] [npc.her] [npc.hips+] back into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			if(partner==null) {
				partner = getCharacterInSlot(ALL_FOURS);
			}
			return "Presenting ass to "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_THREE);
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot IN_FRONT_ANAL_FOUR = new SexSlot(
			"Standing/kneeling",
			"in front (4th anal)",
			"[npc.Name] [npc.verb(push)] [npc.her] [npc.hips+] back into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true) {
		@Override
		public String getName(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			if(partner==null) {
				partner = getCharacterInSlot(ALL_FOURS);
			}
			return "Presenting ass to "+UtilText.parse(partner, "[npc.name]");
		}
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(ALL_FOURS_FOUR);
			return partner.isSizeDifferenceTallerThan(target);
		}
	};
}


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

/**
 * All SexSlots that are used in the BREEDING_STALL position.
 *
 * @since 0.3.4
 * @version 0.3.4
 * @author Innoxia
 */
public class SexSlotBreedingStall {

	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);
}