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

import java.util.ArrayList;
import java.util.Collections;
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.PropertyValue;
import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.character.npc.NPC;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.character.race.Subspecies;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.InventorySlot;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaInterface;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexType;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotGeneric;
import com.lilithsthrone.game.sex.sexActions.SexActionInterface;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.world.places.Population;

/**
 * @since 0.1.0
 * @version 0.3.4
 * @author Innoxia
 */
public interface SexManagerInterface {

	public AbstractSexPosition getPosition();

	public void assignNPCTarget(GameCharacter targeter);

	public Map<GameCharacter, SexSlot> getDominants();
	public Map<GameCharacter, SexSlot> getSubmissives();

	public default SexPace getStartingSexPaceModifier(GameCharacter character) {
		return null;
	}

	/**
	 * @param character
	 * @return The SexPace that this character should be locked into for the duration of this sex scene.
	 */
	public default SexPace getForcedSexPace(GameCharacter character) {
		return null;
	}

	public default Set<GameCharacter> getCharactersSealed() {
		return new HashSet<>();
	}

	public default boolean isPlayerDom() {
		return getDominants().containsKey(Main.game.getPlayer());
	}

	/**
	 * @param sexActionPlayer The action that the player just took before the partner's turn.
	 * @return The action that the partner takes.
	 */
	public SexActionInterface getPartnerSexAction(SexActionInterface sexActionPlayer);

	public default String getStartSexDescription() {
		return "";
	}

	public default SexType getForeplayPreference(NPC character, GameCharacter targetedCharacter) {
		return character.getForeplayPreference(targetedCharacter);
	}

	public default SexType getMainSexPreference(NPC character, GameCharacter targetedCharacter) {
		return character.getMainSexPreference(targetedCharacter);
	}

	public default SexControl getSexControl(GameCharacter character) {
		if(Sex.isDom(character)) {
			return SexControl.FULL;
		} else {
			if(Sex.isSubHasEqualControl()) {
				return SexControl.FULL;
			} else {
				if(character.isPlayer()) {
					return SexControl.ONGOING_PLUS_LIMITED_PENETRATIONS;
				} else {
					return SexControl.ONGOING_ONLY;
				}
			}
		}
	}

	public default String applyEndSexEffects() {
		return "";
	}

	/**
	 * @param character The character to check to see if their self-transform menu is disabled.
	 * @return True if self-transform is disabled during this sex scene.
	 */
	public default boolean isSelfTransformDisabled(GameCharacter character) {
		return false;
	}

	public default List<AbstractSexPosition> getAllowedSexPositions() {
		List<AbstractSexPosition> positions = Util.newArrayListOfValues(
				SexPosition.AGAINST_WALL,
				SexPosition.ALL_FOURS,
				SexPosition.LYING_DOWN,
				SexPosition.STANDING);

		switch(Main.game.getPlayerCell().getType()) {
			case ANGELS_KISS_FIRST_FLOOR:
			case ANGELS_KISS_GROUND_FLOOR:
			case CITY_HALL:
			case DADDYS_APARTMENT:
			case ENFORCER_HQ:
			case ENFORCER_WAREHOUSE:
			case GAMBLING_DEN:
			case LILAYAS_HOUSE_FIRST_FLOOR:
			case LILAYAS_HOUSE_GROUND_FLOOR:
			case LYSSIETH_PALACE:
			case MUSEUM:
			case MUSEUM_LOST:
			case SHOPPING_ARCADE:
			case SUPPLIER_DEN:
			case ZARANIX_HOUSE_FIRST_FLOOR:
			case ZARANIX_HOUSE_GROUND_FLOOR:
			case RAT_WARRENS:
				positions.add(SexPosition.OVER_DESK);
				positions.add(SexPosition.SITTING);
				break;
			case BAT_CAVERNS:
			case DOMINION:
			case EMPTY:
			case HARPY_NEST:
			case IMP_FORTRESS_ALPHA:
			case IMP_FORTRESS_DEMON:
			case IMP_FORTRESS_FEMALES:
			case IMP_FORTRESS_MALES:
			case NIGHTLIFE_CLUB:
			case SLAVER_ALLEY:
			case SLIME_QUEENS_LAIR_FIRST_FLOOR:
			case SLIME_QUEENS_LAIR_GROUND_FLOOR:
			case SUBMISSION:
			case WORLD_MAP:
				break;
		}
		return positions;
	}

