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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.body.valueEnums.Lactation;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.3.4.5
 * @version 0.3.4.5
 * @author Innoxia
 */
public class PlayerSelfFingerBreasts {

	public static final SexAction FEEL_BREASTS = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.BREAST)),
			SexParticipantType.SELF) {

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

		@Override
		public String getActionDescription() {
			return "Squeeze and grope your own [npc.breasts+].";
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterPerformingAction().hasBreasts()
					&& Sex.getSexPace(Sex.getCharacterPerformingAction())!=SexPace.SUB_RESISTING
					 && Sex.getCharacterPerformingAction().isPlayer();
		}

		@Override
		public String getDescription() {
			if(!Sex.getCharacterPerformingAction().isCoverableAreaExposed(CoverableArea.NIPPLES)){
				UtilText.nodeContentSB.setLength(0);

				switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
					case DOM_GENTLE:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] chest, [npc.name] [npc.verb(let)] out a soft [npc.moan] as [npc.she] [npc.verb(start)] fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " softly pressing [npc.her] [npc.lowClothing(NIPPLES)] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to gently press [npc.her] [npc.hands+]"
									+ " against [npc.her] [npc.topClothing(NIPPLES)], before starting to softly grope and squeeze [npc.her] chest.",
								"Teasing [npc.her] [npc.fingers] over [npc.her] [npc.topClothing(NIPPLES)],"
										+ " [npc.name] [npc.verb(start)] softly [npc.moaning] and sighing as [npc.she] gently [npc.verb(fondle)] and [npc.verb(grope)] [npc.her] own [npc.breastRows] [npc.breasts+]."));
						break;
					case DOM_ROUGH:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] chest, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(start)] roughly fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " forcefully grinding [npc.her] [npc.lowClothing(NIPPLES)] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to forcefully grind [npc.her] [npc.hands+]"
									+ " against [npc.her] [npc.topClothing(NIPPLES)], before starting to roughly grope and squeeze [npc.her] chest.",
								"Running [npc.her] [npc.fingers] over [npc.her] [npc.topClothing(NIPPLES)],"
										+ " [npc.name] [npc.verb(start)] loudly panting and [npc.moaning] as [npc.she] roughly [npc.verb(fondle)] and [npc.verb(grope)] [npc.her] own [npc.breastRows] [npc.breasts+]."));
						break;
					case SUB_NORMAL:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] chest, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(start)] fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " pressing [npc.her] [npc.lowClothing(NIPPLES)] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to press [npc.her] [npc.hands+]"
									+ " against [npc.her] [npc.topClothing(NIPPLES)], before starting to grope and squeeze [npc.her] chest.",
								"Running [npc.her] [npc.fingers] over [npc.her] [npc.topClothing(NIPPLES)],"
										+ " [npc.name] [npc.verb(start)] panting and [npc.moaning] as [npc.she] [npc.verb(fondle)] and [npc.verb(grope)] [npc.her] own [npc.breastRows] [npc.breasts+]."));
						break;
					default: // Dom normal and sub eager:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] chest, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(start)] eagerly fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " desperately pressing [npc.her] [npc.lowClothing(NIPPLES)] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to eagerly press [npc.her] [npc.hands+]"
									+ " against [npc.her] [npc.topClothing(NIPPLES)], before starting to frantically grope and squeeze [npc.her] chest.",
								"Running [npc.her] [npc.fingers] over [npc.her] [npc.topClothing(NIPPLES)],"
										+ " [npc.name] [npc.verb(start)] desperately panting and [npc.moaning] as [npc.she] eagerly [npc.verb(fondle)] and [npc.verb(grope)] [npc.her] own [npc.breastRows] [npc.breasts+]."));
						break;
				}

				switch (Sex.getCharacterPerformingAction().getBreastStoredMilk()) {
					case ONE_TRICKLE:
						UtilText.nodeContentSB.append(" A small trickle of [npc.milk] leaks out into [npc.her] [npc.lowClothing(NIPPLES)] as [npc.she] [npc.verb(squeeze)] down on [npc.her] [npc.nipples+].");
						break;
					case TWO_SMALL_AMOUNT:
						UtilText.nodeContentSB.append(" A small squirt of [npc.milk] leaks out into [npc.her] [npc.lowClothing(NIPPLES)] as [npc.she] [npc.verb(squeeze)] down on [npc.her] [npc.nipples+].");
						break;
					case THREE_DECENT_AMOUNT:
						UtilText.nodeContentSB.append(" A trickle of [npc.milk] runs out into [npc.her] [npc.lowClothing(NIPPLES)] as [npc.she] [npc.verb(squeeze)] down on [npc.her] [npc.nipples+].");
						break;
					case FOUR_LARGE_AMOUNT:
						UtilText.nodeContentSB.append(" Almost immediately, [npc.her] [npc.milk] [npc.verb(start)] to flow out of [npc.her] [npc.nipples+] and into [npc.her] [npc.lowClothing(NIPPLES)].");
						break;
					case FIVE_VERY_LARGE_DROOLING:
						UtilText.nodeContentSB.append(" [npc.Her] [npc.milk] quickly [npc.verb(start)] streaming out into [npc.her] [npc.lowClothing(NIPPLES)] as [npc.she] [npc.verb(squeeze)] down on [npc.her] [npc.nipples+].");
						break;
					case SIX_EXTREME_AMOUNT_DRIPPING:
						UtilText.nodeContentSB.append(" [npc.Her] [npc.milk] immediately [npc.verb(start)] pouring out in a constant stream, quickly soaking [npc.her] [npc.lowClothing(NIPPLES)].");
						break;
					case SEVEN_MONSTROUS_AMOUNT_POURING:
						UtilText.nodeContentSB.append(" [npc.Her] [npc.milk] immediately [npc.verb(start)] pouring out in a heavy flow, quickly soaking [npc.her] [npc.lowClothing(NIPPLES)].");
						break;
					default:
						break;
				}

				return UtilText.nodeContentSB.toString();

			} else {

				UtilText.nodeContentSB.setLength(0);

				switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
					case DOM_GENTLE:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] exposed chest, [npc.name] [npc.verb(let)] out a soft [npc.moan] as [npc.she] [npc.verb(start)] fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " softly pressing [npc.her] [npc.fingers+] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to gently press [npc.her] [npc.hands+]"
									+ " against [npc.her] exposed chest, before starting to softly grope and squeeze [npc.her] [npc.breastRows] [npc.breasts].",
								"Teasing [npc.her] [npc.fingers] over [npc.her] exposed [npc.breastRows] [npc.breasts+],"
										+ " [npc.name] [npc.verb(start)] gently [npc.moaning] and sighing as [npc.she] [npc.verb(begin)] to gently fondle and grope them."));
						break;
					case DOM_ROUGH:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] exposed chest, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(start)] roughly fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " forcefully grinding [npc.her] [npc.fingers+] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to forcefully grind [npc.her] [npc.hands+]"
									+ " against [npc.her] exposed chest, before starting to roughly grope and squeeze [npc.her] [npc.breastRows] [npc.breasts].",
								"Running [npc.her] [npc.fingers] over [npc.her] exposed [npc.breastRows] [npc.breasts+],"
										+ " [npc.name] [npc.verb(start)] loudly panting and [npc.moaning] as [npc.she] [npc.verb(begin)] to roughly fondle and grope them."));
						break;
					case SUB_NORMAL:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] exposed chest, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(start)] fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " pressing [npc.her] [npc.fingers+] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to press [npc.her] [npc.hands+]"
									+ " against [npc.her] exposed chest, before starting to grope and squeeze [npc.her] [npc.breastRows] [npc.breasts].",
								"Running [npc.her] [npc.fingers] over [npc.her] exposed [npc.breastRows] [npc.breasts+],"
										+ " [npc.name] [npc.verb(start)] panting and [npc.moaning] as [npc.she] [npc.verb(begin)] to fondle and grope them."));
						break;
					default: // Dom normal and sub eager:
						UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
								"Reaching up to [npc.her] exposed chest, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] [npc.verb(start)] eagerly fondling and groping [npc.her] [npc.breastRows] [npc.breasts+],"
										+ " desperately pressing [npc.her] [npc.fingers+] down against [npc.her] [npc.nipples+] in the process.",
								"Turned on and desperate to have [npc.her] [npc.breasts+] toyed with, [npc.name] [npc.verb(reach)] up to eagerly press [npc.her] [npc.hands+]"
									+ " against [npc.her] exposed chest, before starting to frantically grope and squeeze [npc.her] [npc.breastRows] [npc.breasts].",
								"Running [npc.her] [npc.fingers] over [npc.her] exposed [npc.breastRows] [npc.breasts+],"
										+ " [npc.name] [npc.verb(start)] desperately panting and [npc.moaning] as [npc.she] [npc.verb(begin)] to eagerly fondle and grope them."));
						break;
				}

				switch (Sex.getCharacterPerformingAction().getBreastStoredMilk()) {
					case ONE_TRICKLE:
						UtilText.nodeContentSB.append(" A small trickle of [npc.milk] leaks out onto [npc.her] [npc.fingers] as [npc.she] [npc.verb(squeeze)] down on [npc.namePos] [npc.nipples+].");
						break;
					case TWO_SMALL_AMOUNT:
						UtilText.nodeContentSB.append(" A small squirt of [npc.milk] leaks out onto [npc.her] [npc.fingers] as [npc.she] [npc.verb(squeeze)] down on [npc.namePos] [npc.nipples+].");
						break;
					case THREE_DECENT_AMOUNT:
						UtilText.nodeContentSB.append(" A trickle of [npc.milk] runs out over [npc.her] [npc.fingers] as [npc.she] [npc.verb(squeeze)] down on [npc.namePos] [npc.nipples+].");
						break;
					case FOUR_LARGE_AMOUNT:
						UtilText.nodeContentSB.append(" Almost immediately, [npc.her] [npc.milk] starts to flow out over [npc.her] [npc.fingers],"
								+ " and [npc.she] [npc.moansVerb] as [npc.she] [npc.verb(feel)] it running down over [npc.her] [npc.breasts+].");
						break;
					case FIVE_VERY_LARGE_DROOLING:
						UtilText.nodeContentSB.append(" [npc.Her] [npc.milk] quickly [npc.verb(start)] drooling out in a little stream over [npc.her] [npc.fingers] as [npc.she] [npc.verb(squeeze)] down on [npc.her] [npc.nipples+].");
						break;
					case SIX_EXTREME_AMOUNT_DRIPPING:
						UtilText.nodeContentSB.append(" [npc.Her] [npc.milk] immediately [npc.verb(start)] pouring out in a constant stream, quickly soaking [npc.her] [npc.breasts+] and dripping down onto the floor beneath [npc.herHim].");
						break;
					case SEVEN_MONSTROUS_AMOUNT_POURING:
						UtilText.nodeContentSB.append(" [npc.Her] [npc.milk] [npc.verb(start)] pouring out in a heavy flow, quickly soaking [npc.her] [npc.breasts+] and dripping down to form a large pool on the floor beneath [npc.herHim].");
						break;
					default:
						break;
				}

				return UtilText.nodeContentSB.toString();

			}
		}

		@Override
		public void applyEffects(){
			if(!Sex.getCharacterPerformingAction().isCoverableAreaExposed(CoverableArea.NIPPLES)
					&& Sex.getCharacterPerformingAction().getBreastStoredMilk().getMinimumValue()>=Lactation.ONE_TRICKLE.getMinimumValue()
					&& Sex.getCharacterPerformingAction().getLowestZLayerCoverableArea(CoverableArea.NIPPLES)!=null) {
				Sex.getCharacterPerformingAction().getLowestZLayerCoverableArea(CoverableArea.NIPPLES).setDirty(Sex.getCharacterPerformingAction(), true);
			}
		}

		@Override
		public String applyEffectsString() {
			return Sex.getCharacterPerformingAction().incrementBreastStoredMilk(-10);
		}

	};
}


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

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

	public static final SexAction PLAYER_PINCH_NIPPLE_CROTCH = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION_AND_EXPOSED,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexPace(Main.game.getPlayer())!=SexPace.SUB_RESISTING
					&& Sex.getCharacterPerformingAction().isPlayer()
					&& Sex.getCharacterPerformingAction().getLegConfiguration().isBipedalPositionedCrotchBoobs();
		}

		@Override
		public String getActionTitle() {
			return "Pinch crotch-nipples";
		}

		@Override
		public String getActionDescription() {
			return "Play with your [pc.crotchNipples].";
		}

		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"You reach down to your [pc.crotchBoobs] and start playing with your hard [pc.crotchNipples], pinching and rubbing them as you moan with arousal.",
					"Your fingertips tease over your [pc.crotchBoobs], stopping to pinch and tug at your [pc.crotchNipples] as you moan and sigh in delight.",
					"You reach down to your [pc.crotchBoobs], and, with eager fingers, start to pinch and rub at your exposed [pc.crotchNipples].",
					Sex.isMasturbation()
						?"Your [pc.crotchNipples] are just begging for some attention, and you whine in delight as you reach down to start pinching them."
						:UtilText.parse(Sex.getCharacterTargetedForSexAction(this),
								"Your [pc.crotchNipples] are just begging for some attention, and you reach down and start to pinch at them, whining in delight as [npc.name] smirks at you.")));

			switch (Main.game.getPlayer().getBreastCrotchStoredMilk()) {
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(" A small trickle of [pc.crotchMilk] leaks out onto your fingertips.");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(" A small squirt of [pc.crotchMilk] leaks out onto your fingertips.");
					break;
				case THREE_DECENT_AMOUNT:
					UtilText.nodeContentSB.append(" A trickle of [pc.crotchMilk] runs out over your fingertips.");
					break;
				case FOUR_LARGE_AMOUNT:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts to flow out over your fingers and run down your [pc.crotchBoobs+].");
					break;
				case FIVE_VERY_LARGE_DROOLING:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts drooling out in a little stream over your fingers.");
					break;
				case SIX_EXTREME_AMOUNT_DRIPPING:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts pouring out in a constant stream to run down your [pc.crotchBoobs+].");
					break;
				case SEVEN_MONSTROUS_AMOUNT_POURING:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts pouring out in a heavy flow to quickly soak your [pc.crotchBoobs+].");
					break;
				default:
					break;
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String applyEffectsString() {
			return Main.game.getPlayer().incrementBreastCrotchStoredMilk(-10);
		}

	};

	public static final SexAction PLAYER_SELF_FINGER_NIPPLE_CROTCH_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Finger crotch-nipples";
		}

		@Override
		public String getActionDescription() {
			return "Sink your fingers into your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"You reach down, letting out a lewd moan as you eagerly sink your fingers into your fuckable [pc.crotchNipples].",
					"Your fingertips tease over your [pc.crotchBoobs], circling around your [pc.crotchNipples] before greedily sinking inside.",
					"You moan and squeal as you start eagerly fingering your nipple-cunts.",
					"With a lewd cry, you sink your digits into your inviting nipple-cunts, panting heavily as you start eagerly fingering yourself."));

			switch (Main.game.getPlayer().getBreastCrotchStoredMilk()) {
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(" A small trickle of [pc.crotchMilk] leaks out around your fingertips.");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(" A small squirt of [pc.crotchMilk] leaks out around your fingertips.");
					break;
				case THREE_DECENT_AMOUNT:
					UtilText.nodeContentSB.append(" A trickle of [pc.crotchMilk] runs out around your fingertips.");
					break;
				case FOUR_LARGE_AMOUNT:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts to flow out around your fingers and run down your [pc.crotchBoobs+].");
					break;
				case FIVE_VERY_LARGE_DROOLING:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts drooling out in a little stream around your fingers.");
					break;
				case SIX_EXTREME_AMOUNT_DRIPPING:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts pouring out in a constant stream to run down your [pc.crotchBoobs+].");
					break;
				case SEVEN_MONSTROUS_AMOUNT_POURING:
					UtilText.nodeContentSB.append(" Your [pc.crotchMilk] starts pouring out in a heavy flow to quickly soak your [pc.crotchBoobs+].");
					break;
				default:
					break;
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String applyEffectsString() {
			return Main.game.getPlayer().incrementBreastCrotchStoredMilk(-10);
		}
	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_NIPPLE_CROTCH_GENTLE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF,
			SexPace.DOM_GENTLE) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer())
					&& Sex.getCharacterPerformingAction().getLegConfiguration().isBipedalPositionedCrotchBoobs();
		}

		@Override
		public String getActionTitle() {
			return "Gentle nipple fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Gently finger your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you slowly push your [pc.fingers] deep inside your [pc.crotchNipple+].",
					"Gently pumping your [pc.fingers] in and out of your [pc.crotchNipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.crotchBoob+].",
					"Curling your [pc.fingers] up inside your [pc.crotchNipple], you let out a little whimper as you start pumping your digits in and out of your [pc.crotchBoob+].",
					"Focusing on pleasuring your fuckable [pc.crotchBoobs], you start gently pumping your [pc.fingers] in and out of one of your [pc.crotchNipples+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_NIPPLE_CROTCH_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF,
			SexPace.DOM_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer())
					&& Sex.getCharacterPerformingAction().getLegConfiguration().isBipedalPositionedCrotchBoobs();
		}

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

		@Override
		public String getActionDescription() {
			return "Concentrate on fingering your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.fingers] deep inside your [pc.crotchNipple+].",
					"Pumping your [pc.fingers] in and out of your [pc.crotchNipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.crotchBoob+].",
					"Curling your [pc.fingers] up inside your fuckable [pc.crotchNipple], you let out [pc.a_moan] as you start pumping your digits in and out of your [pc.crotchBoob+].",
					"Focusing on pleasuring your [pc.crotchBoobs+], you start pumping your [pc.fingers] in and out of one of your [pc.crotchNipples+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_NIPPLE_CROTCH_ROUGH = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF,
			SexPace.DOM_ROUGH) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer())
					&& Sex.getCharacterPerformingAction().getLegConfiguration().isBipedalPositionedCrotchBoobs();
		}

		@Override
		public String getActionTitle() {
			return "Rough nipple-fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Roughly finger your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you roughly slam your [pc.fingers] deep inside your [pc.crotchNipple+], before starting to rapidly finger your [pc.crotchBoob].",
					"Roughly pumping your [pc.fingers] in and out of your [pc.crotchNipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.crotchBoob+].",
					"Forcefully curling your [pc.fingers] up inside your fuckable [pc.crotchNipple], you let out [pc.a_moan] as you start roughly grinding your digits in and out of your [pc.crotchBoob+].",
					"Focusing on pleasuring your fuckable [pc.crotchBoobs+], you start roughly slamming your [pc.fingers] in and out of one of your [pc.crotchNipples+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_FINGER_NIPPLE_CROTCH_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF,
			SexPace.SUB_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer())
					&& Sex.getCharacterPerformingAction().getLegConfiguration().isBipedalPositionedCrotchBoobs();
		}

		@Override
		public String getActionTitle() {
			return "Nipple-fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Concentrate on fingering your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.fingers] deep inside your [pc.crotchNipple+].",
					"Pumping your [pc.fingers] in and out of your [pc.crotchNipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.crotchBoob+].",
					"Curling your [pc.fingers] up inside your fuckable [pc.crotchNipple], you let out [pc.a_moan] as you start pumping your digits in and out of your [pc.crotchBoob+].",
					"Focusing on pleasuring your [pc.crotchBoobs+], you start pumping your [pc.fingers] in and out of one of your [pc.crotchNipples+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_FINGER_NIPPLE_CROTCH_EAGER = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF,
			SexPace.SUB_EAGER) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer())
					&& Sex.getCharacterPerformingAction().getLegConfiguration().isBipedalPositionedCrotchBoobs();
		}

		@Override
		public String getActionTitle() {
			return "Eager nipple-fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Eagerly finger your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you eagerly slam your [pc.fingers] deep inside your [pc.crotchNipple+], before starting to desperately finger your [pc.crotchBoob].",
					"Enthusiastically pumping your [pc.fingers] in and out of your [pc.crotchNipple+], you find yourself letting out a series of delighted [pc.moans] as you frantically finger your [pc.crotchBoob+].",
					"Desperately curling your [pc.fingers] up inside your fuckable [pc.crotchNipple], you let out [pc.a_moan] as you start eagerly grinding your digits in and out of your [pc.crotchBoob+].",
					"Focusing on pleasuring your fuckable [pc.crotchBoobs+], you eagerly start slamming your [pc.fingers] in and out of one of your [pc.crotchNipples+].");
		}

	};

	public static final SexAction PLAYER_SELF_FINGER_NIPPLE_CROTCH_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE_CROTCH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public String getActionTitle() {
			return "Stop fingering nipples (self)";
		}

		@Override
		public String getActionDescription() {
			return "Stop fingering your [pc.crotchNipples+].";
		}

		@Override
		public String getDescription() {
			return "Letting out a satisfied [pc.moan], you slide your fingers out of your [pc.crotchNipples+].";
		}
	};
}

