code:
package com.lilithsthrone.game.dialogue.places.dominion.shoppingArcade;

import java.util.Map.Entry;

import com.lilithsthrone.game.PropertyValue;
import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.CorruptionLevel;
import com.lilithsthrone.game.character.body.CoverableArea;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.character.npc.dominion.Vicky;
import com.lilithsthrone.game.character.quests.Quest;
import com.lilithsthrone.game.character.quests.QuestLine;
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.responses.ResponseTrade;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.inventory.item.AbstractItem;
import com.lilithsthrone.game.inventory.item.AbstractItemType;
import com.lilithsthrone.game.inventory.item.ItemType;
import com.lilithsthrone.game.inventory.weapon.AbstractWeapon;
import com.lilithsthrone.game.sex.SexPace;
import com.lilithsthrone.game.sex.managers.dominion.SMVickyOverDesk;
import com.lilithsthrone.game.sex.positions.slots.SexSlotDesk;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.82
 * @version 0.3.5.5
 * @author Innoxia
 */
public class ArcaneArts {

	public static final DialogueNode EXTERIOR = new DialogueNode("Arcane Arts (Exterior)", "-", false) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "EXTERIOR");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return ShoppingArcadeDialogue.getCoreResponseTab(index);
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(responseTab==0) {
				if (index == 1) {
					if(Main.game.isExtendedWorkTime()) {
						return new Response("Enter", "Step inside Arcane Arts.", SHOP_WEAPONS);
					} else {
						return new Response("Enter", "Arcane Arts is currently closed. You'll have to come back later if you want to do some shopping here.", null);
					}
				}
			}

			return ShoppingArcadeDialogue.getFastTravelResponses(responseTab, index);
		}
	};

	public static final DialogueNode SHOP_WEAPONS = new DialogueNode("Arcane Arts", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "SHOP_WEAPONS");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new ResponseTrade("Weapons", "Walk over to the counter and see what weapons Vicky has in stock.", Main.game.getNpc(Vicky.class)) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.vickyIntroduced, true);

						Main.game.getNpc(Vicky.class).clearNonEquippedInventory(false);

						for (Entry<AbstractWeapon, Integer> weapon : ((Vicky) Main.game.getNpc(Vicky.class)).getWeaponsForSale().entrySet()) {
							if(Main.game.getNpc(Vicky.class).isInventoryFull()) {
								break;
							}
							Main.game.getNpc(Vicky.class).addWeapon(weapon.getKey(), weapon.getValue(), false, false);
						}
					}
				};

			} else if (index == 2) {
				return new ResponseTrade("Potions & Spells", "Walk over to the counter and see what potions, essences, and spells Vicky has in stock.", Main.game.getNpc(Vicky.class)) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.vickyIntroduced, true);

						Main.game.getNpc(Vicky.class).clearNonEquippedInventory(false);

						for (Entry<AbstractItem, Integer> item : ((Vicky) Main.game.getNpc(Vicky.class)).getItemsForSale().entrySet()) {
							if(Main.game.getNpc(Vicky.class).isInventoryFull()) {
								break;
							}
							Main.game.getNpc(Vicky.class).addItem(item.getKey(), item.getValue(), false, false);
						}
					}
				};

			} else if (index == 3) {
				if(((Vicky) Main.game.getNpc(Vicky.class)).getClothingForSale().isEmpty()) {
					return new Response("Clothing", "Vicky doesn't have any clothing in stock at the moment.", null);
				}
				return new ResponseTrade("Clothing", "Walk over to the counter and see what clothing Vicky has in stock.", Main.game.getNpc(Vicky.class)) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.vickyIntroduced, true);

						Main.game.getNpc(Vicky.class).clearNonEquippedInventory(false);

						for (Entry<AbstractClothing, Integer> clothing : ((Vicky) Main.game.getNpc(Vicky.class)).getClothingForSale().entrySet()) {
							if(Main.game.getNpc(Vicky.class).isInventoryFull()) {
								break;
							}
							Main.game.getNpc(Vicky.class).addClothing(clothing.getKey(), clothing.getValue(), false, false);
						}
					}
				};

			} else if(index==5) {
				if(!Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.arthursPackageObtained)) {
					if(Main.game.getPlayer().getQuest(QuestLine.SIDE_HYPNO_WATCH)==Quest.SIDE_HYPNO_WATCH_VICKY) {
						if(Main.game.getPlayer().isInventoryFull()) {
							return new Response("Arthur's package", "You don't have enough room in your inventory for the package!", null);

						} else {
							return new Response("Arthur's package", "Tell Vicky that you're here to collect Arthur's package.", ARTHURS_PACKAGE) {
								@Override
								public void effects() {
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.vickyIntroduced, true);
								}
							};
						}

					} else {
						return null;
					}

				} else {
					if(Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.ANUS, true) || (Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true) && Main.game.getPlayer().hasVagina())) {
						return new ResponseSex("Offer body", "Let Vicky use your body.",
								Util.newArrayListOfValues(Fetish.FETISH_SUBMISSIVE), null, CorruptionLevel.TWO_HORNY, null, null, null,
								true, false,
								new SMVickyOverDesk(
										Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Vicky.class), SexSlotDesk.BETWEEN_LEGS)),
										Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_FRONT))),
								null,
								null,
								VICKY_POST_SEX,
								UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "SHOP_WEAPONS_OFFER_BODY"));
					} else {
						return new Response("Offer body", "Vicky needs to be able to access your anus"+(Main.game.getPlayer().hasVagina()?" or vagina":"")+"!", null);
					}
				}

			} else if (index == 6 && Main.getProperties().hasValue(PropertyValue.nonConContent) && Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.arthursPackageObtained)) {
				if(Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.ANUS, true) || (Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true) && Main.game.getPlayer().hasVagina())) {

					return new ResponseSex("Nervously leave", "Vicky is far too intimidating for you... Turn around and try to escape from her gaze. [style.boldBad(You get the feeling that this will result in non-consensual sex...)]",
							Util.newArrayListOfValues(
									Fetish.FETISH_SUBMISSIVE,
									Fetish.FETISH_NON_CON_SUB), null, CorruptionLevel.FOUR_LUSTFUL, null, null, null,
							false, false,
							new SMVickyOverDesk(
									Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Vicky.class), SexSlotDesk.BETWEEN_LEGS)),
									Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_FRONT))) {
								@Override
								public SexPace getStartingSexPaceModifier(GameCharacter character) {
									if(character.isPlayer()) {
										return SexPace.SUB_RESISTING;
									}
									return null;
								}
							},
							null,
							null,
							VICKY_POST_SEX_RAPE,
							UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "SHOP_WEAPONS_RAPE"));

				} else {
					return new Response("Nervously leave", "Vicky needs to be able to access your anus"+(Main.game.getPlayer().hasVagina()?" or vagina":"")+"!", null);
				}

			} else if (index == 0) {
				return new Response("Leave", "Leave Arcane Arts and head back out into the arcade.", EXTERIOR) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.vickyIntroduced, true);
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode ARTHURS_PACKAGE = new DialogueNode("Arcane Arts", "-", true, true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "ARTHURS_PACKAGE");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				if(Main.game.getPlayer().getMoney()>=100) {
					return new Response("Pay ("+UtilText.formatAsMoney(100, "span")+")", "Pay Vicky 100 flames.", ARTHURS_PACKAGE_BOUGHT) {
						@Override
						public void effects() {
							Main.game.getDialogueFlags().setFlag(DialogueFlagValue.arthursPackageObtained, true);
							Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().addItem(AbstractItemType.generateItem(ItemType.ARTHURS_PACKAGE), false, true));
							Main.game.getPlayer().incrementMoney(-100);
						}
					};
				} else {
					return new Response("Pay ("+UtilText.formatAsMoneyUncoloured(100, "span")+")", "You don't have enough money to pay the fee!", null);
				}

			} else if (index == 2) {
				if(Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.ANUS, true) || (Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true) && Main.game.getPlayer().hasVagina())) {
					return new ResponseSex("Offer body", "Let Vicky use your body as payment for the fee.",
							Util.newArrayListOfValues(Fetish.FETISH_SUBMISSIVE), null, CorruptionLevel.TWO_HORNY, null, null, null,
							true, false,
							new SMVickyOverDesk(
									Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Vicky.class), SexSlotDesk.BETWEEN_LEGS)),
									Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_FRONT))),
							null,
							null,
							VICKY_POST_SEX_PACKAGE,
							UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "ARTHURS_PACKAGE_SEX"));
				} else {
					return new Response("Offer body", "Vicky needs to be able to access your anus"+(Main.game.getPlayer().hasVagina()?" or vagina":"")+"!", null);
				}

			} else if (index == 3 && Main.getProperties().hasValue(PropertyValue.nonConContent)) {
				if(Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.ANUS, true) || (Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true) && Main.game.getPlayer().hasVagina())) {

					return new ResponseSex(
							"Weakly refuse",
							"You can't bring yourself to say no to such an intimidating person... Try to wriggle free and leave... [style.boldBad(You get the feeling that this will result in non-consensual sex...)]",
							Util.newArrayListOfValues(
									Fetish.FETISH_SUBMISSIVE,
									Fetish.FETISH_NON_CON_SUB), null, CorruptionLevel.FOUR_LUSTFUL, null, null, null,
							false, false,
							new SMVickyOverDesk(
									Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Vicky.class), SexSlotDesk.BETWEEN_LEGS)),
									Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotDesk.OVER_DESK_ON_FRONT))) {
								@Override
								public SexPace getStartingSexPaceModifier(GameCharacter character) {
									if(character.isPlayer()) {
										return SexPace.SUB_RESISTING;
									}
									return null;
								}
							},
							null,
							null,
							VICKY_POST_SEX_RAPE_PACKAGE,
							UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "ARTHURS_PACKAGE_RAPE"));

				} else {
					return new Response("Weakly refuse", "Vicky needs to be able to access your anus"+(Main.game.getPlayer().hasVagina()?" or vagina":"")+"!", null);
				}

			} else if (index == 0) {
				return new Response("Leave", "Leave Arcane Arts and head back out into the arcade.", EXTERIOR) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.vickyIntroduced, true);
						Main.game.getTextEndStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "ARTHURS_PACKAGE_LEAVE"));
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode ARTHURS_PACKAGE_BOUGHT = new DialogueNode("Arcane Arts", "-", true, true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "ARTHURS_PACKAGE_BOUGHT");
		}

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

	public static final DialogueNode VICKY_POST_SEX_PACKAGE = new DialogueNode("Arcane Arts", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "VICKY_POST_SEX_PACKAGE");
		}

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

	public static final DialogueNode VICKY_POST_SEX_RAPE_PACKAGE = new DialogueNode("Arcane Arts", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "VICKY_POST_SEX_RAPE_PACKAGE");
		}

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

	public static final DialogueNode VICKY_POST_SEX = new DialogueNode("Arcane Arts", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "VICKY_POST_SEX");
		}

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

	public static final DialogueNode VICKY_POST_SEX_RAPE = new DialogueNode("Arcane Arts", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/arcaneArts", "VICKY_POST_SEX_RAPE");
		}

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

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.dialogue.places.dominion.shoppingArcade;