	public default boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return character.isPlayer() && isPositionChangingAllowed(character);
	}

	/**
	 * @return true by default. If returns false, no position-changing actions at all are available for the character passed in to the method.
	 */
	public default boolean isPositionChangingAllowed(GameCharacter character) {
		return character.isPlayer() || (Sex.getTotalParticipantCount(false)==2); // Only player is allowed to switch in multi-sex scenes
	}

	public default boolean isPlayerAbleToStopSex() {
		return Sex.isDom(Main.game.getPlayer()) || (Sex.getSexControl(Main.game.getPlayer())==SexControl.FULL && Sex.isConsensual());
	}

	public default boolean isEndSexAffectionChangeEnabled(GameCharacter character) {
		return true;
	}

	public default boolean isPartnerWantingToStopSex(GameCharacter partner) {
		boolean subsSatisfied = true;
		boolean domsSatisfied = true;
		boolean subsResisting = true;
		boolean subsDenied = true;

		// Do not skip orgasms at end of sex:
		if(Sex.getLastUsedPlayerAction().getActionType().isOrgasmOption()
				|| Sex.getLastUsedPlayerAction().getActionType()==SexActionType.PREPARE_FOR_PARTNER_ORGASM) {
			return false;
		}

		// Do not allow player-owned slaves to end sex if the player is also a dom and is not a spectator:
		if(Sex.isDom(Main.game.getPlayer()) && !Sex.isSpectator(Main.game.getPlayer()) && Sex.getInitialSexManager().isPlayerAbleToStopSex() && partner.isSlave() && partner.getOwner().isPlayer()) {
			return false;
		}

		for(GameCharacter character : Sex.getDominantParticipants(false).keySet()) {
			if(Sex.getNumberOfOrgasms(character)<character.getOrgasmsBeforeSatisfied() && Sex.getSexPositionSlot(character)!=SexSlotGeneric.MISC_WATCHING) {
				domsSatisfied = false;
			}
		}

		for(GameCharacter character : Sex.getSubmissiveParticipants(false).keySet()) {
			if(Sex.getSexPace(character)!=SexPace.SUB_RESISTING && Sex.getSexPositionSlot(character)!=SexSlotGeneric.MISC_WATCHING) {
				subsResisting = false;
			}
			if(Sex.getNumberOfOrgasms(character)<character.getOrgasmsBeforeSatisfied() && Sex.getSexPositionSlot(character)!=SexSlotGeneric.MISC_WATCHING) {
				subsSatisfied = false;
			}
			if(Sex.getNumberOfDeniedOrgasms(character)==0) {
				subsDenied = false;
			}
		}

		if(Sex.isDom(partner) && (!Sex.isConsensual() || subsResisting || !Sex.isSubHasEqualControl() || (partner.getFetishDesire(Fetish.FETISH_DENIAL).isPositive() && subsDenied))) {
			if(Sex.getNumberOfOrgasms(partner)>partner.getOrgasmsBeforeSatisfied()*2) {
				return true;
			}
			return domsSatisfied;

		} else if(Sex.getSexControl(partner)!=SexControl.FULL) {
			return false;

		} else {
			return domsSatisfied && subsSatisfied;
		}
	}

	public default void initStartingLustAndArousal(GameCharacter character) {
		character.setLustNoText(50);
		character.setArousal(0);
		if(Sex.isDom(character)) {
			if(character.hasFetish(Fetish.FETISH_DOMINANT)) {
				character.setLustNoText(85);
				character.setArousal(10);
			} else if(character.hasFetish(Fetish.FETISH_SUBMISSIVE)) {
				character.setLustNoText(10);
			}
		} else {
			if(character.hasFetish(Fetish.FETISH_SUBMISSIVE)) {
				character.setLustNoText(85);
				character.setArousal(10);
			}
		}

		if(Main.getProperties().hasValue(PropertyValue.nonConContent)) {
			if(!character.isPlayer() && !Sex.isMasturbation()) {
				int attracted = 0;
				int unattracted = 0;
				for(GameCharacter target : (Sex.isDom(character)?Sex.getSubmissiveParticipants(false).keySet():Sex.getDominantParticipants(false).keySet())) {
					if(character.isAttractedTo(target)) {
						attracted++;
					} else {
						unattracted++;
					}
				}
				if(attracted==0) {
					character.setLustNoText(0); // If they aren't attracted to anyone, start resisting
				} else if(unattracted>0) {
					character.setLustNoText(character.getLust()/2); // If they are attracted to some, but not all, halve starting lust
				}
			}
		}
	}

	public default boolean isAbleToEquipSexClothing(GameCharacter character){
		return true;
	}

	public default boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return true;
	}

	/**
	 * @param character The character whose permission is to be tested.
	 * @param clothing The clothing to test. Can be null for a generic permissions check.
	 * @return true if this character is able to remove other people's clothing in sex.
	 */
	public default boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing) {
		// Is now handled in SexManager as of v0.3.3.8
//		if(clothing!=null
//				&& !Sex.isDom(character)
//				&& clothing.getClothingType().isSexToy()) {
//			return false;
//		}

//		if(character.isPlayer()) {
//			return true;
//		}
//
//		return Sex.getSexControl(character)==SexControl.FULL;

		// The only thing that should limit this is overridden special conditions:
		return true;
	}

	public default boolean isItemUseAvailable() {
		return true;
	}

	public default boolean isCharacterStartNaked(GameCharacter character) {
		return false;
	}

	/**
	 * @return A mapping of characters to the areas which they should have exposed at the start of sex.
	 *  The initial Boolean is to determine if clothing is to be removed (true), or displaced (false).
	 *  The inner map's key is which area is to be exposed, while the value (a list of InventorySlots) corresponds to what slots should not be touched while exposing this area.
	 *  To see how it's used, reference GameCharacter's displaceClothingForAccess() method.
	 */
	public default Map<Boolean, Map<GameCharacter, Map<CoverableArea, List<InventorySlot>>>> exposeAtStartOfSexMapExtendedInformation() {
		Map<Boolean, Map<GameCharacter, Map<CoverableArea, List<InventorySlot>>>> map = new HashMap<>();

		map.put(false, new HashMap<>());

		for(Entry<GameCharacter, List<CoverableArea>> e : this.exposeAtStartOfSexMap().entrySet()) {
			map.get(false).put(e.getKey(), new HashMap<>());

			for(CoverableArea c : e.getValue()) {
				map.get(false).get(e.getKey()).put(c, null);
			}
		}

		return map;
	}

	public default Map<GameCharacter, List<CoverableArea>> exposeAtStartOfSexMap() {
		return new HashMap<>();
	}

	public default List<CoverableArea> getAdditionalAreasToExposeDuringSex(GameCharacter performer, GameCharacter target) {
		if(performer.equals(target)) {
			return Util.newArrayListOfValues(CoverableArea.NIPPLES);
		} else {
			if(Sex.isConsensual() || target.hasBreasts()) {
				return Util.newArrayListOfValues(CoverableArea.NIPPLES);
			}
		}
		return new ArrayList<>();
	}

	public default List<InventorySlot> getSlotsConcealed(GameCharacter character) {
		return new ArrayList<>();
	}

	public default boolean isPartnerUsingForeplayActions() {
		return true;
	}

	/**
	 * @param character
	 * @return The OrgasmBehaviour for this character. Normally returns DEFAULT, but can also return CREAMPIE or PULL_OUT, in which case the character will ignore requests and treat associated orgasm actions as having a SexActionPriority of UNIQUE_MAX.
	 */
	public default OrgasmBehaviour getCharacterOrgasmBehaviour(GameCharacter character) {
		return OrgasmBehaviour.DEFAULT;
	}

	public default boolean isPublicSex() {
		for(GameCharacter character : this.getDominants().keySet()) {
			if(character.getLocationPlace().isPopulated()) {
				return true;
			}
		}
		for(GameCharacter character : this.getSubmissives().keySet()) {
			if(character.getLocationPlace().isPopulated()) {
				return true;
			}
		}
		return false;
	}

	public default String getPublicSexStartingDescription() {
		List<Subspecies> speciesPresent = null;
		Population pop = Main.game.getPlayer().getLocationPlace().getPlaceType().getPopulation();
		if(pop!=null) {
			speciesPresent = new ArrayList<>(pop.getSpecies().keySet());
		}
		if(speciesPresent!=null && !speciesPresent.isEmpty()) {
			List<Race> racesPresent = new ArrayList<>();
			for(Subspecies species : speciesPresent) {
				if(!racesPresent.contains(species.getRace())) {
					racesPresent.add(species.getRace());
				}
			}
			Collections.shuffle(racesPresent);
			List<String> raceNames = new ArrayList<>();
			for(int i=0; i<racesPresent.size() && i<3;i++) {
				raceNames.add(Subspecies.getMainSubspeciesOfRace(racesPresent.get(i)).getNamePlural(null));
			}
			if(raceNames.size() < racesPresent.size()) {
				raceNames.add("many other races");
			}

			return "
"
					+ (Sex.isMasturbation()
							?"A crowd of "+Util.stringsToStringList(raceNames, false)+" quickly forms around you, eager to watch your erotic display..."
							:"A crowd of "+Util.stringsToStringList(raceNames, false)+" quickly forms around you and [npc.name], eager to watch your erotic display...")
					+ "
";

		} else {
			return "
"
					+ (Sex.isMasturbation()
							?""
							:"A crowd quickly forms around you and [npc.name], eager to watch your erotic display...")
					+ "
";
		}
	}

	public default String getRandomPublicSexDescription() {
		if(Sex.isMasturbation()) {
			return "
"
						+ UtilText.returnStringAtRandom(
							"The crowd of onlookers laugh and cheer as they look on.",
							"You hear someone in the crowd wolf-whistling as they watch you masturbating.",
							"A pair of Enforcers shove their way through the crowd, but instead of putting a stop to your fun, they join the onlookers in laughing and commenting on your performance.",
							"You hear the crowd that's gathered to watch you commenting on your performance.",
							"Cheering and laughing, the crowd of onlookers watch as you continue masturbating.",
							"You glance across to see several members of the crowd touching themselves as they watch you go at it.",
							"The crowd cheers you on as you carry on masturbating in front of them.",
							"Several members of the crowd shout and cheer as you carry on masturbating in front of them.")
					+"
";

		} else {
			return "
"
						+ UtilText.parse(Sex.getTargetedPartner(Main.game.getPlayer()),
							UtilText.returnStringAtRandom(
								"The crowd of onlookers laugh and cheer as they look on.",
								"You hear someone in the crowd wolf-whistling as they watch you having sex.",
								"A pair of Enforcers shove their way through the crowd, but instead of putting a stop to your fun, they join the onlookers in laughing and commenting on your performance.",
								"You hear the crowd that's gathered to watch you commenting on your performance.",
								"You hear the crowd that's gathered to watch you commenting on [npc.namePos] performance.",
								"Cheering and laughing, the crowd of onlookers watch as you continue having sex with [npc.name].",
								"You glance across to see several members of the crowd touching themselves as they watch you and [npc.name] go at it.",
								"The crowd cheers you on as you and [npc.name] carry on having sex in front of them.",
								"The crowd laughs and cheers as you and [npc.name] carry on having sex in front of them.",
								"Several members of the crowd shout and cheer as you and [npc.name] carry on having sex in front of them.",
								"Several members of the crowd cheer you on as you and [npc.name] carry on having sex in front of them."))
					+"
";
		}
	}

	public Map<GameCharacter, List<SexAreaInterface>> getAreasBannedMap();

	public default boolean isAreasBannedMapAppliedToSelfActions(GameCharacter character) {
		return getAreasBannedMap().containsKey(character);
	}

	// Revealing CoverableAreas:

	public default boolean isAppendStartingExposedDescriptions(GameCharacter character) {
		return true;
	}

	public default boolean isAppendStartingWetDescriptions() {
		return true;
	}

	// Player:
	public default String getAssRevealReaction(GameCharacter characterBeingRevealed, List<GameCharacter> charactersReacting, boolean locationSpecific) {
		String reaction = "";

		if(!Sex.isMasturbation()
				&& Sex.getSexPositionSlot(characterBeingRevealed)!=SexSlotGeneric.MISC_WATCHING
				&& Sex.getSexPositionSlot(charactersReacting.get(0))!=SexSlotGeneric.MISC_WATCHING) {
			reaction = (!characterBeingRevealed.isPlayer()
						?"
"
							+ UtilText.parse(characterBeingRevealed, characterBeingRevealed.getAssDescription(locationSpecific))
						+ "
"
						:"")
					+ charactersReacting.get(0).getAssRevealDescription(characterBeingRevealed, charactersReacting, locationSpecific);
		}

		for(GameCharacter character : charactersReacting) {
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.ANUS, character, true);
		}
		return reaction;
	}

	public default String getVaginaRevealReaction(GameCharacter characterBeingRevealed, List<GameCharacter> charactersReacting) {
		String reaction = "";

		if(!Sex.isMasturbation()
				&& Sex.getSexPositionSlot(characterBeingRevealed)!=SexSlotGeneric.MISC_WATCHING
				&& Sex.getSexPositionSlot(charactersReacting.get(0))!=SexSlotGeneric.MISC_WATCHING) {
			reaction = (!characterBeingRevealed.isPlayer()
						?"
"
							+ UtilText.parse(characterBeingRevealed, characterBeingRevealed.getVaginaDescription())
						+ "
"
						:"")
					+ charactersReacting.get(0).getVaginaRevealDescription(characterBeingRevealed, charactersReacting);
		}

		for(GameCharacter character : charactersReacting) {
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.VAGINA, character, true);
		}
		return reaction;
	}

	public default String getBreastsRevealReaction(GameCharacter characterBeingRevealed, List<GameCharacter> charactersReacting) {
		String reaction = "";

		if(!Sex.isMasturbation()
				&& Sex.getSexPositionSlot(characterBeingRevealed)!=SexSlotGeneric.MISC_WATCHING
				&& Sex.getSexPositionSlot(charactersReacting.get(0))!=SexSlotGeneric.MISC_WATCHING) {
			reaction = (!characterBeingRevealed.isPlayer()
						?"
"
							+ UtilText.parse(characterBeingRevealed, characterBeingRevealed.getBreastDescription())
						+ "
"
						:"")
					+ charactersReacting.get(0).getBreastsRevealDescription(characterBeingRevealed, charactersReacting);
		}

		for(GameCharacter character : charactersReacting) {
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.BREASTS, character, true);
		}
		return reaction;
	}

	public default String getBreastsCrotchRevealReaction(GameCharacter characterBeingRevealed, List<GameCharacter> charactersReacting) {
		String reaction = "";

		if(!Sex.isMasturbation()
				&& Sex.getSexPositionSlot(characterBeingRevealed)!=SexSlotGeneric.MISC_WATCHING
				&& Sex.getSexPositionSlot(charactersReacting.get(0))!=SexSlotGeneric.MISC_WATCHING) {
			reaction = (!characterBeingRevealed.isPlayer()
						?"
"
							+ UtilText.parse(characterBeingRevealed, characterBeingRevealed.getBreastCrotchDescription())
						+ "
"
						:"")
					+ charactersReacting.get(0).getBreastsCrotchRevealDescription(characterBeingRevealed, charactersReacting);
		}

		for(GameCharacter character : charactersReacting) {
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.BREASTS_CROTCH, character, true);
		}
		return reaction;
	}

	public default String getPenisRevealReaction(GameCharacter characterBeingRevealed, List<GameCharacter> charactersReacting) {
		String reaction = "";

		if(!Sex.isMasturbation()
				&& Sex.getSexPositionSlot(characterBeingRevealed)!=SexSlotGeneric.MISC_WATCHING
				&& Sex.getSexPositionSlot(charactersReacting.get(0))!=SexSlotGeneric.MISC_WATCHING) {
			reaction = (!characterBeingRevealed.isPlayer()
						?"
"
							+ UtilText.parse(characterBeingRevealed, characterBeingRevealed.getPenisDescription())
						+ "
"
						:"")
					+ charactersReacting.get(0).getPenisRevealDescription(characterBeingRevealed, charactersReacting);
		}

		for(GameCharacter character : charactersReacting) {
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.PENIS, character, true);
		}
		return reaction;
	}

	public default String getMoundRevealReaction(GameCharacter characterBeingRevealed, List<GameCharacter> charactersReacting) {
		String reaction = "";

		if(!Sex.isMasturbation()
				&& Sex.getSexPositionSlot(characterBeingRevealed)!=SexSlotGeneric.MISC_WATCHING
				&& Sex.getSexPositionSlot(charactersReacting.get(0))!=SexSlotGeneric.MISC_WATCHING) {
			reaction = charactersReacting.get(0).getMoundRevealDescription(characterBeingRevealed, charactersReacting);
		}

		for(GameCharacter character : charactersReacting) {
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.PENIS, character, true);
			characterBeingRevealed.setAreaKnownByCharacter(CoverableArea.VAGINA, character, true);
		}
		return reaction;
	}

}


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