repo_name: klorpa/Pedo

license: unknown


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.LubricationType;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.2.9
 * @author Innoxia
 */
public class PlayerSelfFingerMouth {

	public static final SexAction PLAYER_SELF_FINGER_MOUTH_LUBRICATION = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION_AND_EXPOSED,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ZERO_NONE,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.MOUTH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.hasLubricationTypeFromAnyone(Main.game.getPlayer(), SexAreaPenetration.FINGER, LubricationType.SALIVA);
		}

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

		@Override
		public String getActionDescription() {
			return "Lubricate your fingers with your saliva.";
		}

		@Override
		public String getDescription() {
			return "Lifting your [pc.hand] up to your mouth, you slide your [pc.fingers] past your [pc.lips+], before lewdly sucking on them for a moment in order to get them well lubricated with your saliva.";
		}

		@Override
		public void applyEffects() {
			Sex.transferLubrication(Main.game.getPlayer(), SexAreaPenetration.FINGER, Main.game.getPlayer(), SexAreaOrifice.MOUTH);
		}
	};

	public static final SexAction PLAYER_SELF_FINGER_MOUTH_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ZERO_NONE,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.MOUTH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

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

		@Override
		public String getActionDescription() {
			return "Put your [pc.fingers] in your mouth and start sucking them.";
		}

		@Override
		public String getDescription() {
			return "Lifting your [pc.hand] up to your mouth, you slide your [pc.fingers] past your [pc.lips+] before starting to lewdly suck on your intruding digits.";
		}
	};

	public static final SexAction PLAYER_SELF_FINGER_MOUTH_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.MOUTH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public String getActionTitle() {
			return "Stop sucking fingers (self)";
		}

		@Override
		public String getActionDescription() {
			return "Stop sucking your [pc.fingers].";
		}

		@Override
		public String getDescription() {
			return "With a little sigh, you slide your saliva-coated [pc.fingers] out of your mouth.";
		}
	};
}


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.2.11
 * @author Innoxia
 */
