code:
package com.lilithsthrone.game.dialogue.npcDialogue.dominion;

import com.lilithsthrone.game.character.attributes.Attribute;
import com.lilithsthrone.game.character.attributes.IntelligenceLevel;
import com.lilithsthrone.game.character.attributes.PhysiqueLevel;
import com.lilithsthrone.game.character.npc.NPC;
import com.lilithsthrone.game.dialogue.DialogueNode;
import com.lilithsthrone.game.dialogue.responses.Response;
import com.lilithsthrone.game.dialogue.responses.ResponseSex;
import com.lilithsthrone.game.dialogue.responses.ResponseTrade;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.universal.SMGeneric;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.96
 * @version 0.3.2
 * @author Innoxia
 */
public class ReindeerOverseerDialogue {

	private static NPC getReindeer() {
		return Main.game.getActiveNPC();
	}

	private static Response getDefaultResponses(int index) {
		if(index == 1) {
			return new ResponseTrade("Trade", "Ask [npc.name] what Yuletide presents [npc.sheIs] selling.", getReindeer()) {
				@Override
				public void effects() {
					Main.game.getDialogueFlags().addReindeerEncountered(getReindeer().getId());
				}
			};

		} else if(index == 2) {
			if(Main.game.getDialogueFlags().hasWorkedForReindeer(getReindeer().getId())) {
				return new Response("Work", "You've already helped [npc.name] to finish all of the work [npc.she] had today, so you'll need to come back tomorrow if you wanted to work for [npc.herHim] again.", null);

			} else {
				return new Response("Work", "Offer to work with the reindeer-morphs.", ENCOUNTER_WORK) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().addReindeerEncountered(getReindeer().getId());
						Main.game.getDialogueFlags().addReindeerDailyWorkedFor(getReindeer().getId());
					}
				};
			}

		} else if(index == 3) {
			if(!Main.game.getDialogueFlags().hasWorkedForReindeer(getReindeer().getId())) {
				return new Response("Relieve stress", "[npc.Name] is far too busy to take any time off work right now. Perhaps if you helped out first, [npc.she]'d have time to have sex with you...", null);

			} else {
				return new ResponseSex("Relieve stress",
					"Ask [npc.name] if [npc.she]'d like to blow off some steam with you.",
					true, true,
					new SMGeneric(
							Util.newArrayListOfValues(Main.game.getPlayer()),
							Util.newArrayListOfValues(getReindeer()),
					null,
					null) {
						@Override
						public boolean isPublicSex() {
							return false;
						}
					},
					AFTER_SEX,
					"
"
						+ "Putting on your most seductive voice, you step close to [npc.name] and ask,"
						+ " [pc.speech(You know, if you're feeling stressed from all this work, maybe I could help you to blow off some steam?)]"
					+ "
"
					+ "
"
						+ "A desperate little whine escapes from [npc.her] mouth, and before you can say anything else, the [npc.race] grabs you by the [pc.arm] and pulls you towards where [npc.her] cart is parked."
						+ " Covering the distance in just a few long strides, [npc.name] leads you around to the other side of the vehicle,"
							+ " where you discover that the many wooden boxes which constitute the cart's cargo blocks the view down a narrow alley from the rest of the street."
					+ "
"
					+ "
"
						+ "[npc.speech(Ah, fuck! I'm so horny!)]"
						+ " [npc.name] whines, pulling you a little way down the alley before turning and wrapping [npc.her] arms around you."
						+ " [npc.speech(I was told Dominion was the place to go for an easy fuck, but I've been so caught up in work that I haven't met anyone but you! Please, let's just fuck already!)]"
					+ "
"
					+ "
"
						+ "You can't say no to that, and as [npc.name] presses [npc.her] [npc.lips] against yours, you return the [npc.race]'s passionate embrace..."
					+ "
") {
						@Override
						public void effects() {
							Main.game.getDialogueFlags().addReindeerEncountered(getReindeer().getId());
						}
					};
			}

		} else if(index==0) {
			return new Response("Leave", "Tell [npc.name] that you might come back another time, before taking your leave.", ENCOUNTER_START){
				@Override
				public void effects() {
					Main.game.getDialogueFlags().addReindeerEncountered(getReindeer().getId());
				}
				@Override
				public DialogueNode getNextDialogue(){
					return Main.game.getDefaultDialogueNoEncounter();
				}
			};

		} else {
			return null;
		}
	}

	public static final DialogueNode ENCOUNTER_START = new DialogueNode("Reindeer Overseer", "", true) {

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

			if(Main.game.getDialogueFlags().hasEncounteredReindeer(getReindeer().getId())) {
				UtilText.nodeContentSB.append("
"
							+ "Wanting to speak with [npc.name] again, you look around for a little while, before eventually spotting [npc.herHim] issuing orders to some of [npc.her] workers."
							+ " Walking up to [npc.herHim], you call out a greeting,"
							+ " [pc.speech(Hi, [npc.name]!)]"
						+ "
"
						+ "
"
							+ "[npc.Name] turns around to see who's calling [npc.herHim], and you see a smile break out across [npc.her] face as [npc.she] sees that it's you."
							+ " [npc.speech(Hello again, [pc.name]!)]"
						+ "
"
						+ "
"
							+ "You spend a little while making small talk and getting to know [npc.name] a little better."
							+ " Most of [npc.her] interests seem to be related to snow in one way or another, and you're a little relieved when [npc.she] finally brings the conversation to a close,"
							+ " [npc.speech(I really should be getting on with work, but if you wanted to take a look at the goods I've got for sale, I could spare some time for that.)]"
						+ "
");

			} else {
				UtilText.nodeContentSB.append("
"
							+ "You notice that there are quite a few reindeer-morphs in this part of Dominion; each one of them busily shovelling snow in order to keep the streets clear."
							+ " Deciding that you'd like to have a chat, you walk up to several of them and say hello."
							+ " You're somewhat discouraged, however, when you discover that they're so engrossed in their work that they pay no heed to your attempts to strike up a conversation."
							+ " Just as you're about to give up, a [npc.feminine] voice rings out from behind you,"
							+ " [npc.speech(Can I help?)]"
						+ "
"
						+ "
"
							+ "Turning around, you find yourself face-to-face with a particularly imposing [npc.race]."
							+ " [npc.She] crosses [npc.her] arms and starts tapping [npc.her] foot on the ground as [npc.she] impatiently continues,"
							+ " [npc.speech(I'm [npc.name], the overseer for the workers in this area. If you're looking for something to buy, we've brought some goods with us, just like we do every year. You fancy a look?)]"
						+ "
");

				if(Main.game.getDialogueFlags().hasEncounteredAnyReindeers()) {
					UtilText.nodeContentSB.append("
"
							+ "Feeling happy now that you've found the overseer for this particular group, you reply,"
							+ " [pc.speech(What sort of goods do you have? I've spoken with another overseer already, and they mostly had Yuletide-related clothing, food and drink, as well as some clothing from the youko.)]"
						+ "
"
						+ "
"
							+ "The [npc.race] smiles."
							+ " [npc.speech(Well, all of us reindeer-morphs travel together, so we've got the same goods as any of the other groups."
								+ " Still, if you'd like to take a look, just let me know.)]"
						+ "
");

				} else {
					UtilText.nodeContentSB.append("
"
							+ "Feeling happy now that you've got an opportunity to talk to one of these reindeer-morphs, you reply,"
							+ " [pc.speech(What sort of goods do you have? And where did all of you come from? I haven't seen reindeer-morphs here in Dominion before.)]"
						+ "
"
						+ "
"
							+ "The [npc.race] smiles as [npc.she] answers,"
							+ " [npc.speech(We travel here from our homeland out in the frozen tundra every winter."
								+ " We stay here to work until the end of February, which is when it stops snowing, and then we migrate back to the tundra for the rest of the year, which is why you haven't seen us before."
								+ " As to what goods I can offer, we've brought plenty of the food, drink, and clothing that we make in our homeland."
								+ " We travelled through the Shinrin highlands this year, so I also have some of the youko's traditional clothing which we traded for.)]"
						+ "
");
				}
			}

			if(Main.game.getDialogueFlags().hasWorkedForReindeer(getReindeer().getId())) {
				if(Main.game.getDialogueFlags().hasFuckedReindeer(getReindeer().getId())) {
					UtilText.nodeContentSB.append(
							"
"
								+ "[npc.Name] smiles fondly at you as [npc.she] steps closer."
								+ " [npc.speech(Thanks for your help today, [pc.name]; I really appreciate it. You know... I could do with letting off some steam... You want to have a little fun again?)]"
							+ "
");

				} else {
					UtilText.nodeContentSB.append(
							"
"
								+ "[npc.Name] smiles fondly at you as [npc.she] steps closer."
								+ " [npc.speech(Thanks for your help today, [pc.name]; I really appreciate it."
									+ " It can get pretty stressful trying to keep all these streets clear, especially when we're so undermanned.)]"
							+ "
");

				}

			} else {
				UtilText.nodeContentSB.append(
					"
"
						+ "[npc.Name] lets out a little sigh."
						+ " [npc.speech(We're a little undermanned this year, so if you're looking for work, I can offer a part-time job."
							+ " If not, and if you're not interested in trading, then I really need to get back to work; we've got so much to get done today!)]"
					+ "
");

			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			return getDefaultResponses(index);
		}
	};

	public static final DialogueNode ENCOUNTER_WORK = new DialogueNode("Reindeer Overseer", "", true) {

		@Override
		public String getContent() {
			return "
"
						+ "Deciding that you'd like to take up [npc.namePos] offer of a part-time job, you ask [npc.herHim],"
						+ " [pc.speech(I'd be willing to work for you for a while, what do you need help with?)]"
					+ "
"
					+ "
"
						+ "[npc.speech(Almost everything!)]"
						+ " [npc.name] replies, laughing,"
						+ " [npc.speech(but it'd be a lot easier to manage if you choose just one thing to focus on."
							+ " If you're strong, you could help out directly by joining in and shovelling snow."
							+ " If you're any good with the arcane, we've got a few heat-staves on the cart;"
								+ " you can use them to channel your power into a beam of arcane fire, which is very useful for helping to break up sections of densely-packed snow."
							+ " And, finally, if you're better with people than you are with physical or arcane work, then going around between the workers and delivering drinks and words of encouragement would be a great help.)]"
					+ "
"
					+ "
"
						+ "As you're wondering which task to perform, [npc.name] finishes,"
						+ " [npc.speech(Oh, and I'll pay you based on how well you work, so it'd be best to stick with what you're good at.)]"
					+ "
";
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				return new Response("Shovel snow", "Tell [npc.name] that you'll shovel snow with the rest of the workers.", ENCOUNTER_WORK_FINISHED) {
					@Override
					public void effects() {
						int money = (int)(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE)*1.5f);
						Main.game.getPlayer().incrementMoney(money);

						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Deciding that you'd be best at shovelling snow, you tell [npc.name] that that's what you'd like to do."
									+ " [npc.She] then leads you over to a cart that's parked on one side of the street, where [npc.she] grabs a shovel and hands it over to you."
									+ " [npc.speech(With your help, we should be finished in a few more hours. Thanks for the assistance!)]"
								+ "
"
								+ "
"
									+ "Setting off to where the other reindeer-morphs are working, you get stuck in and start shovelling snow.");
						switch(PhysiqueLevel.getPhysiqueLevelFromValue(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE))) {
							case ZERO_WEAK: case ONE_AVERAGE:
								Main.game.getTextStartStringBuilder().append(
										" Although it didn't seem too hard at first, you're not able to keep up with the stamina or strength of the reindeer-morphs, and before long you find yourself having to take a break."
										+ "
"
										+ "
"
											+ "[npc.speech(Don't worry, [pc.name],)]"
											+ " the voice of [npc.name] calls out, and you jump to your feet as you see [npc.herHim] approach,"
											+ " [npc.speech(everyone else here is used to this sort of work, so don't be discouraged if you can't keep up!"
												+ " Just make sure to take a rest if you're feeling tired.)]"
										+ "
"
										+ "
"
											+ "Knowing that your poor performance will undoubtedly result in a reduction to your wages, you resign yourself to the fact that you're not quite as strong as you thought you were."
											+ " The next few hours pass quickly enough, and by the time the day's work is done, you find yourself completely exhausted."
										+ "
"
										+ "
"
											+ "[npc.speech(Hi, [pc.name]! Good work today!)]"
											+ " [npc.name] calls out, mercifully not mentioning your sub-par performance as [npc.she] pays you."
											+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned today!)]"
										+ "
");
								break;
							case TWO_STRONG: case THREE_POWERFUL:
								Main.game.getTextStartStringBuilder().append(
											" Although it's harder work than you first though it would be, you're able to keep up with the reindeer-morphs, and even manage to shovel a little more snow than a couple of them."
										+ "
"
										+ "
"
											+ "[npc.speech(Great work, [pc.name],)]"
											+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach,"
											+ " [npc.speech(everyone else here is used to this sort of work, and you're managing to keep up with them!"
												+ " Just make sure to take a rest if you're feeling tired.)]"
										+ "
"
										+ "
"
											+ "Knowing that your good performance will undoubtedly result in an increase to your wages, you keep working at the same pace."
											+ " The next few hours pass quickly enough, and by the time the day's work is done, you find yourself satisfied with your performance."
										+ "
"
										+ "
"
											+ "[npc.speech(Hi, [pc.name]! Great work today!)]"
											+ " [npc.name] calls out, sounding genuinely pleased as [npc.she] pays you."
											+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned today!)]"
										+ "
");
								break;
							case FOUR_MIGHTY: case FIVE_HERCULEAN:
								Main.game.getTextStartStringBuilder().append(
										" The work turns out to be far easier than you thought it'd be, and not only are you able to keep up with the reindeer-morphs, the amount of snow that you're able to shovel soon puts them to shame."
									+ "
"
									+ "
"
										+ "[npc.speech(Wow, [pc.name],)]"
										+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach,"
										+ " [npc.speech(I've never seen anyone work like that before; you're amazing!"
											+ " Just make sure to take a rest if you're feeling tired.)]"
									+ "
"
									+ "
"
										+ "Knowing that your excellent performance will undoubtedly result in an increase to your wages, you keep working at the same pace."
										+ " The next few hours pass quickly enough, and by the time the day's work is done, you've cleared the entire street of snow."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi, [pc.name]! Fantastic work today!)]"
										+ " [npc.name] calls out, sounding extremely happy as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
						}
					}
				};

			} else if(index==2) {
				return new Response("Use heat-stave", "Tell [npc.name] that you'd like to use one of the heat-staves to score out lines in the snow.", ENCOUNTER_WORK_FINISHED) {
					@Override
					public void effects() {
						int money = (int)(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_ARCANE)*1.5f);
						Main.game.getPlayer().incrementMoney(money);

						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Deciding that you'd work best by using your arcane power to harness [npc.namePos] 'heat-stave', you tell the [npc.race] that that's what you'd like to do."
									+ " [npc.She] then leads you over to a cart that's parked on one side of the street, where [npc.she] grabs a tall, wooden staff with a curious orange gemstone fixed into one end, before handing it over to you."
									+ " [npc.speech(Just focus your arcane energy into the stave while pointing the bottom at the ground."
										+ " With your help, we should be finished in a few more hours."
										+ " Thanks for the assistance!)]"
								+ "
"
								+ "
"
									+ "Setting off to the area where the reindeer-morphs will need to clear next, you do as [npc.name] instructed, and point the bottom of the staff at the mounds of snow while focusing your arcane energy into it.");

						switch(IntelligenceLevel.getIntelligenceLevelFromValue(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_ARCANE))) {
							case ZERO_AIRHEAD: case ONE_AVERAGE:
								Main.game.getTextStartStringBuilder().append(
										" A little jet of hot air shoots out of the staff, and by slowly tracing a path over the snow, you're able to melt it into pre-cut sections, ready for the reindeer-morphs to shovel."
									+ "
"
										+ "[npc.speech(Looking good, [pc.name],)]"
										+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach."
										+ " [npc.speech(With you helping out like this, the rest of the day's work shouldn't take too long.)]"
									+ "
"
									+ "
"
										+ "Despite [npc.namePos] encouraging words, you can't help but feel as though you're not really harnessing the staff's true power."
										+ " Nevertheless, the next few hours pass quickly enough, and before long the entire street is clear of snow."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi [pc.name]! Good work today!)]"
										+ " [npc.name] says as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
							case TWO_SMART: case THREE_BRAINY:
								Main.game.getTextStartStringBuilder().append(
										" A small jet of flames shoots out of the staff, and by tracing a path over the snow, you're able to quickly melt it into pre-cut sections, ready for the reindeer-morphs to shovel."
									+ "
"
										+ "[npc.speech(Looking great, [pc.name],)]"
										+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach."
										+ " [npc.speech(With you helping out like this, the rest of the day's work shouldn't take too long.)]"
									+ "
"
									+ "
"
										+ "Encouraged by [npc.namePos] words, you set about harnessing the staff's power to break up the snow."
										+ " The next few hours pass quickly enough, and before long the entire street is clear."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi, [pc.name]! Great work today!)]"
										+ " [npc.name] beams at you as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
							case FOUR_GENIUS: case FIVE_POLYMATH:
								Main.game.getTextStartStringBuilder().append(
										" An intense jet of flames blasts out of the staff, and by tracing a path over the snow, you're able to almost-instantly melt it into pre-cut sections, ready for the reindeer-morphs to shovel."
									+ "
"
										+ "[npc.speech(Wow, [pc.name]!)]"
										+ " The voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach,"
										+ " [npc.speech(I didn't even realise the heat-stave had that much power in it! I've never seen anyone use it quite like that! With your help, we should be finished in no time!)]"
									+ "
"
									+ "
"
										+ "Encouraged by [npc.namePos] words, you set about harnessing the staff's power to break up the snow."
										+ " The next few hours pass quickly enough, and before long the entire street is clear."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi, [pc.name]! Amazing work today!)]"
										+ " [npc.name] beams at you as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
						}
					}
				};

			} else if(index==3) {
				return new Response("Encouragement", "Tell [npc.name] that you'd be best suited for delivering drinks and encouraging the workers.", ENCOUNTER_WORK_FINISHED) {
					@Override
					public void effects() {
						int money = (int)(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE)*1.5f);
						Main.game.getPlayer().incrementMoney(money);

						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Deciding that you'd work best by delivering drinks and encouraging the workers, you tell the [npc.race] that that's what you'd like to do."
									+ " [npc.She] then leads you over to a cart that's parked on one side of the street, where [npc.she] shows you where the drinks are stored."
									+ " [npc.speech(Just go around asking the workers if they need a drink, and if they do, fetch them one from here."
										+ " With your help, we should be finished in a few more hours. Thanks for the assistance!)]"
								+ "
"
								+ "
"
									+ "Setting off to the area where the reindeer-morphs are working, you do as [npc.name] instructed, and start asking each one if they'd like a drink.");

						switch(PhysiqueLevel.getPhysiqueLevelFromValue(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE))) {
							case ZERO_WEAK: case ONE_AVERAGE:
								Main.game.getTextStartStringBuilder().append(
										" The workers are far more demanding than you'd expected, and before long you find yourself struggling to keep up with their requests."
									+ "
"
										+ "[npc.speech(Good work, [pc.name],)]"
										+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach."
										+ " [npc.speech(With you helping out like this, the rest of the day's work shouldn't take too long.)]"
									+ "
"
									+ "
"
										+ "Despite [npc.namePos] encouraging words, you can't help but feel as though you're not doing very well."
										+ " Nevertheless, the next few hours pass quickly enough, and before long the entire street is clear of snow."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi, [pc.name]! Good work today!)]"
										+ " [npc.name] says as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
							case THREE_POWERFUL: case TWO_STRONG:
								Main.game.getTextStartStringBuilder().append(
										" The workers are far more demanding than you'd expected, but despite this, you're still able to keep up with their requests."
									+ "
"
										+ "[npc.speech(Great work, [pc.name],)]"
										+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach."
										+ " [npc.speech(With you helping out like this, the rest of the day's work shouldn't take too long.)]"
									+ "
"
									+ "
"
										+ "Encouraged by [npc.namePos] words, you set about delivering the drinks that you're carrying, before hurrying off to fetch the next set of orders."
										+ " The next few hours pass quickly enough, and before long the entire street is clear of snow."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi, [pc.name]! Great work today!)]"
										+ " [npc.name] says as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
							case FOUR_MIGHTY: case FIVE_HERCULEAN:
								Main.game.getTextStartStringBuilder().append(
										" The workers are far more demanding than you'd expected, but despite this, you're easily able to keep up their requests, and even find time to stop and chat with several of them."
									+ "
"
										+ "[npc.speech(Fantastic work, [pc.name],)]"
										+ " the voice of [npc.name] calls out, and you turn around to see [npc.herHim] approach."
										+ " [npc.speech(With you helping out like this, the rest of the day's work shouldn't take too long.)]"
									+ "
"
									+ "
"
										+ "Encouraged by [npc.namePos] words, you continue delivering drinks to the perpetually-thirsty reindeer-morphs."
										+ " The next few hours pass quickly enough, and before long the entire street is clear of snow."
									+ "
"
									+ "
"
										+ "[npc.speech(Hi, [pc.name]! Brilliant work today!)]"
										+ " [npc.name] says as [npc.she] pays you."
										+ " [npc.speech(Here's the "+Util.intToString(money)+" flames you've earned!)]"
									+ "
");
								break;
						}
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode ENCOUNTER_WORK_FINISHED = new DialogueNode("Reindeer Overseer", "", true) {

		@Override
		public int getSecondsPassed() {
			return 60 * 4*60;
		}

		@Override
		public String getContent() {
			return "
"
						+ "[pc.speech(Thanks, [npc.name],)]"
						+ " you respond,"
						+ " [pc.speech(will there be any more work available?)]"
					+ "
"
					+ "
"
						+ "[npc.speech(Well, we're all finished for today, but come back tomorrow and there's sure to be more to do!)]"
						+ " [npc.name] cheerily responds, and as [npc.she] talks, you can't help but notice that [npc.she] keeps on glancing hungrily down at your body."
						+ " [npc.speech(All this work is really stressful sometimes. You know, since I arrived here in Dominion, you're the first person outside of my work group who I've really talked to!"
							+ " I never get the time to meet new people, or to have any fun...)]"
					+ "
"
					+ "
"
						+ "It's quite clear that your strong aura is having an arousing effect on [npc.name], and you imagine that all it would take would be the slightest suggestion of sex, and [npc.she]'d sure to be all over you..."
					+ "
";
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			return getDefaultResponses(index);
		}
	};

	public static final DialogueNode AFTER_SEX = new DialogueNode("Reindeer Overseer", "", true) {

		@Override
		public String getContent() {
			UtilText.nodeContentSB.setLength(0);
			if(Sex.getNumberOfOrgasms(getReindeer()) >= getReindeer().getOrgasmsBeforeSatisfied()) {
				UtilText.nodeContentSB.append(
						"
"
							+ "With a satisfied sigh, [npc.name] begins to get [npc.her] clothing in order."
							+ " [npc.speech(Fuck... That was good...)]"
						+ "
");

			} else {
				UtilText.nodeContentSB.append(
						"
"
							+ "With an annoyed huff, [npc.name] begins to get [npc.her] clothing in order."
							+ " [npc.speech(Fuck... I'm still so horny! That was pretty disappointing...)]"
						+ "
");
			}

			UtilText.nodeContentSB.append(
					"
"
						+ "Once you've both got your things in order, you step back out into the street."
						+ " You wonder if you should ask to see what goods [npc.name] has on offer, or simply take your leave."
					+ "
");

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			return getDefaultResponses(index);
		}
	};
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.dialogue.npcDialogue.dominion;

import com.lilithsthrone.game.PropertyValue;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.character.npc.NPC;
import com.lilithsthrone.game.dialogue.DialogueFlagValue;
import com.lilithsthrone.game.dialogue.DialogueNode;
import com.lilithsthrone.game.dialogue.responses.Response;
import com.lilithsthrone.game.dialogue.responses.ResponseSex;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.game.sex.managers.universal.SMGeneric;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.2.5
 * @version 0.2.5
 * @author Innoxia
 */
public class RentalMommyDialogue {

	private static NPC getMommy() {
		return Main.game.getActiveNPC();
	}

	public static final DialogueNode ENCOUNTER = new DialogueNode("Rental Mommy", "", true) {

		@Override
		public String getContent() {
			if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.mommyFound)) {
				return UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "ENCOUNTER_REPEAT");
			} else {
				return UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "ENCOUNTER");
			}
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				if(Main.game.getPlayer().getMoney()<50) {
					return new Response("Hire "+UtilText.formatAsMoneyUncoloured(50, "span"), "You don't have enough money for this!", null);
				}
				return new Response("Hire "+UtilText.formatAsMoney(50, "span"), "Hire the rental Mommy.", MOMMYS_EXTRAS) {
					@Override
					public void effects() {
						Main.game.getPlayer().incrementMoney(-50);
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.mommyFound, true);
					}
				};

			} else if(index==2) {
				return new Response("Decline", "", ENCOUNTER) {
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "DECLINE"));
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.mommyFound, true);
					}
				};
			}

			return null;
		}
	};

	public static final DialogueNode MOMMYS_EXTRAS = new DialogueNode("Rental Mommy", "", true, true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMYS_EXTRAS"));

			if(Main.getProperties().hasValue(PropertyValue.lactationContent)) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMYS_EXTRAS_OFFER_BREASTFEEDING"));
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				if(Main.game.getPlayer().getMoney()<1000) {
					return new Response("Submissive Sex "+UtilText.formatAsMoneyUncoloured(1000, "span"), "You don't have enough money for this!", null);
				}
				return new ResponseSex("Submissive Sex "+UtilText.formatAsMoney(1000, "span"), "Follow Mommy into her house, before letting her take the dominant role in having sex with you.",
						true, true,
						new SMGeneric(
								Util.newArrayListOfValues(getMommy()),
								Util.newArrayListOfValues(Main.game.getPlayer()),
						null,
						null) {
							@Override
							public boolean isPublicSex() {
								return false;
							}
						},
						AFTER_SEX_MOMMY_AS_DOM,
						UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_HOUSE_ENTRY_SEX_SUB")
							+ UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_HOUSE_ENTRY")
							+ UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_SEX_SUB")) {
					@Override
					public void effects() {
						Main.game.getPlayer().incrementMoney(-1000);
					}
				};

			} else if(index==2) {
				if(Main.game.getPlayer().getMoney()<2000) {
					return new Response("Dominant Sex "+UtilText.formatAsMoneyUncoloured(2000, "span"), "You don't have enough money for this!", null);
				}
				return new ResponseSex("Dominant Sex "+UtilText.formatAsMoney(2000, "span"), "Follow Mommy into her house, before taking the dominant role and having sex with her.",
						true, true,
						new SMGeneric(
								Util.newArrayListOfValues(Main.game.getPlayer()),
								Util.newArrayListOfValues(getMommy()),
						null,
						null) {
							@Override
							public boolean isPublicSex() {
								return false;
							}
						},
						AFTER_SEX_MOMMY_AS_SUB,
						UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_HOUSE_ENTRY_SEX_DOM")
							+ UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_HOUSE_ENTRY")
							+ UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_SEX_DOM")) {
					@Override
					public void effects() {
						Main.game.getPlayer().incrementMoney(-2000);
					}
				};

			} else if(index==3) {
				if(Main.game.getPlayer().getMoney()<500) {
					return new Response("Breastfeeding "+UtilText.formatAsMoneyUncoloured(500, "span"), "You don't have enough money for this!", null);
				}
				if(!Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
					return new Response("Breastfeeding "+UtilText.formatAsMoneyUncoloured(500, "span"), "You can't access your mouth, so you can't be breastfed by Mommy!", null);
				}
				return new Response("Breastfeeding "+UtilText.formatAsMoney(500, "span"), "Follow Mommy into her house and be breastfed by her.", MOMMYS_EXTRAS_BREASTFEEDING) {
					@Override
					public void effects() {
						Main.game.getPlayer().incrementMoney(-500);
						getMommy().setAreaKnownByCharacter(CoverableArea.BREASTS, Main.game.getPlayer(), true);
						getMommy().setAreaKnownByCharacter(CoverableArea.NIPPLES, Main.game.getPlayer(), true);
						Main.game.getPlayer().ingestFluid(getMommy(), getMommy().getMilk(), SexAreaOrifice.MOUTH, 500);
					}
				};

			} else if(index==4) {
				if(Main.game.getPlayer().getMoney()<1000) {
					return new Response("Public Breastfeeding "+UtilText.formatAsMoneyUncoloured(1000, "span"), "You don't have enough money for this!", null);
				}
				if(!Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
					return new Response("Public Breastfeeding "+UtilText.formatAsMoneyUncoloured(1000, "span"), "You can't access your mouth, so you can't be breastfed by Mommy!", null);
				}
				return new Response("Public Breastfeeding "+UtilText.formatAsMoney(1000, "span"), "Remain out here on the bench, and, in full sight of the public, be breastfed by Mommy.", MOMMYS_EXTRAS_BREASTFEEDING_PUBLIC) {
					@Override
					public void effects() {
						Main.game.getPlayer().incrementMoney(-1000);
						getMommy().setAreaKnownByCharacter(CoverableArea.BREASTS, Main.game.getPlayer(), true);
						getMommy().setAreaKnownByCharacter(CoverableArea.NIPPLES, Main.game.getPlayer(), true);
						Main.game.getPlayer().incrementFetishExperience(Fetish.FETISH_LACTATION_OTHERS, 25);
						Main.game.getPlayer().incrementFetishExperience(Fetish.FETISH_EXHIBITIONIST, 10);
						Main.game.getPlayer().ingestFluid(getMommy(), getMommy().getMilk(), SexAreaOrifice.MOUTH, 500);
					}
				};

			} else if(index==5) {
				return new Response("Decline", "Decline Mommy's extra offers, and take your leave.", ENCOUNTER) {
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMYS_EXTRAS_DECLINED"));
					}
				};
			}

			return null;
		}
	};

	public static final DialogueNode MOMMYS_EXTRAS_BREASTFEEDING = new DialogueNode("Rental Mommy", "", true, true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_HOUSE_ENTRY_BREASTFEEDING"));

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_HOUSE_ENTRY"));

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMYS_EXTRAS_BREASTFEEDING"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			 if(index==1) {
				return new Response("Leave", "Thank Mommy and take your leave.", MOMMYS_EXTRAS_BREASTFEEDING) {
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode MOMMYS_EXTRAS_BREASTFEEDING_PUBLIC = new DialogueNode("Rental Mommy", "", true, true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMYS_EXTRAS_BREASTFEEDING_PUBLIC"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			 if(index==1) {
				return new Response("Leave", "Thank Mommy and take your leave.", MOMMYS_EXTRAS_BREASTFEEDING_PUBLIC) {
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode AFTER_SEX_MOMMY_AS_DOM = new DialogueNode("Rental Mommy", "", true) {

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

			if(Sex.getNumberOfOrgasms(getMommy()) >= getMommy().getOrgasmsBeforeSatisfied()) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_ORGASMED"));

			} else {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_NO_ORGASM"));
			}

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "AFTER_SEX_MOMMY_AS_DOM_END"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			 if(index==1) {
				return new Response("Leave", "Thank Mommy and take your leave.", AFTER_SEX_MOMMY_AS_DOM) {
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode AFTER_SEX_MOMMY_AS_SUB = new DialogueNode("Rental Mommy", "", true) {

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

			if(Sex.getNumberOfOrgasms(getMommy()) >= getMommy().getOrgasmsBeforeSatisfied()) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_ORGASMED"));

			} else {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "MOMMY_NO_ORGASM"));
			}

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/rentalMommy", "AFTER_SEX_MOMMY_AS_SUB_END"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			 if(index==1) {
				return new Response("Leave", "Thank Mommy and take your leave.", AFTER_SEX_MOMMY_AS_SUB) {
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};
			} else {
				return null;
			}
		}
	};
}


