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

import com.lilithsthrone.game.character.GameCharacter;

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

	public static final SexSlot OVER_DESK_ON_BACK = new SexSlot(
			"Lying back",
			"lying back",
			"[npc.Name] [npc.verb(collapse)] back down onto the desk's surface, before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false,
			SexSlotTag.OVER_DESK_BACK);
	public static final SexSlot OVER_DESK_ON_BACK_TWO = new SexSlot(OVER_DESK_ON_BACK) {
		@Override
		public String getDescription() {
			return "lying back (2nd)";
		}
	};
	public static final SexSlot OVER_DESK_ON_BACK_THREE = new SexSlot(OVER_DESK_ON_BACK) {
		@Override
		public String getDescription() {
			return "lying back (3rd)";
		}
	};
	public static final SexSlot OVER_DESK_ON_BACK_FOUR = new SexSlot(OVER_DESK_ON_BACK) {
		@Override
		public String getDescription() {
			return "lying back (4th)";
		}
	};

	public static final SexSlot OVER_DESK_ON_FRONT = new SexSlot(
			"Bent over",
			"bent over",
			"[npc.Name] [npc.verb(collapse)] down onto the desk's surface, before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false);
	public static final SexSlot OVER_DESK_ON_FRONT_TWO = new SexSlot(OVER_DESK_ON_FRONT) {
		@Override
		public String getDescription() {
			return "bent over (2nd)";
		}
	};
	public static final SexSlot OVER_DESK_ON_FRONT_THREE = new SexSlot(OVER_DESK_ON_FRONT) {
		@Override
		public String getDescription() {
			return "bent over (3rd)";
		}
	};
	public static final SexSlot OVER_DESK_ON_FRONT_FOUR = new SexSlot(OVER_DESK_ON_FRONT) {
		@Override
		public String getDescription() {
			return "bent over (4th)";
		}
	};

	public static final SexSlot BETWEEN_LEGS = new SexSlot(
			"Between legs",
			"between legs",
			null,
			true,
			SexSlotTag.OVER_DESK_BETWEEN_LEGS);
	public static final SexSlot BETWEEN_LEGS_TWO = new SexSlot(BETWEEN_LEGS) {
		@Override
		public String getDescription() {
			return "between legs (2nd)";
		}
	};
	public static final SexSlot BETWEEN_LEGS_THREE = new SexSlot(BETWEEN_LEGS) {
		@Override
		public String getDescription() {
			return "between legs (3rd)";
		}
	};
	public static final SexSlot BETWEEN_LEGS_FOUR = new SexSlot(BETWEEN_LEGS) {
		@Override
		public String getDescription() {
			return "between legs (4th)";
		}
	};

	public static final SexSlot PERFORMING_ORAL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc.Name] [npc.verb(lower)] [npc.her] head down into [npc2.namePos] groin, 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 target.getHeightValue()<=80; // Assuming a desk is 70cm high, a character stands to perform oral if they're 80cm or shorter
		}
	};
	public static final SexSlot PERFORMING_ORAL_TWO = new SexSlot(
			"Performing oral",
			"performing oral (2nd)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return target.getHeightValue()<=80; // Assuming a desk is 70cm high, a character stands to perform oral if they're 80cm or shorter
		}
	};
	public static final SexSlot PERFORMING_ORAL_THREE = new SexSlot(
			"Performing oral",
			"performing oral (3rd)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return target.getHeightValue()<=80; // Assuming a desk is 70cm high, a character stands to perform oral if they're 80cm or shorter
		}
	};
	public static final SexSlot PERFORMING_ORAL_FOUR = new SexSlot(
			"Performing oral",
			"performing oral (4th)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return target.getHeightValue()<=80; // Assuming a desk is 70cm high, a character stands to perform oral if they're 80cm or shorter
		}
	};

	public static final SexSlot RECEIVING_ORAL = new SexSlot(
			"Receiving oral",
			"receiving oral",
			"[npc.Name] [npc.verb(press)] [npc.herself] up close against [npc2.name], before letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true);
	public static final SexSlot RECEIVING_ORAL_TWO = new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (2nd)";
		}
	};
	public static final SexSlot RECEIVING_ORAL_THREE =  new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (3rd)";
		}
	};
	public static final SexSlot RECEIVING_ORAL_FOUR =  new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (4th)";
		}
	};
}


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

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

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

}

repo_name: klorpa/Pedo