public class PlayerSelfFingerNipple {

	public static final SexAction PLAYER_PINCH_NIPPLES = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION_AND_EXPOSED,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexPace(Main.game.getPlayer())!=SexPace.SUB_RESISTING && Sex.getCharacterPerformingAction().isPlayer();
		}

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

		@Override
		public String getActionDescription() {
			return "Play with your nipples.";
		}

		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"You reach up and start playing with your hard nipples, pinching and rubbing them as you moan with arousal.",
					"Your fingertips tease over your breasts, stopping to pinch and tug at your nipples as you moan and sigh in delight.",
					"You reach up to your breasts, and, with eager fingers, start to pinch and rub at your exposed nipples.",
					"Your nipples are just begging for some attention, and you whine in delight as you reach up to start pinching them."));

			switch (Main.game.getPlayer().getBreastStoredMilk()) {
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(" A small trickle of [pc.milk] leaks out onto your fingertips.");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(" A small squirt of [pc.milk] leaks out onto your fingertips.");
					break;
				case THREE_DECENT_AMOUNT:
					UtilText.nodeContentSB.append(" A trickle of [pc.milk] runs out over your fingertips.");
					break;
				case FOUR_LARGE_AMOUNT:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts to flow out over your fingers and run down your [pc.breasts+].");
					break;
				case FIVE_VERY_LARGE_DROOLING:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts drooling out in a little stream over your fingers.");
					break;
				case SIX_EXTREME_AMOUNT_DRIPPING:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts pouring out in a constant stream to run down your [pc.breasts+].");
					break;
				case SEVEN_MONSTROUS_AMOUNT_POURING:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts pouring out in a heavy flow to quickly soak your [pc.breasts+].");
					break;
				default:
					break;
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String applyEffectsString() {
			return Main.game.getPlayer().incrementBreastStoredMilk(-10);
		}

	};

	public static final SexAction PLAYER_SELF_FINGER_NIPPLE_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Finger nipples (self)";
		}

		@Override
		public String getActionDescription() {
			return "Sink your fingers into your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"You reach up, letting out a lewd moan as you eagerly sink your fingers into your fuckable nipples.",

					"Your fingertips tease over your breasts, circling around your nipples before greedily sinking inside.",

					"You moan and squeal as you start eagerly fingering your nipple-cunts.",

					"With a lewd cry, you sink your digits into your inviting nipple-cunts, panting heavily as you start eagerly fingering yourself."));

			switch (Main.game.getPlayer().getBreastStoredMilk()) {
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(" A small trickle of [pc.milk] leaks out around your fingertips.");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(" A small squirt of [pc.milk] leaks out around your fingertips.");
					break;
				case THREE_DECENT_AMOUNT:
					UtilText.nodeContentSB.append(" A trickle of [pc.milk] runs out around your fingertips.");
					break;
				case FOUR_LARGE_AMOUNT:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts to flow out around your fingers and run down your [pc.breasts+].");
					break;
				case FIVE_VERY_LARGE_DROOLING:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts drooling out in a little stream around your fingers.");
					break;
				case SIX_EXTREME_AMOUNT_DRIPPING:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts pouring out in a constant stream to run down your [pc.breasts+].");
					break;
				case SEVEN_MONSTROUS_AMOUNT_POURING:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts pouring out in a heavy flow to quickly soak your [pc.breasts+].");
					break;
				default:
					break;
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String applyEffectsString() {
			return Main.game.getPlayer().incrementBreastStoredMilk(-10);
		}
	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_NIPPLE_GENTLE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.DOM_GENTLE) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Gentle nipple fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Gently finger your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you slowly push your [pc.fingers] deep inside your [pc.nipple+].",

					"Gently pumping your [pc.fingers] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.breast+].",

					"Curling your [pc.fingers] up inside your [pc.nipple], you let out a little whimper as you start pumping your digits in and out of your [pc.breast+].",

					"Focusing on pleasuring your fuckable [pc.breasts], you start gently pumping your [pc.fingers] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_NIPPLE_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.DOM_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

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

		@Override
		public String getActionDescription() {
			return "Concentrate on fingering your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.fingers] deep inside your [pc.nipple+].",

					"Pumping your [pc.fingers] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.breast+].",

					"Curling your [pc.fingers] up inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start pumping your digits in and out of your [pc.breast+].",

					"Focusing on pleasuring your [pc.breasts+], you start pumping your [pc.fingers] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_NIPPLE_ROUGH = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.DOM_ROUGH) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Rough nipple-fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Roughly finger your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you roughly slam your [pc.fingers] deep inside your [pc.nipple+], before starting to rapidly finger your [pc.breast].",

					"Roughly pumping your [pc.fingers] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.breast+].",

					"Forcefully curling your [pc.fingers] up inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start roughly grinding your digits in and out of your [pc.breast+].",

					"Focusing on pleasuring your fuckable [pc.breasts+], you start roughly slamming your [pc.fingers] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_FINGER_NIPPLE_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.SUB_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Nipple-fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Concentrate on fingering your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.fingers] deep inside your [pc.nipple+].",

					"Pumping your [pc.fingers] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger your [pc.breast+].",

					"Curling your [pc.fingers] up inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start pumping your digits in and out of your [pc.breast+].",

					"Focusing on pleasuring your [pc.breasts+], you start pumping your [pc.fingers] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_FINGER_NIPPLE_EAGER = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.SUB_EAGER) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Eager nipple-fingering (self)";
		}

		@Override
		public String getActionDescription() {
			return "Eagerly finger your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you eagerly slam your [pc.fingers] deep inside your [pc.nipple+], before starting to desperately finger your [pc.breast].",

					"Enthusiastically pumping your [pc.fingers] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you frantically finger your [pc.breast+].",

					"Desperately curling your [pc.fingers] up inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start eagerly grinding your digits in and out of your [pc.breast+].",

					"Focusing on pleasuring your fuckable [pc.breasts+], you eagerly start slamming your [pc.fingers] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction PLAYER_SELF_FINGER_NIPPLE_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public String getActionTitle() {
			return "Stop fingering nipples (self)";
		}

		@Override
		public String getActionDescription() {
			return "Stop fingering your [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			return "Letting out a satisfied [pc.moan], you slide your fingers out of your [pc.nipples+].";
		}
	};
}


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.positions.slots.SexSlotTag;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.3.4
 * @author Innoxia
 */