/**
 * @since 0.3
 * @version 0.3
 * @author Innoxia
 */
public enum SubControlLevel {

	/**The submissive partner can perform all actions.*/
	EQUAL,

	/**The submissive partner cannot perform penetrative actions, unless they are the player, in which case they can perform non-virginity-taking penetrative actions.*/
	LIMITED,

	/**The submissive partner cannot perform any penetrative actions.*/
	RESTRICTED;
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.sex.managers.dominion;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.2.8
 * @version 0.3.4
 * @author Innoxia
 */
public class SMBraxDoggy extends SexManagerDefault {

	public SMBraxDoggy(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.ALL_FOURS,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.3.5
 * @version 0.3.5.1
 * @author Innoxia
 */
public class SMClaireWarehouse extends SexManagerDefault {

	public SMClaireWarehouse(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.AGAINST_WALL,
				dominants,
				submissives);
	}

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

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.AGAINST_WALL);
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(partner)>=partner.getOrgasmsBeforeSatisfied() && Sex.getNumberOfOrgasms(Main.game.getPlayer())>=Main.game.getPlayer().getOrgasmsBeforeSatisfied();
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.npc.dominion.Daddy;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.3.3.10
 * @version 0.3.3.10
 * @author Innoxia
 */
public class SMDaddyDinnerOral extends SexManagerDefault {

