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

import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.main.Main;

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class Cowgirl {

	//TODO These need proper formatting before inclusion into sex actions

	public static String getTongueMouthDescription() {

		UtilText.nodeContentSB.setLength(0);

		if (Sex.getAllContactingSexAreas(Sex.getCharacterPerformingAction(), SexAreaOrifice.ANUS).contains(SexAreaPenetration.PENIS)) {
			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"[npc.Name] [npc.verb(sink)] down onto [npc2.namePos] [npc2.penis+], letting out [npc.a_moan+] [npc.she] [npc.verb(lean)] down and [npc.verb(grab)] [npc2.namePos] head in both hands, before pulling [npc2.name] up into a passionate kiss.",
					"With [npc.a_moan+], [npc.name] [npc.verb(slide)] down onto [npc2.namePos] [npc2.penis+], leaning down into [npc2.namePos] [npc2.breasts] and breathing in [npc2.namePos] [npc2.scent] before pressing [npc.her] [npc.lips+] against [npc2.namePos]s.",
					"[npc.Name] [npc.verb(let)] [npc2.namePos] [npc2.penis+] slide even deeper into [npc.her] [npc.asshole+] as [npc.she] [npc.verb(lean)] down and pulls [npc2.name] into a desperate kiss.",
					"Leaning down, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] buries [npc.herself] on [npc2.namePos] [npc2.penis+], before leaning forwards and pressing [npc.her] [npc.lips+] against [npc2.namePos]s."));

		} else if (Sex.getAllContactingSexAreas(Sex.getCharacterPerformingAction(), SexAreaOrifice.VAGINA).contains(SexAreaPenetration.PENIS)) {
			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"[npc.Name] [npc.verb(sink)] down onto [npc2.namePos] [npc2.penis+], letting out a happy squeal as [npc.she] [npc.verb(feel)] [npc2.name] sink deep inside [npc.her] [npc.pussy+]."
								+ " Bottoming out on [npc2.namePos] [npc2.cock], [npc.she] [npc.verb(lean)] down and [npc.verb(grab)] [npc2.namePos] head in both hands, before pulling [npc2.name] up into a passionate kiss.",
					"With [npc.a_moan+], [npc.name] [npc.verb(slide)] down onto [npc2.namePos] [npc2.penis+], leaning down into [npc2.namePos] [npc2.breasts] and breathing in [npc2.namePos] [npc2.scent] before pressing [npc.her] [npc.lips+] against [npc2.namePos]s.",
					"[npc.Name] [npc.verb(let)] [npc2.namePos] [npc2.penis+] slide even deeper into [npc.her] [npc.pussy+] as [npc.she] [npc.verb(lean)] down and pulls [npc2.name] into a desperate kiss.",
					"Leaning down, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] buries [npc.herself] on [npc2.namePos] [npc2.penis+], before leaning forwards and pressing [npc.her] [npc.lips+] against [npc2.namePos]s."));

		} else {
			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"[npc.Name] [npc.verb(lean)] down, grabbing [npc2.namePos] head in both hands and pulling [npc2.name] up into a passionate kiss.",
					"With a grin, [npc.name] [npc.verb(lean)] down into [npc2.namePos] [npc2.breasts], breathing in [npc2.namePos] [npc2.scent] before pressing [npc.her] [npc.lips+] against [npc2.namePos]s.",
					"Leaning down, [npc.name] [npc.verb(let)] out [npc.a_moan+] as [npc.she] presses [npc.her] [npc.lips+] against [npc2.namePos]s and starts to eagerly kiss [npc2.name]."));
		}

		switch(Sex.getSexPace(Main.game.getPlayer())) {
			case SUB_EAGER:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] happily push [npc2.namePos] [npc2.tongue] deep into [npc.her] mouth, eagerly pressing [npc2.namePos] [npc2.lips+] back against [npc.hers] and [npc2.moaning] in delight as [npc2.name] greedily return [npc.her] display of affection.",
						" With an eager [npc2.moan], [npc2.name] desperately grind back against [npc.herHim], muffling [npc2.namePos] [npc2.moans] into [npc.her] mouth as [npc2.name] greedily thrust [npc2.namePos] [npc2.tongue] past [npc.her] [npc.lips+].",
						" [npc2.Moaning] in delight, [npc2.name] desperately grind [npc2.namePos]self back against [npc.herHim], eagerly pressing [npc2.namePos] [npc2.lips+] firmly against [npc.hers] as [npc2.name] happily push [npc2.namePos] [npc2.tongue] into [npc.her] mouth."));
				break;
			case SUB_NORMAL:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] push [npc2.namePos] [npc2.tongue] into [npc.her] mouth, pressing [npc2.namePos] [npc2.lips+] back against [npc.hers] as [npc2.name] eagerly return [npc.her] display of affection.",
						" With [npc2.a_moan], [npc2.name] lean back against [npc.herHim], muffling [npc2.namePos] [npc2.moans] into [npc.her] mouth as [npc2.name] eagerly thrust [npc2.namePos] [npc2.tongue] past [npc.her] [npc.lips+].",
						" [npc2.Moaning] in delight, [npc2.name] lean back against [npc.herHim], pressing [npc2.namePos] [npc2.lips+] against [npc.hers] as [npc2.name] happily slide [npc2.namePos] [npc2.tongue] into [npc.her] mouth."));
				break;
			case SUB_RESISTING:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] try to pull away, [npc2.sobbing] and squirming in discomfort as [npc.she] forces [npc.herself] on [npc2.name].",
						" [npc2.NamePos] [npc2.sob+] is muffled into [npc.her] mouth as [npc2.name] try to pull away, squirming in discomfort as [npc.name] forces [npc.herself] on [npc2.name].",
						" With [npc2.a_sob+], [npc2.name] try, in vain, to pull away from [npc.herHim], protesting and squirming in discomfort as [npc.she] forces [npc.her] [npc.tongue] past [npc2.namePos] reluctant [npc2.lips]."));
				break;
			default:
				break;
		}

		return UtilText.nodeContentSB.toString();
	}

	public static String getStartingVaginalPenetrationDescription() {

		UtilText.nodeContentSB.setLength(0);

		switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
			case DOM_GENTLE:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						"[npc.Name] reaches down to take hold of [npc2.namePos] [npc2.cock+], before shuffling around to get into a good position."
								+ " After taking a moment to tease the [npc2.cockHead+] between [npc.her] outer labia, [npc.she] [npc.verb(let)] out a little [npc.moan] as [npc.she] slowly drops down and penetrates [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.cock+].",
						"Shuffling around into a better position, [npc.name] lines the [npc2.cockHead+] of [npc2.namePos] [npc2.cock+] up between [npc.her] [npc.legs+], and with a slow, steady movement, [npc.she] gently drops down,"
								+ " penetrating [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.cock+]."));
				break;
			case DOM_NORMAL:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						"[npc.Name] reaches down to take a firm hold of [npc2.namePos] [npc2.cock+], before shuffling around to get into a good position."
								+ " After taking a moment to tease the [npc2.cockHead+] between [npc.her] outer labia, [npc.she] [npc.verb(let)] out [npc.a_moan+] as [npc.she] eagerly drops down and penetrates [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.cock+].",
						"Shuffling around into a better position, [npc.name] lines the [npc2.cockHead+] of [npc2.namePos] [npc2.cock+] up between [npc.her] [npc.legs+], and with a single movement, [npc.she] eagerly drops down,"
								+ " penetrating [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.cock+]."));
				break;
			case DOM_ROUGH:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						"[npc.Name] reaches down and roughly [npc.verb(grab)] [npc2.namePos] [npc2.cock+], before shuffling around to get into a good position."
								+ " After taking a moment to tease the [npc2.cockHead+] between [npc.her] outer labia, [npc.she] [npc.verb(let)] out [npc.a_moan+] as [npc.she] forcefully drops down and penetrates [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.cock+].",
						"Shuffling around into a better position, [npc.name] lines the [npc2.cockHead+] of [npc2.namePos] [npc2.cock+] up between [npc.her] [npc.legs+], and with a single movement, [npc.she] roughly drops down,"
								+ " penetrating [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.cock+]."));
				break;
			default:
				break;
		}
		switch(Sex.getSexPace(Main.game.getPlayer())) {
			case SUB_EAGER:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_moan+] as [npc2.name] enter [npc.herHim], eagerly bucking [npc2.namePos] [npc2.hips] up as [npc2.name] start fucking [npc.her] [npc.pussy+].",
						" With [npc2.a_moan+], [npc2.name] eagerly thrust [npc2.namePos] [npc2.hips] up into [npc.her] groin, sinking [npc2.namePos] [npc2.cock+] into [npc.her] [npc.pussy+] as [npc2.name] start energetically fucking [npc.herHim]."));
				break;
			case SUB_NORMAL:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_moan+] as [npc2.name] enter [npc.herHim], bucking [npc2.namePos] [npc2.hips] up as [npc2.name] start fucking [npc.her] [npc.pussy+].",
						" With [npc2.a_moan+], [npc2.name] thrust [npc2.namePos] [npc2.hips] up into [npc.her] groin, sinking [npc2.namePos] [npc2.cock+] into [npc.her] [npc.pussy+] as [npc2.name] start fucking [npc.herHim]."));
				break;
			case SUB_RESISTING:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_sob+] as [npc.she] forces [npc2.namePos] [npc2.cock] inside of [npc.herHim], and, struggling against [npc.herHim] in vain, [npc2.name] desperately try to push [npc.herHim] off of [npc2.name].",
						" With [npc2.a_sob+], [npc2.name] struggle against [npc.name] as [npc.she] forces [npc2.namePos] [npc2.cock] deep into [npc.her] [npc.pussy+]."));
				break;
			default:
				break;
		}

		return UtilText.nodeContentSB.toString();
	}

	public static String getRidingCockGentle() {
		return UtilText.returnStringAtRandom(
				"Using [npc.her] legs, [npc.name] slowly [npc.verb(lift)] [npc.herself] up and down, sliding [npc2.namePos] [npc2.penis+] in and out of [npc.her] [npc.pussy+] as [npc.she] [npc.moansVerb+] out loud.",
				"Leaning forwards, [npc.name] uses [npc.her] [npc.hands] to support some of [npc.her] weight as [npc.she] slowly [npc.verb(slide)] up and down on [npc2.namePos] [npc2.penis+]."
						+ " As [npc.she] [npc.verb(lower)] [npc.her] [npc.face+] towards [npc2.name], [npc.she] gets a waft of [npc2.namePos] [npc2.scent], and [npc.she] bites [npc.her] [npc.lip] as [npc.she] breathes in the intoxicating aroma.",
				"Lowering [npc.her] [npc.hands] to [npc.her] knees, [npc.name] uses [npc.her] [npc.legs] to slowly slide [npc.herself] up and down, letting out soft [npc.moans] as [npc.she] impales [npc.herself] on [npc2.namePos] [npc2.cock+].",
				"[npc.Name] slowly [npc.verb(lift)] [npc.herself] up before sliding back down, letting out a soft [npc.moan] as [npc.she] spears [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.penis+].");
	}

	public static String getRidingCockNormal() {
		return UtilText.returnStringAtRandom(
				"Using [npc.her] legs, [npc.name] [npc.verb(lift)] [npc.herself] up and down, sliding [npc2.namePos] [npc2.penis+] in and out of [npc.her] [npc.pussy+] as [npc.she] [npc.moansVerb+] out loud.",
				"Leaning forwards, [npc.name] uses [npc.her] [npc.hands] to support some of [npc.her] weight as [npc.she] eagerly [npc.verb(slide)] up and down on [npc2.namePos] [npc2.penis+]."
						+ " As [npc.she] [npc.verb(lower)] [npc.her] [npc.face+] towards [npc2.name], [npc.she] gets a waft of [npc2.namePos] [npc2.scent], and [npc.she] bites [npc.her] [npc.lip] as [npc.she] breathes in the intoxicating aroma.",
				"Lowering [npc.her] [npc.hands] to [npc.her] knees, [npc.name] uses [npc.her] [npc.legs] to enthusiastically slide [npc.herself] up and down, letting out [npc.moans+] as [npc.she] impales [npc.herself] on [npc2.namePos] [npc2.cock+].",
				"[npc.Name] [npc.verb(lift)] [npc.herself] up before greedily sliding back down, letting out [npc.a_moan+] as [npc.she] spears [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.penis+].");
	}

	public static String getRidingCockRough() {
		return UtilText.returnStringAtRandom(
				"Using [npc.her] legs, [npc.name] rapidly bounces [npc.herself] up and down, slamming [npc2.namePos] [npc2.penis+] in and out of [npc.her] [npc.pussy+] as [npc.she] [npc.moansVerb+] out loud.",
				"Leaning forwards, [npc.name] uses [npc.her] [npc.hands] to support some of [npc.her] weight as [npc.she] starts rapidly bucking up and down on [npc2.namePos] [npc2.penis+]."
						+ " As [npc.she] [npc.verb(lower)] [npc.her] [npc.face+] towards [npc2.name], [npc.she] gets a waft of [npc2.namePos] [npc2.scent], and [npc.she] bites [npc.her] [npc.lip] as [npc.she] breathes in the intoxicating aroma.",
				"Placing [npc.her] [npc.hands] down on the floor behind [npc.herHim] for support, [npc.name] starts rapidly bouncing [npc.herself] up and down, letting out shuddering, [npc.moans+] as [npc.she] impales [npc.herself] on [npc2.namePos] [npc2.cock+].",
				"Grinning down at [npc2.name], [npc.name] starts enthusiastically bouncing up and down, letting out [npc.a_moan+] as [npc.she] spears [npc.her] [npc.pussy+] on [npc2.namePos] [npc2.penis+].");
	}

	public static String getStoppingVaginalPenetrationDescription() {

		UtilText.nodeContentSB.setLength(0);

		switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
			case DOM_ROUGH:
				UtilText.nodeContentSB.append("Reaching down, [npc.name] roughly [npc.verb(grab)] the base of [npc2.namePos] [npc2.cock], before lifting [npc.herself] up and allowing [npc2.namePos] [npc2.cock+] to slide out of [npc.her] [npc.pussy+].");
				break;
			default:
				UtilText.nodeContentSB.append("Reaching down, [npc.name] takes hold of the base of [npc2.namePos] [npc2.cock], before lifting [npc.herself] up and allowing [npc2.namePos] [npc2.cock+] to slide out of [npc.her] [npc.pussy+].");
				break;
		}

		switch(Sex.getSexPace(Main.game.getPlayer())) {
			case SUB_RESISTING:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out a relieved sigh, which soon turns into [npc2.a_sob+] as [npc2.name] realise that [npc.she] isn't finished with [npc2.name] yet.",
						" With [npc2.a_sob+], [npc2.name] continue to protest and struggle against [npc.herHim] as [npc.she] holds [npc2.name] firmly in place."));
				break;
			default:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_moan+] as [npc.she] stops riding [npc2.name].",
						" [npc2.A_moan+] escapes from between [npc2.namePos] [npc2.lips+], betraying [npc2.namePos] desire to continue fucking [npc.her] [npc.pussy+]."));
				break;
		}

		return UtilText.nodeContentSB.toString();
	}

	public static String getStartingAnalPenetrationDescription() {

		UtilText.nodeContentSB.setLength(0);

		switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
			case DOM_GENTLE:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						"[npc.Name] reaches down to take hold of [npc2.namePos] [npc2.cock+], before shuffling around to get into a good position."
								+ " After taking a moment to tease the [npc2.cockHead+] over [npc.her] [npc.asshole+], [npc.she] [npc.verb(let)] out a little [npc.moan] as [npc.she] slowly drops down and penetrates [npc.her] [npc.ass+] on [npc2.namePos] [npc2.cock+].",
						"Shuffling around into a better position, [npc.name] lines the [npc2.cockHead+] of [npc2.namePos] [npc2.cock+] up between [npc.her] ass cheeks, and with a slow, steady movement, [npc.she] gently drops down,"
								+ " penetrating [npc.her] [npc.asshole+] on [npc2.namePos] [npc2.cock+]."));
				break;
			case DOM_NORMAL:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						"[npc.Name] reaches down to take a firm hold of [npc2.namePos] [npc2.cock+], before shuffling around to get into a good position."
								+ " After taking a moment to tease the [npc2.cockHead+] over [npc.her] [npc.asshole+], [npc.she] [npc.verb(let)] out [npc.a_moan+] as [npc.she] eagerly drops down and penetrates [npc.her] [npc.ass+] on [npc2.namePos] [npc2.cock+].",
						"Shuffling around into a better position, [npc.name] lines the [npc2.cockHead+] of [npc2.namePos] [npc2.cock+] up between [npc.her] ass cheeks, and with a single movement, [npc.she] eagerly drops down,"
								+ " penetrating [npc.her] [npc.asshole+] on [npc2.namePos] [npc2.cock+]."));
				break;
			case DOM_ROUGH:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						"[npc.Name] reaches down and roughly [npc.verb(grab)] [npc2.namePos] [npc2.cock+], before shuffling around to get into a good position."
								+ " After taking a moment to tease the [npc2.cockHead+] over [npc.her] [npc.asshole+], [npc.she] [npc.verb(let)] out [npc.a_moan+] as [npc.she] forcefully drops down and penetrates [npc.her] [npc.ass+] on [npc2.namePos] [npc2.cock+].",
						"Shuffling around into a better position, [npc.name] lines the [npc2.cockHead+] of [npc2.namePos] [npc2.cock+] up between [npc.her] ass cheeks, and with a single movement, [npc.she] roughly drops down,"
								+ " penetrating [npc.her] [npc.asshole+] on [npc2.namePos] [npc2.cock+]."));
				break;
			default:
				break;
		}
		switch(Sex.getSexPace(Main.game.getPlayer())) {
			case SUB_EAGER:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_moan+] as [npc2.name] enter [npc.herHim], eagerly bucking [npc2.namePos] [npc2.hips] up as [npc2.name] start fucking [npc.her] [npc.asshole+].",
						" With [npc2.a_moan+], [npc2.name] eagerly thrust [npc2.namePos] [npc2.hips] up into [npc.her] [npc.ass], sinking [npc2.namePos] [npc2.cock+] into [npc.her] [npc.asshole+] as [npc2.name] start energetically fucking [npc.herHim]."));
				break;
			case SUB_NORMAL:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_moan+] as [npc2.name] enter [npc.herHim], bucking [npc2.namePos] [npc2.hips] up as [npc2.name] start fucking [npc.her] [npc.asshole+].",
						" With [npc2.a_moan+], [npc2.name] thrust [npc2.namePos] [npc2.hips] up into [npc.her] [npc.ass], sinking [npc2.namePos] [npc2.cock+] into [npc.her] [npc.asshole+] as [npc2.name] start fucking [npc.herHim]."));
				break;
			case SUB_RESISTING:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_sob+] as [npc.she] forces [npc2.namePos] [npc2.cock] inside of [npc.herHim], and, struggling against [npc.herHim] in vain, [npc2.name] desperately try to push [npc.herHim] off of [npc2.name].",
						" With [npc2.a_sob+], [npc2.name] struggle against [npc.name] as [npc.she] forces [npc2.namePos] [npc2.cock] deep into [npc.her] [npc.asshole+]."));
				break;
			default:
				break;
		}

		return UtilText.nodeContentSB.toString();
	}

	public static String getRidingCockAnallyGentle() {
		return UtilText.returnStringAtRandom(
				"Using [npc.her] legs, [npc.name] slowly [npc.verb(lift)] [npc.herself] up and down, sliding [npc2.namePos] [npc2.penis+] in and out of [npc.her] [npc.asshole+] as [npc.she] [npc.moansVerb+] out loud.",
				"Leaning forwards, [npc.name] uses [npc.her] [npc.hands] to support some of [npc.her] weight as [npc.she] slowly [npc.verb(slide)] up and down on [npc2.namePos] [npc2.penis+]."
						+ " As [npc.she] [npc.verb(lower)] [npc.her] [npc.face+] towards [npc2.name], [npc.she] gets a waft of [npc2.namePos] [npc2.scent], and [npc.she] bites [npc.her] [npc.lip] as [npc.she] breathes in the intoxicating aroma.",
				"Lowering [npc.her] [npc.hands] to [npc.her] knees, [npc.name] uses [npc.her] [npc.legs] to slowly slide [npc.herself] up and down, letting out soft [npc.moans] as [npc.she] impales [npc.herself] on [npc2.namePos] [npc2.cock+].",
				"[npc.Name] slowly [npc.verb(lift)] [npc.herself] up before sliding back down, letting out a soft [npc.moan] as [npc.she] spears [npc.her] [npc.asshole+] on [npc2.namePos] [npc2.penis+].");
	}

	public static String getRidingCockAnallyNormal() {
		return UtilText.returnStringAtRandom(
				"Using [npc.her] legs, [npc.name] [npc.verb(lift)] [npc.herself] up and down, sliding [npc2.namePos] [npc2.penis+] in and out of [npc.her] [npc.asshole+] as [npc.she] [npc.moansVerb+] out loud.",
				"Leaning forwards, [npc.name] uses [npc.her] [npc.hands] to support some of [npc.her] weight as [npc.she] eagerly [npc.verb(slide)] up and down on [npc2.namePos] [npc2.penis+]."
						+ " As [npc.she] [npc.verb(lower)] [npc.her] [npc.face+] towards [npc2.name], [npc.she] gets a waft of [npc2.namePos] [npc2.scent], and [npc.she] bites [npc.her] [npc.lip] as [npc.she] breathes in the intoxicating aroma.",
				"Lowering [npc.her] [npc.hands] to [npc.her] knees, [npc.name] uses [npc.her] [npc.legs] to enthusiastically slide [npc.herself] up and down, letting out [npc.moans+] as [npc.she] impales [npc.herself] on [npc2.namePos] [npc2.cock+].",
				"[npc.Name] [npc.verb(lift)] [npc.herself] up before greedily sliding back down, letting out [npc.a_moan+] as [npc.she] spears [npc.her] [npc.asshole+] on [npc2.namePos] [npc2.penis+].");
	}

	public static String getRidingCockAnallyRough() {
		return UtilText.returnStringAtRandom(
				"Using [npc.her] legs, [npc.name] rapidly bounces [npc.herself] up and down, slamming [npc2.namePos] [npc2.penis+] in and out of [npc.her] [npc.asshole+] as [npc.she] [npc.moansVerb+] out loud.",
				"Leaning forwards, [npc.name] uses [npc.her] [npc.hands] to support some of [npc.her] weight as [npc.she] starts rapidly bucking up and down on [npc2.namePos] [npc2.penis+]."
						+ " As [npc.she] [npc.verb(lower)] [npc.her] [npc.face+] towards [npc2.name], [npc.she] gets a waft of [npc2.namePos] [npc2.scent], and [npc.she] bites [npc.her] [npc.lip] as [npc.she] breathes in the intoxicating aroma.",
				"Placing [npc.her] [npc.hands] down on the floor behind [npc.herHim] for support, [npc.name] starts rapidly bouncing [npc.herself] up and down, letting out shuddering, [npc.moans+] as [npc.she] impales [npc.herself] on [npc2.namePos] [npc2.cock+].",
				"Grinning down at [npc2.name], [npc.name] starts enthusiastically bouncing up and down, letting out [npc.a_moan+] as [npc.she] spears [npc.her] [npc.asshole+] on [npc2.namePos] [npc2.penis+].");
	}

	public static String getStoppingAnalPenetrationDescription() {

		UtilText.nodeContentSB.setLength(0);

		switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
			case DOM_ROUGH:
				UtilText.nodeContentSB.append("Reaching back beneath [npc.herHim], [npc.name] roughly [npc.verb(grab)] the base of [npc2.namePos] [npc2.cock], before lifting [npc.herself] up and allowing [npc2.namePos] [npc2.cock+] to slide out of [npc.her] [npc.asshole+].");
				break;
			default:
				UtilText.nodeContentSB.append("Reaching back beneath [npc.herHim], [npc.name] takes hold of the base of [npc2.namePos] [npc2.cock], before lifting [npc.herself] up and allowing [npc2.namePos] [npc2.cock+] to slide out of [npc.her] [npc.asshole+].");
				break;
		}

		switch(Sex.getSexPace(Main.game.getPlayer())) {
			case SUB_RESISTING:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out a relieved sigh, which soon turns into [npc2.a_sob+] as [npc2.name] realise that [npc.she] isn't finished with [npc2.name] yet.",
						" With [npc2.a_sob+], [npc2.name] continue to protest and struggle against [npc.herHim] as [npc.she] holds [npc2.name] firmly in place."));
				break;
			default:
				UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
						" [npc2.Name] let out [npc2.a_moan+] as [npc.she] stops riding [npc2.name].",
						" [npc2.A_moan+] escapes from between [npc2.namePos] [npc2.lips+], betraying [npc2.namePos] desire to continue fucking [npc.her] [npc.ass+]."));
				break;
		}

		return UtilText.nodeContentSB.toString();
	}

}


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

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.body.types.VaginaType;
import com.lilithsthrone.game.character.body.valueEnums.CumProduction;
import com.lilithsthrone.game.character.race.Race;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.ArousalIncrease;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaInterface;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.SexAreaPenetration;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.SexParticipantType;
import com.lilithsthrone.game.sex.positions.slots.SexSlot;
import com.lilithsthrone.game.sex.positions.slots.SexSlotAllFours;
import com.lilithsthrone.game.sex.positions.slots.SexSlotTag;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionCategory;
import com.lilithsthrone.game.sex.sexActions.SexActionPriority;
import com.lilithsthrone.game.sex.sexActions.SexActionType;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.2.8
 * @version 0.3.3
 * @author Innoxia
 */