public class PlayerSelfFingerVagina {

	public static final SexAction PLAYER_SELF_FINGER_VAGINA_SPREAD_PUSSY = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION_AND_EXPOSED,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.TWO_LOW,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getSexPace(Main.game.getPlayer())!=SexPace.SUB_RESISTING && Sex.getCharacterPerformingAction().isPlayer();
		}

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

		@Override
		public String getActionDescription() {
			return "Use your [pc.fingers] to spread your pussy.";
		}

		@Override
		public String getDescription() {
			if(Sex.isMasturbation()) {
				if(Sex.getSexPositionSlot(Main.game.getPlayer()).hasTag(SexSlotTag.ALL_FOURS)) {
					return UtilText.returnStringAtRandom(
							"Reaching back between your [pc.legs], you tease your fingers over the entrance to your [pc.pussy+], before letting out [pc.a_moan+] as you use your digits to spread out your [pc.labia+].",
							"You probe your fingers back between your [pc.legs], moaning softly as you use two of your digits to invitingly spread out your [pc.pussy+] in order to present yourself.",
							"Sliding your fingertips over your [pc.pussy+], you let out [pc.a_moan+] as you shake your ass a little, before using your digits to spread out your pussy lips.",
							"You eagerly slide your fingers over your needy [pc.pussy], [pc.moaning+] as you use your digits to part your soft folds and present yourself for penetration.");
				} else {
					return UtilText.returnStringAtRandom(
							"Reaching down between your [pc.legs], you tease your fingers over the entrance to your [pc.pussy+], before letting out [pc.a_moan+] as you use your digits to spread out your [pc.labia+].",
							"You probe your fingers down between your [pc.legs], moaning softly as you use two of your digits to invitingly spread out your [pc.pussy+].",
							"Sliding your fingertips over your [pc.pussy+], you let out [pc.a_moan+] as you use your digits to spread out your pussy lips.",
							"You eagerly slide your fingers over your needy [pc.pussy], [pc.moaning+] as you use your digits to part your soft folds and present yourself for penetration.");
				}

			} else {
				if(Sex.getSexPositionSlot(Main.game.getPlayer()).hasTag(SexSlotTag.ALL_FOURS)) {
					return UtilText.parse(Sex.getCharacterPerformingAction(), Sex.getTargetedPartner(Sex.getCharacterPerformingAction()),
							UtilText.returnStringAtRandom(
							"Reaching back between your [pc.legs], you tease your fingers over the entrance to your [pc.pussy+], before letting out [pc.a_moan+] as you use your digits to spread out your labia for [npc2.name].",
							"You probe your fingers back between your [pc.legs], moaning softly as you use two of your digits to invitingly spread out your [pc.pussy+] and present yourself to [npc2.name].",
							"Sliding your fingertips over your [pc.pussy+], you let out [pc.a_moan+] as you shake your ass a little, before using your digits to spread out your pussy lips.",
							"You eagerly slide your fingers over your needy [pc.pussy], [pc.moaning+] as you use your digits to part your soft folds and present yourself for penetration."));
				} else {
					return UtilText.parse(Sex.getCharacterPerformingAction(), Sex.getTargetedPartner(Sex.getCharacterPerformingAction()),
							UtilText.returnStringAtRandom(
							"Reaching down between your [pc.legs], you tease your fingers over the entrance to your [pc.pussy+], before letting out [pc.a_moan+] as you use your digits to spread out your labia.",
							"You probe your fingers down between your [pc.legs], moaning softly as you use two of your digits to invitingly spread out your [pc.pussy+].",
							"Sliding your fingertips over your [pc.pussy+], you let out [pc.a_moan+] as you use your digits to spread out your pussy lips.",
							"You eagerly slide your fingers over your needy [pc.pussy], [pc.moaning+] as you use your digits to part your soft folds and present yourself for penetration."));
				}
			}
		}

		@Override
		public void applyEffects() {
			Sex.transferLubrication(Main.game.getPlayer(), SexAreaPenetration.FINGER, Main.game.getPlayer(), SexAreaOrifice.VAGINA);
		}

	};

	public static final SexAction PLAYER_SELF_FINGER_VAGINA_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

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

		@Override
		public String getActionDescription() {
			return "Start fingering yourself.";
		}

		@Override
		public String getDescription() {
			return (UtilText.returnStringAtRandom(
					"Reaching down between your [pc.legs], you tease your fingers over the entrance to your [pc.pussy+], before letting out [pc.a_moan+] as you push your digits deep inside.",

					"You probe your fingers down between your [pc.legs], moaning softly as you push two of your digits into your inviting [pc.pussy+].",

					"Sliding your fingertips over your neglected [pc.pussy], you let out [pc.a_moan+] as you push your digits inside and start fingering yourself.",

					"You eagerly push your fingers into your needy [pc.pussy], [pc.moaning+] as you curl your digits up inside yourself and start stroking in a 'come-hither' motion."));
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_VAGINA_GENTLE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF,
			SexPace.DOM_GENTLE) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

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

		@Override
		public String getActionDescription() {
			return "Gently finger your [pc.pussy+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you slowly push your [pc.fingers] deep inside your [pc.pussy+].",

					"Gently pumping your [pc.fingers] in and out of your [pc.pussy+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger yourself.",

					"Curling your [pc.fingers] up inside your [pc.pussy], you let out a little whimper as you start stroking your vaginal walls.",

					"Focusing on the pleasure you're giving yourself between your [pc.legs], you start gently pumping your [pc.fingers] in and out of your [pc.pussy+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_VAGINA_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF,
			SexPace.DOM_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

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

		@Override
		public String getActionDescription() {
			return "Concentrate on fingering yourself.";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.fingers] deep inside your [pc.pussy+].",

					"Pumping your [pc.fingers] in and out of your [pc.pussy+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger yourself.",

					"Curling your [pc.fingers] up inside your [pc.pussy], you let out [pc.a_moan] as you start stroking your vaginal walls.",

					"Focusing on the pleasure you're giving yourself between your [pc.legs], you start pumping your [pc.fingers] in and out of your [pc.pussy+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_FINGER_VAGINA_ROUGH = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF,
			SexPace.DOM_ROUGH) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

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

		@Override
		public String getActionDescription() {
			return "Roughly finger yourself.";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you roughly slam your [pc.fingers] deep inside your [pc.pussy+], before starting to roughly finger yourself.",

					"Roughly pumping your [pc.fingers] in and out of your [pc.pussy+], you find yourself letting out a series of delighted [pc.moans] as you ruthlessly finger yourself.",

					"Forcefully curling your [pc.fingers] up inside your [pc.pussy], you let out [pc.a_moan] as you start roughly grinding your fingertips up against your vaginal walls.",

					"Focusing on the pleasure you're giving yourself between your [pc.legs], you start roughly slamming your [pc.fingers] in and out of your [pc.pussy+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_FINGER_VAGINA_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF,
			SexPace.SUB_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

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

		@Override
		public String getActionDescription() {
			return "Concentrate on fingering yourself.";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.fingers] deep inside your [pc.pussy+].",

					"Pumping your [pc.fingers] in and out of your [pc.pussy+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically finger yourself.",

					"Curling your [pc.fingers] up inside your [pc.pussy], you let out [pc.a_moan] as you start stroking your vaginal walls.",

					"Focusing on the pleasure you're giving yourself between your [pc.legs], you start pumping your [pc.fingers] in and out of your [pc.pussy+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_FINGER_VAGINA_EAGER = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF,
			SexPace.SUB_EAGER) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

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

		@Override
		public String getActionDescription() {
			return "Eagerly finger yourself.";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you eagerly slam your [pc.fingers] deep inside your [pc.pussy+], before starting to desperately finger yourself.",

					"Enthusiastically pumping your [pc.fingers] in and out of your [pc.pussy+], you find yourself letting out a series of delighted [pc.moans] as you frantically finger yourself.",

					"Desperately curling your [pc.fingers] up inside your [pc.pussy], you let out [pc.a_moan] as you start eagerly grinding your fingertips up against your vaginal walls.",

					"Focusing on the pleasure you're giving yourself between your [pc.legs], you eagerly start slamming your [pc.fingers] in and out of your [pc.pussy+].");
		}

	};

	public static final SexAction PLAYER_SELF_FINGER_VAGINA_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

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

		@Override
		public String getActionDescription() {
			return "Stop fingering yourself.";
		}

		@Override
		public String getDescription() {
			return "With [pc.a_groan+], you slide your fingers out of your [pc.pussy+].";
		}
	};
}


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