	public SMDaddyDinnerOral(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.SITTING,
				dominants,
				submissives);
	}

	@Override
	public Map<GameCharacter, List<CoverableArea>> exposeAtStartOfSexMap() {
		Map<GameCharacter, List<CoverableArea>> map = new HashMap<>();
		map.put(Main.game.getNpc(Daddy.class),
				Util.newArrayListOfValues(CoverableArea.PENIS));
		return map;
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(!Sex.isDom(character)) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}

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

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isAbleToEquipSexClothing(GameCharacter character){
		return false;
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return false;
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing) {
		return false;
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return (partner instanceof Daddy)
				&& Sex.getNumberOfOrgasms(partner)>=1;
	}

	@Override
	public boolean isAppendStartingExposedDescriptions(GameCharacter character) {
		return false;
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.npc.dominion.Jules;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.2.8
 * @version 0.3.5.1
 * @author Innoxia
 */
public class SMJulesCockSucking extends SexManagerDefault {

	public SMJulesCockSucking(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.STANDING,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(Main.game.getNpc(Jules.class))>=Main.game.getNpc(Jules.class).getOrgasmsBeforeSatisfied();
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return !character.isPlayer();
	}

	@Override
	public Map<GameCharacter, List<CoverableArea>> exposeAtStartOfSexMap() {
		return Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Jules.class), Util.newArrayListOfValues(CoverableArea.PENIS)));
	}

	@Override
	public List<CoverableArea> getAdditionalAreasToExposeDuringSex(GameCharacter performer, GameCharacter target) {
		return new ArrayList<>();
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.npc.dominion.Kruger;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.69.9
 * @version 0.3.4
 * @author Innoxia
 */
public class SMKrugerChair extends SexManagerDefault {

	public SMKrugerChair(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.SITTING,
				dominants,
				submissives);
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.SITTING);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return !character.isPlayer();
	}

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

	@Override
	public String getPublicSexStartingDescription() {
		return "
"
				+ "The lionesses and zebra-girls sitting around the booth start to giggle and touch themselves as they watch you about to get fucked by Kruger..."
				+ "
";
	}

	@Override
	public String getRandomPublicSexDescription() {
		List<String> descriptions = Util.newArrayListOfValues(
				"One of the lionesses lifts up her skirt, and, pulling her thong to one side, starts to finger herself while watching you and Kruger.",
				"Two of the zebra-girls lean back on the sofa and start making out with one another.",
				"You hear several of the lionesses who are watching you being to share some comments on your performance.",
				"You hear one of the zebra-girls let out an erotic moan as she watches Kruger having fun with you.",
				"The girls who are watching your performance continue to giggle and make lewd comments all around you.",
				"You glance across to see several of the girls touching themselves as they watch you and Kruger go at it.",
				"One of the zebra-girls cheers you on as you and Kruger carry on having sex in front of them.",
				"One of the lionesses giggles and makes a lewd comment as you and Kruger carry on having sex in front of her.");

		if(Sex.getOrificesBeingPenetratedBy(Main.game.getNpc(Kruger.class), SexAreaPenetration.PENIS, Main.game.getPlayer()).contains(SexAreaOrifice.MOUTH)) {
			descriptions.add("A lioness kneels down beside you, before pushing your head down on Kruger's cock, giggling to herself as she forces you to deepthroat his [kruger.cock+].");
			descriptions.add("A pair of zebra-girls lean forwards to either side of you, and, taking hold of your head, help you to bob up and down on [kruger.cock+].");
			descriptions.add("One of the lionesses leans forwards and snarls, [genericFemale.speech(That's right, bitch, know your place.)]");
			descriptions.add("A lioness leans forwards and pushes your head down on Kruger's cock, snarling, [genericFemale.speech(Come on, slut, you can suck cock better than that.)]");
			descriptions.add("One of the zebra-girls sits back on the sofa and cheers, [genericFemale.speech(Come on Kruger, fuck that bitch's face real good!)]");
			descriptions.add("A zebra-girl leans in against Kruger, and, grinning down at you, she encourages him, [genericFemale.speech(Oh yeah, Kruger, you put that slut in [pc.her] place!)]");
		}

		if(Sex.getOrificesBeingPenetratedBy(Main.game.getNpc(Kruger.class), SexAreaPenetration.PENIS, Main.game.getPlayer()).contains(SexAreaOrifice.VAGINA)) {
			descriptions.add("A lioness steps up behind you, before taking hold of your shoulders and pushing down, giggling to herself as she forces Kruger's [kruger.cock+] deep into your [pc.pussy+].");
			descriptions.add("A pair of zebra-girls step forwards to either side of you, and, taking a firm grip under your [pc.arms], pull you up and down in order to help Kruger's [kruger.cock+] slide in and out of your [pc.pussy+].");
			descriptions.add("One of the lionesses leans forwards and snarls, [genericFemale.speech(You're just a slutty cock-sleeve, aren't you bitch?)]");
			descriptions.add("A lioness leans forwards, and, taking hold of your [pc.hips+], pulls you down onto Kruger's cock, snarling, [genericFemale.speech(Come on, slut, take it deep.)]");
			descriptions.add("One of the zebra-girls sits back on the sofa and cheers, [genericFemale.speech(Come on Kruger, fuck that bitch real good!)]");
			descriptions.add("A zebra-girl leans in against Kruger, and, grinning across at you, she encourages him, [genericFemale.speech(Oh yeah, Kruger, you put that slut in [pc.her] place!)]");
		}

		if(Sex.getOrificesBeingPenetratedBy(Main.game.getNpc(Kruger.class), SexAreaPenetration.PENIS, Main.game.getPlayer()).contains(SexAreaOrifice.ANUS)) {
			descriptions.add("A lioness steps up behind you, before taking hold of your shoulders and pushing down, giggling to herself as she forces Kruger's [kruger.cock+] deep into your [pc.asshole+].");
			descriptions.add("A pair of zebra-girls step forwards to either side of you, and, taking a firm grip under your [pc.arms], pull you up and down in order to help Kruger's [kruger.cock+] slide in and out of your [pc.asshole+].");
			descriptions.add("One of the lionesses leans forwards and snarls, [genericFemale.speech(You're just a filthy butt-slut, aren't you bitch?)]");
			descriptions.add("A lioness leans forwards, and, taking hold of your [pc.hips+], pulls you down onto Kruger's cock, snarling, [genericFemale.speech(Come on, you dirty butt-slut, take it deep.)]");
			descriptions.add("One of the zebra-girls sits back on the sofa and cheers, [genericFemale.speech(Come on Kruger, fuck that bitch's ass real good!)]");
			descriptions.add("A zebra-girl leans in against Kruger, and, grinning across at you, she encourages him, [genericFemale.speech(Oh yeah, Kruger, you put that dirty butt-slut in [pc.her] place!)]");
		}

		return "
"
					+Util.randomItemFrom(descriptions)
				+"
";
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(Main.game.getNpc(Kruger.class))>=2
				&& (Sex.getNumberOfOrgasms(Main.game.getPlayer())>=1 || Sex.getNumberOfOrgasms(Main.game.getNpc(Kruger.class))>=5);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class SMKrugerThreesome extends SexManagerDefault {

	public SMKrugerThreesome(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.OVER_TABLE_KRUGER_THREESOME,
				dominants,
				submissives);
	}

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

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


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.5
 * @version 0.3.4
 * @author Innoxia
 */
public class SMMasturbation extends SexManagerDefault {

	public SMMasturbation(Map<GameCharacter, SexSlot> dominants) {
		super(SexPosition.MASTURBATION,
				dominants,
				new HashMap<>());
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.MASTURBATION);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.3
 * @version 0.3.4
 * @author Innoxia
 */
public class SMMilkingStall extends SexManagerDefault {

	public SMMilkingStall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.MILKING_STALL,
				dominants,
				submissives);
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return getDominants().containsKey(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return getDominants().containsKey(character);
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.MILKING_STALL);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.dialogue.places.dominion.lilayashome.LilayasRoom;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;
import com.lilithsthrone.main.Main;

/**
 * @since 0.2.5
 * @version 0.2.5
 * @author Innoxia
 */
public class SMPantyMasturbation extends SexManagerDefault {

	public SMPantyMasturbation(Map<GameCharacter, SexSlot> dominants) {
		super(SexPositionBipeds.PANTY_MASTURBATION,
				dominants,
				new HashMap<>());
	}

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

	@Override
	public String applyEndSexEffects() {
		return Main.game.getPlayer().addClothing(LilayasRoom.lilayasPanties, false);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.69.9
 * @version 0.3.4
 * @author Innoxia
 */
public class SMPixShowerTime extends SexManagerDefault {

	public SMPixShowerTime(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.SHOWER_TIME_PIX,
				dominants,
				submissives);
	}

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

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

	@Override
	public boolean isCharacterStartNaked(GameCharacter character) {
		return true;
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPositionUnique.SHOWER_TIME_PIX);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.7?
 * @version 0.3.4
 * @author Innoxia
 */
public class SMRoseHands extends SexManagerDefault {

	public SMRoseHands(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.HANDS_ROSE,
				dominants,
				submissives);
	}

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

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

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return false;
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return false;
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPositionUnique.HANDS_ROSE);
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class SMStallBackToWall extends SexManagerDefault {

	public SMStallBackToWall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.BACK_TO_WALL_STALL,
				dominants,
				submissives);
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class SMStallFaceToWall extends SexManagerDefault {

	public SMStallFaceToWall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.FACING_WALL_STALL,
				dominants,
				submissives);

	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotStocks;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.95
 * @version 0.3.4
 * @author Innoxia
 */
public class SMStocks extends SexManagerDefault {

	public SMStocks(boolean vaginalAllowed, boolean analAllowed, boolean oralAllowed, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.STOCKS,
				dominants,
				submissives);

		for(GameCharacter character : submissives.keySet()) {
			getAreasBannedMap().put(character, new ArrayList<>());
		}

		if(!vaginalAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.VAGINA);
			}
		}

		if(!analAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.ANUS);
			}
		}