import com.lilithsthrone.game.character.attributes.AffectionLevel;
import com.lilithsthrone.game.character.npc.dominion.Nyan;
import com.lilithsthrone.game.character.quests.Quest;
import com.lilithsthrone.game.character.quests.QuestLine;
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.responses.ResponseTrade;
import com.lilithsthrone.game.dialogue.utils.GiftDialogue;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.sex.Sex;
import com.lilithsthrone.game.sex.managers.universal.SMGeneric;
import com.lilithsthrone.game.sex.managers.universal.SMLyingDown;
import com.lilithsthrone.game.sex.positions.slots.SexSlotLyingDown;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.82
 * @version 0.3.5.5
 * @author Innoxia
 */
public class ClothingEmporium {

	public static final DialogueNode EXTERIOR = new DialogueNode("Nyan's Clothing Emporium (Exterior)", "-", false) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_EXTERIOR");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return ShoppingArcadeDialogue.getCoreResponseTab(index);
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(responseTab==0) {
				if (index == 1) {
					if(!Main.game.isExtendedWorkTime()) {
						return new Response("Enter", "Nyan's Clothing Emporium is currently closed. You'll have to come back later...", null);

					} else if(Main.game.getDialogueFlags().values.contains(DialogueFlagValue.nyanIntroduced)) {
						return new Response("Enter", "Step inside Nyan's Clothing Emporium.", SHOP_CLOTHING_REPEAT);

					} else {
						return new Response("Enter", "Step inside Nyan's Clothing Emporium.", SHOP_CLOTHING);
					}
				}
			}
			return ShoppingArcadeDialogue.getFastTravelResponses(responseTab, index);
		}
	};

	public static final DialogueNode SHOP_CLOTHING = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_GREETING");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Stockroom", "Nyan has shown you into the stockroom.", SHOP_CLOTHING_STOCK_ROOM) {
					@Override
					public void effects() {
						Main.game.getDialogueFlags().values.add(DialogueFlagValue.nyanIntroduced);
					}
				};
			}
			return null;
		}
	};

	public static final DialogueNode SHOP_CLOTHING_STOCK_ROOM = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_STOCK_ROOM");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode SHOP_CLOTHING_REPEAT = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getAuthor() {
			if(Main.game.getNpc(Nyan.class).isPregnant() && !Main.game.getNpc(Nyan.class).isCharacterReactedToPregnancy(Main.game.getPlayer())) {
				return "Duner";
			} else {
				return "Innoxia";
			}
		}

		@Override
		public String getContent() {
			if(Main.game.getNpc(Nyan.class).isVisiblyPregnant() && !Main.game.getNpc(Nyan.class).isCharacterReactedToPregnancy(Main.game.getPlayer())) {
				return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_GREETING_REPEAT_PREGNANT");
			} else {
				return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_GREETING_REPEAT");
			}
		}

		@Override
		public String getResponseTabTitle(int index) {
			if(index==0) {
				return "Trade";
			} else if(index==1) {
				return "Talk";
			} else {
				return null;
			}
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(responseTab==1) {
				if(Main.game.getPlayer().isQuestCompleted(QuestLine.RELATIONSHIP_NYAN_HELP)) {
					if(index==1) {
						if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanTalkedTo)) {
							return new Response("Small Talk", "You've already had a chat with Nyan today. You can repeat this action tomorrow.", null);

						} else {
							return new Response("Small Talk", "Talk with Nyan about her store, the weather, and other such topics.", ROMANCE_TALK) {
								@Override
								public void effects() {
									Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 1f));
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanTalkedTo, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}

					} else if(index==2) {
						if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanComplimented)) {
							return new Response("Compliment", "You've already complimented Nyan today. You can repeat this action tomorrow.", null);

						} else {
							return new Response("Compliment", "Compliment Nyan's appearance and abilities.", ROMANCE_COMPLIMENT) {
								@Override
								public void effects() {
									Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 3f));
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanComplimented, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}

					} else if(index==3) {
						int requiredAffection = AffectionLevel.POSITIVE_TWO_LIKE.getMinimumValue();
						if(Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())<requiredAffection) {
							return new Response(
									"Flirt",
									"You can tell that attempting to flirt with Nyan would end in disaster."
										+ " You should work on getting to know her a little better first."
										+ " ([style.italicsBad(Requires Nyan's affection to be at least "+requiredAffection+", and is currently "+Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())+".)])",
									null);

						} else if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanFlirtedWith)) {
							return new Response("Flirt", "You've already flirted with Nyan today. You can repeat this action tomorrow.", null);

						} else {
							return new Response("Flirt", "Flirt with Nyan a little.", ROMANCE_FLIRT) {
								@Override
								public void effects() {
									Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 4f));
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanFlirtedWith, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}

					} else if(index==4) {
						int requiredAffection = AffectionLevel.POSITIVE_THREE_CARING.getMinimumValue();
						if(Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())<requiredAffection) {
							return new Response(
									"Kiss",
									"You can tell that attempting to kiss Nyan would end in disaster."
										+ " You should work on getting to know her a little better first."
										+ " ([style.italicsBad(Requires Nyan's affection to be at least "+requiredAffection+", and is currently "+Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())+".)])",
									null);

						} else if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanKissed)) {
							return new Response("Kiss", "You've already kissed Nyan today. You can repeat this action tomorrow.", null);

						} else {
							return new Response("Kiss", "You can tell from the way Nyan looks at you that she wouldn't mind being kissed. Lean forwards and give her what she wants.", ROMANCE_KISS) {
								@Override
								public void effects() {
									Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 5f));
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanKissed, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}

					} else if(index==5) {
						int requiredAffection = AffectionLevel.POSITIVE_FOUR_LOVE.getMinimumValue();
						if(Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())<requiredAffection) {
							return new Response(
									"Make Out",
									"You can tell that attempting to make out with Nyan would end in disaster."
										+ " You should work on getting to know her a little better first."
										+ " ([style.italicsBad(Requires Nyan's affection to be at least "+requiredAffection+", and is currently "+Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())+".)])",
									null);

						} else if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanMakeOut)) {
							return new Response("Make Out", "You've already made out with Nyan today. You can repeat this action tomorrow.", null);

						} else {
							return new Response("Make Out", "You can tell that Nyan is desperate for some intense physical contact with you. Lean forwards and passionately start making out with her.", ROMANCE_MAKE_OUT) {
								@Override
								public void effects() {
									Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 6f));
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanMakeOut, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}

					} else if(index==6) {
						if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanGift)) {
							return new Response("Gift", "You've already given Nyan a gift today. You can repeat this action tomorrow.", null);
						} else {
							return new Response("Gift", "Give Nyan a gift (opens gift selection screen).", ROMANCE_GIFT) {
								@Override
								public DialogueNode getNextDialogue() {
									return GiftDialogue.getGiftDialogue(Main.game.getNpc(Nyan.class), SHOP_CLOTHING_REPEAT, 1, ROMANCE_GIFT, 1);
								}
								@Override
								public void effects() {
//									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanGift, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}

					} else if(index==10) {
						int requiredAffection = AffectionLevel.POSITIVE_FOUR_LOVE.getMinimumValue();

						if(Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())<requiredAffection) {
							return new Response(
									"Sex",
									"You can tell that propositioning Nyan for sex would end in disaster."
										+ " You should work on getting to know her a little better first."
										+ " ([style.italicsBad(Requires Nyan's affection to be at least "+requiredAffection+", and is currently "+Main.game.getNpc(Nyan.class).getAffection(Main.game.getPlayer())+".)])",
									null);

						} else if(Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.nyanSex)) {
							return new Response("Sex", "You've already had sex with Nyan today. You can repeat this action tomorrow.", null);

						} else {
							return new ResponseSex("Sex",
									"Have sex with Nyan.",
									null, null, null, null, null, null,
									true, true,
									!Main.game.getPlayer().isTaur()
										?new SMLyingDown(
											Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotLyingDown.MISSIONARY)),
											Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Nyan.class), SexSlotLyingDown.LYING_DOWN)))
										:new SMGeneric(
												Util.newArrayListOfValues(Main.game.getPlayer()),
												Util.newArrayListOfValues(Main.game.getNpc(Nyan.class)),
												null,
												null),
									null,
									null,
									END_SEX,
									UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_SEX")) {
								@Override
								public void effects() {
									Main.game.getDialogueFlags().setFlag(DialogueFlagValue.nyanSex, true);
									if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
										Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
									}
								}
							};
						}
					}

				} else if(Main.game.getPlayer().getQuest(QuestLine.RELATIONSHIP_NYAN_HELP) == Quest.RELATIONSHIP_NYAN_STOCK_ISSUES_SUPPLIERS_BEATEN) {
					if(index==1) {
						return new Response("Report back", "Tell Nyan that you've dealt with the suppliers.", SHOP_REPORT_BACK) {
							@Override
							public void effects() {
								Main.game.getPlayer().incrementMoney(5000);
								Main.game.getNpc(Nyan.class).setSellModifier(1.25f);
								Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 25));
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().setQuestProgress(QuestLine.RELATIONSHIP_NYAN_HELP, Quest.SIDE_UTIL_COMPLETE));
							}
						};
					}

				} else if(Main.game.getPlayer().getQuest(QuestLine.RELATIONSHIP_NYAN_HELP) == Quest.RELATIONSHIP_NYAN_STOCK_ISSUES_AGREED_TO_HELP) {
					if(index==1) {
						return new Response("Report back", "Report back to Nyan once you've dealt with the suppliers.", null);
					}

				} else if(Main.game.getPlayer().getQuest(QuestLine.RELATIONSHIP_NYAN_HELP) == Quest.RELATIONSHIP_NYAN_STOCK_ISSUES) {
					if(index==1) {
						return new Response("Offer help", "Tell Nyan that you'll help her with her supplier problem.", SHOP_OFFER_HELP) {
							@Override
							public void effects() {
								Main.game.getTextEndStringBuilder().append(Main.game.getNpc(Nyan.class).incrementAffection(Main.game.getPlayer(), 10));
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().setQuestProgress(QuestLine.RELATIONSHIP_NYAN_HELP, Quest.RELATIONSHIP_NYAN_STOCK_ISSUES_AGREED_TO_HELP));
							}
						};
					}

				} else if(!Main.game.getPlayer().hasQuest(QuestLine.RELATIONSHIP_NYAN_HELP)){
					if(index==1) {
						return new Response("Enchanted Clothing", "Ask Nyan if she stocks enchanted clothing.", SHOP_ENCHANTED_CLOTHING) {
							@Override
							public void effects() {
								Main.game.getTextEndStringBuilder().append(Main.game.getPlayer().startQuest(QuestLine.RELATIONSHIP_NYAN_HELP));
							}
						};
					}
				}

				if (index == 0) {
					return new Response("Leave", "Tell Nyan that you've got to get going.", EXTERIOR) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_EXIT"));
							if(Main.game.getNpc(Nyan.class).isVisiblyPregnant()) {
								Main.game.getNpc(Nyan.class).setCharacterReactedToPregnancy(Main.game.getPlayer(), true);
							}
						}
					};

				} else {
					return null;
				}

			} else if(responseTab==0) {
				if (index == 1) {
					return new ResponseTrade("Female Clothing", "Ask her what female clothing is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonFemaleClothing()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 2) {
					return new ResponseTrade("Female Lingerie", "Ask her what female lingerie is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonFemaleUnderwear()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 3) {
					return new ResponseTrade("Female Accessories", "Ask her what female accessories are available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonFemaleAccessories()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 6) {
					return new ResponseTrade("Male Clothing", "Ask her what male clothing is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonMaleClothing()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 7) {
					return new ResponseTrade("Male Underwear", "Ask her what male underwear is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonMaleLingerie()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 8) {
					return new ResponseTrade("Male Accessories", "Ask her what male accessories are is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonMaleAccessories()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 11) {
					return new ResponseTrade("Unisex Clothing", "Ask her what unisex clothing is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonAndrogynousClothing()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 12) {
					return new ResponseTrade("Unisex Underwear", "Ask her what unisex underwear is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonAndrogynousLingerie()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 13) {
					return new ResponseTrade("Unisex Accessories", "Ask her what unisex accessories are is available.", Main.game.getNpc(Nyan.class)){
						@Override
						public void effects() {
							Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

							for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getCommonAndrogynousAccessories()) {
								if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
									break;
								}
								Main.game.getNpc(Nyan.class).addClothing(c, false);
							}
						}
					};

				} else if (index == 5) {
					if(Main.game.getPlayer().isQuestCompleted(QuestLine.RELATIONSHIP_NYAN_HELP)) {
						return new ResponseTrade("Specials", "Ask Nyan about any special items of clothing she might have in stock.", Main.game.getNpc(Nyan.class)){
							@Override
							public void effects() {
								Main.game.getNpc(Nyan.class).clearNonEquippedInventory(false);

								for (AbstractClothing c : ((Nyan) Main.game.getNpc(Nyan.class)).getSpecials()) {
									if(Main.game.getNpc(Nyan.class).isInventoryFull()) {
										break;
									}
									Main.game.getNpc(Nyan.class).addClothing(c, false);
								}
							}
						};
					} else {
						return new Response("Specials", "Nyan doesn't have any special items of clothing on offer at the moment...", null);
					}

				} else if (index == 0) {
					return new Response("Leave", "Tell Nyan that you've got to get going.", EXTERIOR) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_EXIT"));
						}
					};

				} else {
					return null;
				}
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode SHOP_ENCHANTED_CLOTHING = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_SUPPLIER_PROBLEM");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode SHOP_OFFER_HELP = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_OFFER_HELP");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode SHOP_REPORT_BACK = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_REPORT_BACK");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 0) {
				return new Response("Leave", "Exit the store.", EXTERIOR) {
					@Override
					public void effects() {
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/clothingEmporium", "NYAN_EXIT_EMBARRASSED"));
					}
				};

			} else {
				return null;
			}
		}
	};

	public static final DialogueNode ROMANCE_TALK = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

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

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_TALK_BASE"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_TALK"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_TALK_FINAL"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode ROMANCE_COMPLIMENT = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_COMPLIMENT_BASE"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_COMPLIMENT"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_COMPLIMENT_FINAL"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode ROMANCE_FLIRT = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_FLIRT_BASE"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_FLIRT"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_FLIRT_FINAL"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode ROMANCE_KISS = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_KISS_BASE"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_KISS"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_KISS_FINAL"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode ROMANCE_MAKE_OUT = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_MAKE_OUT_BASE"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_MAKE_OUT"));
			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_MAKE_OUT_FINAL"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode END_SEX = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

		@Override
		public String getContent() {
			if(Sex.getNumberOfOrgasms(Main.game.getNpc(Nyan.class))==0) {
				return UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_END_SEX_NO_ORGASM");
			} else {
				return UtilText.parseFromXMLFile("characters/dominion/nyan", "NYAN_END_SEX");
			}
		}

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

	public static final DialogueNode ROMANCE_GIFT = new DialogueNode("Nyan's Clothing Emporium", "-", true) {

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

		@Override
		public String getResponseTabTitle(int index) {
			return SHOP_CLOTHING_REPEAT.getResponseTabTitle(index);
		}

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

}