public class DoggyStyle {

	public static final SexAction SLAP_ASS = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.TWO_HORNY,
			null,
			SexParticipantType.NORMAL,
			SexPace.DOM_ROUGH) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isDom(Sex.getCharacterPerformingAction())
					&& (Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this)).hasTag(SexSlotTag.ALL_FOURS))
					&& (Sex.getSexPositionSlot(Sex.getCharacterPerformingAction()).hasTag(SexSlotTag.BEHIND_ALL_FOURS));
		}

		@Override
		public String getActionTitle() {
			return "Slap ass";
		}

		@Override
		public String getActionDescription() {
			return "Start slapping [npc2.namePos] ass.";
		}

		@Override
		public SexActionCategory getCategory() {
			return SexActionCategory.SEX;
		}

		@Override
		public String getDescription() {
			String tailSpecial1 = "", tailSpecial2 = "";

			if (Sex.getAllContactingSexAreas(Sex.getCharacterTargetedForSexAction(this), SexAreaOrifice.VAGINA).contains(SexAreaPenetration.PENIS)) {
				switch(Sex.getCharacterTargetedForSexAction(this).getTailType()) {
					case NONE:
						tailSpecial1 = "Hilting [npc.her] [npc.cock+] deep inside [npc2.namePos] [npc2.pussy+], [npc.name] [npc.verb(reach)] down and roughly [npc.verb(grope)] [npc2.her] [npc2.ass+],"
								+ " before starting to deliver a series of stinging slaps to [npc2.her] exposed cheeks.";
						break;
					default:
						tailSpecial1 = "Hilting [npc.her] [npc.cock+] deep inside [npc2.namePos] [npc2.pussy+], [npc.name] roughly [npc.verb(grab)] the base of [npc2.her] [npc2.tail+] and [npc.verb(yank)] upwards,"
											+ " raising [npc2.her] [npc2.ass+] up high in the air before starting to deliver a series of stinging slaps to [npc2.her] exposed cheeks.";
						break;
				}
				switch(Sex.getCharacterTargetedForSexAction(this).getTailType()) {
					case NONE:
						tailSpecial2 = "Still ploughing away at [npc2.her] [npc2.pussy+], [npc.name] [npc.verb(growl)] down that [npc.sheIs] going to put [npc2.name] in [npc2.her] place,"
								+ " before starting make good on [npc.her] threat by aggressively slapping [npc2.her] exposed ass cheeks.";
						break;
					default:
						tailSpecial2 = "Still ploughing away at [npc2.her] [npc2.pussy+], [npc.name] [npc.verb(grab)] the base of [npc2.namePos] [npc2.tail+] in one [npc.hand],"
											+ " roughly yanking [npc2.her] [npc2.ass+] up high in the air before starting to aggressively slap [npc2.her] exposed cheeks.";
						break;
				}

				return UtilText.returnStringAtRandom(
							tailSpecial1,
							tailSpecial2,
							"[npc2.Name] [npc2.verb(let)] out [npc2.a_moan+] as [npc.name] [npc.verb(start)] slapping [npc2.her] [npc2.ass+] in time with [npc.her] powerful thrusts into [npc2.her] [npc2.pussy+].",

							"Hilting [npc.her] [npc.cock+] deep inside [npc2.namePos] [npc2.pussy], [npc.name] [npc.verb(use)] one [npc.hand] to hold [npc2.herHim] still,"
								+ " while using [npc.her] other to deliver a series of stinging slaps to [npc2.her] exposed ass cheeks.",

							"While [npc.name] [npc.verb(continue)] pounding away at [npc2.namePos] [npc2.pussy+], [npc.she] [npc.verb(reach)] down and [npc.verb(start)] to roughly slap [npc2.her] [npc2.ass+],"
									+ " growling in glee as [npc2.she] [npc2.verb(squirm)] and [npc2.verb(squeal)] under [npc.her] stinging blows.");

			} else if (Sex.getAllContactingSexAreas(Sex.getCharacterTargetedForSexAction(this), SexAreaOrifice.ANUS).contains(SexAreaPenetration.PENIS)) {
				switch(Sex.getCharacterTargetedForSexAction(this).getTailType()) {
					case NONE:
						tailSpecial1 = "Hilting [npc.her] [npc.cock+] deep inside [npc2.namePos] [npc2.asshole+], [npc.name] [npc.verb(reach)] down and roughly [npc.verb(grope)] [npc2.her] [npc2.ass+],"
								+ " before starting to deliver a series of stinging slaps to [npc2.her] exposed cheeks.";
						break;
					default:
						tailSpecial1 = "Hilting [npc.her] [npc.cock+] deep inside [npc2.namePos] [npc2.asshole+], [npc.name] roughly [npc.verb(grab)] the base of [npc2.her] [npc2.tail+] and [npc.verb(yank)] upwards,"
											+ " raising [npc2.her] [npc2.ass+] up high in the air before starting to deliver a series of stinging slaps to [npc2.her] exposed cheeks.";
						break;
				}
				switch(Sex.getCharacterTargetedForSexAction(this).getTailType()) {
					case NONE:
						tailSpecial2 = "Still ploughing away at [npc2.her] [npc2.asshole+], [npc.name] [npc.verb(growl)] down that [npc.sheIs] going to put [npc2.name] in [npc2.her] place,"
								+ " before starting make good on [npc.her] threat by aggressively slapping [npc2.her] exposed ass cheeks.";
						break;
					default:
						tailSpecial2 = "Still ploughing away at [npc2.her] [npc2.asshole+], [npc.name] [npc.verb(grab)] the base of [npc2.namePos] [npc2.tail+] in one [npc.hand],"
											+ " roughly yanking [npc2.her] [npc2.ass+] up high in the air before starting to aggressively slap [npc2.her] exposed cheeks.";
						break;
				}

				return UtilText.returnStringAtRandom(
							tailSpecial1,
							tailSpecial2,
							"[npc2.Name] [npc2.verb(let)] out [npc2.a_moan+] as [npc.name] [npc.verb(start)] slapping [npc2.her] [npc2.ass+] in time with [npc.her] powerful thrusts into [npc2.her] [npc2.asshole+].",

							"Hilting [npc.her] [npc.cock+] deep inside [npc2.namePos] [npc2.asshole], [npc.name] [npc.verb(use)] one [npc.hand] to hold [npc2.herHim] still,"
								+ " while using [npc.her] other to deliver a series of stinging slaps to [npc2.her] exposed ass cheeks.",

							"While [npc.name] [npc.verb(continue)] pounding away at [npc2.namePos] [npc2.asshole+], [npc.she] [npc.verb(reach)] down and [npc.verb(start)] to roughly slap [npc2.her] [npc2.ass+],"
									+ " growling in glee as [npc2.she] [npc2.verb(squirm)] and [npc2.verb(squeal)] under [npc.her] stinging blows.");

			} else {
				switch(Sex.getCharacterTargetedForSexAction(this).getTailType()) {
					case NONE:
						tailSpecial1 = "Growling down into [npc2.namePos] [npc2.ear+], [npc.name] [npc.verb(reach)] down and [npc.verb(grab)] [npc2.her] waist, using one hand to hold [npc2.herHim] still,"
											+ " while using [npc.her] other to deliver a series of stinging slaps to [npc2.her] [npc2.ass+].";
						break;
					default:
						tailSpecial1 = "Growling down into [npc2.namePos] [npc2.ear], [npc.name] roughly [npc.verb(grab)] the base of [npc2.her] [npc2.tail+] and [npc.verb(yank)] upwards,"
									+ " raising [npc2.her] [npc2.ass+] up high in the air before starting to deliver a series of stinging slaps to [npc2.her] exposed cheeks.";
						break;
				}
				switch(Sex.getCharacterTargetedForSexAction(this).getTailType()) {
					case NONE:
						tailSpecial2 = "[npc.Name] [npc.verb(reach)] down and [npc.verb(grab)] [npc2.namePos] waist with one hand,"
								+ " holding [npc2.herHim] firmly in [npc.her] grip as [npc.she] [npc.verb(start)] to aggressively slap [npc2.her] exposed cheeks.";
						break;
					default:
						tailSpecial2 = "[npc.Name] [npc.verb(reach)] down and [npc.verb(grab)] the base of [npc2.namePos] [npc2.tail+], causing [npc2.herHim] to let out a surprised yelp as [npc.she] roughly [npc.verb(yank)] upwards,"
											+ " forcing [npc2.herHim] to push [npc2.her] [npc2.ass+] up high in the air as [npc.name] [npc.verb(start)] to aggressively slap [npc2.her] exposed cheeks.";
						break;
				}

				return UtilText.returnStringAtRandom(
							tailSpecial1,
							tailSpecial2,
							"[npc2.Name] [npc2.verb(let)] out [npc2.a_moan+] as [npc.name] [npc.verb(start)] roughly slapping [npc2.her] [npc2.ass+],"
									+ " and [npc.name] [npc.verb(find)] [npc.herself] grinning in glee as [npc.she] [npc.verb(watch)] [npc2.herHim] squirm and cry out beneath [npc.her] stinging blows.",

							"[npc2.Name] [npc2.verb(let)] out a startled wail as [npc.name] [npc.verb(start)] to roughly slap [npc2.her] [npc2.ass+],"
									+ " and [npc.name] quickly [npc.verb(find)] [npc.herself] grinning in glee as [npc.she] [npc.verb(watch)] [npc2.herHim] squirm and wail beneath [npc.her] relentless blows.",

							"[npc.Name] [npc.verb(growl)] down that [npc.sheIs] going to put [npc2.name] in [npc2.her] place, before starting to aggressively slap [npc2.her] [npc2.ass+],"
									+ " smirking down at [npc2.her] submissive form as [npc2.she] squeals and cries out beneath [npc.her] relentless blows.");
			}
		}

	};

	public static final SexAction PULL_HAIR = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.TWO_HORNY,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public String getActionTitle() {
			return "Pull hair";
		}

		@Override
		public String getActionDescription() {
			return "Grab [npc2.namePos] hair and pull [npc2.her] head back.";
		}

		@Override
		public SexActionCategory getCategory() {
			return SexActionCategory.SEX;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			boolean suitableSlot = false;

			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_TWO) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_TWO
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_TWO;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_THREE) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_THREE
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_THREE;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_FOUR) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_FOUR
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_FOUR;
			}

			return Sex.getSexPace(Sex.getCharacterPerformingAction())!=SexPace.SUB_RESISTING
					&& Sex.getPenetrationTypeFreeCount(Sex.getCharacterPerformingAction(), SexAreaPenetration.FINGER)>=1
					&& Sex.getCharacterTargetedForSexAction(this).getHairLength().isSuitableForPulling()
					&& suitableSlot;
		}

		@Override
		public String getDescription() {

			boolean vaginalSex = false;
			try {
				vaginalSex = Sex.getOngoingActionsMap(Sex.getCharacterPerformingAction()).get(SexAreaPenetration.PENIS).get(Sex.getCharacterTargetedForSexAction(this)).contains(SexAreaOrifice.VAGINA);
			} catch(Exception ex) {
			}
			boolean analSex = false;
			try {
				analSex = Sex.getOngoingActionsMap(Sex.getCharacterPerformingAction()).get(SexAreaPenetration.PENIS).get(Sex.getCharacterTargetedForSexAction(this)).contains(SexAreaOrifice.ANUS);
			} catch(Exception ex) {
			}

			String tag = "pussy";
			if(analSex) {
				tag = "asshole";
			}

			switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
				case DOM_GENTLE:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] gently [npc.verb(take)] hold of [npc2.namePos] [npc2.hair], and, while continuing to rhythmically slide [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] slowly [npc.verb(pull)] back, causing [npc2.name] to lift [npc2.her] head and let out [npc2.a_moan+].",
								"Taking a gentle hold of [npc2.namePos] [npc2.hair] in one [npc.hand], [npc.name] simultaneously [npc.verb(pull)] [npc2.her] head back while burying [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" softly giggling":" smirking")+" to [npc.herself] as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to slowly sink [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards and [npc.verb(take)] a gentle hold of [npc2.her] [npc2.hair],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] gently [npc.verb(take)] hold of [npc2.namePos] [npc2.hair], before slowly pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Taking a gentle hold of [npc2.namePos] [npc2.hair] in one [npc.hand], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" softly [npc.verb(giggle)]":" [npc.verb(smirk)]")
									+" to [npc.herself] as [npc.she] [npc.verb(pull)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Tracing [npc.her] [npc.fingers+] up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards and [npc.verb(take)] a gentle hold of [npc2.her] [npc2.hair],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
				case DOM_ROUGH:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] roughly [npc.verb(grab)] a handful of [npc2.namePos] [npc2.hair], and, while continuing to forcefully slam [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] sharply [npc.verb(yank)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Grabbing a fistful of [npc2.namePos] [npc2.hair], [npc.name] simultaneously [npc.verb(yank)] [npc2.her] head back while slamming [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" maniacally giggling":" deeply grunting")+" in pleasure as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to roughly slam [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards and [npc.verb(grab)] a fistful of [npc2.her] [npc2.hair],"
										+ " before violently yanking [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] roughly [npc.verb(grab)] a handful of [npc2.namePos] [npc2.hair], before sharply yanking [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Grabbing a fistful of [npc2.namePos] [npc2.hair], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" maniacally [npc.verb(giggle)]":" deeply [npc.verb(grunt)]")
									+" as [npc.she] violently [npc.verb(yank)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Groping and pawing [npc.her] way up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards and [npc.verb(grab)] a fistful of [npc2.her] [npc2.hair],"
										+ " before roughly tugging [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
				default: // For dom normal, sub normal, and sub eager:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] firmly [npc.verb(take)] hold of [npc2.namePos] [npc2.hair], and, while continuing to rhythmically pump [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] steadily [npc.verb(pull)] back, causing [npc2.name] to lift [npc2.her] head and let out [npc2.a_moan+].",
								"Taking a firm hold of [npc2.namePos] [npc2.hair] in one [npc.hand], [npc.name] simultaneously [npc.verb(pull)] [npc2.her] head back while thrusting [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" happily giggling":" grunting")+" in pleasure as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to energetically thrust [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards and [npc.verb(take)] a firm hold of [npc2.her] [npc2.hair],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] firmly [npc.verb(take)] hold of [npc2.namePos] [npc2.hair], before steadily pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Taking a firm hold of [npc2.namePos] [npc2.hair] in one [npc.hand], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" happily [npc.verb(giggle)]":" [npc.verb(chuckle)]")
									+" in pleasure as [npc.she] [npc.verb(pull)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Tracing [npc.her] [npc.fingers+] up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards and [npc.verb(take)] a firm hold of [npc2.her] [npc2.hair],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
			}
		}

	};

	public static final SexAction PULL_EARS = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.TWO_HORNY,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public String getActionTitle() {
			return "Pull ears";
		}

		@Override
		public String getActionDescription() {
			return "Grab [npc2.namePos] [npc2.ears+] and pull [npc2.her] head back.";
		}

		@Override
		public SexActionCategory getCategory() {
			return SexActionCategory.SEX;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			boolean suitableSlot = false;

			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_TWO) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_TWO
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_TWO;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_THREE) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_THREE
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_THREE;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_FOUR) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_FOUR
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_FOUR;
			}

			return Sex.getSexPace(Sex.getCharacterPerformingAction())!=SexPace.SUB_RESISTING
					&& Sex.getPenetrationTypeFreeCount(Sex.getCharacterPerformingAction(), SexAreaPenetration.FINGER)>=2
					&& Sex.getCharacterTargetedForSexAction(this).getEarType().isAbleToBeUsedAsHandlesInSex()
					&& suitableSlot;
		}

		@Override
		public String getDescription() {

			boolean vaginalSex = false;
			try {
				vaginalSex = Sex.getOngoingActionsMap(Sex.getCharacterPerformingAction()).get(SexAreaPenetration.PENIS).get(Sex.getCharacterTargetedForSexAction(this)).contains(SexAreaOrifice.VAGINA);
			} catch(Exception ex) {
			}
			boolean analSex = false;
			try {
				analSex = Sex.getOngoingActionsMap(Sex.getCharacterPerformingAction()).get(SexAreaPenetration.PENIS).get(Sex.getCharacterTargetedForSexAction(this)).contains(SexAreaOrifice.ANUS);
			} catch(Exception ex) {
			}

			String tag = "pussy";
			if(analSex) {
				tag = "asshole";
			}

			switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
				case DOM_GENTLE:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] gently [npc.verb(take)] hold of [npc2.namePos] [npc2.ears+] in each [npc.hand], and, while continuing to rhythmically slide [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] slowly [npc.verb(pull)] back, causing [npc2.name] to lift [npc2.her] head and let out [npc2.a_moan+].",
								"Taking a gentle hold of [npc2.namePos] [npc2.ears+] with both [npc.hands], [npc.name] simultaneously [npc.verb(pull)] [npc2.her] head back while burying [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" softly giggling":" smirking")+" to [npc.herself] as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to slowly sink [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a gentle hold of [npc2.her] [npc2.ears+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] gently [npc.verb(take)] hold of [npc2.namePos] [npc2.ears+] in each [npc.hand], before slowly pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Taking a gentle hold of [npc2.namePos] [npc2.ears+] with both [npc.hands], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" softly [npc.verb(giggle)]":" [npc.verb(smirk)]")
									+" to [npc.herself] as [npc.she] [npc.verb(pull)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Tracing [npc.her] [npc.fingers+] up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a gentle hold of [npc2.her] [npc2.ears+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
				case DOM_ROUGH:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] roughly [npc.verb(grab)] hold of [npc2.namePos] [npc2.ears+], and, while continuing to forcefully slam [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] sharply [npc.verb(yank)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Grabbing [npc2.namePos] [npc2.ears+] with both [npc.hands], [npc.name] simultaneously [npc.verb(yank)] [npc2.her] head back while slamming [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" maniacally giggling":" deeply grunting")+" in pleasure as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to roughly slam [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(grab)] [npc2.her] [npc2.ears+],"
										+ " before violently yanking [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] roughly [npc.verb(grab)] hold of [npc2.namePos] [npc2.ears+] in each [npc.hand], before sharply yanking [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Grabbing [npc2.namePos] [npc2.ears+] with both [npc.hands], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" maniacally [npc.verb(giggle)]":" deeply [npc.verb(grunt)]")
									+" as [npc.she] violently [npc.verb(yank)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Groping and pawing [npc.her] way up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(grab)] [npc2.her] [npc2.ears+],"
										+ " before roughly tugging [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
				default: // For dom normal, sub normal, and sub eager:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] firmly [npc.verb(take)] hold of [npc2.namePos] [npc2.ears+] in each [npc.hand], and, while continuing to rhythmically pump [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] steadily [npc.verb(pull)] back, causing [npc2.name] to lift [npc2.her] head and let out [npc2.a_moan+].",
								"Taking a firm hold of [npc2.namePos] [npc2.ears+] with both [npc.hands], [npc.name] simultaneously [npc.verb(pull)] [npc2.her] head back while thrusting [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" happily giggling":" grunting")+" in pleasure as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to energetically thrust [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a firm hold of [npc2.her] [npc2.ears+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] firmly [npc.verb(take)] hold of [npc2.namePos] [npc2.ears+] in each [npc.hand], before steadily pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Taking a firm hold of [npc2.namePos] [npc2.ears+] with both [npc.hands], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" happily [npc.verb(giggle)]":" [npc.verb(chuckle)]")
									+" in pleasure as [npc.she] [npc.verb(pull)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Tracing [npc.her] [npc.fingers+] up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a firm hold of [npc2.her] [npc2.ears+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
			}
		}

	};

	public static final SexAction GRAB_HORNS = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.TWO_LOW,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.TWO_HORNY,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public String getActionTitle() {
			return "Grab horns";
		}

		@Override
		public String getActionDescription() {
			return "Grab [npc2.namePos] [npc2.horns+] and pull [npc2.her] head back.";
		}

		@Override
		public SexActionCategory getCategory() {
			return SexActionCategory.SEX;
		}

		@Override
		public boolean isBaseRequirementsMet() {
			boolean suitableSlot = false;

			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_TWO) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_TWO
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_TWO;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_THREE) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_THREE
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_THREE;
			}
			if(Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this))==SexSlotAllFours.ALL_FOURS_FOUR) {
				suitableSlot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.BEHIND_FOUR
						|| Sex.getSexPositionSlot(Sex.getCharacterPerformingAction())==SexSlotAllFours.HUMPING_FOUR;
			}

			return Sex.getSexPace(Sex.getCharacterPerformingAction())!=SexPace.SUB_RESISTING
					&& Sex.getPenetrationTypeFreeCount(Sex.getCharacterPerformingAction(), SexAreaPenetration.FINGER)>=2
					&& Sex.getCharacterTargetedForSexAction(this).isHornsAbleToBeUsedAsHandlesInSex()
					&& suitableSlot;
		}

		@Override
		public String getDescription() {

			boolean vaginalSex = false;
			try {
				vaginalSex = Sex.getOngoingActionsMap(Sex.getCharacterPerformingAction()).get(SexAreaPenetration.PENIS).get(Sex.getCharacterTargetedForSexAction(this)).contains(SexAreaOrifice.VAGINA);
			} catch(Exception ex) {
			}
			boolean analSex = false;
			try {
				analSex = Sex.getOngoingActionsMap(Sex.getCharacterPerformingAction()).get(SexAreaPenetration.PENIS).get(Sex.getCharacterTargetedForSexAction(this)).contains(SexAreaOrifice.ANUS);
			} catch(Exception ex) {
			}

			String tag = "pussy";
			if(analSex) {
				tag = "asshole";
			}

			switch(Sex.getSexPace(Sex.getCharacterPerformingAction())) {
				case DOM_GENTLE:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] gently [npc.verb(take)] hold of [npc2.namePos] [npc2.horns+] in each [npc.hand], and, while continuing to rhythmically slide [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] slowly [npc.verb(pull)] back, causing [npc2.name] to lift [npc2.her] head and let out [npc2.a_moan+].",
								"Taking a gentle hold of [npc2.namePos] [npc2.horns+] with both [npc.hands], [npc.name] simultaneously [npc.verb(pull)] [npc2.her] head back while burying [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" softly giggling":" smirking")+" to [npc.herself] as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to slowly sink [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a gentle hold of [npc2.her] [npc2.horns+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] gently [npc.verb(take)] hold of [npc2.namePos] [npc2.horns+] in each [npc.hand], before slowly pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Taking a gentle hold of [npc2.namePos] [npc2.horns+] with both [npc.hands], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" softly [npc.verb(giggle)]":" [npc.verb(smirk)]")
									+" to [npc.herself] as [npc.she] [npc.verb(pull)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Tracing [npc.her] [npc.fingers+] up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a gentle hold of [npc2.her] [npc2.horns+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
				case DOM_ROUGH:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] roughly [npc.verb(grab)] hold of [npc2.namePos] [npc2.horns+], and, while continuing to forcefully slam [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] sharply [npc.verb(yank)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Grabbing [npc2.namePos] [npc2.horns+] with both [npc.hands], [npc.name] simultaneously [npc.verb(yank)] [npc2.her] head back while slamming [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" maniacally giggling":" deeply grunting")+" in pleasure as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to roughly slam [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(grab)] [npc2.her] [npc2.horns+],"
										+ " before violently yanking [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] roughly [npc.verb(grab)] hold of [npc2.namePos] [npc2.horns+] in each [npc.hand], before sharply yanking [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Grabbing [npc2.namePos] [npc2.horns+] with both [npc.hands], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" maniacally [npc.verb(giggle)]":" deeply [npc.verb(grunt)]")
									+" as [npc.she] violently [npc.verb(yank)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Groping and pawing [npc.her] way up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(grab)] [npc2.her] [npc2.horns+],"
										+ " before roughly tugging [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
				default: // For dom normal, sub normal, and sub eager:
					if(vaginalSex || analSex) {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] firmly [npc.verb(take)] hold of [npc2.namePos] [npc2.horns+] in each [npc.hand], and, while continuing to rhythmically pump [npc.her] [npc.cock] in and out of [npc2.her] [npc2."+tag+"+],"
										+ " [npc.she] steadily [npc.verb(pull)] back, causing [npc2.name] to lift [npc2.her] head and let out [npc2.a_moan+].",
								"Taking a firm hold of [npc2.namePos] [npc2.horns+] with both [npc.hands], [npc.name] simultaneously [npc.verb(pull)] [npc2.her] head back while thrusting [npc.her] [npc.cock+] deep into [npc2.her] [npc2."+tag+"],"
										+(Sex.getCharacterPerformingAction().isFeminine()?" happily giggling":" grunting")+" in pleasure as [npc2.name] [npc2.verb(let)] out [npc2.moan+].",
								"Continuing to energetically thrust [npc.her] [npc.cock+] in and out of [npc2.namePos] [npc2."+tag+"+], [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a firm hold of [npc2.her] [npc2.horns+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");

					} else {
						return UtilText.returnStringAtRandom(
								"Reaching forwards, [npc.name] firmly [npc.verb(take)] hold of [npc2.namePos] [npc2.horns+] in each [npc.hand], before steadily pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].",
								"Taking a firm hold of [npc2.namePos] [npc2.horns+] with both [npc.hands], [npc.name] "+(Sex.getCharacterPerformingAction().isFeminine()?" happily [npc.verb(giggle)]":" [npc.verb(chuckle)]")
									+" in pleasure as [npc.she] [npc.verb(pull)] [npc2.her] head back, causing [npc2.herHim] to let out [npc2.moan+].",
								"Tracing [npc.her] [npc.fingers+] up the length of [npc2.namePos] back, [npc.name] [npc.verb(reach)] forwards with two [npc.hands] and [npc.verb(take)] a firm hold of [npc2.her] [npc2.horns+],"
										+ " before pulling [npc2.her] head back and causing [npc2.herHim] to let out [npc2.a_moan+].");
					}
			}
		}

	};

	public static final SexAction LOOK_BACK = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ONE_VANILLA,
			null,
			SexParticipantType.NORMAL) {

		@Override
		public boolean isBaseRequirementsMet() {
			SexSlot slot = Sex.getSexPositionSlot(Sex.getCharacterPerformingAction());
			SexSlot targetedSlot = Sex.getSexPositionSlot(Sex.getCharacterTargetedForSexAction(this));
			return Sex.getSexPace(Sex.getCharacterPerformingAction())!=SexPace.SUB_RESISTING
					&& (slot.hasTag(SexSlotTag.ALL_FOURS))
					&& (targetedSlot.hasTag(SexSlotTag.BEHIND_ALL_FOURS));
		}

		@Override
		public String getActionTitle() {
			return "Seductive look";
		}
		@Override
		public String getActionDescription() {
			return "Turn your head back and give [npc2.name] a seductive look.";
		}

		@Override
		public SexActionCategory getCategory() {
			return SexActionCategory.SEX;
		}

		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Turning [npc.her] head back, [npc.name] [npc.verb(look)] up at [npc2.name] and [npc.verb(bite)] [npc.her] [npc.lip], putting on [npc.her] most seductive look as [npc.she] [npc.verb(entice)] [npc2.herHim] to use [npc.herHim].",
					"Looking back at [npc2.name] as [npc2.she] [npc2.verb(tower)] over [npc.her] [npc.ass+], [npc.name] [npc.verb(put)] on a seductive look,"
							+ " [npc.moaning] in delight as [npc.she] [npc.verb(entice)] [npc2.herHim] into using [npc.her] body.",
					"[npc.Name] [npc.verb(turn)] [npc.her] head and [npc.verb(bite)] [npc.her] [npc.lip] at [npc2.name], doing [npc.her] best to look as seductive as possible.",
					"Looking back, [npc.name] [npc.verb(put)] on a seductive look for [npc2.name], feeling extremely pleased with [npc.herself] as [npc.she] [npc.verb(see)] [npc2.herHim] gazing hungrily down at [npc.herHim] in return.");
		}
	};

	// Orgasms:

	public static final SexAction DOGGY_DOMINANT_ORGASM = new SexAction(
			SexActionType.ORGASM,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.THREE_DIRTY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.PENIS, SexAreaOrifice.ANUS)),
			SexParticipantType.NORMAL,
			SexPace.DOM_ROUGH) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterTargetedForSexAction(this).isCoverableAreaExposed(CoverableArea.MOUTH)
					&& Sex.isDom(Sex.getCharacterPerformingAction())
					&& Sex.getDominantParticipants(false).size()==1
					&& Sex.getCharacterPerformingAction().hasPenisIgnoreDildo()
					&& (Sex.getSexPositionSlot(Sex.getCharacterPerformingAction()).hasTag(SexSlotTag.BEHIND_ALL_FOURS))
					&& (Sex.getCharacterPerformingAction().isPlayer() || Sex.getRequestedPulloutWeighting(Sex.getCharacterPerformingAction())<=0);