license: unknown


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

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

	public static final SexSlot LYING_DOWN = new SexSlot(
			"Lying on back",
			"lying on back",
			"With a buck of [npc.her] [npc.hips], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false,
			SexSlotTag.LYING_DOWN);
	public static final SexSlot LYING_DOWN_TWO = new SexSlot(LYING_DOWN) {
		@Override
		public String getDescription() {
			return "lying on back (2nd)";
		}
	};
	public static final SexSlot LYING_DOWN_THREE = new SexSlot(LYING_DOWN) {
		@Override
		public String getDescription() {
			return "lying on back (3rd)";
		}
	};
	public static final SexSlot LYING_DOWN_FOUR = new SexSlot(LYING_DOWN) {
		@Override
		public String getDescription() {
			return "lying on back (4th)";
		}
	};

	public static final SexSlot COWGIRL = new SexSlot(
			"Cowgirl",
			"cowgirl",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down into [npc2.namePos] groin, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false,
			SexSlotTag.COWGIRL);
	public static final SexSlot COWGIRL_TWO = new SexSlot(COWGIRL) {
		@Override
		public String getDescription() {
			return "cowgirl (2nd)";
		}
	};
	public static final SexSlot COWGIRL_THREE = new SexSlot(COWGIRL) {
		@Override
		public String getDescription() {
			return "cowgirl (3rd)";
		}
	};
	public static final SexSlot COWGIRL_FOUR = new SexSlot(COWGIRL) {
		@Override
		public String getDescription() {
			return "cowgirl (4th)";
		}
	};

	public static final SexSlot COWGIRL_REVERSE = new SexSlot(
			"Reverse cowgirl",
			"reverse cowgirl",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down into [npc2.namePos] groin, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false,
			SexSlotTag.COWGIRL_REVERSE);
	public static final SexSlot COWGIRL_REVERSE_TWO = new SexSlot(COWGIRL_REVERSE) {
		@Override
		public String getDescription() {
			return "reverse cowgirl (2nd)";
		}
	};
	public static final SexSlot COWGIRL_REVERSE_THREE = new SexSlot(COWGIRL_REVERSE) {
		@Override
		public String getDescription() {
			return "reverse cowgirl (3rd)";
		}
	};
	public static final SexSlot COWGIRL_REVERSE_FOUR = new SexSlot(COWGIRL_REVERSE) {
		@Override
		public String getDescription() {
			return "reverse cowgirl (4th)";
		}
	};

	// Sitting looking down into the person's eyes
	public static final SexSlot FACE_SITTING = new SexSlot(
			"Frontal face-sitting",
			"face-sitting",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_TWO = new SexSlot(
			"Frontal face-sitting",
			"face-sitting (2nd)",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_THREE = new SexSlot(
			"Frontal face-sitting",
			"face-sitting (3rd)",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_FOUR = new SexSlot(
			"Frontal face-sitting",
			"face-sitting (4th)",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	// Sitting looking down at the person's lower body
	public static final SexSlot FACE_SITTING_REVERSE = new SexSlot(
			"Reverse face-sitting",
			"reverse face-sitting",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_REVERSE_TWO = new SexSlot(
			"Reverse face-sitting",
			"reverse face-sitting (2nd)",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_REVERSE_THREE = new SexSlot(
			"Reverse face-sitting",
			"reverse face-sitting (3rd)",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot FACE_SITTING_REVERSE_FOUR = new SexSlot(
			"Reverse face-sitting",
			"reverse face-sitting (4th)",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot LAP_PILLOW = new SexSlot(
			"Lap pillow",
			"lap pillow",
			"Looking down into [npc2.namePos] [npc2.eyes], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot LAP_PILLOW_TWO = new SexSlot(
			"Lap pillow",
			"lap pillow (2nd)",
			"Looking down into [npc2.namePos] [npc2.eyes], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot LAP_PILLOW_THREE = new SexSlot(
			"Lap pillow",
			"lap pillow (3rd)",
			"Looking down into [npc2.namePos] [npc2.eyes], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot LAP_PILLOW_FOUR = new SexSlot(
			"Lap pillow",
			"lap pillow (4th)",
			"Looking down into [npc2.namePos] [npc2.eyes], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false);

	public static final SexSlot SIXTY_NINE = new SexSlot(
			"Sixty-nine",
			"sixty-nine",
			"With trembling [npc.legs], [npc.name] [npc.verb(allow)] [npc.her] crotch to drop down onto [npc2.namePos] face, letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false,
			SexSlotTag.SIXTY_NINE);
	public static final SexSlot SIXTY_NINE_TWO = new SexSlot(SIXTY_NINE) {
		@Override
		public String getDescription() {
			return "sixty-nine (2nd)";
		}
	};
	public static final SexSlot SIXTY_NINE_THREE = new SexSlot(SIXTY_NINE) {
		@Override
		public String getDescription() {
			return "sixty-nine (3rd)";
		}
	};
	public static final SexSlot SIXTY_NINE_FOUR = new SexSlot(SIXTY_NINE) {
		@Override
		public String getDescription() {
			return "sixty-nine (4th)";
		}
	};

	public static final SexSlot MISSIONARY = new SexSlot(
			"Missionary",
			"between legs",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and, leaning down on top of [npc2.name], [npc.she] [npc.verb(gaze)] lustfully down into [npc2.her] [npc2.eyes+].",
			false,
			SexSlotTag.MISSIONARY);
	public static final SexSlot MISSIONARY_TWO = new SexSlot(MISSIONARY) {
		@Override
		public String getDescription() {
			return "between legs (2nd)";
		}
	};
	public static final SexSlot MISSIONARY_THREE = new SexSlot(MISSIONARY) {
		@Override
		public String getDescription() {
			return "between legs (3rd)";
		}
	};
	public static final SexSlot MISSIONARY_FOUR = new SexSlot(MISSIONARY) {
		@Override
		public String getDescription() {
			return "between legs (4th)";
		}
	};

	public static final SexSlot MISSIONARY_ORAL = new SexSlot(
			"Missionary oral",
			"face between legs",
			"[npc.Name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax, and, pressing [npc.her] [npc.face] into [npc2.namePos] groin, [npc.she] [npc.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.MISSIONARY_ORAL);
	public static final SexSlot MISSIONARY_ORAL_TWO = new SexSlot(MISSIONARY_ORAL) {
		@Override
		public String getDescription() {
			return "face between legs (2nd)";
		}
	};
	public static final SexSlot MISSIONARY_ORAL_THREE = new SexSlot(MISSIONARY_ORAL) {
		@Override
		public String getDescription() {
			return "face between legs (3rd)";
		}
	};
	public static final SexSlot MISSIONARY_ORAL_FOUR = new SexSlot(MISSIONARY_ORAL) {
		@Override
		public String getDescription() {
			return "face between legs (4th)";
		}
	};

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

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

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

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

	public static final SexSlot SCISSORING = new SexSlot(
			"Scissoring",
			"scissoring",
			"Desperately thrusting [npc.her] [npc.hips] forwards in order to grind [npc.her] groin against [npc2.nameHers], [npc.name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot SCISSORING_TWO = new SexSlot(
			"Scissoring",
			"scissoring (2nd)",
			"Desperately thrusting [npc.her] [npc.hips] forwards in order to grind [npc.her] groin against [npc2.nameHers], [npc.name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot SCISSORING_THREE = new SexSlot(
			"Scissoring",
			"scissoring (3rd)",
			"Desperately thrusting [npc.her] [npc.hips] forwards in order to grind [npc.her] groin against [npc2.nameHers], [npc.name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot SCISSORING_FOUR = new SexSlot(
			"Scissoring",
			"scissoring (4th)",
			"Desperately thrusting [npc.her] [npc.hips] forwards in order to grind [npc.her] groin against [npc2.nameHers], [npc.name] [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

	public static final SexSlot BESIDE = new SexSlot(
			"Beside",
			"beside",
			"With a buck of [npc.her] [npc.hips], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false,
			SexSlotTag.LYING_DOWN);
	public static final SexSlot BESIDE_TWO = new SexSlot(BESIDE) {
		@Override
		public String getDescription() {
			return "beside (2nd)";
		}
	};
	public static final SexSlot BESIDE_THREE = new SexSlot(BESIDE) {
		@Override
		public String getDescription() {
			return "beside (3rd)";
		}
	};
	public static final SexSlot BESIDE_FOUR = new SexSlot(BESIDE) {
		@Override
		public String getDescription() {
			return "beside (4th)";
		}
	};
}


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

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

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

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

	public static final SexSlot KNEELING = new SexSlot(
			"Kneeling",
			"kneeling",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs] slide out from under [npc.herHim], and, letting out [npc.a_moan+], [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false);

	public static final SexSlot KNEELING_PANTIES = new SexSlot(
			"Kneeling",
			"kneeling",
			"[npc.Name] [npc.verb(let)] [npc.her] [npc.legs] slide out from under [npc.herHim], and, tightly gripping Lilaya's panties, [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false);

}


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 MILKING_STALL position.
 *
 * @since 0.3.4
 * @version 0.3.4
 * @author Innoxia
 */
public class SexSlotMilkingStall {

	public static final SexSlot LOCKED_IN_MILKING_STALL = new SexSlot(
			"Locked in stall",
			"locked in stall",
			"Unable to move, [npc1.name] [npc1.verb(wriggle)] around in the stall and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.LOCKED_IN_STOCKS);
	public static final SexSlot LOCKED_IN_MILKING_STALL_TWO = new SexSlot(LOCKED_IN_MILKING_STALL) {
		@Override
		public String getDescription() {
			return "locked in stall (2nd)";
		}
	};
	public static final SexSlot LOCKED_IN_MILKING_STALL_THREE = new SexSlot(LOCKED_IN_MILKING_STALL) {
		@Override
		public String getDescription() {
			return "locked in stall (3rd)";
		}
	};
	public static final SexSlot LOCKED_IN_MILKING_STALL_FOUR = new SexSlot(LOCKED_IN_MILKING_STALL) {
		@Override
		public String getDescription() {
			return "locked in stall (4th)";
		}
	};

	public static final SexSlot BEHIND_MILKING_STALL = new SexSlot(
			"Behind stall",
			"behind stall",
			"[npc1.Name] [npc1.verb(buck)] [npc.her] hips forwards, thrusting into [npc2.namePos] groin and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.BEHIND_STOCKS);
	public static final SexSlot BEHIND_MILKING_STALL_TWO = new SexSlot(BEHIND_MILKING_STALL) {
		@Override
		public String getDescription() {
			return "behind stall (2nd)";
		}
	};
	public static final SexSlot BEHIND_MILKING_STALL_THREE = new SexSlot(BEHIND_MILKING_STALL) {
		@Override
		public String getDescription() {
			return "behind stall (3rd)";
		}
	};
	public static final SexSlot BEHIND_MILKING_STALL_FOUR = new SexSlot(BEHIND_MILKING_STALL) {
		@Override
		public String getDescription() {
			return "behind stall (4th)";
		}
	};

	public static final SexSlot PERFORMING_ORAL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot PERFORMING_ORAL_TWO = new SexSlot(
			"Performing oral",
			"performing oral (2nd)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot PERFORMING_ORAL_THREE = new SexSlot(
			"Performing oral",
			"performing oral (3rd)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot PERFORMING_ORAL_FOUR = new SexSlot(
			"Performing oral",
			"performing oral (4th)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot RECEIVING_ORAL = new SexSlot(
			"Receiving oral",
			"receiving oral",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true,
			SexSlotTag.RECEIVING_ORAL_STOCKS);
	public static final SexSlot RECEIVING_ORAL_TWO = new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (2nd)";
		}
	};
	public static final SexSlot RECEIVING_ORAL_THREE =  new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (3rd)";
		}
	};
	public static final SexSlot RECEIVING_ORAL_FOUR =  new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (4th)";
		}
	};
}


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 SITTING position.
 *
 * @since 0.3.4
 * @version 0.3.4
 * @author Innoxia
 */
public class SexSlotSitting {

	public static final SexSlot SITTING = new SexSlot(
			"Sitting",
			"sitting down",
			"With a small thrust of [npc.her] [npc.hips], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.",
			false,
			SexSlotTag.SITTING);
	public static final SexSlot SITTING_TWO = new SexSlot(SITTING){
		@Override
		public String getDescription() {
			return "sitting down (2nd)";
		}
	};
	public static final SexSlot SITTING_THREE = new SexSlot(SITTING){
		@Override
		public String getDescription() {
			return "sitting down (3rd)";
		}
	};
	public static final SexSlot SITTING_FOUR = new SexSlot(SITTING){
		@Override
		public String getDescription() {
			return "sitting down (4th)";
		}
	};

	public static final SexSlot SITTING_IN_LAP = new SexSlot(
			"Sitting in lap",
			"sitting in lap",
			"With trembling [npc.legs], [npc.name] [npc.verb(sink)] down into [npc2.namePos] lap, and with [npc.a_moan+], [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false,
			SexSlotTag.SITTING_IN_LAP);
	public static final SexSlot SITTING_IN_LAP_TWO = new SexSlot(SITTING_IN_LAP){
		@Override
		public String getDescription() {
			return "sitting in lap (2nd)";
		}
	};
	public static final SexSlot SITTING_IN_LAP_THREE = new SexSlot(SITTING_IN_LAP){
		@Override
		public String getDescription() {
			return "sitting in lap (3rd)";
		}
	};
	public static final SexSlot SITTING_IN_LAP_FOUR = new SexSlot(SITTING_IN_LAP){
		@Override
		public String getDescription() {
			return "sitting in lap (4th)";
		}
	};

	public static final SexSlot SITTING_BETWEEN_LEGS = new SexSlot(
			"Between legs",
			"between legs",
			"Leaning down into [npc2.name], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(SITTING);
			return partner!=null && !partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot SITTING_BETWEEN_LEGS_TWO = new SexSlot(
			"Between legs",
			"between legs (2nd)",
			"Leaning down into [npc2.name], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(SITTING_TWO);
			return partner!=null && !partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot SITTING_BETWEEN_LEGS_THREE = new SexSlot(
			"Between legs",
			"between legs (3rd)",
			"Leaning down into [npc2.name], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(SITTING_THREE);
			return partner!=null && !partner.isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot SITTING_BETWEEN_LEGS_FOUR = new SexSlot(
			"Between legs",
			"between legs (4th)",
			"Leaning down into [npc2.name], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			GameCharacter partner = getCharacterInSlot(SITTING_FOUR);
			return partner!=null && !partner.isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot PERFORMING_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 boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot PERFORMING_ORAL_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_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_FOUR = new SexSlot(
			"Performing oral",
			"performing oral (4th)",
			null,
			false) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot SITTING_TAUR_PRESENTING_ORAL = new SexSlot(
			"Presenting for oral",
			"presenting for oral",
			"With trembling [npc.legs], [npc.name] [npc.verb(push)] [npc.her] groin back against [npc2.namePos] face, and with [npc.a_moan+], [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			false);
	public static final SexSlot SITTING_TAUR_PRESENTING_ORAL_TWO = new SexSlot(SITTING_TAUR_PRESENTING_ORAL){
		@Override
		public String getDescription() {
			return "presenting for oral (2nd)";
		}
	};
	public static final SexSlot SITTING_TAUR_PRESENTING_ORAL_THREE = new SexSlot(SITTING_TAUR_PRESENTING_ORAL){
		@Override
		public String getDescription() {
			return "presenting for oral (3rd)";
		}
	};
	public static final SexSlot SITTING_TAUR_PRESENTING_ORAL_FOUR = new SexSlot(SITTING_TAUR_PRESENTING_ORAL){
		@Override
		public String getDescription() {
			return "presenting for oral (4th)";
		}
	};

}


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 STANDING position.
 *
 * @since 0.3.4
 * @version 0.3.4
 * @author Innoxia
 */
public class SexSlotStanding {

	public static final SexSlot STANDING_DOMINANT = new SexSlot(
			"Standing",
			"standing",
			"[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,
			SexSlotTag.STANDING) {
		@Override
		public String getOrgasmDescription(GameCharacter orgasmingCharacter, GameCharacter targetedCharacter) {
			SexSlot targetedSlot = Sex.getSexPositionSlot(targetedCharacter);
			if(targetedSlot.hasTag(SexSlotTag.PERFORMING_ORAL)) {
				return "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.";
			}
			if(targetedSlot.hasTag(SexSlotTag.PERFORMING_ORAL_BEHIND)) {
				return "With a small backwards thrust of [npc.her] [npc.hips], [npc.name] [npc.verb(push)] [npc.her] rear end back into [npc2.namePos] [npc2.face], before letting out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.";
			}
			if(targetedSlot.hasTag(SexSlotTag.STANDING_BEHIND)) {
				return "Leaning back into [npc2.name], [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(reach)] [npc.her] climax.";
			}
			if(targetedCharacter.isTaur()) {
				return "[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.";
			}
			return "[npc.Name] [npc.verb(reach)] around and [npc.verb(grab)] [npc2.namePos] [npc2.ass+], pulling [npc2.herHim] close and letting out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.";
		}
	};

	public static final SexSlot STANDING_DOMINANT_TWO = new SexSlot(STANDING_DOMINANT) {
		@Override
		public String getDescription() {
			return "standing (2nd)";
		}
		@Override
		public String getOrgasmDescription(GameCharacter orgasmingCharacter, GameCharacter targetedCharacter) {
			return STANDING_DOMINANT.getGenericOrgasmDescription(orgasmingCharacter, targetedCharacter);
		}
	};
	public static final SexSlot STANDING_DOMINANT_THREE = new SexSlot(STANDING_DOMINANT) {
		@Override
		public String getDescription() {
			return "standing (3rd)";
		}
		@Override
		public String getOrgasmDescription(GameCharacter orgasmingCharacter, GameCharacter targetedCharacter) {
			return STANDING_DOMINANT.getGenericOrgasmDescription(orgasmingCharacter, targetedCharacter);
		}
	};
	public static final SexSlot STANDING_DOMINANT_FOUR = new SexSlot(STANDING_DOMINANT) {
		@Override
		public String getDescription() {
			return "standing (4th)";
		}
		@Override
		public String getOrgasmDescription(GameCharacter orgasmingCharacter, GameCharacter targetedCharacter) {
			return STANDING_DOMINANT.getGenericOrgasmDescription(orgasmingCharacter, targetedCharacter);
		}
	};

	public static final SexSlot STANDING_SUBMISSIVE = new SexSlot(
			"Standing",
			"standing (in front)",
			"[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) {
		@Override
		public String getDescription() {
			return "standing (2nd in front)";
		}
	};
	public static final SexSlot STANDING_SUBMISSIVE_THREE = new SexSlot(STANDING_SUBMISSIVE) {
		@Override
		public String getDescription() {
			return "standing (3rd in front)";
		}
	};
	public static final SexSlot STANDING_SUBMISSIVE_FOUR = new SexSlot(STANDING_SUBMISSIVE) {
		@Override
		public String getDescription() {
			return "standing (4th in front)";
		}
	};

	public static final SexSlot STANDING_SUBMISSIVE_BEHIND = new SexSlot(
			"Standing",
			"standing (behind)",
			"[npc.Name] [npc.verb(pull)] [npc2.name] back in against [npc.her] [npc.breasts] and [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(prepare)] to reach [npc.her] climax.",
			true,
			SexSlotTag.STANDING_BEHIND);

	public static final SexSlot STANDING_SUBMISSIVE_BEHIND_TWO = new SexSlot(STANDING_SUBMISSIVE) {
		@Override
		public String getDescription() {
			return "standing (2nd behind)";
		}
	};
	public static final SexSlot STANDING_SUBMISSIVE_BEHIND_THREE = new SexSlot(STANDING_SUBMISSIVE) {
		@Override
		public String getDescription() {
			return "standing (3rd behind)";
		}
	};
	public static final SexSlot STANDING_SUBMISSIVE_BEHIND_FOUR = new SexSlot(STANDING_SUBMISSIVE) {
		@Override
		public String getDescription() {
			return "standing (4th behind)";
		}
	};

	public static final SexSlot PERFORMING_ORAL = new SexSlot(
			"Performing oral (front)",
			"performing oral (front)",
			"[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,
			SexSlotTag.PERFORMING_ORAL) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

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

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

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

	public static final SexSlot PERFORMING_ORAL_BEHIND = new SexSlot(
			"Performing oral (behind)",
			"performing oral (behind)",
			"[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,
			SexSlotTag.PERFORMING_ORAL_BEHIND) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

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

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

	public static final SexSlot PERFORMING_ORAL_BEHIND_FOUR = new SexSlot(
			"Performing oral (behind)",
			"performing oral (4th behind)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_BEHIND) {
		@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.sex.Sex;

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

	public static final SexSlot LOCKED_IN_STOCKS = new SexSlot(
			"Locked in stocks",
			"locked in stocks",
			"Unable to move, [npc1.name] [npc1.verb(wriggle)] around in the stocks and [npc1.verb(let)] out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.LOCKED_IN_STOCKS);
	public static final SexSlot LOCKED_IN_STOCKS_TWO = new SexSlot(LOCKED_IN_STOCKS) {
		@Override
		public String getDescription() {
			return "locked in stocks (2nd)";
		}
	};
	public static final SexSlot LOCKED_IN_STOCKS_THREE = new SexSlot(LOCKED_IN_STOCKS) {
		@Override
		public String getDescription() {
			return "locked in stocks (3rd)";
		}
	};
	public static final SexSlot LOCKED_IN_STOCKS_FOUR = new SexSlot(LOCKED_IN_STOCKS) {
		@Override
		public String getDescription() {
			return "locked in stocks (4th)";
		}
	};

	public static final SexSlot BEHIND_STOCKS = new SexSlot(
			"Behind stocks",
			"behind stocks",
			"[npc1.Name] [npc1.verb(buck)] [npc.her] hips forwards, thrusting into [npc2.namePos] groin and letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.BEHIND_STOCKS);
	public static final SexSlot BEHIND_STOCKS_TWO = new SexSlot(BEHIND_STOCKS) {
		@Override
		public String getDescription() {
			return "behind stocks (2nd)";
		}
	};
	public static final SexSlot BEHIND_STOCKS_THREE = new SexSlot(BEHIND_STOCKS) {
		@Override
		public String getDescription() {
			return "behind stocks (3rd)";
		}
	};
	public static final SexSlot BEHIND_STOCKS_FOUR = new SexSlot(BEHIND_STOCKS) {
		@Override
		public String getDescription() {
			return "behind stocks (4th)";
		}
	};

	public static final SexSlot PERFORMING_ORAL = new SexSlot(
			"Performing oral",
			"performing oral",
			"[npc1.Name] [npc1.verb(reach)] up and [npc1.verb(place)] a [npc1.hand] on one of [npc2.namePos] [npc2.legs], letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot PERFORMING_ORAL_TWO = new SexSlot(
			"Performing oral",
			"performing oral (2nd)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot PERFORMING_ORAL_THREE = new SexSlot(
			"Performing oral",
			"performing oral (3rd)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};
	public static final SexSlot PERFORMING_ORAL_FOUR = new SexSlot(
			"Performing oral",
			"performing oral (4th)",
			null,
			false,
			SexSlotTag.PERFORMING_ORAL_STOCKS) {
		@Override
		public boolean isStanding(GameCharacter target) {
			return Sex.getTargetedPartner(target).isSizeDifferenceTallerThan(target);
		}
	};

	public static final SexSlot RECEIVING_ORAL = new SexSlot(
			"Receiving oral",
			"receiving oral",
			"[npc1.Name] [npc1.verb(reach)] down and [npc1.verb(place)] a [npc1.hand] on [npc2.namePos] head, letting out [npc1.a_moan+] as [npc1.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			true,
			SexSlotTag.RECEIVING_ORAL_STOCKS);
	public static final SexSlot RECEIVING_ORAL_TWO = new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (2nd)";
		}
	};
	public static final SexSlot RECEIVING_ORAL_THREE =  new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (3rd)";
		}
	};
	public static final SexSlot RECEIVING_ORAL_FOUR =  new SexSlot(RECEIVING_ORAL) {
		@Override
		public String getDescription() {
			return "receiving oral (4th)";
		}
	};
}


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

/**
 * @since 0.3.4
 * @version 0.3.4.5
 * @author Innoxia
 */
public enum SexSlotTag {

	STANDING,
	STANDING_BEHIND,
	PERFORMING_ORAL,
	PERFORMING_ORAL_BEHIND,

	FACE_TO_WALL,
	BACK_TO_WALL,

	SITTING,
	SITTING_IN_LAP,

	OVER_DESK_BACK,
	OVER_DESK_BETWEEN_LEGS,

	ALL_FOURS,
	BEHIND_ALL_FOURS,

	LYING_DOWN,
	COWGIRL,
	COWGIRL_REVERSE,
	MISSIONARY,
	MISSIONARY_ORAL,
	SIXTY_NINE,

	LOCKED_IN_STOCKS,
	BEHIND_STOCKS,
	PERFORMING_ORAL_STOCKS,
	RECEIVING_ORAL_STOCKS;
}


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	public static final SexSlot MATING_PRESS_BOTTOM = new SexSlot(
			"On back",
			"mating pressed",
			"As [npc.sheIs] being pinned to the floor beneath [npc2.name], all [npc.name] can do is look up into [npc2.her] [npc2.eyes] and let out [npc.a_moan+] as [npc.she] [npc1.verb(prepare)] to reach [npc1.her] climax.",
			false);

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

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

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

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

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

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

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

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

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

	/* Glory hole */

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

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

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

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

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


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

import java.util.List;

import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * For use in position request SexActions.
 *
 * @since 0.3.1
 * @version 0.3.1
 * @author Innoxia
 */
public class PositioningData {

	private AbstractSexPosition position;
	private List<SexSlot> performerSlots;
	private List<SexSlot> partnerSlots;

	/**
	 * @param performerSlots Slot 0 is always used as the slot for the one performing the associated action.
	 * @param partnerSlots Slot 0 is always used as the slot for the one targeted by the associated action.
	 */
	public PositioningData(AbstractSexPosition position, List<SexSlot> performerSlots, List<SexSlot> partnerSlots) {
		this.position = position;
		this.performerSlots = performerSlots;
		this.partnerSlots = partnerSlots;
	}

	@Override
	public boolean equals(Object o) {
		return (o instanceof PositioningData)
				&& ((PositioningData)o).getPosition()==this.getPosition()
				&& ((PositioningData)o).getPerformerSlots().equals(this.getPerformerSlots())
				&& ((PositioningData)o).getPartnerSlots().equals(this.getPartnerSlots());
	}

	@Override
	public int hashCode() {
		int result = 17;
		result = 31 * result + this.getPosition().hashCode();
		result = 31 * result + this.getPerformerSlots().hashCode();
		result = 31 * result + this.getPartnerSlots().hashCode();
		return result;
	}

	public AbstractSexPosition getPosition() {
		return position;
	}

	/**Slot 0 is always used as the slot for the one performing the associated action.*/
	public List<SexSlot> getPerformerSlots() {
		return performerSlots;
	}

	/**Slot 0 is always used as the slot for the one targeted by the associated action.*/
	public List<SexSlot> getPartnerSlots() {
		return partnerSlots;
	}

}


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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.body.valueEnums.FluidFlavour;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaInterface;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;

/**
 * @since 0.1.0
 * @version 0.2.8
 * @author Innoxia
 */
public abstract class SexAction implements SexActionInterface {

	private SexActionType sexActionType;

	private ArousalIncrease selfArousalGain;
	private ArousalIncrease targetArousalGain;

	private CorruptionLevel minimumCorruptionNeeded;

	/**A map of all the SexAreaInterfaces that are interacting with one another in this SexAction.
	 *  The keys are representing ownership of the character who performs the action, while the values are owned by the character upon which this is being performed.*/
	private Map<SexAreaInterface, SexAreaInterface> sexAreaInteractions;

	private SexParticipantType participantType;
	private SexPace associatedSexPace;
	private Map<GameCharacter, Set<Fetish>> characterFetishes;
	private Map<GameCharacter, Set<Fetish>> characterFetishesForPartner;

	public SexAction(SexActionInterface sexActionToCopy) {
		this.sexActionType = sexActionToCopy.getActionType();
		this.selfArousalGain = sexActionToCopy.getArousalGainSelf();
		this.targetArousalGain = sexActionToCopy.getArousalGainTarget();
		this.minimumCorruptionNeeded = sexActionToCopy.getCorruptionNeeded();
		this.sexAreaInteractions = sexActionToCopy.getSexAreaInteractions();
		this.participantType = sexActionToCopy.getParticipantType();
		this.associatedSexPace = sexActionToCopy.getSexPace();
	}

	public SexAction(
			SexActionType sexActionType,
			ArousalIncrease selfArousalGain,
			ArousalIncrease targetArousalGain,
			CorruptionLevel minimumCorruptionNeeded,
			Map<SexAreaInterface, SexAreaInterface> sexAreaInteractions,
			SexParticipantType participantType) {

		this(sexActionType,
				selfArousalGain,
				targetArousalGain,
				minimumCorruptionNeeded,
				sexAreaInteractions,
				participantType,
				null);
	}

	public SexAction(
			SexActionType sexActionType,
			ArousalIncrease selfArousalGain,
			ArousalIncrease targetArousalGain,
			CorruptionLevel minimumCorruptionNeeded,
			Map<SexAreaInterface, SexAreaInterface> sexAreaInteractions,
			SexParticipantType participantType,
			SexPace associatedSexPace) {

		this.sexActionType = sexActionType;
		this.selfArousalGain = selfArousalGain;
		this.targetArousalGain = targetArousalGain;
		this.minimumCorruptionNeeded = minimumCorruptionNeeded;

		if(sexAreaInteractions==null) {
			this.sexAreaInteractions = new HashMap<>();
		} else {
			this.sexAreaInteractions = sexAreaInteractions;
		}

		this.participantType = participantType;
		this.associatedSexPace = associatedSexPace;
	}

	@Override
	public SexPace getSexPace(){
		return associatedSexPace;
	}

	public Map<SexAreaInterface, SexAreaInterface> getSexAreaInteractions() {
		return sexAreaInteractions;
	}

	@Override
	public SexParticipantType getParticipantType() {
		return participantType;
	}

	@Override
	public SexActionType getActionType(){
		return sexActionType;
	}

	@Override
	public ArousalIncrease getArousalGainSelf() {
		if(Sex.getSexPace(Sex.getCharacterPerformingAction())==SexPace.SUB_RESISTING
				&& this.getActionType()!=SexActionType.PREPARE_FOR_PARTNER_ORGASM
				&& this.getActionType()!=SexActionType.SPECIAL) {
			if(Sex.getCharacterPerformingAction().hasFetish(Fetish.FETISH_NON_CON_SUB)) {
				return ArousalIncrease.FOUR_HIGH;

			} else {
				// If it's an erogenous zone, they gain arousal. If not, arousal gain is 0.
				for(SexAreaInterface sArea : this.getSexAreaInteractions().keySet()) {
					if((sArea.isOrifice() && ((SexAreaOrifice)sArea).getBaseArousalWhenPenetrated()>1)
							|| (sArea.isPenetration() && ((SexAreaPenetration)sArea).getBaseArousalWhenPenetrating()>1)) {
						return ArousalIncrease.TWO_LOW;
					}
				}
				return ArousalIncrease.ZERO_NONE;
			}
		}

		return selfArousalGain;
	}

	@Override
	public ArousalIncrease getArousalGainTarget() {
		if(this.isSadisticAction() && !Sex.getCharacterTargetedForSexAction(this).getFetishDesire(Fetish.FETISH_MASOCHIST).isPositive()) {
			return ArousalIncrease.ZERO_NONE;
		}

		if(!Sex.isMasturbation()) {
			if(Sex.getSexPace(Sex.getCharacterTargetedForSexAction(this))==SexPace.SUB_RESISTING
					&& this.getActionType()!=SexActionType.PREPARE_FOR_PARTNER_ORGASM
					&& this.getActionType()!=SexActionType.SPECIAL) {
				if(Sex.getCharacterTargetedForSexAction(this).hasFetish(Fetish.FETISH_NON_CON_SUB)) {
					return ArousalIncrease.FOUR_HIGH;

				} else {
					// If it's an erogenous zone, they gain arousal. If not, arousal gain is 0.
					for(SexAreaInterface sArea : this.getSexAreaInteractions().values()) {
						if(sArea!=null
								&& ((sArea.isOrifice() && ((SexAreaOrifice)sArea).getBaseArousalWhenPenetrated()>1)
										|| (sArea.isPenetration() && ((SexAreaPenetration)sArea).getBaseArousalWhenPenetrating()>1))) {
							return ArousalIncrease.TWO_LOW;
						}
					}
					return ArousalIncrease.ZERO_NONE;
				}
			}
		}

		return targetArousalGain;
	}

	@Override
	public CorruptionLevel getCorruptionNeeded(){
		return minimumCorruptionNeeded;
	}

	@Override
	public abstract String getActionTitle();

	@Override
	public abstract String getDescription();

	private static String formatFlavour(String input) {
		return "
"
				+ input
			+ "
";
	}

	@Override
	public String getFluidFlavourDescription(GameCharacter performing, GameCharacter receiving) {
		if((this.getPerformingCharacterAreas().contains(SexAreaPenetration.TONGUE) || this.getPerformingCharacterAreas().contains(SexAreaOrifice.MOUTH)) && performing.isPlayer()) {

			if(this.getTargetedCharacterAreas().contains(SexAreaOrifice.VAGINA)) {
				FluidFlavour flavour = receiving.getGirlcumFlavour();
				if(flavour!=FluidFlavour.GIRL_CUM) {
					return formatFlavour(UtilText.parse(receiving,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.pussy] tastes like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}

			} else if(this.getTargetedCharacterAreas().contains(SexAreaPenetration.PENIS)) {
				FluidFlavour flavour = receiving.getCumFlavour();
				if(flavour!=FluidFlavour.CUM) {
					return formatFlavour(UtilText.parse(receiving,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.cock] tastes like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}

			} else if(this.getTargetedCharacterAreas().contains(SexAreaOrifice.NIPPLE)) {
				FluidFlavour flavour = receiving.getMilkFlavour();
				if(flavour!=FluidFlavour.MILK) {
					return formatFlavour(UtilText.parse(receiving,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.nipples] taste like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}

			} else if(this.getTargetedCharacterAreas().contains(SexAreaOrifice.NIPPLE_CROTCH)) {
				FluidFlavour flavour = receiving.getMilkCrotchFlavour();
				if(flavour!=FluidFlavour.MILK) {
					return formatFlavour(UtilText.parse(receiving,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.crotchNipples] taste like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}
			}

		} else if((this.getTargetedCharacterAreas().contains(SexAreaPenetration.TONGUE) || this.getTargetedCharacterAreas().contains(SexAreaOrifice.MOUTH)) && receiving.isPlayer()) {

			if(this.getPerformingCharacterAreas().contains(SexAreaOrifice.VAGINA)) {
				FluidFlavour flavour = performing.getGirlcumFlavour();
				if(flavour!=FluidFlavour.GIRL_CUM) {
					return formatFlavour(UtilText.parse(performing,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.pussy] tastes like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}

			} else if(this.getPerformingCharacterAreas().contains(SexAreaPenetration.PENIS)) {
				FluidFlavour flavour = performing.getCumFlavour();
				if(flavour!=FluidFlavour.CUM) {
					return formatFlavour(UtilText.parse(performing,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.cock] tastes like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}

			} else if(this.getPerformingCharacterAreas().contains(SexAreaOrifice.NIPPLE)) {
				FluidFlavour flavour = performing.getMilkFlavour();
				if(flavour!=FluidFlavour.MILK) {
					return formatFlavour(UtilText.parse(performing,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.nipples] taste like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}

			} else if(this.getPerformingCharacterAreas().contains(SexAreaOrifice.NIPPLE_CROTCH)) {
				FluidFlavour flavour = performing.getMilkCrotchFlavour();
				if(flavour!=FluidFlavour.MILK) {
					return formatFlavour(UtilText.parse(performing,
										UtilText.returnStringAtRandom(
												"[npc.NamePos] [npc.crotchNipples] taste like  "+flavour.getName()+"!",
												"The taste of  "+flavour.getName()+" fills your mouth!")));
				}
			}
		}

		return "";
	}

	@Override
	public List<Fetish> getFetishesForTargetedPartner(GameCharacter characterPerformingAction) {
		return getFetishesForEitherPartner(characterPerformingAction, false);
	}

	@Override
	public List<Fetish> getFetishes(GameCharacter characterPerformingAction) {
		return getFetishesForEitherPartner(characterPerformingAction, true);
	}

	/**
	 * To be overridden to add extra fetishes on top of the automatically-generated ones in getFetishes() and getFetishesForTargetedPartner().
	 */
	public List<Fetish> getExtraFetishes(GameCharacter character) {
		return null;
	}

	public List<Fetish> getFetishesForEitherPartner(GameCharacter characterPerformingAction, boolean characterPerformingActionFetishes) {
//		if(characterFetishes==null || characterFetishes.get(characterPerformingAction)==null) {
			GameCharacter characterTarget = Sex.getTargetedPartner(characterPerformingAction);

			characterFetishes = new HashMap<>();
			characterFetishesForPartner = new HashMap<>();

			characterFetishes.putIfAbsent(characterPerformingAction, new HashSet<>());
			characterFetishesForPartner.putIfAbsent(characterPerformingAction, new HashSet<>());

			if(getExtraFetishes(characterPerformingAction)!=null) {
				for(Fetish f : getExtraFetishes(characterPerformingAction)) {
					characterFetishes.get(characterPerformingAction).add(f);
				}
			}
			if(getExtraFetishes(characterTarget)!=null) {
				for(Fetish f : getExtraFetishes(characterTarget)) {
					characterFetishesForPartner.get(characterPerformingAction).add(f);
				}
			}

//			if(this.getParticipantType()==SexParticipantType.SELF && !characterPerformingActionFetishes) { // If this is a self action, do not apply fetishes to other partner.
//				return new ArrayList<>(characterFetishesForPartner.get(characterPerformingAction));
//			}

			if(this.getParticipantType()!=SexParticipantType.SELF && characterPerformingAction.isRelatedTo(characterTarget)) {
				characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_INCEST);
				characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_INCEST);
			}

			if(Sex.isPublicSex()) {
				characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_EXHIBITIONIST);
				characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_EXHIBITIONIST);
			}

			if(this.getSexPace()!=null) {
				switch(this.getSexPace()) {
					case DOM_GENTLE:
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
						break;
					case DOM_NORMAL:
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
						break;
					case DOM_ROUGH:
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SADIST);
						if(this.getParticipantType()==SexParticipantType.SELF) {
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_MASOCHIST);
						}
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_MASOCHIST);
						break;
					case SUB_EAGER:
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
						break;
					case SUB_NORMAL:
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
						break;
					case SUB_RESISTING:
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
						characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_NON_CON_SUB);
						characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_NON_CON_DOM);
						break;
				}
			}

			List<CoverableArea> cummedOnList = null;
			try { // Wrap in try/catch block as some sex actions may make calls to ongoing actions that aren't ongoing yet
				cummedOnList = this.getAreasCummedOn(characterPerformingAction, characterTarget);
			} catch(Exception ex) {
			}

			if(cummedOnList != null) {
				characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);
				characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
				for(CoverableArea area : cummedOnList) {
					switch(area) {
						case NONE:
							break;
						case ANUS: case ASS:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
							break;
						case BACK:
							break;
						case BREASTS: case NIPPLES:
							if(characterTarget.getBreastRawMilkStorageValue()>0) {
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
							}
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
							break;
						case BREASTS_CROTCH: case NIPPLES_CROTCH:
							if(characterTarget.getBreastCrotchRawMilkStorageValue()>0) {
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
							}
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
							break;
						case HAIR:
							break;
						case HANDS:
							break;
						case FEET:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_FOOT_GIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_FOOT_RECEIVING);
							break;
						case LEGS: case THIGHS:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
							break;
						case MOUND:
							break;
						case MOUTH:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
							break;
						case PENIS: case TESTICLES:
							break;
						case STOMACH:
							break;
						case VAGINA:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
							break;
					}
				}
			}

			try { // Wrap in try/catch block as some sex actions may make calls to ongoing actions that aren't ongoing yet
				cummedOnList = this.getAreasCummedOn(characterTarget, characterPerformingAction);
			} catch(Exception ex) {
			}
			if(cummedOnList != null) {
				characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
				characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);

				for(CoverableArea area : cummedOnList) {
					switch(area) {
						case NONE:
							break;
						case ANUS: case ASS:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
							break;
						case BACK:
							break;
						case BREASTS: case NIPPLES:
							if(characterPerformingAction.getBreastRawMilkStorageValue()>0) {
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
							}
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
							break;
						case BREASTS_CROTCH: case NIPPLES_CROTCH:
							if(characterPerformingAction.getBreastCrotchRawMilkStorageValue()>0) {
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
							}
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
							break;
						case HAIR:
							break;
						case HANDS:
							break;
						case FEET:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_FOOT_RECEIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_FOOT_GIVING);
							break;
						case LEGS: case THIGHS:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
							break;
						case MOUND:
							break;
						case MOUTH:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
							break;
						case PENIS: case TESTICLES:
							break;
						case STOMACH:
							break;
						case VAGINA:
							characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
							characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
							break;
					}
				}
			}

			List<SexAreaInterface> cummedInList = this.getAreasCummedIn(characterPerformingAction, characterTarget);
			if(cummedInList != null) {
				characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);
				characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);

				for(SexAreaInterface area : cummedInList) {
					if(area.isOrifice()) {
						switch((SexAreaOrifice)area) {
							case ANUS: case ASS:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
								break;
							case BREAST: case NIPPLE:
								if(characterTarget.getBreastRawMilkStorageValue()>0) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
									characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
								}
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
								break;
							case BREAST_CROTCH: case NIPPLE_CROTCH:
								if(characterTarget.getBreastCrotchRawMilkStorageValue()>0) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
									characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
								}
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
								break;
							case THIGHS:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
								break;
							case MOUTH:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
								break;
							case VAGINA:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
								if(this.getParticipantType()==SexParticipantType.SELF) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
								}
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
								break;
							case URETHRA_PENIS:
							case URETHRA_VAGINA:
								break;
						}
					} else {
						switch((SexAreaPenetration)area) {
							case CLIT:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
								if(this.getParticipantType()==SexParticipantType.SELF) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
								}
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
								break;
							case FINGER:
								break;
							case FOOT:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_FOOT_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_FOOT_GIVING);
								break;
							case PENIS:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PENIS_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_PENIS_GIVING);
								break;
							case TAIL:
								break;
							case TENTACLE:
								break;
							case TONGUE:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
								break;
						}
					}
				}
			}

			cummedInList = this.getAreasCummedIn(characterTarget, characterPerformingAction);
			if(cummedInList != null) {
				characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
				characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);

				for(SexAreaInterface area : cummedInList) {
					if(area.isOrifice()) {
						switch((SexAreaOrifice)area) {
							case ANUS: case ASS:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
								break;
							case BREAST: case NIPPLE:
								if(characterPerformingAction.getBreastRawMilkStorageValue()>0) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
									characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
								}
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
								break;
							case BREAST_CROTCH: case NIPPLE_CROTCH:
								if(characterPerformingAction.getBreastCrotchRawMilkStorageValue()>0) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
									characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
								}
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
								break;
							case THIGHS:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
								break;
							case MOUTH:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
								break;
							case VAGINA:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
								if(this.getParticipantType()==SexParticipantType.SELF) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
								}
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
								break;
							case URETHRA_PENIS:
							case URETHRA_VAGINA:
								break;
						}
					} else {
						switch((SexAreaPenetration)area) {
							case CLIT:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
								if(this.getParticipantType()==SexParticipantType.SELF) {
									characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
								}
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
								break;
							case FINGER:
								break;
							case FOOT:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_FOOT_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_FOOT_RECEIVING);
								break;
							case PENIS:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PENIS_GIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_PENIS_RECEIVING);
								break;
							case TAIL:
								break;
							case TENTACLE:
								break;
							case TONGUE:
								characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
								characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
								break;
						}
					}
				}
			}

			for(Entry<SexAreaInterface, SexAreaInterface> entry : this.getSexAreaInteractions().entrySet()) {
				if(this.getActionType()!=SexActionType.STOP_ONGOING) {
					if(characterPerformingActionFetishes) {
						if(this.getParticipantType()==SexParticipantType.SELF) {
							characterFetishes.get(characterPerformingAction).addAll(
									getFetishesFromPenetrationAndOrificeTypes(characterPerformingAction, entry.getKey(), characterPerformingAction, entry.getValue(), !characterPerformingActionFetishes));
						}
						characterFetishes.get(characterPerformingAction).addAll(
								getFetishesFromPenetrationAndOrificeTypes(characterPerformingAction, entry.getKey(), Sex.getTargetedPartner(characterPerformingAction), entry.getValue(), characterPerformingActionFetishes));

					} else {
						if(this.getParticipantType()==SexParticipantType.SELF) {
							characterFetishesForPartner.get(characterPerformingAction).addAll(
									getFetishesFromPenetrationAndOrificeTypes(characterPerformingAction, entry.getKey(), characterPerformingAction, entry.getValue(), !characterPerformingActionFetishes));
						}
						characterFetishesForPartner.get(characterPerformingAction).addAll(
								getFetishesFromPenetrationAndOrificeTypes(characterPerformingAction, entry.getKey(), Sex.getTargetedPartner(characterPerformingAction), entry.getValue(), characterPerformingActionFetishes));
					}
				}
			}

			characterFetishes.get(characterPerformingAction).removeIf(f -> !characterTarget.hasVagina() && (f==Fetish.FETISH_VAGINAL_GIVING || f==Fetish.FETISH_IMPREGNATION));
			characterFetishesForPartner.get(characterPerformingAction).removeIf(f -> !characterTarget.hasVagina() && (f==Fetish.FETISH_VAGINAL_GIVING || f==Fetish.FETISH_IMPREGNATION));
//		}

		if(characterPerformingActionFetishes) {
			return new ArrayList<>(characterFetishes.get(characterPerformingAction));

		} else {
			return new ArrayList<>(characterFetishesForPartner.get(characterPerformingAction));
		}
	}
}


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

/**
 * @since 0.1.88
 * @version 0.1.97
 * @author Innoxia
 */
public enum SexActionCategory {

	CHARACTER_SWITCH,

	MISCELLANEOUS,
	SELF,
	SEX,
	POSITIONING;

}