import java.util.List;

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.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.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.2.0
 * @author Innoxia
 */
public class PlayerSelfNoPen {

	public static final SexAction PLAYER_STROKE_VAGINA_SUB = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.VAGINA)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.HANDS);
		}

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

		@Override
		public String getActionDescription() {
			return "Get some pleasure from touching yourself.";
		}

		@Override
		public String getDescription() {
			if(Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.VAGINA)) {
				return UtilText.returnStringAtRandom(
						"Reaching down between your [pc.legs+], you tease your fingers over the entrance to your [pc.pussy+], letting out a deep sigh as you stimulate your outer folds.",
						"You probe your fingers down between your [pc.legs+], moaning softly as you tease your fingers over the entrance to your inviting [pc.pussy].",
						"Sliding your fingertips over your neglected [pc.pussy], you let out [pc.a_moan+] as you start stimulating your outer labia.",
						"You eagerly slide your fingers over your needy [pc.pussy], moaning and sighing as you gently press down on your outer labia.");

			} else {
				return UtilText.returnStringAtRandom(
						"You run your hand over your groin, pressing your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.VAGINA).getName()+" down hard against your needy [pc.pussy] as you let out a little whimper.",
						"You push your fingers down between your [pc.legs+], moaning and sighing as you feel your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.VAGINA).getName()+" rubbing against your pussy lips.",
						"You slide your fingertips over your "+Main.game.getPlayer().getHighestZLayerCoverableArea(CoverableArea.VAGINA).getName()+", before pressing down and trying to stimulate your [pc.pussy+] through your clothing.",
						"Pushing down between your legs with the palm of your [pc.hand], you squeeze your thighs together as you feel your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.VAGINA).getName()
								+" being pressed tightly against your neglected [pc.pussy].");
			}
		}

		@Override
		public void applyEffects() {
			if(Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.VAGINA)) {
				Sex.transferLubrication(Main.game.getPlayer(), SexAreaPenetration.FINGER, Main.game.getPlayer(), SexAreaOrifice.VAGINA);
			}
		}

	};

	public static final SexAction PLAYER_STROKE_PENIS = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaPenetration.PENIS)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.HANDS);
		}

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

		@Override
		public String getActionDescription() {
			return "Get some pleasure from stroking your [pc.cock].";
		}

		@Override
		public String getDescription() {
			if(Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS)) {
				return UtilText.returnStringAtRandom(
						"Reaching down between your [pc.legs+], you take hold of your [pc.cock+], stroking up and down its length as you let out [pc.a_moan+].",
						"You tease your [pc.fingers] over the [pc.cockHead+] of your [pc.cock+], groaning and sighing as you start jerking off.",
						"Taking hold of your [pc.cock+] in one hand, you let out [pc.a_moan+] as you start jerking off.",
						"Wrapping your [pc.fingers] around your [pc.cock+], you let out a series of [pc.groans+] as you start masturbating.");

			} else {
				return UtilText.returnStringAtRandom(
						"You run your [pc.hand] over your groin, pressing your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.PENIS).getName()+" down against your [pc.cock+] as you let out a little [pc.groan].",
						"You slide your fingers down between your [pc.legs+], letting out a little [pc.groan] as you feel your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.PENIS).getName()
								+" rubbing down against your [pc.cock+].",
						"You slide your fingertips over your "+Main.game.getPlayer().getHighestZLayerCoverableArea(CoverableArea.PENIS).getName()+", before pressing down and trying to stimulate your [pc.cock+] through your clothing.",
						"Pushing down between your legs with the palm of your hand, you rub up and down as you feel your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.PENIS).getName()
								+" being pressed tightly against your concealed [pc.cock].");
			}
		}

		@Override
		public void applyEffects() {
			if(Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS)) {
				Sex.transferLubrication(Main.game.getPlayer(), SexAreaPenetration.FINGER, Main.game.getPlayer(), SexAreaPenetration.PENIS);
			}
		}

	};

	public static final SexAction PLAYER_STROKE_MOUND = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, null)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Main.game.getPlayer().hasPenis()
					&& !Main.game.getPlayer().hasVagina()
					 && Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.HANDS);
		}

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

		@Override
		public String getActionDescription() {
			return "Get some pleasure from touching your genderless mound.";
		}

		@Override
		public String getDescription() {
			if(Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS)) {
				return UtilText.returnStringAtRandom(
						"Reaching down between your legs, you run your fingertips over your doll-like mound, moaning and sighing as you tease the sensitive area.",
						"You tease your fingers over the sensitive doll-like mound between your legs, sighing and whining as you stimulate yourself.",
						"With probing fingers, you reach down and start to pinch and rub at your surprisingly delicate genderless crotch.",
						"Despite lacking genitalia, your crotch remains a highly sensitive erogenous zone, and you eagerly start rubbing and pressing down on it with greedy fingers.");

			} else {
				return UtilText.returnStringAtRandom(
						"You run your hand over your groin, pressing your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.VAGINA).getName()+" down against your doll-like mound as you let out a little sigh.",
						"You push your fingers down between your legs, moaning and sighing as you feel your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.VAGINA).getName()
								+" rubbing against your genderless crotch.",
						"You slide your fingertips over your "+Main.game.getPlayer().getHighestZLayerCoverableArea(CoverableArea.VAGINA).getName()
								+", before pressing down and trying to stimulate your doll-like mound through your clothing.",
						"Pushing down between your legs with the palm of your hand, you squeeze your thighs together as you feel your "+Main.game.getPlayer().getLowestZLayerCoverableArea(CoverableArea.VAGINA).getName()
								+" being pressed tightly against your genderless mound.");
			}

		}

		@Override
		public List<Fetish> getFetishes(GameCharacter character) {
			if(character.isPlayer()) {
				return Util.newArrayListOfValues(Fetish.FETISH_MASTURBATION);
			} else {
				return null;
			}
		}
	};
}


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