//					&& (Sex.getCharacterPerformingAction().isPlayer() || !Sex.getCharacterPerformingAction().getFetishDesire(Fetish.FETISH_SADIST).isNegative());
		}

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

		@Override
		public SexActionPriority getPriority() {
			if(Math.random()<0.75f) {
				return SexActionPriority.HIGH;
			}
			return SexActionPriority.NORMAL;
		}

		@Override
		public String getActionTitle() {
			return "Ass-to-mouth";
		}

		@Override
		public String getActionDescription() {
			if(Sex.getCharacterPerformingAction().isWearingCondom()) {
				return "Roughly fuck [npc2.name] into the floor before filling your condom with your cum. Then slide it off and use [npc2.her] mouth to clean yourself off.";
			}
			return "Roughly fuck [npc2.name] into the floor before filling [npc2.her] [npc2.ass] with your cum. Then use [npc2.her] mouth to clean yourself off.";
		}

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

			UtilText.nodeContentSB.append(
					"As [npc.name] [npc.verb(feel)] [npc2.namePos] [npc2.asshole+] squeezing down around [npc.her] [npc.cock+], [npc.she] [npc.verb(decide)] to show [npc2.herHim] how"
						+ (Sex.getCharacterPerformingAction().getRace()==Race.WOLF_MORPH || Sex.getCharacterPerformingAction().getRace()==Race.DOG_MORPH
							?" an alpha treats their submissive little beta."
							:" a real dom treats their submissive bitch.")
					+ " Letting out [npc.a_moan+], [npc.name] [npc.verb(slam)] [npc.her] [npc.cock+] deep into [npc2.namePos] [npc2.ass+], grinning devilishly as [npc2.she] [npc2.verb(let)] out [npc2.a_moan+]."
					+ "<br/><br/>"
					+ "Reaching down, [npc.she] then [npc.verb(grab)] [npc2.namePos] shoulders, before pushing [npc.her] weight down onto [npc2.her] back as [npc.she] roughly [npc2.verb(mount)] [npc2.herHim]."
					+ " With [npc.namePos] weight now on top of [npc2.herHim], [npc2.name] [npc2.verb(collapses)] to the floor with [npc2.a_moan+]."
					+ " Bending down, and with [npc.her] throbbing [npc.cock] still hilted in [npc2.namePos] [npc2.asshole+], [npc.name] [npc.verb(growl)] menacingly in [npc2.her] [npc2.ear], "
							+ "[npc.speech(You little bitch! All you're good for is being my slutty cock-sleeve!)]"
					+"<br/><br/>"
					+ "Upon hearing those degrading words, [npc2.Name] [npc2.verb(let)] out another [npc2.moan+], which is enough to send [npc.name] over the edge."
					+ " As [npc.she] [npc.verb(grind)] [npc2.namePos] [npc2.face+] into the floor, [npc.she] [npc.verb(reach)] [npc.her] climax, and as [npc.her] [npc.balls+] tense up"
					);

			switch (Sex.getCharacterPerformingAction().getPenisOrgasmCumQuantity()) {
				case ZERO_NONE:
					UtilText.nodeContentSB.append(", [npc.she] [npc.verb(realise)] that [npc.she] [npc.is]n't able to produce even one drop of cum, somewhat lessening the impact of [npc.her] dominant display.");
					break;
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(", a small trickle of [npc.cum+] squirts");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(", a small amount of [npc.cum+] squirts");
					break;
				case THREE_AVERAGE:
					UtilText.nodeContentSB.append(", [npc.her] [npc.cum+] shoots");
					break;
				case FOUR_LARGE:
					UtilText.nodeContentSB.append(", [npc.her] [npc.cum+] shoots");
					break;
				case FIVE_HUGE:
					UtilText.nodeContentSB.append(", [npc.her] load pours out");
					break;
				case SIX_EXTREME:
					UtilText.nodeContentSB.append(", [npc.her] huge load pours out");
					break;
				case SEVEN_MONSTROUS:
					UtilText.nodeContentSB.append(", [npc.her] enormous load pours out");
					break;
			}

			if(Sex.getCharacterPerformingAction().getPenisOrgasmCumQuantity()!=CumProduction.ZERO_NONE) {
				if(Sex.getCharacterPerformingAction().isWearingCondom()) {
					UtilText.nodeContentSB.append(" into the condom that [npc.sheIs] wearing.");
				} else {
					UtilText.nodeContentSB.append(" deep into [npc2.namePos] [npc2.asshole+].");
				}
			}

			if (Sex.getCharacterPerformingAction().getVaginaType() != VaginaType.NONE) {
				UtilText.nodeContentSB.append("<br/><br/>"
						+ "As [npc.name] [npc.verb(slide)] [npc.her] still-throbbing shaft out from [npc2.namePos] well-used [npc2.ass], [npc.she] [npc.verb(feel)] a second orgasm building deep in [npc.her] groin."
						+ " Grabbing [npc2.namePos] hips to brace [npc.herself], [npc.name] [npc.verb(start)] to go weak at the knees before clenching [npc.her] thighs together as [npc.her] [npc.ass+] shudders and quivers."
						+ " A mind-splitting orgasm washes through [npc.her], and [npc.name] [npc.moanVerb] in delight as [npc.her] feminine sex joins in on the fun.");

			} else {
				UtilText.nodeContentSB.append("<br/><br/>"
						+ "As [npc.name] [npc.verb(slide)] [npc.her] still-throbbing shaft out from [npc2.namePos] well-used [npc2.ass], [npc.she] [npc.verb(look)] down, grinning, at the mess [npc.sheHas] made of [npc2.herHim].");
			}

			UtilText.nodeContentSB.append("<br/><br/>"
					+ "Panting heavily, [npc.name] suddenly [npc.verb(remember)] what [npc.she] had planned, and [npc.verb(shuffle)] around to where [npc2.namePos] face is still collapsed down against the floor."
					+ (Sex.getCharacterTargetedForSexAction(this).hasHair()
							?" Reaching down, [npc.she] roughly [npc.verb(grab)] a fistful of [npc2.namePos] [npc2.hair+],"
							:" Reaching down, [npc.she] roughly [npc.verb(grab)] [npc2.namePos] neck,")
					+" and before [npc2.she] [npc2.has] a chance to react, [npc.she] [npc.verb(shove)] [npc2.her] [npc2.face+] down onto [npc.her] [npc.cock+]."
					+ " [npc2.Name] [npc2.moansVerb] and [npc2.verb(squirm)] as "+(Sex.getCharacterPerformingAction().isPlayer()?"you":"[npc2.her] dominant partner")+" [npc.verb(give)] [npc2.herHim] a taste of [npc2.her] own [npc2.ass],"
						+ " and, holding [npc2.herHim] tightly in position, [npc.she] [npc.moansVerb+] as [npc2.her] frantic [npc2.tongue] cleans [npc.herHim] off."
					+ "<br/><br/>"
					+ "After a minute of using [npc2.name] in this manner, [npc.name] finally [npc.verb(release)] [npc2.herHim], and, with a deep gasp, [npc2.she] [npc2.verb(collapse)] to the floor, completely exhausted from the dominant treatment.");

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public List<SexAreaInterface> getAreasCummedIn(GameCharacter cumProvider, GameCharacter cumTarget) {
			if(cumProvider.equals(Sex.getCharacterPerformingAction()) && cumTarget.equals(Sex.getCharacterTargetedForSexAction(this))) {
				return Util.newArrayListOfValues(SexAreaOrifice.ANUS);
			} else {
				return null;
			}
		}

		@Override
		public void applyEffects() {
			Sex.stopOngoingAction(Sex.getCharacterPerformingAction(), SexAreaPenetration.PENIS, Sex.getCharacterTargetedForSexAction(this), SexAreaOrifice.ANUS);
		}

	};

	public static final SexAction DOGGY_DOMINANT_ORGASM_PUSSY = new SexAction(
			SexActionType.ORGASM,
			ArousalIncrease.FOUR_HIGH,
			ArousalIncrease.THREE_NORMAL,
			CorruptionLevel.THREE_DIRTY,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.PENIS, SexAreaOrifice.VAGINA)),
			SexParticipantType.NORMAL,
			SexPace.DOM_ROUGH) {

		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.getCharacterTargetedForSexAction(this).isCoverableAreaExposed(CoverableArea.MOUTH)
					&& Sex.isDom(Sex.getCharacterPerformingAction())
					&& Sex.getDominantParticipants(false).size()==1
					&& Sex.getCharacterPerformingAction().hasPenisIgnoreDildo()
					&& (Sex.getSexPositionSlot(Sex.getCharacterPerformingAction()).hasTag(SexSlotTag.BEHIND_ALL_FOURS))
					&& (Sex.getCharacterPerformingAction().isPlayer() || Sex.getRequestedPulloutWeighting(Sex.getCharacterPerformingAction())<=0);
//					&& (Sex.getCharacterPerformingAction().isPlayer() || !Sex.getCharacterPerformingAction().getFetishDesire(Fetish.FETISH_SADIST).isNegative());
		}

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

		@Override
		public SexActionPriority getPriority() {
			if(Math.random()<0.75f) {
				return SexActionPriority.HIGH;
			}
			return SexActionPriority.NORMAL;
		}

		@Override
		public String getActionTitle() {
			return "Pussy-to-mouth";
		}

		@Override
		public String getActionDescription() {
			if(Sex.getCharacterPerformingAction().isWearingCondom()) {
				return "Roughly fuck [npc2.name] into the floor before filling your condom with your cum. Then slide it off and use [npc2.her] mouth to clean yourself off.";
			}
			return "Roughly fuck [npc2.name] into the floor before filling [npc2.her] [npc2.pussy] with your cum. Then use [npc2.her] mouth to clean yourself off.";
		}

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

			UtilText.nodeContentSB.append(
					"As [npc.name] [npc.verb(feel)] [npc2.namePos] [npc2.pussy+] squeezing down around [npc.her] [npc.cock+], [npc.she] [npc.verb(decide)] to show [npc2.herHim] how"
						+ (Sex.getCharacterPerformingAction().getRace()==Race.WOLF_MORPH || Sex.getCharacterPerformingAction().getRace()==Race.DOG_MORPH
							?" an alpha treats their submissive little beta."
							:" a real dom treats their submissive bitch.")
					+ " Letting out [npc.a_moan+], [npc.name] [npc.verb(slam)] [npc.her] [npc.cock+] deep into [npc2.namePos] [npc2.pussy+], grinning devilishly as [npc2.she] [npc2.verb(let)] out [npc2.a_moan+]."
					+ "<br/><br/>"
					+ "Reaching down, [npc.she] then [npc.verb(grab)] [npc2.namePos] shoulders, before pushing [npc.her] weight down onto [npc2.her] back as [npc.she] roughly [npc2.verb(mount)] [npc2.herHim]."
					+ " With [npc.namePos] weight now on top of [npc2.herHim], [npc2.name] [npc2.verb(collapses)] to the floor with [npc2.a_moan+]."
					+ " Bending down, and with [npc.her] throbbing [npc.cock] still hilted in [npc2.namePos] [npc2.pussy+], [npc.name] [npc.verb(growl)] menacingly in [npc2.her] [npc2.ear], "
							+ "[npc.speech(You little bitch! All you're good for is being my slutty cock-sleeve!)]"
					+"<br/><br/>"
					+ "Upon hearing those degrading words, [npc2.Name] [npc2.verb(let)] out another [npc2.moan+], which is enough to send [npc.name] over the edge."
					+ " As [npc.she] [npc.verb(grind)] [npc2.namePos] [npc2.face+] into the floor, [npc.she] [npc.verb(reach)] [npc.her] climax, and as [npc.her] [npc.balls+] tense up"
					);

			switch (Sex.getCharacterPerformingAction().getPenisOrgasmCumQuantity()) {
				case ZERO_NONE:
					UtilText.nodeContentSB.append(", [npc.she] [npc.verb(realise)] that [npc.she] [npc.is]n't able to produce even one drop of cum, somewhat lessening the impact of [npc.her] dominant display.");
					break;
				case ONE_TRICKLE:
					UtilText.nodeContentSB.append(", a small trickle of [npc.cum+] squirts");
					break;
				case TWO_SMALL_AMOUNT:
					UtilText.nodeContentSB.append(", a small amount of [npc.cum+] squirts");
					break;
				case THREE_AVERAGE:
					UtilText.nodeContentSB.append(", [npc.her] [npc.cum+] shoots");
					break;
				case FOUR_LARGE:
					UtilText.nodeContentSB.append(", [npc.her] [npc.cum+] shoots");
					break;
				case FIVE_HUGE:
					UtilText.nodeContentSB.append(", [npc.her] load pours out");
					break;
				case SIX_EXTREME:
					UtilText.nodeContentSB.append(", [npc.her] huge load pours out");
					break;
				case SEVEN_MONSTROUS:
					UtilText.nodeContentSB.append(", [npc.her] enormous load pours out");
					break;
			}

			if(Sex.getCharacterPerformingAction().getPenisOrgasmCumQuantity()!=CumProduction.ZERO_NONE) {
				if(Sex.getCharacterPerformingAction().isWearingCondom()) {
					UtilText.nodeContentSB.append(" into the condom that [npc.sheIs] wearing.");
				} else {
					UtilText.nodeContentSB.append(" deep into [npc2.namePos] [npc2.pussy+].");
				}
			}

			if (Sex.getCharacterPerformingAction().getVaginaType() != VaginaType.NONE) {
				UtilText.nodeContentSB.append("<br/><br/>"
						+ "As [npc.name] [npc.verb(slide)] [npc.her] still-throbbing shaft out from [npc2.namePos] well-used [npc2.pussy], [npc.she] [npc.verb(feel)] a second orgasm building deep in [npc.her] groin."
						+ " Grabbing [npc2.namePos] hips to brace [npc.herself], [npc.name] [npc.verb(start)] to go weak at the knees before clenching [npc.her] thighs together as [npc.her] [npc.pussy+] shudders and quivers."
						+ " A mind-splitting orgasm washes through [npc.her], and [npc.name] [npc.moanVerb] in delight as [npc.her] feminine sex joins in on the fun.");

			} else {
				UtilText.nodeContentSB.append("<br/><br/>"
						+ "As [npc.name] [npc.verb(slide)] [npc.her] still-throbbing shaft out from [npc2.namePos] well-used [npc2.pussy], [npc.she] [npc.verb(look)] down, grinning, at the mess [npc.sheHas] made of [npc2.herHim].");
			}

			UtilText.nodeContentSB.append("<br/><br/>"
					+ "Panting heavily, [npc.name] suddenly [npc.verb(remember)] what [npc.she] had planned, and [npc.verb(shuffle)] around to where [npc2.namePos] face is still collapsed down against the floor."
					+ (Sex.getCharacterTargetedForSexAction(this).hasHair()
							?" Reaching down, [npc.she] roughly [npc.verb(grab)] a fistful of [npc2.namePos] [npc2.hair+],"
							:" Reaching down, [npc.she] roughly [npc.verb(grab)] [npc2.namePos] neck,")
					+" and before [npc2.she] [npc2.has] a chance to react, [npc.she] [npc.verb(shove)] [npc2.her] [npc2.face+] down onto [npc.her] [npc.cock+]."
					+ " [npc2.Name] [npc2.moansVerb] and [npc2.verb(squirm)] as "+(Sex.getCharacterPerformingAction().isPlayer()?"you":"[npc2.her] dominant partner")+" [npc.verb(give)] [npc2.herHim] a taste of [npc2.her] own [npc2.pussy],"
						+ " and, holding [npc2.herHim] tightly in position, [npc.she] [npc.moansVerb+] as [npc2.her] frantic [npc2.tongue] cleans [npc.herHim] off."
					+ "<br/><br/>"
					+ "After a minute of using [npc2.name] in this manner, [npc.name] finally [npc.verb(release)] [npc2.herHim], and, with a deep gasp, [npc2.she] [npc2.verb(collapse)] to the floor, completely exhausted from the dominant treatment.");

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public List<SexAreaInterface> getAreasCummedIn(GameCharacter cumProvider, GameCharacter cumTarget) {
			if(cumProvider.equals(Sex.getCharacterPerformingAction()) && cumTarget.equals(Sex.getCharacterTargetedForSexAction(this))) {
				return Util.newArrayListOfValues(SexAreaOrifice.VAGINA);
			} else {
				return null;
			}
		}

		@Override
		public void applyEffects() {
			Sex.stopOngoingAction(Sex.getCharacterPerformingAction(), SexAreaPenetration.PENIS, Sex.getCharacterTargetedForSexAction(this), SexAreaOrifice.VAGINA);
		}

	};

}