code:
package com.lilithsthrone.game.dialogue.npcDialogue.offspring;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.AffectionLevel;
import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.character.npc.NPC;
import com.lilithsthrone.game.character.npc.NPCFlagValue;
import com.lilithsthrone.game.character.npc.misc.NPCOffspring;
import com.lilithsthrone.game.character.persona.Occupation;
import com.lilithsthrone.game.character.persona.SexualOrientation;
import com.lilithsthrone.game.character.quests.QuestLine;
import com.lilithsthrone.game.character.race.Subspecies;
import com.lilithsthrone.game.dialogue.DialogueNode;
import com.lilithsthrone.game.dialogue.companions.SlaveDialogue;
import com.lilithsthrone.game.dialogue.places.dominion.lilayashome.LilayaHomeGeneric;
import com.lilithsthrone.game.dialogue.responses.Response;
import com.lilithsthrone.game.dialogue.responses.ResponseCombat;
import com.lilithsthrone.game.dialogue.responses.ResponseEffectsOnly;
import com.lilithsthrone.game.dialogue.responses.ResponseSex;
import com.lilithsthrone.game.dialogue.responses.ResponseTag;
import com.lilithsthrone.game.dialogue.utils.InventoryInteraction;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.inventory.clothing.ClothingType;
import com.lilithsthrone.game.inventory.item.AbstractItemType;
import com.lilithsthrone.game.inventory.item.ItemType;
import com.lilithsthrone.game.occupantManagement.OccupancyUtil;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.managers.universal.SMGeneric;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.world.Cell;
import com.lilithsthrone.world.WorldType;
import com.lilithsthrone.world.places.PlaceType;