public class PlayerSelfPenisAnus {

}


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

public class PlayerSelfPenisMouth {

}


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

public class PlayerSelfPenisNipple {

}


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

public class PlayerSelfPenisVagina {

}


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.1.79
 * @author Innoxia
 */
public class PlayerSelfTailAnus {

	public static final SexAction PLAYER_SELF_TAIL_ANUS_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.THREE_DIRTY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Tail-peg (self)";
		}

		@Override
		public String getActionDescription() {
			return "Start fucking your own [pc.ass] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Snaking your [pc.tail] up to your [pc.ass], you tease the tip over your [pc.asshole], [pc.moaning] in delight before thrusting it deep inside your [pc.asshole+].",

					"You snake your [pc.tail] up to your [pc.ass], [pc.moaning] in delight as you force it deep into your inviting [pc.asshole].",

					"Sliding the tip of your [pc.tail+] up to your neglected [pc.asshole], you suddenly thrust it deep inside, letting out [pc.a_moan+] as you start tail-fucking your own [pc.ass].",

					"You eagerly thrust your [pc.tail+] deep into your needy [pc.asshole], letting out a series of [pc.moans+] as you start tail-fucking your own [pc.ass].");

		}

	};

	public static final SexAction DOM_PLAYER_SELF_TAIL_ANUS_GENTLE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.TWO_HORNY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF,
			SexPace.DOM_GENTLE) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Gentle tail-pegging (self)";
		}

		@Override
		public String getActionDescription() {
			return "Gently fuck your own [pc.ass] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you slowly push your [pc.tail] deep inside your [pc.asshole+].",

					"Gently pumping your [pc.tail] in and out of your [pc.asshole+], you find yourself letting out a series of delighted [pc.moans] as you slowly fuck your own [pc.ass].",

					"Slowly driving your [pc.tail] deep inside your [pc.asshole], you let out a little whimper as you "
							+(Main.game.getPlayer().hasPenis() && !Sex.getCharacterPerformingAction().hasVagina()?"use it to gently start massaging your prostate.":"gently fuck your own [pc.ass+]."),

					"Focusing on pleasuring your [pc.ass+], you start gently pumping your [pc.tail] in and out of your [pc.asshole+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_TAIL_ANUS_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.TWO_HORNY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF,
			SexPace.DOM_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Tail-pegging (self)";
		}

		@Override
		public String getActionDescription() {
			return "Concentrate on fucking your own [pc.ass] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.tail] deep inside your [pc.asshole+].",

					"Pumping your [pc.tail] in and out of your [pc.asshole+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically fuck your own [pc.ass].",

					"Driving your [pc.tail] deep inside your [pc.asshole], you let out [pc.a_moan] as you "
							+(Main.game.getPlayer().hasPenis() && !Sex.getCharacterPerformingAction().hasVagina()?"use it to start massaging your prostate.":"steadily fuck your own [pc.ass+]."),

					"Focusing on pleasuring your [pc.ass+], you start pumping your [pc.tail] in and out of your [pc.asshole+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_TAIL_ANUS_ROUGH = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.THREE_DIRTY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF,
			SexPace.DOM_ROUGH) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Rough tail-pegging (self)";
		}

		@Override
		public String getActionDescription() {
			return "Roughly fuck your own [pc.ass] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you roughly slam your [pc.tail] deep inside your [pc.asshole+], before starting to roughly fuck your own [pc.ass].",

					"Roughly pumping your [pc.tail] in and out of your [pc.asshole+], you find yourself letting out a series of delighted [pc.moans] as you ruthlessly fuck your own [pc.ass].",

					"Forcefully driving your [pc.tail] deep inside your [pc.asshole], you let out [pc.a_moan] as you "
							+(Main.game.getPlayer().hasPenis() && !Sex.getCharacterPerformingAction().hasVagina()?"start roughly grinding it up against your prostate.":"roughly fuck your own [pc.ass+]."),

					"Focusing on pleasuring your [pc.ass+], you start roughly slamming your [pc.tail] in and out of your [pc.asshole+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_TAIL_ANUS_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.TWO_HORNY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF,
			SexPace.SUB_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Tail-pegging (self)";
		}

		@Override
		public String getActionDescription() {
			return "Concentrate on fucking your own [pc.ass] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.tail] deep inside your [pc.asshole+].",

					"Pumping your [pc.tail] in and out of your [pc.asshole+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically fuck your own [pc.ass].",

					"Driving your [pc.tail] deep inside your [pc.asshole], you let out [pc.a_moan] as you "
							+(Main.game.getPlayer().hasPenis() && !Sex.getCharacterPerformingAction().hasVagina()?"use it to start massaging your prostate.":"steadily fuck your own [pc.ass+]."),

					"Focusing on pleasuring your [pc.ass+], you start pumping your [pc.tail] in and out of your [pc.asshole+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_TAIL_ANUS_EAGER = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.THREE_DIRTY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF,
			SexPace.SUB_EAGER) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Eager tail-pegging (self)";
		}

		@Override
		public String getActionDescription() {
			return "Eagerly start fucking your own [pc.ass] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you eagerly slam your [pc.tail] deep inside your [pc.asshole+], before starting to desperately fuck your own [pc.ass].",

					"Enthusiastically pumping your [pc.tail] in and out of your [pc.asshole+], you find yourself letting out a series of delighted [pc.moans] as you frantically fuck your own [pc.ass].",

					"Desperately driving your [pc.tail] deep inside your [pc.asshole], you let out [pc.a_moan] as you "
							+(Main.game.getPlayer().hasPenis() && !Sex.getCharacterPerformingAction().hasVagina()?"start eagerly grinding it up against your prostate.":"eagerly fuck your own [pc.ass+]."),

					"Focusing on pleasuring your [pc.ass+], you eagerly start slamming your [pc.tail] in and out of your [pc.asshole+].");
		}

	};

	public static final SexAction PLAYER_SELF_TAIL_ANUS_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.ANUS)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Stop tail-peg (self)";
		}

		@Override
		public String getActionDescription() {
			return "Stop fucking yourself with your [pc.tail].";
		}

		@Override
		public String getDescription() {
			return "With [pc.a_groan+], you slide your [pc.tail+] out of your [pc.asshole+].";
		}
	};
}


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.LubricationType;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.2.9
 * @author Innoxia
 */