		if(!oralAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.MOUTH);
			}
		}
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return getDominants().containsKey(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return getDominants().containsKey(character);
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.STOCKS);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(Sex.getSexPositionSlot(character)==SexSlotStocks.LOCKED_IN_STOCKS
				|| Sex.getSexPositionSlot(character)==SexSlotStocks.LOCKED_IN_STOCKS_TWO
				|| Sex.getSexPositionSlot(character)==SexSlotStocks.LOCKED_IN_STOCKS_THREE
				|| Sex.getSexPositionSlot(character)==SexSlotStocks.LOCKED_IN_STOCKS_FOUR) {
			return SexControl.NONE;
		}
		return super.getSexControl(character);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.97
 * @version 0.3.4
 * @author Innoxia
 */
public class SMVickyOverDesk extends SexManagerDefault {

	public SMVickyOverDesk(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.OVER_DESK,
				dominants,
				submissives);
	}

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

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.OVER_DESK);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public SexPace getForcedSexPace(GameCharacter character) {
		if(!character.isPlayer()) {
			return SexPace.DOM_ROUGH;
		}
		return null;
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.sexActions.SexActionInterface;
import com.lilithsthrone.game.sex.sexActions.dominion.RalphOral;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.6?
 * @version 0.3.4
 * @author Innoxia
 */
public class SexManagerRalphDiscount extends SexManagerDefault {

	public SexManagerRalphDiscount(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.UNDER_DESK_RALPH,
				dominants,
				submissives);
	}

	@Override
	public SexActionInterface getPartnerSexAction(SexActionInterface sexActionPlayer) {
		if(Sex.getAvailableSexActionsPartner().contains(RalphOral.PARTNER_PENETRATES)) {
			return RalphOral.PARTNER_PENETRATES;
		} else if(Sex.getAvailableSexActionsPartner().contains(RalphOral.PARTNER_PENETRATES_ANUS)) {
			return RalphOral.PARTNER_PENETRATES_ANUS;
		}

		return super.getPartnerSexAction(sexActionPlayer);
	}

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

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return false;
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPositionUnique.UNDER_DESK_RALPH);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion.cultist;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.ArousalLevel;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.sexActions.SexActionInterface;
import com.lilithsthrone.game.sex.sexActions.dominion.CultistSexActions;

/**
 * @since 0.1.88
 * @version 0.3.4
 * @author Innoxia
 */
public class SMAltarMissionary extends SexManagerDefault {