code:
package com.lilithsthrone.game.dialogue.places.dominion.shoppingArcade;

import com.lilithsthrone.game.character.npc.dominion.Ashley;
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.ResponseTrade;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.main.Main;

/**
 * @since 0.1.99
 * @version 0.3.5.5
 * @author Kumiko, Innoxia
 */
public class DreamLover {

	public static final DialogueNode EXTERIOR = new DialogueNode("Dream Lover (Exterior)", "-", false) {

		@Override
		public String getAuthor() {
			return "Kumiko";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "EXTERIOR");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return ShoppingArcadeDialogue.getCoreResponseTab(index);
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(responseTab==0) {
				if (index == 1) {
					if(!Main.game.isExtendedWorkTime()) {
						return new Response("Enter", "Step inside 'Dream Lover'.", EXTERIOR_CLOSED);
					}
					return new Response("Enter", "Step inside 'Dream Lover'.", ENTRY);
				}
			}
			return ShoppingArcadeDialogue.getFastTravelResponses(responseTab, index);
		}
	};

	public static final DialogueNode EXTERIOR_CLOSED = new DialogueNode("Dream Lover (Exterior)", "-", false, true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "EXTERIOR_CLOSED");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return ShoppingArcadeDialogue.getCoreResponseTab(index);
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(responseTab==0) {
				if (index == 1) {
					return new Response("Enter", "'Dream Lover' is currently closed, so you'll have to back at another time if you wanted to do any shopping here.", null);
				}
			}
			return ShoppingArcadeDialogue.getFastTravelResponses(responseTab, index);
		}
	};

	public static final DialogueNode ENTRY = new DialogueNode("Dream Lover", "-", true) {

		@Override
		public String getAuthor() {
			return "Kumiko";
		}

		@Override
		public String getContent() {
			UtilText.nodeContentSB.setLength(0);
			if(Main.game.getDialogueFlags().values.contains(DialogueFlagValue.ashleyIntroduced)) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "ENTRY_REPEAT"));

				if(!Main.game.getDialogueFlags().values.contains(DialogueFlagValue.ashleyAttitude)) {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "ENTRY_REPEAT_ATTITUDE"));
				}

				return UtilText.nodeContentSB.toString();

			} else {
				return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "ENTRY");
			}
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(!Main.game.getDialogueFlags().values.contains(DialogueFlagValue.ashleyIntroduced)) {
				if (index == 1) {
					return new Response("Explore", "Explore the shelves.", EXPLORE_SHELVES) {
						@Override
						public void effects() {
							Main.game.getDialogueFlags().setFlag(DialogueFlagValue.ashleyIntroduced, true);
						}
					};

				} else {
					return null;
				}

			} else {

				if (index == 1) {
					return new ResponseTrade("Trade", "Wander around the shop and see what items there are for sale...", Main.game.getNpc(Ashley.class));

				} else if(index==2 && !Main.game.getDialogueFlags().values.contains(DialogueFlagValue.ashleyAttitude)) {
					return new Response("Confront Ashley", "What's with this person's attitude? Walk up to the counter and confront them about it.", CONFRONT_ASHLEY) {
						@Override
						public void effects() {
							if(!Main.game.getDialogueFlags().hasFlag(DialogueFlagValue.ashleySexToysDiscovered)) {
								Main.game.getTextEndStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "SEX_TOY_DISCOVERY"));
							}
							Main.game.getDialogueFlags().setFlag(DialogueFlagValue.ashleySexToysDiscovered, true);
							Main.game.getDialogueFlags().setFlag(DialogueFlagValue.ashleyAttitude, true);
						}
					};

				} else if (index == 0) {
					return new Response("Leave", "Head back out to the Shopping Arcade.", EXTERIOR) {
						@Override
						public void effects() {
							Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "EXIT"));
						}
					};

				} else {
					return null;
				}
			}
		}
	};

	public static final DialogueNode EXPLORE_SHELVES = new DialogueNode("Dream Lover", "-", true, true) {

		@Override
		public String getAuthor() {
			return "Kumiko";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "EXPLORE_SHELVES");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				return new Response("Confront Ashley", "What's with this person's attitude? Walk up to the counter and confront them about it.", CONFRONT_ASHLEY) {
					@Override
					public void effects() {
						Main.game.getTextEndStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "SEX_TOY_DISCOVERY"));
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.ashleyAttitude, true);
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.ashleySexToysDiscovered, true);
					}
				};

			} else if(index==2) {
				return new Response("Keep quiet", "It's probably best to just ignore this person's strange attitude...", IGNORE_ASHLEY) {
					@Override
					public void effects() {
						Main.game.getTextEndStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "SEX_TOY_DISCOVERY"));
						Main.game.getDialogueFlags().setFlag(DialogueFlagValue.ashleySexToysDiscovered, true);
					}
				};

			}  else {
				return null;
			}
		}
	};

	public static final DialogueNode CONFRONT_ASHLEY = new DialogueNode("Dream Lover", "-", true, true) {

		@Override
		public String getAuthor() {
			return "Kumiko";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "CONFRONT_ASHLEY");
		}

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

	public static final DialogueNode IGNORE_ASHLEY = new DialogueNode("Dream Lover", "-", true, true) {

		@Override
		public String getAuthor() {
			return "Kumiko";
		}

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/dreamLover", "IGNORE_ASHLEY");
		}

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

}