public class PlayerSelfTailMouth {

	public static final SexAction PLAYER_SELF_TAIL_MOUTH_LUBRICATION = new SexAction(
			SexActionType.REQUIRES_NO_PENETRATION_AND_EXPOSED,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ZERO_NONE,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.MOUTH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.hasLubricationTypeFromAnyone(Main.game.getPlayer(), SexAreaPenetration.TAIL, LubricationType.SALIVA);
		}

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

		@Override
		public String getActionDescription() {
			return "Lubricate your tail with your saliva.";
		}

		@Override
		public String getDescription() {
			return "Lifting your [pc.tail+] up to your mouth, you slide your [pc.tail+] past your [pc.lips+], before lewdly sucking on it for a moment in order to get it well lubricated with your saliva.";
		}

		@Override
		public void applyEffects() {
			Sex.transferLubrication(Main.game.getPlayer(), SexAreaPenetration.TAIL, Main.game.getPlayer(), SexAreaOrifice.MOUTH);
		}
	};

	public static final SexAction PLAYER_SELF_TAIL_MOUTH_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ZERO_NONE,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.MOUTH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

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

		@Override
		public String getActionDescription() {
			return "Put your [pc.tail] in your mouth and start sucking it.";
		}

		@Override
		public String getDescription() {
			return "Snaking your [pc.tail] up to your mouth, you slide the tip past your [pc.lips+] before starting to lewdly suck on it.";
		}
	};

	public static final SexAction PLAYER_SELF_FINGER_MOUTH_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.MOUTH)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public String getActionTitle() {
			return "Stop sucking tail (self)";
		}

		@Override
		public String getActionDescription() {
			return "Stop sucking your [pc.tail].";
		}

		@Override
		public String getDescription() {
			return "With a little sigh, you slide your saliva-coated [pc.tail] out of your mouth.";
		}
	};
}


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