	public SMAltarMissionary(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.MISSIONARY_ALTAR_CULTIST,
				dominants,
				submissives);
	}

	@Override
	public SexActionInterface getPartnerSexAction(SexActionInterface sexActionPlayer) {
		// If orgasming, use an orgasm action:
		if (ArousalLevel.getArousalLevelFromValue(Sex.getCharacterPerformingAction().getArousal()) == ArousalLevel.FIVE_ORGASM_IMMINENT) {
			return super.getPartnerSexAction(sexActionPlayer);
		}

		if(Sex.isCharacterSealed(Sex.getCharacterPerformingAction())) {
			return CultistSexActions.SEALED;

		} else {
			return super.getPartnerSexAction(sexActionPlayer);
		}
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character) {
		return !Sex.isCharacterSealed(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing) {
		return !Sex.isCharacterSealed(character);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(!Sex.isDom(character) && character.isPlayer()) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.cultist;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.1.88
 * @version 0.3.4
 * @author Innoxia
 */
public class SMAltarMissionarySealed extends SexManagerDefault {

	public SMAltarMissionarySealed(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.MISSIONARY_ALTAR_SEALED_CULTIST,
				dominants,
				submissives);
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character) {
		return !Sex.isCharacterSealed(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing) {
		return !Sex.isCharacterSealed(character);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(!Sex.isDom(character) && character.isPlayer()) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.cultist;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.1.69
 * @version 0.3.4
 * @author Innoxia
 */
public class SMCultistKneeling extends SexManagerDefault {

	public SMCultistKneeling(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.KNEELING_ORAL_CULTIST,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

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

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(!Sex.isDom(character) && character.isPlayer()) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.gloryHole;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.race.Subspecies;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.InventorySlot;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotUnique;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.world.places.Population;

/**
 * @since 0.2.9
 * @version 0.3.4
 * @author Innoxia
 */
public class SMGloryHole extends SexManagerDefault {

	public SMGloryHole(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.GLORY_HOLE,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return Sex.isDom(character);
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return character.isPlayer();
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return false;
	}

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

	@Override
	public List<InventorySlot> getSlotsConcealed(GameCharacter character) {
		List<InventorySlot> concealedSlots = new ArrayList<>();

		if(Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_KNEELING)) {
			Collections.addAll(concealedSlots, InventorySlot.values());
			concealedSlots.remove(InventorySlot.MOUTH);

		} else if(Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_FUCKED)
				|| Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_FUCKING)) {
			Collections.addAll(concealedSlots, InventorySlot.values());
			concealedSlots.remove(InventorySlot.VAGINA);
			concealedSlots.remove(InventorySlot.ANUS);
			concealedSlots.remove(InventorySlot.GROIN);
			concealedSlots.remove(InventorySlot.LEG);

		} else if(Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE)
				||Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_TWO)) {
			Collections.addAll(concealedSlots, InventorySlot.values());
			concealedSlots.remove(InventorySlot.PENIS);
			concealedSlots.remove(InventorySlot.VAGINA);
			concealedSlots.remove(InventorySlot.GROIN);
			concealedSlots.remove(InventorySlot.LEG);

		}

		return concealedSlots;
	}

	@Override
	public String getPublicSexStartingDescription() {
		return "
"
					+ "As you let out [pc.a_moan+], several of the people in the toilets turn around to see what's happening."
					+ " Seeing the door to your stall left wide open, and with you about to get started on servicing the cocks before you, a few of them step up and prepare to watch..."
				+ "
";
	}

	@Override
	public String getRandomPublicSexDescription() {
		Population pop = Main.game.getPlayer().getLocationPlace().getPlaceType().getPopulation();
		if(pop!=null && !pop.getSpecies().isEmpty()) {
			Subspecies subspecies = Util.randomItemFrom(new ArrayList<>(Main.game.getPlayerCell().getPlace().getPlaceType().getPopulation().getSpecies().keySet()));

			return "
"
						+ UtilText.returnStringAtRandom(
							"The people who've gathered to watch your lewd display laugh and cheer as they look on.",
							"You hear someone in the crowd wolf-whistling as they watch you servicing the glory holes.",
							"A pair of zebra-boy bouncers shove their way through the crowd, but instead of putting a stop to your fun, they join in with the crowd in laughing and commenting on your performance.",
							"You hear the crowd that's gathered to watch you commenting on your performance.",
							"Cheering and laughing, the crowd of onlookers watch as you continue servicing the cocks before you.",
							"You glance across to see several members of the crowd touching themselves as they watch you service the glory holes.",
							"The crowd cheers you on as you carry on servicing the glory holes.",
							"The crowd laughs and cheers as you carry on acting like a desperate slut in front of them.",
							"Several members of the crowd shout and cheer as you carry on servicing the glory holes.",
							Util.capitaliseSentence(UtilText.generateSingularDeterminer(subspecies.getSingularFemaleName(null)))+" "+subspecies.getSingularFemaleName(null)+" steps forwards,"
									+ " stroking her exposed cock as she suddenly cums all over the floor in front of you.",
							Util.capitaliseSentence(UtilText.generateSingularDeterminer(subspecies.getSingularMaleName(null)))+" "+subspecies.getSingularMaleName(null)+" steps forwards,"
									+ " stroking his exposed cock as he suddenly cums all over the floor in front of you.")
					+"
";
		}

		return "";
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.gloryHole;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.InventorySlot;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotUnique;

/**
 * @since 0.2.9
 * @version 0.3.4
 * @author Innoxia
 */
public class SMGloryHoleSex extends SexManagerDefault {

	public SMGloryHoleSex(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.GLORY_HOLE_SEX,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return Sex.isDom(character);
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return character.isPlayer();
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return false;
	}

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

	@Override
	public List<InventorySlot> getSlotsConcealed(GameCharacter character) {
		List<InventorySlot> concealedSlots = new ArrayList<>();

		if(Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_FUCKED)) {
			Collections.addAll(concealedSlots, InventorySlot.values());
			concealedSlots.remove(InventorySlot.MOUTH);
			concealedSlots.remove(InventorySlot.PENIS);
			concealedSlots.remove(InventorySlot.VAGINA);
			concealedSlots.remove(InventorySlot.GROIN);
			concealedSlots.remove(InventorySlot.LEG);

		} else if(Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_FUCKING)) {
			Collections.addAll(concealedSlots, InventorySlot.values());
			concealedSlots.remove(InventorySlot.PENIS);
			concealedSlots.remove(InventorySlot.VAGINA);
			concealedSlots.remove(InventorySlot.GROIN);
			concealedSlots.remove(InventorySlot.LEG);

		} else if(Sex.getSexPositionSlot(character).equals(SexSlotUnique.GLORY_HOLE_RECEIVING_ORAL_ONE)) {
			Collections.addAll(concealedSlots, InventorySlot.values());
			concealedSlots.remove(InventorySlot.PENIS);
			concealedSlots.remove(InventorySlot.VAGINA);
			concealedSlots.remove(InventorySlot.GROIN);
			concealedSlots.remove(InventorySlot.LEG);

		}

		return concealedSlots;
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion.toiletStall;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.8
 * @version 0.3.4
 * @author Innoxia
 */
public class SMStallBackToWall extends SexManagerDefault {

	public SMStallBackToWall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.AGAINST_WALL,
				dominants,
				submissives);
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.STANDING,
				SexPosition.AGAINST_WALL);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.toiletStall;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.8
 * @version 0.3.4
 * @author Innoxia
 */
public class SMStallSex extends SexManagerDefault {

	public SMStallSex(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.STANDING,
				dominants,
				submissives);
	}

	@Override
	public List<AbstractSexPosition> getAllowedSexPositions() {
		return Util.newArrayListOfValues(
				SexPosition.STANDING,
				SexPosition.AGAINST_WALL);
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.vanessa;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.npc.dominion.Vanessa;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3.2
 * @version 0.3.4
 * @author Innoxia
 */
public class SMVanessaOral extends SexManagerDefault {

	public SMVanessaOral(AbstractSexPosition position, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(position,
				dominants,
				submissives);
	}

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

	@Override
	public Map<GameCharacter, List<CoverableArea>> exposeAtStartOfSexMap() {
		if(Sex.isDom(Main.game.getPlayer())) {
			return Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), Util.newArrayListOfValues(CoverableArea.VAGINA)));
		}
		return Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Vanessa.class), Util.newArrayListOfValues(CoverableArea.VAGINA)));
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(character.isPlayer() && !Sex.isDom(character)) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		// When player is performing cunnilingus, she stops after orgasming once:
		if(Sex.isDom(partner)) {
			return Sex.getNumberOfOrgasms(partner)>=1;
		}

		// When player is receiving cunnilingus, or fucking Vanessa, she stops after both of you are satisfied:
		return Sex.getNumberOfOrgasms(Main.game.getPlayer())>=Main.game.getPlayer().getOrgasmsBeforeSatisfied()
				&& Sex.getNumberOfOrgasms(Main.game.getNpc(Vanessa.class))>=Main.game.getNpc(Vanessa.class).getOrgasmsBeforeSatisfied();
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion.vanessa;

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.npc.dominion.Vanessa;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3.2
 * @version 0.3.4
 * @author Innoxia
 */