repo_name: klorpa/Pedo

license: unknown


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

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class FaceSitting {

}


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

/**
 * @since 0.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class FaceToWall {

}


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

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.SexParticipantType;
import com.lilithsthrone.game.sex.sexActions.SexAction;
import com.lilithsthrone.game.sex.sexActions.SexActionLimitation;
import com.lilithsthrone.game.sex.sexActions.SexActionPriority;
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.2.8
 * @version 0.2.8
 * @author Innoxia
 */
public class HandHolding {

	public static final SexAction PLAYER_HAND_MASSAGE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Hand massage";
		}
		@Override
		public String getActionDescription() {
			return "Massage Rose's hands.";
		}
		@Override
		public boolean isBaseRequirementsMet() {
			return true;
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Taking Rose's hand in one of yours, you gently press the [pc.fingers+] of your other hand down against the back of hers, rubbing and massaging her delicate skin.",
					"You take hold of Rose's hand, and with slow, deliberate movements, start massaging giving her a gentle massage.",
					"Holding Rose's hand in yours, you start to apply a gentle pressure, revelling in the feeling of her perfect, unblemished skin as you give her a loving massage.",
					"With a soft, tender care, you start massaging Rose's hands, letting out little [pc.moans] as you feel the softness of her angelic skin.");
		}
		@Override
		public void applyEffects() {
		}
	};

	public static final SexAction PLAYER_INTERLOCKING_FINGERS = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Interlock fingers";
		}
		@Override
		public String getActionDescription() {
			return "Interlock your fingers with Rose's.";
		}
		@Override
		public boolean isBaseRequirementsMet() {
			return true;
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Taking Rose's hand in yours, you intertwine your fingers between hers, and with a gentle pressure, you lewdly hold her hand.",
					"In a single, deliberate movement, you grasp Rose's hand in yours, sliding your fingers between hers as you fully penetrate the inviting gaps between her digits.",
					"Letting out a determined [pc.moan], you slide your fingers between Rose's, squeezing down on her hand as you show her just how naughty you are.",
					"With a lewd thrust of your [pc.arm], you grasp Rose's perfect hand in yours, quickly interlocking your fingers with hers as you struggle to contain a desperate gasp.");
		}
		@Override
		public void applyEffects() {
		}
	};

	public static final SexAction PLAYER_NAIL_FOCUS = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Nail rub";
		}
		@Override
		public String getActionDescription() {
			return "Gently rub Rose's nails.";
		}
		@Override
		public boolean isBaseRequirementsMet() {
			return true;
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Rose's nails are painted a very soft shade of pink, and you find yourself unable to resist sliding your fingertips up over their flawless surface.",
					"In an incredible display of lewdness, you slide each of your fingertips over the corresponding fingernail on Rose's hand, sighing contentedly to yourself as you feel her perfect manicure.",
					"Rose wasn't lying when she said she takes good care of her hands, and as you slide your fingertips over her perfectly-manicured nails, you wonder just how long it took her to get them looking so good.",
					"The soft shade of pink that Rose has painted her fingernails perfectly compliments the pale tone of her skin, and as you rub your fingers up and down their smooth lengths, you marvel at just how perfect they are.");
		}
		@Override
		public void applyEffects() {
		}
	};

	public static final SexAction FINGER_STROKING = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Stroke fingers";
		}
		@Override
		public String getActionDescription() {
			return "Gently stroke Rose's fingers.";
		}
		@Override
		public boolean isBaseRequirementsMet() {
			return true;
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Grasping one of Rose's slender, feminine fingers in your hand, you slowly slide your fingertips up and down its length, marvelling at how soft her perfect, unblemished skin is.",
					"With a determined thrust of your hand, you grasp Rose's fingers, sliding your own digits up and down over their lengths as you fail to contain an ecstatic [pc.moan].",
					"Sliding your fingers over Rose's, you let out a little whimper in excitement as you start stroking her soft, angelic skin.",
					"Running your fingertips up and down the length of each of Rose's slender, feminine fingers, you struggle to comprehend just how perfectly formed her hands truly are.");
		}
		@Override
		public void applyEffects() {
		}
	};

	public static final SexAction PLAYER_LICK_PALM = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Lick palms";
		}
		@Override
		public String getActionDescription() {
			return "Lick Rose's palms.";
		}
		@Override
		public boolean isBaseRequirementsMet() {
			return Sex.isOrificeFree(Main.game.getPlayer(), SexAreaOrifice.MOUTH);
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Lifting one of Rose's hands up to your mouth, you press your [pc.lips+] against the delicate skin of her palm, before sliding your [pc.tongue] up over her soft skin.",
					"Raising Rose's hand to your mouth, you deliver a long, slow lick to her soft palm, letting out a lewd [pc.moan] as you get a faint taste of salty sweat mixed in with her feminine scent.",
					"Taking hold of Rose's hand, you lift it up to your mouth before softly licking and lapping at her delicate palm. The gentle taste of sweat and feminine perfume hits your [pc.tongue], and you fail to contain a shuddering [pc.moan].",
					"With a little [pc.moan], you raise Rose's angelic hand to your [pc.lips+], before delivering a slow, loving lick to her soft palm.");
		}
		@Override
		public void applyEffects() {
		}
	};

	public static final SexAction PLAYER_START_SUCKING = new SexAction(
			SexActionType.START_ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaOrifice.MOUTH, SexAreaPenetration.FINGER)),
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Suck fingers";
		}
		@Override
		public String getActionDescription() {
			return "Start sucking Rose's fingers.";
		}
		@Override
		public String getDescription() {
			return "In an incredible display of the sort of extreme lewdness usually confined to only the most outrageous of online-publications, you resolutely commit to taking things to the next level."
					+ " Grasping Rose's angelic, feminine hand in yours, you slowly lift it to your mouth."
					+ " Sensing what you're about to do, and in sheer anticipation of witnessing the result of the outrageous course of action you've embarked upon, Rose collapses against the wall for support,"
						+ " moaning and panting as her fingers draw ever nearer to your cavernous maw."
					+ "

"
					+ "As your hot breath falls on her sensitive fingertips, you briefly ponder if perhaps you've taken this a little too far, but there seems to be no easy way out now,"
						+ " and you resolutely thrust Rose's fingers past your lips and into your mouth."
					+ " Thus relegating yourself to the ranks of the lewdest of sexual deviants, and knowing that you'll never quite be the same person as you once were, you proceed to then start sucking on Rose's fingers.";
		}
	};

	public static final SexAction PLAYER_GENTLE_SUCK = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaOrifice.MOUTH, SexAreaPenetration.FINGER)),
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Gentle suck";
		}
		@Override
		public String getActionDescription() {
			return "Gently suck Rose's fingers.";
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"You gently suck and kiss Rose's feminine digits, desperately running your tongue over her slender fingers as you taste her gentle combination of sweat and feminine perfume.",
					"Sucking gently on Rose's perfect fingers, you run your tongue around each of her digits in turn, letting out [pc.moans+] as you orally pleasure her hand.",
					"Determined to give Rose a good time, you gently suck and kiss at each of her feminine fingers, revelling in the feeling of being able to experience such a devious pleasure.",
					"Wrapping your [pc.lips+] around Rose's angelic fingers, you gently suck and kiss at her perfectly-formed digits, making little [pc.moaning] noises as you notice the faint taste of her sweat hitting the back of your tongue.");
		}
	};

	public static final SexAction PLAYER_INTENSE_SUCK = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaOrifice.MOUTH, SexAreaPenetration.FINGER)),
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Intense suck";
		}
		@Override
		public String getActionDescription() {
			return "Intensely suck Rose's fingers.";
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Before you know what you're doing, you've lost yourself to the devious pleasure of sucking Rose's fingers, and with a lewd cry, you desperately pick up the pace of your intense digit-sucking.",
					"With an intense sucking motion, you press your [pc.lips+] down around Rose's fingers before starting to frantically kiss and lick at her delicate digits.",
					"You decide to pick up the pace of your lewd finger-sucking, and with a desperate cry, you greedily swirl your tongue around each of her digits in turn.",
					"Rose's fingers are soft and warm in your mouth, and, not being able to hold yourself back any longer, you frantically start sucking and kissing her perfectly-formed digits.");
		}
	};

	public static final SexAction PLAYER_STOP_SUCKING = new SexAction(
			SexActionType.STOP_ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaOrifice.MOUTH, SexAreaPenetration.FINGER)),
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.PLAYER_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Stop sucking";
		}
		@Override
		public String getActionDescription() {
			return "Stop sucking Rose's fingers.";
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Not being able to cope with just how lewd your finger-sucking has become, you slide Rose's soft, feminine digits out of your mouth."
					+ " A solitary strand of slimy saliva slowly slides out from your mouth, connecting your lips to Rose's fingertips for brief moment before breaking and falling to the floor beneath you.");
		}
	};

	// Rose:

	public static final SexAction PARTNER_MOAN = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.NPC_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Moans";
		}
		@Override
		public String getActionDescription() {
			return "";
		}
		@Override
		public String getDescription() {
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"Rose lets out a desperate cry, ",
					"With an extremely lewd moan, Rose cries out, ",
					"Desperately moaning, Rose locks her [rose.eyes+] with yours, ",
					"With a desperate, shuddering moan, Rose cries out, "));

			UtilText.nodeContentSB.append(UtilText.returnStringAtRandom(
					"[rose.speech(~Aah!~ Yes! Don't stop!)]",
					"[rose.speech(Yes! Yes! ~Aah!~ Take me!)]",
					"[rose.speech(Oh yes! ~Aah!~ Keep going!)]",
					"[rose.speech(Oh! ~Aah!~ Keep going! Yes!)]",
					"[rose.speech(~Aah!~ Yes, Yes, Yes!!!)]",
					"[rose.speech(~Aah!~ Oh yes! Keep going! ~Aah!~)]"));

			return UtilText.nodeContentSB.toString();
		}
	};

	public static final SexAction PARTNER_PANTING = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.NPC_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Panting";
		}
		@Override
		public String getActionDescription() {
			return "";
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Rose seems unable to do anything but pant and [rose.moan] as you carry on stimulating her hands.",
					"Your expert hand-holding skills prove to be too much for Rose, who's unable to do anything but pant from sheer arousal.",
					"Rose's eyes roll up into the back of her head for a moment, and as her tongue lolls out of her mouth, she lets out a long, desperate moan.",
					"With a desperate [rose.moan], Rose starts panting and sighing, and you see her [rose.tongue+] lolling out of her mouth as she struggles to deal with the amount of pleasure you're giving to her.");
		}
	};

	public static final SexAction PARTNER_TABLE_BRACE = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.NPC_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Brace";
		}
		@Override
		public String getActionDescription() {
			return "";
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"Rose partially collapses against the table-top next to her, desperately bracing herself as she starts to go weak at the knees.",
					"With a little [rose.moan], Rose leans against the wall next to her, bracing herself as she struggles to cope with her intense arousal.",
					"Rose rests her back against the wall next to her, clearly unable to stand of her own volition as she lets out a shuddering [rose.moan].",
					"Leaning against the nearby table-top, Rose uses the piece of furniture for support, clearly struggling to remain upright due to the overwhelming pleasure she's receiving from your expert hand-holding skills.");
		}
	};

	public static final SexAction PARTNER_SLIDE_FINGERS = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.FIVE_EXTREME,
			ArousalIncrease.FIVE_EXTREME,
			CorruptionLevel.ZERO_PURE,
			Util.newHashMapOfValues(new Value<>(SexAreaPenetration.FINGER, SexAreaOrifice.MOUTH)),
			SexParticipantType.NORMAL) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.NPC_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "Slide fingers";
		}
		@Override
		public String getActionDescription() {
			return "";
		}
		@Override
		public String getDescription() {
			return UtilText.returnStringAtRandom(
					"With a lewd [rose.moan], Rose starts sliding her fingering in and out of your mouth, causing you to experience levels of lewdness you couldn't imagine even in your wildest dreams.",
					"Rose starts slowly sliding her fingers in and out of your mouth, and you let out a desperate whine as you feel her soft skin rubbing over your [pc.lips+].",
					"Sliding her fingers in and out of your mouth, Rose swirls them around your tongue a little before letting out a desperate [rose.moan].",
					"In an unparallelled display of outrageous sexual deviancy, Rose starts slowly sliding her fingers in and out of your mouth, allowing you to feel her unbelievably soft skin rubbing back and forth past your [pc.lips+].");
		}
	};

	public static final SexAction PARTNER_STOP_SEX = new SexAction(
			SexActionType.ONGOING,
			ArousalIncrease.ONE_MINIMUM,
			ArousalIncrease.ONE_MINIMUM,
			CorruptionLevel.ZERO_PURE,
			null,
			SexParticipantType.SELF) {
		@Override
		public SexActionLimitation getLimitation() {
			return SexActionLimitation.NPC_ONLY;
		}
		@Override
		public String getActionTitle() {
			return "";
		}

		@Override
		public String getActionDescription() {
			return "";
		}

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

		@Override
		public SexActionPriority getPriority() {
			return SexActionPriority.UNIQUE_MAX;
		}

		@Override
		public String getDescription() {
			return "With a satisfied sigh, Rose disentangles herself from your clutches, and, staring lovingly into your eyes, excuses herself,"
					+ " [rose.speech(I don't think I can take any more right now! I need to get some rest, but we definitely need to do this again some time!)]";
		}

		@Override
		public void applyEffects() {
		}

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

}