code:
package com.lilithsthrone.game.dialogue.places.dominion.shoppingArcade;

import java.util.List;

import com.lilithsthrone.game.PropertyValue;
import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.attributes.Attribute;
import com.lilithsthrone.game.character.npc.dominion.Pix;
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.managers.dominion.SMPixShowerTime;
import com.lilithsthrone.game.sex.managers.universal.SMAgainstWall;
import com.lilithsthrone.game.sex.positions.AbstractSexPosition;
import com.lilithsthrone.game.sex.positions.SexPosition;
import com.lilithsthrone.game.sex.positions.slots.SexSlotAgainstWall;
import com.lilithsthrone.game.sex.positions.slots.SexSlotUnique;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;

/**
 * @since 0.1.66
 * @version 0.3.5.5
 * @author Innoxia
 */
public class PixsPlayground {

	private static final int SINGLE_PAYMENT_VALUE = 100;
	private static final int MEMBERSHIP_VALUE = 8000;

	private static Response getResponseGym(int index) {
		if (index == 1) {
			if (Main.game.getPlayer().getHealthPercentage() < 0.4f) {
				return new Response("Cardio", "You are too tired to do any more exercise!", null);

			} else {
				return new Response("Cardio", "Use the running and cycling machines to burn off some of your body size.", GYM_CARDIO){
					@Override
					public void effects(){
						Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.4f);
						Main.game.getTextEndStringBuilder().append(
								"
[style.boldBad(-5)] Body Size
"
								+Main.game.getPlayer().incrementBodySize(-5));
					}
				};
			}

		} else if (index == 2) {
			if (Main.game.getPlayer().getHealthPercentage() < 0.4f) {
				return new Response("Weights", "You are too tired to do any more exercise!", null);

			} else {
				return new Response("Weights", "Use the free weights and exercise machines to build up your strength.", GYM_WEIGHTS){
					@Override
					public void effects(){
						Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.4f);
						Main.game.getTextEndStringBuilder().append(
								"
[style.boldGood(+5)] Muscle Definition
"
								+Main.game.getPlayer().incrementMuscle(5));
					}
				};
			}

		} else if (index == 3) {
				if(!Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymIsMember)) {
					return new Response("Pix", "Only lifetime members can get personal training from Pix.", null);

				} else if (Main.game.getPlayer().getHealthPercentage() < 0.8f) {
					return new Response("Pix", "You are too tired to do Pix's exhausting workout routine!", null);

				} else {
					return new Response("Pix",
							"Pix is hovering close by, bouncing up and down on the spot while glancing your way. She obviously wants you to ask her for a personal training session. Call her over and grant her wish.", GYM_PIX_TRAINING){
						@Override
						public void effects(){
							Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.1f);
							Main.game.getTextEndStringBuilder().append(
									"
[style.boldGood(+4)] Muscle Definition
"
									+Main.game.getPlayer().incrementMuscle(4));
						}
					};
				}

		} else if (index == 0) {
			return new Response("Leave", "Decide to leave the gym.", GYM_EXTERIOR);
		}

		return null;
	}

	public static final DialogueNode GYM_EXTERIOR = new DialogueNode("Pix's Playground (Exterior)", "-", false) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_EXTERIOR");
		}

		@Override
		public String getResponseTabTitle(int index) {
			return ShoppingArcadeDialogue.getCoreResponseTab(index);
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(responseTab==0) {
				if (index == 1) {
					if(!Main.game.isExtendedWorkTime()) {
						return new Response("Enter", "The gym is currently closed. You'll have to return during opening hours if you want to work out here.", null);
					} else if(Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymHadTour)) {
						return new Response("Enter", "Step inside the gym.", GYM_RETURNING);
					} else {
						return new Response("Enter", "Step inside the gym.", GYM);
					}
				}
			}
			return ShoppingArcadeDialogue.getFastTravelResponses(responseTab, index);
		}

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

	public static final DialogueNode GYM = new DialogueNode("Pix's Playground", "-", true) {

		@Override
		public String getContent() {
			if (!Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymIntroduced)) {
				return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_ENTRY");

			} else {
				return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_ENTRY_REPEAT");
			}
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Follow", "Follow Pix and let her give you a tour of the gym.", GYM_FOLLOW){
					@Override
					public void effects(){
						Main.game.getDialogueFlags().values.add(DialogueFlagValue.gymIntroduced);
						Main.game.getDialogueFlags().values.add(DialogueFlagValue.gymHadTour);
					}
				};

			} else if (index == 0) {
				return new Response("Leave", "Tell Pix that you don't have time right now, but you might be back later.", GYM_EXTERIOR){
					@Override
					public void effects(){
						Main.game.getDialogueFlags().values.add(DialogueFlagValue.gymIntroduced);
						Main.game.getTextStartStringBuilder().append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_EXIT"));
					}
				};

			} else {
				return null;
			}
		}

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

	public static final DialogueNode GYM_FOLLOW = new DialogueNode("Pix's Playground", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_FOLLOW");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (!Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymIsMember)) {
				if (index == 1) {
					if (Main.game.getPlayer().getMoney() < SINGLE_PAYMENT_VALUE)
						return new Response("Single (" + UtilText.formatAsMoneyUncoloured(SINGLE_PAYMENT_VALUE, "span") + ")", "You don't have enough money!", null);
					else
						return new Response("Single (" + UtilText.formatAsMoney(SINGLE_PAYMENT_VALUE, "span") + ")",
								"Tell Pix that you'd like to pay for a single entry to the gym. This will cost "+UtilText.formatAsMoney(SINGLE_PAYMENT_VALUE, "b")+".", GYM_SINGLE_PAYMENT){
						@Override
						public void effects(){
							Main.game.getPlayer().incrementMoney(-SINGLE_PAYMENT_VALUE);
						}
					};

				} else if (index == 2) {
					if (Main.game.getPlayer().getMoney() < MEMBERSHIP_VALUE)
						return new Response("Membership (" + UtilText.formatAsMoneyUncoloured(MEMBERSHIP_VALUE, "span") + ")", "You don't have enough money!", null);
					else
						return new Response("Membership ("+ UtilText.formatAsMoney(MEMBERSHIP_VALUE, "span") +")",
								"Tell Pix that you'd like to sign up for the lifetime membership option. This will cost "+UtilText.formatAsMoney(MEMBERSHIP_VALUE, "b")+".",
								GYM_LIFETIME_PAYMENT){
						@Override
						public void effects(){
							Main.game.getPlayer().incrementMoney(-MEMBERSHIP_VALUE);
							Main.game.getDialogueFlags().values.add(DialogueFlagValue.gymIsMember);
						}
					};

				} else if (index == 0) {
					return new Response("Leave", "Tell Pix that you'll think about it and be back later.", GYM_EXTERIOR);

				} else {
					return null;
				}

			} else {
				if (index == 1) {
					return new Response("Enter", "Enter the gym and get changed.", GYM_MEMBER_ENTER);

				} else if (index == 0) {
					return new Response("Leave", "Tell Pix that you've changed your mind, and that you'll be back another time.", GYM_EXTERIOR);

				} else {
					return null;
				}
			}
		}

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_RETURNING = new DialogueNode("Pix's Playground", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_RETURNING"));
			if(Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymIsMember)) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_RETURNING_MEMBER"));
			} else {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_RETURNING_NOT_MEMBER"));
			}

			return UtilText.nodeContentSB.toString();
		}

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

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_SINGLE_PAYMENT = new DialogueNode("Pix's Playground", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_SINGLE_PAYMENT");
		}

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

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_LIFETIME_PAYMENT = new DialogueNode("Pix's Playground", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_LIFETIME_PAYMENT");
		}

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

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_MEMBER_ENTER = new DialogueNode("Pix's Playground", "-", true) {

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_MEMBER_ENTER");
		}

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

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_CARDIO = new DialogueNode("Pix's Playground", "-", true) {

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

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_CARDIO"));

			if(Main.game.getPlayer().getHealthPercentage() < 0.4f) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_EXHAUSTED"));
			} else {
				if(Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymIsMember)) {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_POST_WORKOUT_MEMBER"));
				} else {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_POST_WORKOUT"));
				}
			}

			return UtilText.nodeContentSB.toString();
		}

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

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_WEIGHTS = new DialogueNode("Pix's Playground", "-", true) {

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

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_WEIGHTS"));

			if(Main.game.getPlayer().getHealthPercentage() < 0.4f) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_EXHAUSTED"));
			} else {
				if(Main.game.getDialogueFlags().values.contains(DialogueFlagValue.gymIsMember)) {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_POST_WORKOUT_MEMBER"));
				} else {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_POST_WORKOUT"));
				}
			}

			return UtilText.nodeContentSB.toString();
		}

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

		@Override
		public boolean isRegenerationDisabled() {
			return true;
		}
	};
	public static final DialogueNode GYM_PIX_TRAINING = new DialogueNode("Pix's Playground", "-", true) {

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_TRAINING");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Full effort", "Put all of your effort into the weights routine.", GYM_PIX_TRAINING_CARDIO){
					@Override
					public void effects(){
						Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.4f);
						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Deciding that it'd be best to give Pix one hundred percent of your effort, you fully commit to the exercise."
									+ " Following Pix's instructions, you work your way through several more sets of weights, and by the time you're done, you're left panting and feeling thoroughly worn out."
								+ "
"
								+ "
"
									+ "The routine isn't over just yet, however, and, once you're done with the weights, Pix leads you over towards the cardio section."
								+ "
"
								+ "
[style.boldGood(+6)] Muscle Definition
"
								+Main.game.getPlayer().incrementMuscle(6));
						Main.game.getTextEndStringBuilder().append(
								"
[style.boldBad(-4)] Body Size
"
								+Main.game.getPlayer().incrementBodySize(-4));
					}
				};

			} else if (index == 2) {
				return new Response("Hold back", "Hold back and conserve your energy...", GYM_PIX_TRAINING_CARDIO){
					@Override
					public void effects(){
						Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.15f);
						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Not wanting to exhaust yourself, you decide to hold back a little."
									+ " Following Pix's instructions, you work your way through several more sets of weights, but,"
										+ " while still maintaining the impression that you're putting one-hundred percent of your effort into it, you don't fully commit yourself to the exercise."
								+ "
"
								+ "
"
									+ "Pix doesn't seem to pick up on the fact that you're holding back, and, once you're done with the weights, she leads you over towards the cardio section."
								+ "
"
								+ "
[style.boldGood(+2)] Muscle Definition
"
								+Main.game.getPlayer().incrementMuscle(2));
						Main.game.getTextEndStringBuilder().append(
								"
[style.boldBad(-4)] Body Size
"
								+Main.game.getPlayer().incrementBodySize(-4));
					}
				};

			} else {
				return null;
			}
		}

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

	public static final DialogueNode GYM_PIX_TRAINING_CARDIO = new DialogueNode("Pix's Playground", "-", true, true) {

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_TRAINING_CARDIO");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Steady run", "Set the running machine's speed to a steady pace.", GYM_PIX_TRAINING_FINISH){
					@Override
					public void effects(){
						Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.4f);
						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Wanting to show Pix what you can do, you decide to set the machine for a steady run."
									+ " Pix lets out an impressed hum as she sees what speed you're setting the machine to,"
									+ " [pix.speech(Mmm... You're eager to show off for me, aren't ya?)]"
								+ "
"
								+ "
[style.boldBad(-6)] Body Size
"
								+Main.game.getPlayer().incrementBodySize(-6));
					}
				};

			} else if (index == 2) {
				return new Response("Slow jog", "Set the running machine's speed to a slow jog in order to conserve energy.", GYM_PIX_TRAINING_FINISH){
					@Override
					public void effects(){
						Main.game.getPlayer().incrementHealth(-Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM) * 0.15f);
						Main.game.getTextStartStringBuilder().append(
								"
"
									+ "Unwilling to completely exhaust yourself on the running machine, you decide to settle for a slow jog."
									+ " Pix lets out a mildly annoyed huff as she sees what speed you're setting the machine to,"
									+ " [pix.speech(Huh... You're more exhausted than I thought! You're gonna need to get fitter, aren't ya?)]"
								+ "
"
								+ "
[style.boldBad(-2)] Body Size
"
								+Main.game.getPlayer().incrementBodySize(-2));
					}
				};

			} else {
				return null;
			}
		}

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

	public static final DialogueNode GYM_PIX_TRAINING_FINISH = new DialogueNode("Pix's Playground", "-", true, true) {

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_TRAINING_FINISH");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				if(Main.getProperties().hasValue(PropertyValue.nonConContent)) {
					return new Response("Pix's reward",
							"You have a good idea of what Pix means when she says she wants to give you a 'one-to-one cooldown exercise'...",
							GYM_PIX_ASSAULT) {
						@Override
						public void effects() {
							Main.game.getPlayer().cleanAllDirtySlots();
							Main.game.getNpc(Pix.class).cleanAllDirtySlots();
						}
					};
				} else {
					return new Response("Pix's reward",
							"You have a good idea of what Pix means when she says she wants to give you a 'one-to-one cooldown exercise'...",
							GYM_PIX_ASSAULT_CONSENSUAL) {
						@Override
						public void effects() {
							Main.game.getPlayer().cleanAllDirtySlots();
							Main.game.getNpc(Pix.class).cleanAllDirtySlots();
						}
					};
				}

			} else if (index == 2) {
				return new Response("Leave", "You're far too tired to deal with Pix right now. Get changed and leave the gym, avoiding Pix in the showers as you do so.", GYM_EXTERIOR);

			} else {
				return null;
			}
		}

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

	public static final DialogueNode GYM_PIX_ASSAULT = new DialogueNode("Pix's Playground", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT"));

			if(Main.game.getPlayer().getHealthPercentage() < 0.4f) {
				UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_EXHAUSTED"));
			} else {
				if(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE)<Main.game.getNpc(Pix.class).getAttributeValue(Attribute.MAJOR_PHYSIQUE)) {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_WEAKER"));
				} else {
					UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_STRONGER"));
				}
			}

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				return new ResponseSex("Too tired",
						"Tell Pix that you're far too tired to do any more physical exercise right now.",
						false, false,
						new SMPixShowerTime(
								Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Pix.class), SexSlotUnique.FACE_TO_WALL_FACING_TARGET_SHOWER_PIX)),
								Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotUnique.FACE_TO_WALL_AGAINST_WALL_SHOWER_PIX))),
						null,
						null, PIX_POST_SEX, UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_TOO_TIRED"));

			} else if(index==2) {
				return new ResponseSex("Offer sex",
						"Tell Pix that you can make it up to her right now...",
						false, false,
						new SMPixShowerTime(
								Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Pix.class), SexSlotUnique.FACE_TO_WALL_FACING_TARGET_SHOWER_PIX)),
								Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotUnique.FACE_TO_WALL_AGAINST_WALL_SHOWER_PIX))),
						null,
						null, PIX_POST_SEX, UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_OFFER_SEX"));

			} else if(index==3) {
				return new ResponseSex("Accept punishment",
						"Apologise to Pix and accept her punishment.",
						false, false,
						new SMPixShowerTime(
								Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Pix.class), SexSlotUnique.FACE_TO_WALL_FACING_TARGET_SHOWER_PIX)),
								Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotUnique.FACE_TO_WALL_AGAINST_WALL_SHOWER_PIX))),
						null,
						null, PIX_POST_SEX, UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_ACCEPT_PUNISHMENT"));

			} else if(index==4) {
				if(Main.game.getPlayer().getHealthPercentage()<0.4f) {
					return new Response("Break free",
							"You simply don't have enough energy left to try and break free! You need at least 40% "+Attribute.HEALTH_MAXIMUM.getName()+" for this ("+(Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM)*0.4)+")",
							null);

				} else {
					return new Response("Break free",
							"Use the energy that you've saved by holding back during your exercise to break free from Pix.",
							PIX_BREAK_FREE);
				}

			} else if(index==5) {
				if(Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE)<Main.game.getNpc(Pix.class).getAttributeValue(Attribute.MAJOR_PHYSIQUE)) {
					return new Response("Turn Tables",
							"Pix is both stronger and fitter than you (her physique of "+Main.game.getNpc(Pix.class).getAttributeValue(Attribute.MAJOR_PHYSIQUE)+" is greater than your physique of "
									+Main.game.getPlayer().getAttributeValue(Attribute.MAJOR_PHYSIQUE)+"), so you don't stand a chance of turning the tables on her in this situation.",
							null);

				} else if(Main.game.getPlayer().getHealthPercentage()<0.4f) {
					return new Response("Turn Tables",
							"You simply don't have enough energy left to try and turn the tables on Pix! You need at least 40% "+Attribute.HEALTH_MAXIMUM.getName()+" for this ("+(Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM)*0.4)+")",
							null);

				} else {
					return new ResponseSex("Turn Tables",
							"Use the energy that you've saved by holding back during your exercise to break free from Pix, and then turn the tables on her...",
							false, false,
							new SMAgainstWall(
									Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotAgainstWall.STANDING_WALL)),
									Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Pix.class), SexSlotAgainstWall.FACE_TO_WALL))) {
								@Override
								public boolean isCharacterStartNaked(GameCharacter character) {
									return true;
								}
								@Override
								public List<AbstractSexPosition> getAllowedSexPositions() {
									return Util.newArrayListOfValues(
											SexPosition.AGAINST_WALL);
								}
							},
							null,
							null, PIX_POST_SEX_TABLES_TURNED, UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_TURN_TABLES"));
				}

			} else {
				return null;
			}
		}
	};

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "PIX_BREAK_FREE");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Exit gym", "Leave the gym and carry on your way.", GYM_EXTERIOR);
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode PIX_POST_SEX_TABLES_TURNED = new DialogueNode("Changing Rooms", "Carry Pix out to the changing rooms.", true) {

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "PIX_POST_SEX_TABLES_TURNED");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Exit gym", "Leave the gym and carry on your way.", GYM_EXTERIOR);
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode PIX_POST_SEX = new DialogueNode("Pix dresses you", "You're too tired to complain as Pix starts dressing you.", true) {

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "PIX_POST_SEX");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Exit gym", "Leave the gym and carry on your way.", GYM_EXTERIOR);
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode GYM_PIX_ASSAULT_CONSENSUAL = new DialogueNode("Pix's Playground", "-", true) {

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

			UtilText.nodeContentSB.append(UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_CONSENSUAL"));

			return UtilText.nodeContentSB.toString();
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if(index==1) {
				return new ResponseSex("Accept",
						"Let Pix have her fun with you.",
						true, false,
						new SMPixShowerTime(
								Util.newHashMapOfValues(new Value<>(Main.game.getNpc(Pix.class), SexSlotUnique.FACE_TO_WALL_FACING_TARGET_SHOWER_PIX)),
								Util.newHashMapOfValues(new Value<>(Main.game.getPlayer(), SexSlotUnique.FACE_TO_WALL_AGAINST_WALL_SHOWER_PIX))),
						null,
						null, PIX_POST_SEX_CONSENSUAL, UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_CONSENSUAL_START"));

			} else if(index==2) {
				return new Response("Decline",
						"Tell Pix that you're too tired for this right now.",
						GYM_PIX_ASSAULT_CONSENSUAL_DECLINED);

			} else {
				return null;
			}
		}
	};

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "GYM_PIX_ASSAULT_CONSENSUAL_DECLINED");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Exit gym", "Leave the gym and carry on your way.", GYM_EXTERIOR);
			} else {
				return null;
			}
		}
	};

	public static final DialogueNode PIX_POST_SEX_CONSENSUAL = new DialogueNode("Pix dresses you", "Pix helps you to get dressed.", true) {

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

		@Override
		public String getContent() {
			return UtilText.parseFromXMLFile("places/dominion/shoppingArcade/pixsPlayground", "PIX_POST_SEX_CONSENSUAL");
		}

		@Override
		public Response getResponse(int responseTab, int index) {
			if (index == 1) {
				return new Response("Exit gym", "Leave the gym and carry on your way.", GYM_EXTERIOR);
			} else {
				return null;
			}
		}
	};
}