public class SMVanessaSex extends SexManagerDefault {

	public SMVanessaSex(AbstractSexPosition position, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(position,
				dominants,
				submissives);
	}

	@Override
	public Map<GameCharacter, List<CoverableArea>> exposeAtStartOfSexMap() {
		return Util.newHashMapOfValues(
				new Value<>(Main.game.getPlayer(), Util.newArrayListOfValues(CoverableArea.PENIS)),
				new Value<>(Main.game.getNpc(Vanessa.class), Util.newArrayListOfValues(CoverableArea.VAGINA)));
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		// She stops after both of you are satisfied:
		return Sex.getNumberOfOrgasms(Main.game.getPlayer())>=Main.game.getPlayer().getOrgasmsBeforeSatisfied()
				&& Sex.getNumberOfOrgasms(Main.game.getNpc(Vanessa.class))>=Main.game.getNpc(Vanessa.class).getOrgasmsBeforeSatisfied();
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion.zaranix;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.1.95
 * @version 0.3.4
 * @author Innoxia
 */
public class SMAmberDoggyFucked extends SexManagerDefault {

	public SMAmberDoggyFucked(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.ALL_FOURS,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

//	@Override
//	public boolean isPositionChangingAllowed(GameCharacter character) {
//		return false;
//	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.zaranix;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.2.3
 * @version 0.3.4
 * @author Innoxia
 */
public class SMPetMounting extends SexManagerDefault {

	public SMPetMounting(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.PET_MOUNTING,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

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

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

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(partner)>=1;
	}

}


code:
package com.lilithsthrone.game.sex.managers.dominion.zaranix;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPositionUnique;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.2.3
 * @version 0.3.4
 * @author Innoxia
 */
public class SMPetOral extends SexManagerDefault {

	public SMPetOral(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionUnique.PET_ORAL,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

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

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

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(partner)>=1;
	}
}


code:
package com.lilithsthrone.game.sex.managers.dominion.zaranix;

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.npc.dominion.Zaranix;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;

/**
 * @since 0.1.95
 * @version 0.3.3.10
 * @author Innoxia
 */
public class SMZaranixCockSucking extends SexManagerDefault {

	public SMZaranixCockSucking(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.SITTING,
				dominants,
				submissives);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(character.isPlayer()) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return partner.equals(Main.game.getNpc(Zaranix.class)) && Sex.getNumberOfOrgasms(Main.game.getNpc(Zaranix.class))>=2;
	}

	@Override
	public boolean isAbleToEquipSexClothing(GameCharacter character){
		return false;
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return character.equals(Main.game.getNpc(Zaranix.class));
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing) {
		return character.equals(Main.game.getNpc(Zaranix.class));
	}
}


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

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.managers.OrgasmBehaviour;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.2.7
 * @version 0.3.4.5
 * @author Innoxia
 */
public class SMBreedingStall extends SexManagerDefault {

	public SMBreedingStall(boolean vaginalAllowed, boolean analAllowed, boolean oralAllowed, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.BREEDING_STALL,
				dominants,
				submissives);

		for(GameCharacter character : submissives.keySet()) {
			getAreasBannedMap().put(character, new ArrayList<>());
		}

		if(!vaginalAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.VAGINA);
			}
		}

		if(!analAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.ANUS);
			}
		}

		if(!oralAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.MOUTH);
			}
		}
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return getDominants().containsKey(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return getDominants().containsKey(character);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public OrgasmBehaviour getCharacterOrgasmBehaviour(GameCharacter character) {
		if(!character.isPlayer()) {
			return OrgasmBehaviour.CREAMPIE;
		}
		return super.getCharacterOrgasmBehaviour(character);
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(!Sex.isDom(character)) {
			return SexControl.ONGOING_ONLY;
		}
		return super.getSexControl(character);
	}
}


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

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.2.7
 * @version 0.3.1
 * @author Innoxia
 */
public class SMBreedingStallBack extends SexManagerDefault {

	public SMBreedingStallBack(boolean vaginalAllowed, boolean analAllowed, boolean oralAllowed, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.BREEDING_STALL_BACK,
				dominants,
				submissives);

		for(GameCharacter character : submissives.keySet()) {
			getAreasBannedMap().put(character, new ArrayList<>());
		}

		if(!vaginalAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.VAGINA);
			}
		}

		if(!analAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.ANUS);
			}
		}

		if(!oralAllowed) {
			for(GameCharacter character : submissives.keySet()) {
				getAreasBannedMap().get(character).add(SexAreaOrifice.MOUTH);
			}
		}
	}

	@Override
	public boolean isAbleToRemoveSelfClothing(GameCharacter character){
		return getDominants().containsKey(character);
	}

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return getDominants().containsKey(character);
	}

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


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

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.npc.submission.DarkSiren;
import com.lilithsthrone.game.character.npc.submission.Lyssieth;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaInterface;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexControl;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.managers.OrgasmBehaviour;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3
 * @version 0.3.3.10
 * @author Innoxia
 */
public class SMLilayaDemonTF extends SexManagerDefault {

	public SMLilayaDemonTF(AbstractSexPosition sexPositionType, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(sexPositionType,
				dominants,
				submissives);
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		if(partner instanceof Lyssieth) { // Lyssieth stops sex once everyone's orgasmed:
			for(GameCharacter character : Sex.getAllParticipants(false)) {
				if(Sex.getNumberOfOrgasms(character)==0) {
					return false;
				}
			}
			return true;
		}
		return false;
	}

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

	@Override
	public boolean isEndSexAffectionChangeEnabled(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isCharacterStartNaked(GameCharacter character) {
		return true;
	}

	@Override
	public boolean isSelfTransformDisabled(GameCharacter character) {
		return true;
	}

	@Override
	public boolean isAbleToEquipSexClothing(GameCharacter character){
		return false;
	}

	@Override
	public SexControl getSexControl(GameCharacter character) { // Everyone can just continue with ongoing:
		return SexControl.ONGOING_PLUS_LIMITED_PENETRATIONS;
	}

	@Override
	public OrgasmBehaviour getCharacterOrgasmBehaviour(GameCharacter character) {
		if(character.equals(Main.game.getNpc(Lyssieth.class))) {
			return OrgasmBehaviour.CREAMPIE;
		}
		return super.getCharacterOrgasmBehaviour(character);
	}

	@Override
	public SexPace getForcedSexPace(GameCharacter character) {
		if(!character.isPlayer()) {
			if(!Sex.isDom(character)) {
				return SexPace.SUB_EAGER;
			}
		}
		return null;
	}

	@Override
	public Map<GameCharacter, List<SexAreaInterface>> getAreasBannedMap() {
		// Do not let Meraxis take her own virginity using her tail:
		return Util.newHashMapOfValues(new Value<>(Main.game.getNpc(DarkSiren.class), Util.newArrayListOfValues(SexAreaPenetration.TAIL)));
	}
}


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

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.npc.submission.Lyssieth;
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.SexControl;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.managers.OrgasmBehaviour;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3
 * @version 0.3.4
 * @author Innoxia
 */
public class SMLyssiethDemonTF extends SexManagerDefault {