import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.79
 * @version 0.1.79
 * @author Innoxia
 */
public class PlayerSelfTailNipple {

	public static final SexAction PLAYER_SELF_TAIL_NIPPLE_PENETRATION = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Tail-fuck nipples (self)";
		}

		@Override
		public String getActionDescription() {
			return "Use your [pc.tail+] to fuck your own [pc.nipples+].";
		}

		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"Snaking your [pc.tail] up to your [pc.breasts+], you tease the tip over your [pc.nipples], [pc.moaning] in delight before thrusting deep inside one of your [pc.nipples+].",

					"You snake your [pc.tail] up to your [pc.breasts+], [pc.moaning] in delight as you force it deep into an inviting [pc.nipple].",

					"Sliding the tip of your [pc.tail+] up to your [pc.breasts+], you thrust it deep inside an inviting [pc.nipple], letting out [pc.a_moan+] as you start tail-fucking your own [pc.breasts].",

					"You eagerly thrust your [pc.tail+] deep into a needy [pc.nipple], letting out a series of [pc.moans+] as you start tail-fucking your own [pc.breasts]."));

			switch (Main.game.getPlayer().getBreastStoredMilk()) {
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(" A small trickle of [pc.milk] leaks out around your [pc.tail].");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(" A small squirt of [pc.milk] leaks out around your [pc.tail].");
					break;
				case THREE_DECENT_AMOUNT:
					UtilText.nodeContentSB.append(" A trickle of [pc.milk] runs out around your [pc.tail].");
					break;
				case FOUR_LARGE_AMOUNT:
					UtilText.nodeContentSB.append(" Your [pc.milk] starts to flow out around your [pc.tail] and run down your [pc.breasts].");
					break;
				case FIVE_VERY_LARGE_DROOLING:
					UtilText.nodeContentSB.append(" [pc.Milk] starts drooling out in a little stream around your [pc.tail].");
					break;
				case SIX_EXTREME_AMOUNT_DRIPPING:
					UtilText.nodeContentSB.append(" [pc.Milk] starts pouring out in a constant stream to run down your [pc.breasts].");
					break;
				case SEVEN_MONSTROUS_AMOUNT_POURING:
					UtilText.nodeContentSB.append(" [pc.Milk] starts pouring out in a heavy flow to quickly soak your [pc.breasts].");
					break;
				default:
					break;
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String applyEffectsString() {
			return Main.game.getPlayer().incrementBreastStoredMilk(-10);
		}

	};

	public static final SexAction DOM_PLAYER_SELF_TAIL_NIPPLE_GENTLE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.DOM_GENTLE) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Gentle nipple tail-fuck (self)";
		}

		@Override
		public String getActionDescription() {
			return "Gently fuck your [pc.nipples+] with your [pc.tail].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you slowly push your [pc.tail] deep inside your [pc.nipple+].",

					"Gently pumping your [pc.tail] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically fuck your [pc.breast+].",

					"Slowly driving your [pc.tail] deep inside your [pc.nipple], you let out a little whimper as you start gently sliding it in and out of your [pc.breast+].",

					"Focusing on pleasuring your fuckable [pc.breasts], you start gently pumping your [pc.tail] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_TAIL_NIPPLE_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.DOM_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Nipple tail-fucking (self)";
		}

		@Override
		public String getActionDescription() {
			return "Concentrate on fucking your [pc.nipples+] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.tail] deep inside your [pc.nipple+].",

					"Pumping your [pc.tail] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically fuck your [pc.breast+].",

					"Driving your [pc.tail] deep inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start pumping it in and out of your [pc.breast+].",

					"Focusing on pleasuring your [pc.breasts+], you start pumping your [pc.tail] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction DOM_PLAYER_SELF_TAIL_NIPPLE_ROUGH = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.DOM_ROUGH) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Rough nipple tail-fucking (self)";
		}

		@Override
		public String getActionDescription() {
			return "Roughly fuck your [pc.nipples+] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you roughly slam your [pc.tail] deep inside your [pc.nipple+], before starting to rapidly fuck your [pc.breast].",

					"Roughly pumping your [pc.tail] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically fuck your [pc.breast+].",

					"Forcefully driving your [pc.tail] deep inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start roughly grinding it in and out of your [pc.breast+].",

					"Focusing on pleasuring your [pc.breasts+], you start roughly slamming your [pc.tail] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_TAIL_NIPPLE_NORMAL = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.SUB_NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Nipple tail-fucking (self)";
		}

		@Override
		public String getActionDescription() {
			return "Concentrate on fucking your [pc.nipples+] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you greedily push your [pc.tail] deep inside your [pc.nipple+].",

					"Pumping your [pc.tail] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you rhythmically fuck your [pc.breast+].",

					"Driving your [pc.tail] deep inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start pumping it in and out of your [pc.breast+].",

					"Focusing on pleasuring your [pc.breasts+], you start pumping your [pc.tail] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction SUB_PLAYER_SELF_TAIL_NIPPLE_EAGER = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.THREE_NORMAL,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF,
			SexPace.SUB_EAGER) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			return !Sex.isDom(Main.game.getPlayer());
		}

		@Override
		public String getActionTitle() {
			return "Eager nipple tail-fucking (self)";
		}

		@Override
		public String getActionDescription() {
			return "Eagerly fuck your [pc.nipples+] with your [pc.tail+].";
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"[pc.A_moan+] escapes from between your [pc.lips+] as you eagerly slam your [pc.tail] deep inside your [pc.nipple+], before starting to desperately fuck your [pc.breast].",

					"Enthusiastically pumping your [pc.tail] in and out of your [pc.nipple+], you find yourself letting out a series of delighted [pc.moans] as you frantically fuck your [pc.breast+].",

					"Desperately driving your [pc.tail] deep inside your fuckable [pc.nipple], you let out [pc.a_moan] as you start eagerly grinding it in and out of your [pc.breast+].",

					"Focusing on pleasuring your [pc.breasts+], you eagerly start slamming your [pc.tail] in and out of one of your [pc.nipples+].");
		}

	};

	public static final SexAction PLAYER_SELF_TAIL_NIPPLE_STOP_PENETRATION = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.TAIL, SexAreaOrifice.NIPPLE)),
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}

		@Override
		public String getActionTitle() {
			return "Stop nipple tail-fuck (self)";
		}

		@Override
		public String getActionDescription() {
			return "Stop fucking your [pc.nipple+] with your [pc.tail].";
		}

		@Override
		public String getDescription() {
			return "Letting out a satisfied [pc.moan], you slide your [pc.tail+] out of your [pc.nipple+].";
		}
	};
}