/**
 * @since 0.1.8?
 * @version 0.3.1
 * @author Innoxia
 */
public class GenericOffspringDialogue {

	private static NPCOffspring offspring() {
		return (NPCOffspring) Main.game.getActiveNPC();
	}

	private static String getOffspringLabel() {
		if(offspring().hasFlag(NPCFlagValue.flagOffspringIntroduced)) {
			return UtilText.parse(offspring(), "Talking to [npc.Name]");
		} else {
			return "A familiar face";
		}
	}

	private static String getTextFilePath() {
		if(offspring().getWorldLocation().equals(WorldType.HARPY_NEST)) {
			return "characters/offspring/harpyNests";
		} else {
			return "characters/offspring/dominionAlleyway";
		}
	}

	private static String getStatus() {
		StringBuilder sb = new StringBuilder();

		sb.append(offspring().getPlayerRelationStatusDescription());

		// Time limitation:
		sb.append("
");
		int tokens = Main.game.getDialogueFlags().offspringDialogueTokens;
		if(tokens>=1) {
			sb.append("[npc.Name] only has time for [style.italicsMinorBad("+Util.intToString(tokens)+" more thing"+(tokens>1?"s":"")+")] to discuss.");
		} else {
			sb.append("[npc.Name] [style.italicsBad(doesn't have any time left)], and needs to get back to work.");
		}
		sb.append("
");

		return UtilText.parse(offspring(), sb.toString());
	}

	public static final DialogueNode OFFSPRING_ENCOUNTER = new DialogueNode("", "You encounter someone who looks very familiar...", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {

			if(offspring().getAffection(Main.game.getPlayer()) < AffectionLevel.NEGATIVE_TWO_DISLIKE.getMaximumValue()) {
				if (index == 1) {
					return new Response("Apologise", UtilText.parse(offspring(), "Apologise to [npc.name]."), OFFSPRING_ENCOUNTER_APOLOGY) {
						@Override
						public void effects() {
							if(!offspring().hasFlag(NPCFlagValue.flagOffspringFightApologyNeeded) && !offspring().hasFlag(NPCFlagValue.flagOffspringRapeApologyNeeded)) {
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 20));
							} else {
								if(offspring().hasFlag(NPCFlagValue.flagOffspringFightApologyNeeded)) {
									offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
									Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 10));
								}
								if(offspring().hasFlag(NPCFlagValue.flagOffspringRapeApologyNeeded)) {
									offspring().setFlag(NPCFlagValue.flagOffspringRapeApologyNeeded, false);
									Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 10));
								}
							}
							setOffspringFlags();
						}
					};

				} else if (index == 8) {
					return new Response("Sex", UtilText.parse(offspring(), "There's no way [npc.she]'ll consider having sex with you when [npc.sheIs] this angry."), null) {
						@Override
						public void effects() {
							setOffspringFlags();
						}
					};

				} else if (index == 10) {
					return new Response("Attack", UtilText.parse(offspring(), "How dare [npc.name] talk to you like that! It's time to show [npc.herHim] [npc.her] place!"), OFFSPRING_ENCOUNTER_FIGHT) {
						@Override
						public boolean isCombatHighlight() {
							return true;
						}
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, true);
							offspring().setFlag(NPCFlagValue.fightOffspringInApartment, false);
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -100));
							setOffspringFlags();
						}
					};

				} else if (index == 0) {
					return new Response("Leave", UtilText.parse(offspring(), "Tell [npc.name] that you'll come back some other time."), OFFSPRING_ENCOUNTER) {
							@Override
							public DialogueNode getNextDialogue() {
								setOffspringFlags();
								return Main.game.getDefaultDialogueNoEncounter();
							}
						};

				} else {
					return null;
				}

			} else {
				if (index == 1) {
					return new Response("Greeting", UtilText.parse(offspring(), "Say hello to [npc.name]."), OFFSPRING_ENCOUNTER_TALKING) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_GREETING", offspring()));
							setOffspringFlags();

							if(offspring().isAffectionHighEnoughToInviteHome() && !Main.game.getPlayer().hasQuest(QuestLine.SIDE_ACCOMMODATION)) {
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().startQuest(QuestLine.SIDE_ACCOMMODATION));
							}
						}
					};

				} else if (index == 2) {
					return new Response("Hug", UtilText.parse(offspring(), "Hug [npc.name]."), OFFSPRING_ENCOUNTER_TALKING) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_HUG", offspring()));
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 5));
							setOffspringFlags();

							if(offspring().isAffectionHighEnoughToInviteHome() && !Main.game.getPlayer().hasQuest(QuestLine.SIDE_ACCOMMODATION)) {
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().startQuest(QuestLine.SIDE_ACCOMMODATION));
							}
						}
					};

				} else if (index == 3) {
					return new Response("Kiss", UtilText.parse(offspring(), "Give [npc.name] a hug and a kiss."), OFFSPRING_ENCOUNTER_TALKING) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_KISS", offspring()));
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 10));
							setOffspringFlags();

							if(offspring().isAffectionHighEnoughToInviteHome() && !Main.game.getPlayer().hasQuest(QuestLine.SIDE_ACCOMMODATION)) {
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().startQuest(QuestLine.SIDE_ACCOMMODATION));
							}
						}
					};

				} else if (index == 4 && Main.game.isIncestEnabled()) {
					return new Response("Passionate kiss", UtilText.parse(offspring(), "Passionately kiss [npc.name] on the lips, and feel [npc.herHim] up as you do so."), OFFSPRING_ENCOUNTER_TALKING,
							Util.newArrayListOfValues(Fetish.FETISH_INCEST),
							CorruptionLevel.FOUR_LUSTFUL,
							null,
							null,
							null) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_PASSIONATE_KISS", offspring()));
							if(offspring().isAttractedTo(Main.game.getPlayer())) {
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 25));

							} else if(
									((Main.game.getPlayer().isFeminine() && offspring().getSexualOrientation()==SexualOrientation.GYNEPHILIC)
									|| (!Main.game.getPlayer().isFeminine() && offspring().getSexualOrientation()==SexualOrientation.ANDROPHILIC)
									|| (offspring().getSexualOrientation()==SexualOrientation.AMBIPHILIC))
									|| offspring().hasFetish(Fetish.FETISH_INCEST)) {
								//Incest fetish and not attracted to player, or attracted to player and no incest fetish:
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -5));

							} else {
								//Not attracted to player, and no incest fetish:
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -20));
							}
							setOffspringFlags();

							if(offspring().isAffectionHighEnoughToInviteHome() && !Main.game.getPlayer().hasQuest(QuestLine.SIDE_ACCOMMODATION)) {
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().startQuest(QuestLine.SIDE_ACCOMMODATION));
							}
						}
					};

				} if (index == 5) {
					return new Response("Scold [npc.herHim]",
							UtilText.parse(offspring(), "Ask [npc.name] just what [npc.she] thinks [npc.sheIs] doing!"
									+(offspring().getHistory()==Occupation.NPC_PROSTITUTE
											?" (This will voice disapproval about [npc.herHim] being a prostitute.)"
											:" (This will voice disapproval about [npc.herHim] being a mugger.)")),
							OFFSPRING_ENCOUNTER_TALKING) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_SCOLDING", offspring()));
							// If masochist fetish, +5, if not, -5:
							if(offspring().hasFetish(Fetish.FETISH_MASOCHIST)) {
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 5));
							} else {
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -5));
							}
							setOffspringFlags();

							if(offspring().isAffectionHighEnoughToInviteHome() && !Main.game.getPlayer().hasQuest(QuestLine.SIDE_ACCOMMODATION)) {
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().startQuest(QuestLine.SIDE_ACCOMMODATION));
							}
						}
					};

				} else if (index == 10) {
					return new Response("Attack", UtilText.parse(offspring(), "How dare [npc.name] talk to you like that! It's time to show [npc.herHim] [npc.her] place!"), OFFSPRING_ENCOUNTER_FIGHT) {
						@Override
						public boolean isCombatHighlight() {
							return true;
						}
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, true);
							offspring().setFlag(NPCFlagValue.fightOffspringInApartment, false);
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -100));
							setOffspringFlags();
						}
					};

				} else if (index == 0 && offspring().hasFlag(NPCFlagValue.flagOffspringIntroduced)) {
					return new Response("Leave", UtilText.parse(offspring(), "Tell [npc.name] that you'll catch up with [npc.herHim] some other time."), OFFSPRING_ENCOUNTER) {
							@Override
							public DialogueNode getNextDialogue() {
								return Main.game.getDefaultDialogueNoEncounter();
							}
							@Override
							public void effects() {
								Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_LEAVE", offspring()));

								setOffspringFlags();
							}
						};

				} else {
					return null;
				}
			}
		}
	};

	private static void setOffspringFlags() {
		if(offspring().isVisiblyPregnant()) {
			offspring().setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
		}
		if(Main.game.getPlayer().isVisiblyPregnant()) {
			Main.game.getPlayer().setCharacterReactedToPregnancy(offspring(), true);
		}
		offspring().setFlag(NPCFlagValue.flagOffspringIntroduced, true);
		Main.game.getDialogueFlags().offspringDialogueTokens = 2;
	}

	public static final DialogueNode OFFSPRING_ENCOUNTER_APOLOGY = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_APOLOGY", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Continue", "Give [npc.name] some time to think, and continue on your way.", OFFSPRING_ENCOUNTER_APOLOGY) {
					@Override
					public DialogueNode getNextDialogue(){
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_FIGHT = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_FIGHT", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new ResponseCombat("Fight",
						"You find yourself fighting your [npc.daughter]!",
						offspring());
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_TALKING = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_TALKING", offspring()));

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(Main.game.getDialogueFlags().offspringDialogueTokens<=0) {
				if (index == 1) {
					return new Response("Time to go", UtilText.parse(offspring(), "[npc.Name] has started glancing at the clock on the wall, giving you a clear indication that it's time to make your exit."), OFFSPRING_ENCOUNTER) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_TALKING_OUT_OF_TIME", offspring()));
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
						}
						@Override
						public DialogueNode getNextDialogue() {
							return Main.game.getDefaultDialogueNoEncounter();
						}
					};

				} else {
					return null;
				}

			} else {
				if (index == 1) {
					return new Response("Background", UtilText.parse(offspring(), "Ask [npc.name] about [npc.her] background, and about what [npc.she] does for a living."), OFFSPRING_ENCOUNTER_BACKGROUND) {
						@Override
						public void effects() {
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 10));
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							Main.game.getDialogueFlags().offspringDialogueTokens--;
						}
					};

				} else if (index == 2) {
					return new Response("Small talk", UtilText.parse(offspring(), "Chat about this and that with [npc.name]."), OFFSPRING_ENCOUNTER_SMALL_TALK) {
						@Override
						public void effects() {
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 5));
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							Main.game.getDialogueFlags().offspringDialogueTokens--;
						}
					};

				} else if (index == 3) {
					return new Response("Encourage", UtilText.parse(offspring(), "Encourage [npc.name] to do [npc.her] best."), OFFSPRING_ENCOUNTER_ENCOURAGE) {
						@Override
						public void effects() {
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 10));
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							Main.game.getDialogueFlags().offspringDialogueTokens--;
						}
					};

				} else if (index == 4) {
					return new Response("Scold", UtilText.parse(offspring(), "Scold [npc.name], and tell [npc.herHim] to better [npc.herself]."), OFFSPRING_ENCOUNTER_SCOLD) {
						@Override
						public void effects() {
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -10));
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							Main.game.getDialogueFlags().offspringDialogueTokens--;
						}
					};

				} else if (index == 5) {
					if(!Main.game.getPlayer().hasQuest(QuestLine.SIDE_ACCOMMODATION) || !offspring().isAffectionHighEnoughToInviteHome()) {
						return new Response("Offer room",
								UtilText.parse(offspring(), "You feel as though it would be best to spend some more time getting to know [npc.name] before inviting [npc.herHim] back to Lilaya's mansion...
"
								+ "[style.italics(Requires [npc.name] to have at least "+AffectionLevel.POSITIVE_THREE_CARING.getMinimumValue()+" affection towards you.)]"),
								null);

					} else if(!Main.game.getPlayer().isQuestCompleted(QuestLine.SIDE_ACCOMMODATION)) {
						return new Response("Offer room",
								UtilText.parse(offspring(), "You'll need to get Lilaya's permission before inviting [npc.name] back to her mansion..."),
								null);

					} else if(!OccupancyUtil.isFreeRoomAvailableForOccupant()) {
						return new Response("Offer room",
								UtilText.parse(offspring(), "You don't have a suitable room prepared for [npc.name] to move in to. Upgrade one of the empty rooms in Lilaya's house to a 'Guest Room' first."),
								null);

					} else {
						return new Response("Offer room", UtilText.parse(offspring(), "Ask [npc.name] if [npc.she] would like a room in Lilaya's mansion."), OFFSPRING_OFFER_ROOM) {
							@Override
							public void effects() {
								offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
								if(offspring().getAffection(Main.game.getPlayer())<0) {
									Main.game.getTextEndStringBuilder().append(offspring().setAffection(Main.game.getPlayer(), 25));
								} else {
									Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 25));
								}
								Main.game.getPlayer().setLocation(WorldType.LILAYAS_HOUSE_GROUND_FLOOR, PlaceType.LILAYA_HOME_ENTRANCE_HALL);
								offspring().setLocation(WorldType.LILAYAS_HOUSE_GROUND_FLOOR, PlaceType.LILAYA_HOME_ENTRANCE_HALL);
							}
						};
					}

				} else if (index == 6) {
					return new Response("Pet name", UtilText.parse(offspring(), "Ask [npc.name] to call you by a different name."), OFFSPRING_ENCOUNTER_CHOOSE_NAME) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							Main.game.getDialogueFlags().offspringDialogueTokens--;
						}
					};

				}  else if (index == 7) {
					if(Main.game.getPlayer().hasItemType(ItemType.PRESENT)) {
						return new Response("Give Present", UtilText.parse(offspring(), "Give [npc.name] the present that you're carrying."), OFFSPRING_PRESENT) {
							@Override
							public void effects() {
								Main.game.getPlayer().removeItem(AbstractItemType.generateItem(ItemType.PRESENT));

								Main.game.getTextEndStringBuilder().append(Main.game.getActiveNPC().incrementAffection(Main.game.getPlayer(), 15));

								offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
								Main.game.getDialogueFlags().offspringDialogueTokens--;
							}
						};
					} else {
						return null;
					}

				} else if (index == 8 && Main.game.isIncestEnabled()) {
					return new Response("Sex", UtilText.parse(offspring(), "Tell [npc.name] that you want to have sex with [npc.herHim]."), OFFSPRING_ENCOUNTER_SEX,
							Util.newArrayListOfValues(Fetish.FETISH_INCEST),
							CorruptionLevel.FIVE_CORRUPT,
							null,
							null,
							null) {
						@Override
						public void effects() {
							if(offspring().isAttractedTo(Main.game.getPlayer())) {
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 20));
							} else if(offspring().getHistory()!=Occupation.NPC_PROSTITUTE){
								Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -10));
							}
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							Main.game.getDialogueFlags().offspringDialogueTokens--;
						}
					};

				} else if (index == 10) {
					return new Response("Attack", UtilText.parse(offspring(), "It's time to show [npc.herHim] [npc.her] true place in this family!"), OFFSPRING_ENCOUNTER_APARTMENT_FIGHT) {
						@Override
						public boolean isCombatHighlight() {
							return true;
						}
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, true);
							offspring().setFlag(NPCFlagValue.fightOffspringInApartment, true);
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), -100));
							offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
						}
					};

				} else if (index == 11) {
					if(!offspring().isAllowingPlayerToManageInventory()) {
						return new Response("Inventory", UtilText.parse(offspring(), "[npc.Name] doesn't like you enough to allow you to choose what [npc.she] wears, or what [npc.she] eats and drinks."), null);
					} else {
						return new ResponseEffectsOnly("Inventory", UtilText.parse(offspring(), "Manage [npc.namePos] inventory.")) {
							@Override
							public void effects() {
								Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_TALKING_INVENTORY", offspring()));
								Main.mainController.openInventory(offspring(), InventoryInteraction.FULL_MANAGEMENT);
							}
						};
					}

				} else if (index == 0) {
					return new Response("Leave", UtilText.parse(offspring(), "Tell [npc.name] that you'll catch up with [npc.herHim] some other time."), OFFSPRING_ENCOUNTER) {
							@Override
							public void effects() {
								Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_TALKING_LEAVE", offspring()));
								offspring().setFlag(NPCFlagValue.flagOffspringApartmentIntroduced, true);
							}
							@Override
							public DialogueNode getNextDialogue() {
								return Main.game.getDefaultDialogueNoEncounter();
							}
						};

				} else {
					return null;
				}
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_BACKGROUND = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

		@Override
		public String getContent() { // TODO use offspring().flagBackgroundProgress
			UtilText.nodeContentSB.setLength(0);

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_BACKGROUND", offspring()));

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
				return new Response("Background", "You've just talked about [npc.namePos] background.", null);

			} else {
				return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_SMALL_TALK = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_SMALL_TALK", offspring()));

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 2 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
				return new Response("Small talk", "You've just had some small talk with [npc.name].", null);

			} else {
				return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_ENCOURAGE = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_ENCOURAGE", offspring()));

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 3 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
				return new Response("Encourage", "You've just encouraged [npc.name].", null);

			} else {
				return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_SCOLD = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_SCOLD", offspring()));

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 4 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
				return new Response("Scold", "You've just scolded [npc.name].", null);

			} else {
				return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
			}
		}
	};

	public static final DialogueNode OFFSPRING_OFFER_ROOM = new DialogueNode("Offer room", "", true, true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_OFFER_ROOM", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Show to room", "Take [npc.name] to [npc.her] new room.", OFFSPRING_OFFER_ROOM_BACK_HOME) {
					@Override
					public void effects() {
						Cell c = OccupancyUtil.getFreeRoomForOccupant();
						offspring().setLocation(c.getType(), c.getLocation(), true);
						Main.game.getPlayer().setLocation(c.getType(), c.getLocation(), false);
						Main.game.getPlayer().addFriendlyOccupant(offspring());
						Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 50));
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode OFFSPRING_OFFER_ROOM_BACK_HOME = new DialogueNode("New Room", "", true, true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_OFFER_ROOM_BACK_HOME", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				return new Response("Leave", "Give [npc.name] some time to get settled in [npc.her] new room. You can come back at any time to talk with [npc.herHim].", LilayaHomeGeneric.CORRIDOR) {
					@Override
					public void effects() {
						Main.game.getPlayer().setNearestLocation(Main.game.getPlayer().getWorldLocation(), PlaceType.LILAYA_HOME_CORRIDOR, false);
					}
				};
			}
			return null;
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_CHOOSE_NAME = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(
					"
"
						+ "You decide to ask [npc.name] to call you by a different name."
						+ " At the moment, [npc.sheIs] calling you '[npc.pcName]'."
					+ "
"

					// TODO align this properly

					+ "
"
						+ "
"
							+ "
[npc.Name] will call you:
"
							+ "<form style='float:left; padding:auto 0 auto 0;'><input type='text' id='offspringPetNameInput' value='"+ UtilText.parseForHTMLDisplay(offspring().getPetName(Main.game.getPlayer()))+ "'></form>"
							+ "
"
								+ "Rename"
							+ "
"
						+ "
"
						+ "
"
						+ "The names 'Mom'/'Dad' and 'Mommy'/'Daddy' are special, and will automatically switch to the appropriate femininity of your character."
						+ "
"
					+ "
"

					+ "

");

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 5 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
				return new Response("Pet name", "You're already asking [npc.name] to call you by a different name.", null);

			} else {
				return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
			}
		}
	};

	public static final DialogueNode OFFSPRING_PRESENT = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_PRESENT", offspring()));

			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 7 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
				return new Response("Give Present", "You're already giving [npc.name] a present.", null);

			} else {
				return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
			}
		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_SEX = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_SEX", offspring()));