	public SMLyssiethDemonTF(AbstractSexPosition sexPositionType, Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(sexPositionType,
				dominants,
				submissives);
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(Main.game.getNpc(Lyssieth.class))>=3;
	}

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

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isCharacterStartNaked(GameCharacter character) {
		return true;
	}

	@Override
	public boolean isSelfTransformDisabled(GameCharacter character) {
		return true;
	}

	@Override
	public boolean isAbleToEquipSexClothing(GameCharacter character){
		return false;
	}

	@Override
	public OrgasmBehaviour getCharacterOrgasmBehaviour(GameCharacter character) {
		if(character.equals(Main.game.getNpc(Lyssieth.class))) {
			return OrgasmBehaviour.CREAMPIE;
		}
		return super.getCharacterOrgasmBehaviour(character);
	}

	@Override
	public SexControl getSexControl(GameCharacter character) {
		if(character.isPlayer()) {
			return SexControl.ONGOING_ONLY;
		} else {
			return SexControl.FULL;
		}
	}

	@Override
	public SexPace getForcedSexPace(GameCharacter character) {
		if(!character.isPlayer()) {
			if(!Sex.isDom(character)) {
				return SexPace.SUB_EAGER;
			}
			return SexPace.DOM_NORMAL;
		}
		return null;
	}

	@Override
	public Map<GameCharacter, List<SexAreaInterface>> getAreasBannedMap() {
		// Limit finger during giving the player head, so that she can use hug-lock and prevent the player from pulling out:
		if(Sex.getContactingSexAreas(Main.game.getNpc(Lyssieth.class), SexAreaOrifice.MOUTH, Main.game.getPlayer()).contains(SexAreaPenetration.PENIS)) {
			return Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), Util.newArrayListOfValues(SexAreaPenetration.FINGER)));
		}
		// Limit tail during doggy style, so that she can use tail-lock and prevent the player from pulling out:
		if(Sex.getContactingSexAreas(Main.game.getNpc(Lyssieth.class), SexAreaOrifice.VAGINA, Main.game.getPlayer()).contains(SexAreaPenetration.PENIS)
				&& Sex.getPosition()==SexPosition.ALL_FOURS) {
			return Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Lyssieth.class), Util.newArrayListOfValues(SexAreaPenetration.TAIL)));
		}
		return super.getAreasBannedMap();
	}

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.quests.Quest;
import com.lilithsthrone.game.character.quests.QuestLine;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;

/**
 * @since 0.3
 * @version 0.3.4
 * @author Innoxia
 */
public class SMLyssiethSex extends SexManagerDefault {

	public SMLyssiethSex(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.OVER_DESK,
				dominants,
				submissives);
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		if(!Main.game.getPlayer().isQuestProgressGreaterThan(QuestLine.MAIN, Quest.MAIN_2_D_MEETING_A_LILIN)) {
			return false; // Lyssieth orgasm ends sex, so this is fine
		}
		return super.isPartnerWantingToStopSex(partner);
	}

	@Override
	public boolean isPlayerAbleToStopSex() {
		return Main.game.getPlayer().isQuestProgressGreaterThan(QuestLine.MAIN, Quest.MAIN_2_D_MEETING_A_LILIN);
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public SexPace getForcedSexPace(GameCharacter character) {
		if(!character.isPlayer()) {
			if(Main.game.getPlayer().getRace()==Race.HUMAN) {
				if(Sex.isDom(character)) {
					return SexPace.DOM_NORMAL;
				} else {
					return SexPace.SUB_EAGER;
				}

			} else {
				if(Sex.isDom(character)) {
					return SexPace.DOM_NORMAL;
				} else {
					return SexPace.SUB_NORMAL;
				}
			}
		}
		return null;
	}
}


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

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

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.npc.submission.Roxy;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.6
 * @version 0.3.5.5
 * @author Innoxia
 */
public class SMRoxyPussyLicker extends SexManagerDefault {

	public SMRoxyPussyLicker(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.LYING_DOWN,
				dominants,
				submissives);
	}

	@Override
	public Map<GameCharacter, List<CoverableArea>> exposeAtStartOfSexMap() {
		Map<GameCharacter, List<CoverableArea>> map = new HashMap<>();
		map.put(Main.game.getNpc(Roxy.class),
				Util.newArrayListOfValues(
						CoverableArea.VAGINA));
		return map;
	}

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

	@Override
	public boolean isAbleToRemoveOthersClothing(GameCharacter character, AbstractClothing clothing){
		return false;
	}

	@Override
	public boolean isSwapPositionAllowed(GameCharacter character, GameCharacter target) {
		return false;
	}

	@Override
	public boolean isPositionChangingAllowed(GameCharacter character) {
		return false;
	}

	@Override
	public boolean isPartnerWantingToStopSex(GameCharacter partner) {
		return Sex.getNumberOfOrgasms(Main.game.getNpc(Roxy.class))>=1;
	}

	@Override
	public List<CoverableArea> getAdditionalAreasToExposeDuringSex(GameCharacter performer, GameCharacter target) {
		return new ArrayList<>();
	}
}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.1.69
 * @version 0.3.4
 * @author Innoxia
 */
public class SMAgainstWall extends SexManagerDefault {

	public SMAgainstWall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.AGAINST_WALL,
				dominants,
				submissives);
	}

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;

/**
 * @since 0.1.69
 * @version 0.3.4
 * @author Innoxia
 */
public class SMAllFours extends SexManagerDefault {

	public SMAllFours(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPosition.ALL_FOURS,
				dominants,
				submissives);
	}

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.1.69
 * @version 0.1.97
 * @author Innoxia
 */
public class SMBackToWall extends SexManagerDefault {

	public SMBackToWall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.BACK_TO_WALL,
				dominants,
				submissives);
	}

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.1.69
 * @version 0.1.97
 * @author Innoxia
 */
public class SMDoggy extends SexManagerDefault {

	public SMDoggy(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.DOGGY_STYLE,
				dominants,
				submissives);
	}

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class SMFaceSitting extends SexManagerDefault {

	public SMFaceSitting(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.FACE_SITTING,
				dominants,
				submissives);
	}

}


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

import java.util.Map;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.sex.managers.SexManagerDefault;
import com.lilithsthrone.game.sex.positions.SexSlot;
import com.lilithsthrone.game.sex.positions.SexPositionBipeds;

/**
 * @since 0.1.69
 * @version 0.1.97
 * @author Innoxia
 */
public class SMFaceToWall extends SexManagerDefault {

	public SMFaceToWall(Map<GameCharacter, SexSlot> dominants, Map<GameCharacter, SexSlot> submissives) {
		super(SexPositionBipeds.FACING_WALL,
				dominants,
				submissives);

	}

}