//			UtilText.nodeContentSB.append(getStatus());

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(offspring().isAttractedTo(Main.game.getPlayer())) {
				if (index == 1) {
					return new ResponseSex("Incestuous sex",
							"It's time to show your [npc.daughter] what [npc.her] [pc.mother] can do!",
							true, false,
							new SMGeneric(
								Util.newArrayListOfValues(Main.game.getPlayer()),
								Util.newArrayListOfValues(offspring()),
								null,
								null),
							AFTER_SEX_CONSENSUAL,
							"");

				} else if (index == 2) {
					return new ResponseSex("Submissive sex",
							"It's time to let your [npc.daughter] show you what [npc.she] can do!",
							true, false,
							new SMGeneric(
									Util.newArrayListOfValues(offspring()),
									Util.newArrayListOfValues(Main.game.getPlayer()),
									null,
									null),
							AFTER_SEX_CONSENSUAL,
							"");

				} else {
					return null;
				}

			} else if(offspring().getHistory()==Occupation.NPC_PROSTITUTE){
				if (index == 8) {
					if(Main.game.getPlayer().getMoney()>=100) {
						return new ResponseSex("Incestuous sex ("+UtilText.formatAsMoney(100, "span")+")",
								"Pay your [npc.daughter] 100 flames to get what you want!",
								true, false,
								new SMGeneric(
										Util.newArrayListOfValues(Main.game.getPlayer()),
										Util.newArrayListOfValues(offspring()),
										null,
										null) {
									public SexPace getStartingSexPaceModifier(GameCharacter character) {
										if(!character.isPlayer()) {
											return SexPace.SUB_NORMAL;
										}
										return super.getStartingSexPaceModifier(character);
									}
								},
								AFTER_SEX_CONSENSUAL,
								"");
					} else {
						return new Response("Pay "+UtilText.formatAsMoneyUncoloured(100, "span"), "You don't have enough money...", null);
					}

				} else if (index == 9) {
					if(Main.game.getPlayer().getMoney()>=100) {
						return new ResponseSex("Submissive sex ("+UtilText.formatAsMoney(100, "span")+")",
								"Pay your [npc.daughter] 100 flames to get what you want!",
								true, false,
								new SMGeneric(
										Util.newArrayListOfValues(offspring()),
									Util.newArrayListOfValues(Main.game.getPlayer()),
									null,
									null) {
									public SexPace getStartingSexPaceModifier(GameCharacter character) {
										if(!character.isPlayer()) {
											return SexPace.DOM_NORMAL;
										}
										return super.getStartingSexPaceModifier(character);
									}
								},
								AFTER_SEX_CONSENSUAL,
								"");
					} else {
						return new Response("Pay "+UtilText.formatAsMoneyUncoloured(100, "span"), "You don't have enough money...", null);
					}
				} else {
					return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
				}

			} else {
				if (index == 8 && Main.game.getDialogueFlags().offspringDialogueTokens>0) {
					return new Response("Sex", "You've just asked [npc.name] to have sex with you...", null);

				} else {
					return OFFSPRING_ENCOUNTER_TALKING.getResponse(0, index);
				}
			}

		}
	};

	public static final DialogueNode OFFSPRING_ENCOUNTER_APARTMENT_FIGHT = new DialogueNode("", "", true) {

		@Override
		public String getLabel(){
			return getOffspringLabel();
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "OFFSPRING_ENCOUNTER_APARTMENT_FIGHT", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new ResponseCombat("Fight", "You find yourself fighting your [npc.daughter]!", offspring());

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode AFTER_COMBAT_VICTORY = new DialogueNode("Victory", "", true) {

		@Override
		public String getDescription() {
			return "You have defeated [npc.name]!";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {

			if (index == 1) {
				return new Response("Apologise", "Maybe you went too far... Perhaps you should apologise?", null){
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_APOLOGISE", offspring()));
						Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 25));
						offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
					}
				};

			} else if (index == 2 && Main.game.isIncestEnabled()) {
				if(offspring().isAttractedTo(Main.game.getPlayer()) || !Main.game.isNonConEnabled()) {
					return new ResponseSex("Sex",
							"Well, [npc.she] is asking for it!",
							Util.newArrayListOfValues(Fetish.FETISH_INCEST), null, Fetish.FETISH_INCEST.getAssociatedCorruptionLevel(), null, null, null,
							true, false,
							new SMGeneric(
									Util.newArrayListOfValues(Main.game.getPlayer()),
									Util.newArrayListOfValues(offspring()),
							null,
							null),
							AFTER_SEX_VICTORY,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_SEX", offspring()));

				} else {
					return new ResponseSex(
							"Rape [npc.herHim]", "[npc.She] needs to be punished for attacking you like that...",
							Util.newArrayListOfValues(Fetish.FETISH_NON_CON_DOM, Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(Main.game.getPlayer()),
									Util.newArrayListOfValues(offspring()),
							null,
							null),
							AFTER_SEX_VICTORY,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_RAPE", offspring())) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringRapeApologyNeeded, true);
						}
					};
				}

			} else if (index == 3 && Main.game.isIncestEnabled()) {
				if(offspring().isAttractedTo(Main.game.getPlayer()) || !Main.game.isNonConEnabled()) {
					return new ResponseSex("Gentle sex",
							"Well, [npc.she] is asking for it! (Start the sex scene in the 'gentle' pace.)",
							Util.newArrayListOfValues(Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							true, false,
							new SMGeneric(
									Util.newArrayListOfValues(Main.game.getPlayer()),
									Util.newArrayListOfValues(offspring()),
									null,
									null,
									ResponseTag.START_PACE_PLAYER_DOM_GENTLE),
							AFTER_SEX_VICTORY,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_SEX_GENTLE", offspring()));

				} else {
					return new ResponseSex("Rape [npc.herHim] (gentle)",
							"[npc.She] needs to be punished for attacking you like that... (Start the sex scene in the 'gentle' pace.)",
							Util.newArrayListOfValues(Fetish.FETISH_NON_CON_DOM, Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(Main.game.getPlayer()),
									Util.newArrayListOfValues(offspring()),
									null,
									null,
									ResponseTag.START_PACE_PLAYER_DOM_GENTLE),
							AFTER_SEX_VICTORY,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_RAPE_GENTLE", offspring())) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringRapeApologyNeeded, true);
						}
					};
				}

			} else if (index == 4 && Main.game.isIncestEnabled()) {
				if(offspring().isAttractedTo(Main.game.getPlayer()) || !Main.game.isNonConEnabled()) {
					return new ResponseSex("Rough sex",
							"Well, [npc.she] is asking for it! (Start the sex scene in the 'rough' pace.)",
							Util.newArrayListOfValues(Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							true, false,
							new SMGeneric(
									Util.newArrayListOfValues(Main.game.getPlayer()),
									Util.newArrayListOfValues(offspring()),
									null,
									null,
									ResponseTag.START_PACE_PLAYER_DOM_ROUGH),
							AFTER_SEX_VICTORY,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_SEX_ROUGH", offspring()));

				} else {
					return new ResponseSex("Rape [npc.herHim] (rough)",
							"[npc.She] needs to be punished for attacking you like that... (Start the sex scene in the 'rough' pace.)",
							Util.newArrayListOfValues(Fetish.FETISH_NON_CON_DOM, Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(Main.game.getPlayer()),
									Util.newArrayListOfValues(offspring()),
									null,
									null,
									ResponseTag.START_PACE_PLAYER_DOM_ROUGH),
							AFTER_SEX_VICTORY,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_RAPE_ROUGH", offspring())) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringRapeApologyNeeded, true);
						}
					};
				}

			} else if (index == 5 && Main.game.isIncestEnabled()) {
				if(offspring().isAttractedTo(Main.game.getPlayer()) || !Main.game.isNonConEnabled()) {
					return new ResponseSex("Submit",
							"You're not really sure what to do now...
"
								+ "Perhaps it would be best to let [npc.name] choose what to do next?",
							Util.newArrayListOfValues(Fetish.FETISH_SUBMISSIVE, Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(offspring()),
									Util.newArrayListOfValues(Main.game.getPlayer()),
									null,
									null),
							AFTER_SEX_DEFEAT,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_SUBMIT", offspring())) {
						@Override
						public void effects() {
							Main.game.getTextEndStringBuilder().append(offspring().incrementAffection(Main.game.getPlayer(), 50));
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
						}
					};
				} else {
					return new Response("Submit",
							"You can't submit to [npc.herHim], as [npc.she] has no interest in having sex with you!",
							null);
				}

			} else if (index == 6) {
				return new ResponseEffectsOnly("Inventory", "Now that you've defeated [npc.name], there's nothing stopping you from helping yourself to [npc.her] clothing and items..."){
					@Override
					public void effects() {
						Main.mainController.openInventory(offspring(), InventoryInteraction.FULL_MANAGEMENT);
					}
				};

			} else if (index == 10) {
				return new Response(
						"Remove character",
						"Scare [npc.name] away. This will remove [npc.herHim] from this area, allowing another character to move into this tile.",
						AFTER_COMBAT_VICTORY){
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_REMOVE_CHARACTER", offspring()));

						Main.game.banishNPC(offspring());
					}
				};

			} else if (index == 0) {
				return new Response("Leave", "Now that you've taught [npc.name] a lesson, you can be on your way...", AFTER_COMBAT_VICTORY){
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_VICTORY_LEAVE", offspring()));
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode AFTER_COMBAT_DEFEAT = new DialogueNode("Defeat", "", true) {

		@Override
		public String getDescription() {
			return "You have been defeated by [npc.name]!";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_DEFEAT", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(offspring().isAttractedTo(Main.game.getPlayer()) && Main.game.isIncestEnabled()) {
				if (index == 1) {
					return new ResponseSex("Sex",
							"[npc.Name] forces [npc.herself] on you...",
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(offspring()),
									Util.newArrayListOfValues(Main.game.getPlayer()),
							null,
							null), AFTER_SEX_DEFEAT,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_DEFEAT_SEX", offspring())) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
						}
					};

				} else if (index == 2) {
					return new ResponseSex("Eager Sex",
							"[npc.Name] forces [npc.herself] on you...",
							Util.newArrayListOfValues(Fetish.FETISH_INCEST), null, CorruptionLevel.FIVE_CORRUPT, null, null, null,
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(offspring()),
									Util.newArrayListOfValues(Main.game.getPlayer()),
									null,
									null,
									ResponseTag.START_PACE_PLAYER_SUB_EAGER),
							AFTER_SEX_DEFEAT,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_DEFEAT_SEX_EAGER", offspring())) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
						}
					};

				} else if (index == 3 && Main.game.isNonConEnabled()) {
					return new ResponseSex("Resist Sex",
							"[npc.Name] forces [npc.herself] on you...",
							false, false,
							new SMGeneric(
									Util.newArrayListOfValues(offspring()),
									Util.newArrayListOfValues(Main.game.getPlayer()),
									null,
									null,
									ResponseTag.START_PACE_PLAYER_SUB_RESISTING),
							AFTER_SEX_DEFEAT,
							UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_COMBAT_DEFEAT_SEX_RESIST", offspring())) {
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
						}
					};

				} else {
					return null;
				}

			} else {
				if (index == 1) {
					return new Response("Continue", "You're left to continue on your way...", AFTER_COMBAT_DEFEAT){
						@Override
						public DialogueNode getNextDialogue(){
							return Main.game.getDefaultDialogueNoEncounter();
						}
						@Override
						public void effects() {
							offspring().setFlag(NPCFlagValue.flagOffspringFightApologyNeeded, false);
						}
					};

				} else {
					return null;
				}
			}
		}
	};

	public static final DialogueNode AFTER_SEX_CONSENSUAL = new DialogueNode("Post-sex", "", true) {

		@Override
		public String getDescription(){
			return "You've satisfied your lust for your [npc.daughter]... For now...";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_SEX_CONSENSUAL", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Continue", "Carry on your way.", AFTER_SEX_CONSENSUAL){
					@Override
					public DialogueNode getNextDialogue(){
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode AFTER_SEX_VICTORY = new DialogueNode("Step back", "", true) {

		@Override
		public String getDescription(){
			return "Now that you've had your fun, you can step back and leave [npc.name] to recover.";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_SEX_VICTORY", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Continue", "Carry on your way.", AFTER_SEX_VICTORY){
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_SEX_VICTORY_LEAVING", offspring()));
					}
					@Override
					public DialogueNode getNextDialogue(){
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};

			} else if (index == 6) {
				return new ResponseEffectsOnly("Inventory", "There's nothing stopping you from helping yourself to [npc.namePos] clothing and items..."){
					@Override
					public void effects() {
						Main.mainController.openInventory(Main.game.getActiveNPC(), InventoryInteraction.FULL_MANAGEMENT);
					}
				};

			} else if (index == 10 && Main.game.getPlayer().getLocationPlace().getPlaceType().equals(PlaceType.DOMINION_BACK_ALLEYS)) {
				return new Response(
						"Remove character",
						"Scare [npc.name] away. This will remove [npc.herHim] from this area, allowing another character to move into this tile.",
						AFTER_COMBAT_VICTORY){
					@Override
					public DialogueNode getNextDialogue() {
						return Main.game.getDefaultDialogueNoEncounter();
					}
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_SEX_VICTORY_REMOVE_CHARACTER", offspring()));

						Main.game.banishNPC(offspring());
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode AFTER_SEX_DEFEAT = new DialogueNode("Collapse", "", true) {

		@Override
		public int getSecondsPassed() {
			return 15*60;
		}

		@Override
		public String getDescription(){
			return "You're completely worn out from [npc.namePos] dominant treatment, and need a while to recover.";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile(getTextFilePath(), "AFTER_SEX_DEFEAT", offspring());
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Continue", "Carry on your way.", AFTER_SEX_VICTORY){
					@Override
					public DialogueNode getNextDialogue(){
						return Main.game.getDefaultDialogueNoEncounter();
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode ENSLAVEMENT_DIALOGUE = new DialogueNode("New Slave", "", true) {

		@Override
		public String getDescription(){
			return ".";
		}

		@Override
		public String getContent() {
			AbstractClothing enslavementClothing = offspring().getEnslavementClothing();

			if(!offspring().isSlave() && offspring().isAbleToBeEnslaved()) {
				if(enslavementClothing.getClothingType().equals(ClothingType.NECK_SLAVE_COLLAR)) {
					return UtilText.parse(offspring(),
							"
"
								+ "As you lift the collar up to [npc.namePos] neck, you see that the ring attached to the front starts to glow green; a clear indication that it's detecting your [npc.daughter] as a potential enslavement target."
								+ " Encouraged by the light, you finish what you started, and with a heavy metal 'clink', you clasp the collar around [npc.namePos] neck."
							+ "
"
							+ "
"
								+ "As the collar's arcane enchantment recognises its new wearer as being a criminal, ominous purple lettering starts to glow around the metal band, which reads:"
							+ "
"
							+ "
"
								+ "[style.italicsArcane(Slave Registered."
									+ "
Identification: [npc.nameFull(true)]"
									+ "
Race: [npc.race])]"
							+ "
"
							+ "
"
								+ " Finally realising what's going on, [npc.name] looks up at you with fear in [npc.her] [npc.eyes]."
								+ " [npc.speech(W-Wait, [npc.pcName]! T-This isn't a slave collar is it?!)]"
							+ "
"
							+ "
"
								+ "Grinning at your [npc.daughter], you don't have time to offer a response, as with a bright purple flash, they suddenly disappear from sight."
								+ " The last thing you see as they're whisked away is a face of shocked betrayal, and you imagine how angry they'll be when you see them next."
							+ "
"
							+ "
"
								+ "From Finch's instructions, you know that they've been teleported to the 'Slave Administration' building in Slaver Alley, where they'll be waiting for you to pick them up."
							+ "
");
				} else {
					return UtilText.parse(offspring(),
							"
"
								+ "As you bring the "+enslavementClothing.getName()+" closer to [npc.name], you feel "+(enslavementClothing.getClothingType().isPlural()?"them":"it")
									+" start to steadily hum; a clear indication that your [npc.daughter] is being detected as a potential enslavement target."
								+ " Encouraged by this, you decide to finish what you started, and quickly force [npc.name] to wear the enslaving clothing."
							+ "
"
							+ "
"
								+ "As the arcane enchantment recognises its new wearer as being a criminal, ominous purple lettering is projected into the air, which reads:"
							+ "
"
							+ "
"
								+ "[style.italicsArcane(Slave Registered."
									+ "
Identification: [npc.nameFull(true)]"
									+ "
Race: [npc.race])]"
							+ "
"
							+ "
"
								+ " Finally realising what's going on, [npc.name] looks up at you with fear in [npc.her] [npc.eyes]."
								+ " [npc.speech(W-Wait, [npc.pcName]! T-This isn't enslaving me, is it?!)]"
							+ "
"
							+ "
"
								+ "Grinning at your [npc.daughter], you don't have any time to offer a response, as with a bright purple flash, they suddenly disappear from sight."
								+ " The last thing you see as they're whisked away is a face of shocked betrayal, and you imagine how angry they'll be when you see them next."
							+ "
"
							+ "
"
								+ "From Finch's instructions, you know that they've been teleported to the 'Slave Administration' building in Slaver Alley, where they'll be waiting for you to pick them up."
							+ "
");
				}

			} else {
				if(offspring().isSlave()) {
					return UtilText.parse(offspring(),
							"
"
								+ "Holding the "+enslavementClothing.getName()+" in one [pc.hand], you take a step towards [npc.name]."
								+ " [npc.She] lets out a sigh as [npc.she] sees what you're about to do, and says,"
								+ " [npc.speech(If you're trying to enslave me, it won't work, [pc.name]... I'm already a slave...)]"
							+ "
"
							+ "
"
								+ "Despite [npc.her] words, you force the item of clothing onto [npc.name], before stepping back and waiting to see if anything happens."
								+ " True to [npc.her] words, however, the "+enslavementClothing.getName()+"'s arcane enchantment recognises [npc.name] as already being a slave,"
										+ " evidenced by glowing green lettering that's projected into the air, which reads:"
							+ "
"
							+ "
"
								+ "[style.boldGreen(Slave already registered!)]"
							+ "
");

				} else if(offspring().getSubspecies()==Subspecies.DEMON) {
					return UtilText.parse(offspring(),
							"
"
								+ "Holding the "+enslavementClothing.getName()+" in one [pc.hand], you take a step towards [npc.name]."
								+ " [npc.She] lets out a mocking laugh as [npc.she] sees what you're about to do, and sneers,"
								+ " [npc.speech(If you're trying to enslave me, [pc.name], it's no use! No Enforcer would ever sign off on a demon's enslavement warrant!)]"
							+ "
"
							+ "
"
								+ "Despite [npc.her] words, you force the item of clothing onto [npc.herHim], before stepping back and waiting to see if anything happens."
								+ " True to [npc.her] words, however, the "+enslavementClothing.getName()+"'s arcane enchantment doesn't recognise [npc.name] as being a criminal,"
										+ " evidenced by glowing pink lettering that's projected into the air, which reads:"
							+ "
"
							+ "
"
								+ "[style.italicsBad(Target not wanted for enslavement!)]"
							+ "
");

				} else {
					return UtilText.parse(offspring(),
							"
"
								+ "Holding the "+enslavementClothing.getName()+" in one [pc.hand], you take a step towards [npc.name]."
								+ " [npc.She] lets out a mocking laugh as [npc.she] sees what you're about to do, and sneers, [npc.speech(If you're trying to enslave me, it's no use! I haven't been targeted by the Enforcers for anything!)]"
							+ "
"
							+ "
"
								+ "Despite [npc.her] words, you force the item of clothing onto [npc.name], before stepping back and waiting to see if anything happens."
								+ " True to [npc.her] words, however, the "+enslavementClothing.getName()+"'s arcane enchantment doesn't recognise [npc.name] as being a criminal,"
										+ " evidenced by glowing red lettering that's projected into the air, which reads:"
							+ "
"
							+ "
"
								+ "[style.italicsBad(Target not wanted for enslavement!)]"
							+ "
");
				}
			}
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				if(offspring().isAbleToBeEnslaved()) {
					return new Response("Continue", "Carry on your way.", ENSLAVEMENT_DIALOGUE){
						@Override
						public DialogueNode getNextDialogue(){
							return Main.game.getDefaultDialogueNoEncounter();
						}
						@Override
						public void effects() {
							offspring().applyEnslavementEffects(Main.game.getPlayer());
							Main.game.getPlayer().addSlave((NPC) Main.game.getActiveNPC());
							offspring().setLocation(WorldType.SLAVER_ALLEY, PlaceType.SLAVER_ALLEY_SLAVERY_ADMINISTRATION, true);
						}
					};
				} else {
					return new Response("Continue", UtilText.parse(offspring(), "That didn't work, but it doesn't mean you're finished with [npc.name] yet!"), SlaveDialogue.getFollowupEnslavementDialogue());
				}

			} else {
				return null;
			}
		}
	};
}