code:
package com.lilithsthrone.game.character.quests;

import java.time.LocalDateTime;
import java.time.LocalTime;

import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Units;

/**
 * @since 0.1.0
 * @version 0.3.4
 * @author Innoxia
 */
public enum Quest {

	// Main quests:

	MAIN_PROLOGUE(QuestType.MAIN, 1, 5) {
		@Override
		public String getName() {
			return "Survive the evening";
		}

		@Override
		public String getDescription() {
			return "You promised your aunt Lily that you'd attend the opening of her museum's new exhibit. You need to survive the boredom of the evening ahead.";
		}

		@Override
		public String getCompletedDescription() {
			return "Your evening at the museum turned out to be far more eventful than you'd have liked."
					+ " A mysterious demon named Lilith tricked you into being pulled through a magical portal and into a parallel universe."
					+ " After waking up in the middle of an unfamiliar street, you were saved from a dire situation by the half-demon 'Lilaya'."
					+ " She seems to be this universe's version of your aunt Lily, and, in return for agreeing to help her with her experiments, she's allowed you to stay at her home.";
		}
	},

	MAIN_1_A_LILAYAS_TESTS(QuestType.MAIN, 1, 10) {
		@Override
		public String getName() {
			return "Lilaya's tests";
		}

		@Override
		public String getDescription() {
			return "You can find Lilaya in her lab at any time, where she'll be ready to continue running her tests on you. Maybe she can find a way to send you back home?";
		}

		@Override
		public String getCompletedDescription() {
			return "Lilaya ran some more tests on you, but she's unable to progress with her research without the help of her old colleague, Arthur.";
		}
	},

	MAIN_1_B_DEMON_HOME(QuestType.MAIN, 1, 10) {
		@Override
		public String getName() {
			return "The search for Arthur; Demon Home";
		}

		@Override
		public String getDescription() {
			return "Lilaya has informed you that her old colleague, Arthur, would know more about the type of magic used in the portal."
					+ " However, she seems to have an intense dislike of him, and you've ended up being tasked to go and get him to apologise to Lilaya before she'll allow him to" + " come and work with her."
					+ " Arthur lives in a district of the city called 'Demon Home', so you can find him there.";
		}

		@Override
		public String getCompletedDescription() {
			return "When you arrived at Arthur's home, you found that Dominion's Enforcers had arrested him on suspicion of plotting against Lilith." + " After his arrest, he was taken to the Enforcer's HQ.";
		}
	},

	MAIN_1_C_WOLFS_DEN(QuestType.MAIN, 3, 20) {
		@Override
		public String getName() {
			return "The search for Arthur; The Wolf's Den";
		}

		@Override
		public String getDescription() {
			return "Arthur has been arrested by Dominion's Enforcers, and has been taken to the Enforcer's HQ." + " It looks like you'll have to inquire further there and find out a way to save Arthur.";
		}

		@Override
		public String getCompletedDescription() {
			return "You were forced into a fight with the Enforcer's Chief, Brax." + " Thankfully, you were able to beat him, but you then found out that Arthur has been sold into slavery!";
		}
	},

	MAIN_1_D_SLAVERY(QuestType.MAIN, 3, 10) {
		@Override
		public String getName() {
			return "The search for Arthur; Sold into Slavery";
		}

		@Override
		public String getDescription() {
			return "After defeating Brax, you found out that Arthur was sold into slavery to a trader called Scarlett."
					+ " You'll have to travel to Slaver Alley, find Scarlett, and find a way to free Arthur.";
		}

		@Override
		public String getCompletedDescription() {
			return "You found the harpy Scarlett in Slaver Alley, who turned out to be one of the most annoying people you've ever met.";
		}
	},

	MAIN_1_E_REPORT_TO_ALEXA(QuestType.MAIN, 3, 30) {
		@Override
		public String getName() {
			return "The search for Arthur; Find Alexa";
		}

		@Override
		public String getDescription() {
			return "After finding Scarlett in Slaver Alley, you discovered that she's no longer in possession of Arthur."
					+ " Before she'll tell you anything about it, she wants you to go the Harpy Nests and report to her matriarch, Alexa, that her business is a complete failure";
		}

		@Override
		public String getCompletedDescription() {
			return "You reported Scarlett's problems to her matriarch, Alexa."
					+ " She didn't seem to have much sympathy for Scarlett, and quickly flew off to go and talk to her in person.";
		}
	},

	MAIN_1_F_SCARLETTS_FATE(QuestType.MAIN, 3, 30) {
		@Override
		public String getName() {
			return "The search for Arthur; Scarlett's fate";
		}

		@Override
		public String getDescription() {
			return "You need to travel back to Scarlett's shop to find out what's become of her. Hopefully Alexa wasn't too hard on her, and she'll be willing to tell you what happened to Arthur now...";
		}

		@Override
		public String getCompletedDescription() {
			return "You travelled back to Scarlett's shop, only to discover that Alexa has enslaved her!";
		}
	},

	MAIN_1_G_SLAVERY(QuestType.MAIN, 3, 30) {
		@Override
		public String getName() {
			return "The search for Arthur; Slavery";
		}

		@Override
		public String getDescription() {
			return "Alexa is willing to sell Scarlett to you, which seems to be the only way you'll get the information you need."
					+ " You'll need to have a slaver license in order to buy Scarlett.";
		}

		@Override
		public String getCompletedDescription() {
			return "Alexa sold Scarlett to you, which allowed you to order Scarlett to tell you what happened to Arthur.";
		}
	},

	MAIN_1_H_THE_GREAT_ESCAPE(QuestType.MAIN, 10, 200) {
		@Override
		public String getName() {
			return "The search for Arthur; The Great Escape";
		}

		@Override
		public String getDescription() {
			return "It turns out that Arthur was sold to an extremely dangerous demon called Zaranix, who lives in Demon Home."
					+ " You'll need to travel to demon home and rescue Arthur!";
		}

		@Override
		public String getCompletedDescription() {
			return "After defeating Zaranix, you saved Arthur and brought him back to Lilaya's home.";
		}
	},

	MAIN_1_I_ARTHURS_TALE(QuestType.MAIN, 1, 30) {
		@Override
		public String getName() {
			return "The search for Arthur; Conclusion";
		}

		@Override
		public String getDescription() {
			return "Now that you've rescued Arthur from the clutches of Zaranix, you should travel back to Lilaya's home and get the full story of what happened from him.";
		}

		@Override
		public String getCompletedDescription() {
			return "Arthur explained how he was dabbling in the forbidden art of teleportation spells."
					+ " Through one of his agents, Zaranix found out about this, and had no difficulty in getting Arthur enslaved for treason."
					+ " Now that you've rescued him, he's keen to repay the favour by finding out how to send you back home.";
		}
	},

	MAIN_1_J_ARTHURS_ROOM(QuestType.MAIN, 1, 30) {
		@Override
		public String getName() {
			return "The search for Arthur; A room of his own";
		}

		@Override
		public String getDescription() {
			return "Lilaya really doesn't want Arthur in her lab, and has tasked you to help Rose find a suitable room for him to stay in.
"
					+ "Go into one of the empty rooms in Lilaya's House, and through the room management window, upgrade it to 'Arthur's Room'.";
		}

		@Override
		public String getCompletedDescription() {
			return "You located a suitable room for Arthur, and, with Rose's help, moved a significant amount of arcane instrumentation into his new lab-cum-bedroom.";
		}
	},

	MAIN_2_A_INTO_THE_DEPTHS(QuestType.MAIN, 1, 10) {
		@Override
		public String getName() {
			return "Into Submission";
		}

		@Override
		public String getDescription() {
			return "Arthur was able to explain the mechanism by which you were transported into this new world, but he seemed to hold back on some of the details."
					+ " He said that he'd explain everything fully once he knew for certain what was going on, but in order for that to happen, he'll need to talk to one of the seven elder Lilin."
					+ " After much arguing, Lilaya agreed to convince her mother to help, but you'll have to be the one to deliver the message.
"
					+ "Travel down into the undercity of Submission and seek an audience with Lilaya's mother, Lyssieth.";
		}

		@Override
		public String getCompletedDescription() {
			return "Acting on Arthur's advice, you ventured down into Submission and discovered the location of Lyssieth's palace.";
		}
	},

	MAIN_2_B_SIRENS_CALL(QuestType.MAIN, 25, 300) {
		@Override
		public String getName() {
			return "The Siren's Call";
		}

		@Override
		public String getDescription() {
			return "The guards at the gate to Lyssieth's palace told you that she's not receiving any visitors at the moment."
					+ " The only way to gain an audience with her would be to take care of her troublesome daughter; 'The Dark Siren'."
					+ " She's currently living in a stone fortress in one of the central tunnels here in Submission, from which she sends out gangs of imps to terrorise innocent citizens.
"
					+ "If you're able to enslave her, either through combat or trickery, you'll have earned an audience with Lyssieth.";
		}

		@Override
		public String getCompletedDescription() {
			return "You managed to enslave Lyssieth's troublesome daughter, and so earned an audience with her!";
		}
	},

	MAIN_2_C_SIRENS_FALL(QuestType.MAIN, 1, 10) {
		@Override
		public String getName() {
			return "The Siren's Fall";
		}

		@Override
		public String getDescription() {
			return "Return to Lyssieth's palace and report to the guards that you've enslaved 'The Dark Siren'."
					+ " This should be enough to grant you an audience with Lyssieth.";
		}

		@Override
		public String getCompletedDescription() {
			return "For enslaving 'The Dark Siren', the guards at the gate to Lyssieth's palace gave you permission to enter and seek out an audience with her.";
		}
	},

	MAIN_2_D_MEETING_A_LILIN(QuestType.MAIN, 1, 100) {
		@Override
		public String getName() {
			return "Meeting A Lilin";
		}

		@Override
		public String getDescription() {
			return "Travel to Lyssieth's throne room and try to finally get some answers about why you're here and how you can return to your old world.";
		}

		@Override
		public String getCompletedDescription() {
			return "Lyssieth revealed that this world is in fact your own, and that Lilith transformed it into a different reality when she was released from the mirror.";
		}
	},

	MAIN_3_A_FINDING_THE_YOUKO(QuestType.MAIN, 20, 250) {
		@Override
		public String getName() {
			return "Finding the youko";
		}

		@Override
		public String getDescription() {
			return "[style.italicsMinorBad(This is where the main quest currently ends, but more main quest content will be coming in v0.3.7!)]
"//TODO
					+ "[siren.Name] told you that you're going to need the help of the youko if you're to defeat the elder lilin pegataur, Lunette."
					+ " She said that you should find and enlist the help of her old friend, [youkoGuide.name], who worked in her lab back when she was living in her citadel."
					+ " [youkoGuide.Name] will have returned to the town of Elis, which is the settlement nearest to the Shinrin Forest, the youko's homeland.";
		}

		@Override
		public String getCompletedDescription() {
			return "You travelled to Elis, where you found the youko, [youkoGuide.name], in an inn called 'The Ninth Tail'."
					+ " It turned out that she was having to work off a significant debt, and wouldn't be able to help you until it's paid off in full.";
		}
	},

	MAIN_3_B_DEBTS_PAID(QuestType.MAIN, 1, 100) {
		@Override
		public String getName() {
			return "Debts paid";
		}

		@Override
		public String getDescription() {
			return "You need to help [youkoGuide.name] clear her debt, and in exchange she's promised to show you where the leader of all the youko lives.";
		}

		@Override
		public String getCompletedDescription() {
			return "You helped [youkoGuide.name] clear her debt, and, as agreed, she is ready and willing to take you to the youko leader's hideout.";
		}
	},

	// Side Quests:

	SIDE_UTIL_COMPLETE(QuestType.SIDE, 1, 0) {
		@Override
		public String getName() {
			return "Quest Complete!";
		}

		@Override
		public String getDescription() {
			return "Quest complete!";
		}

		@Override
		public String getCompletedDescription() {
			return "Quest complete!";
		}
	},

	SIDE_DISCOVER_ALL_ITEMS(QuestType.SIDE, 1, 100) {
		@Override
		public String getName() {
			return "Completionist";
		}

		@Override
		public String getDescription() {
			return "There are a lot of curious items in this new world. You wonder if you can find them all...";
		}

		@Override
		public String getCompletedDescription() {
			return "You have discovered every item there is to find!";
		}
	},

	SIDE_DISCOVER_ALL_RACES(QuestType.SIDE, 1, 100) {
		@Override
		public String getName() {
			return "Completionist";
		}

		@Override
		public String getDescription() {
			return "There seem to be a lot of strange new races in this world. You wonder if you can discover them all...";
		}

		@Override
		public String getCompletedDescription() {
			return "You have discovered every race there is to find!.";
		}
	},

	// For when you discover your first essence:

	SIDE_ENCHANTMENTS_LILAYA_HELP(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Ask Lilaya for help";
		}

		@Override
		public String getDescription() {
			return "You recently felt a strange force entering your body, and although it doesn't seem to have had any obvious effect, you should probably have it checked out."
					+ " Lilaya is sure to know more, so perhaps you should go and talk to her about it.";
		}

		@Override
		public String getCompletedDescription() {
			return "Lilaya informed you that you're able to collect 'essences' from other people's arcane aura."
					+ " She seemed a little worried that you're able to do this, as apparently it's normally only Lilin who are able to gather essences in this fashion...";
		}
	},

	// For the first time you get pregnant:

	SIDE_PREGNANCY_CONSULT_LILAYA(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Lilaya knows best";
		}

		@Override
		public String getDescription() {
			return "You're pregnant... Oh crap, you're pregnant! Surely Lilaya will know what to do!";
		}

		@Override
		public String getCompletedDescription() {
			return "Lilaya managed to calm you down, and reassured you that pregnancy in this world isn't as big a deal as it was back home.";
		}
	},
	SIDE_PREGNANCY_LILAYA_THE_MIDWIFE(QuestType.SIDE, 1, 20) {
		@Override
		public String getName() {
			return "Lilaya the midwife";
		}

		@Override
		public String getDescription() {
			return "Lilaya said that she'd be able to help you give birth whenever you're ready. You're going to need to wait until your belly has finished growing, then you can go and see Lilaya to give birth.";
		}

		@Override
		public String getCompletedDescription() {
			return "Lilaya helped you give birth. She said that if ever you get pregnant again, she can always help out.";
		}
	},

	// Getting a Slaver License:

	SIDE_SLAVER_NEED_RECOMMENDATION(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Letter of recommendation";
		}

		@Override
		public String getDescription() {
			return "After asking how to obtain a Slaver License at the Slavery Administration building, you discovered that you'll need a letter of recommendation first. Lilaya should be able to help with that.";
		}

		@Override
		public String getCompletedDescription() {
			return "Lilaya gave you a letter of recommendation, and what's more, she also offered to let you house your slaves in her mansion.";
		}
	},
	SIDE_SLAVER_RECOMMENDATION_OBTAINED(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Present letter";
		}

		@Override
		public String getDescription() {
			return "Now that you've obtained a letter of recommendation from Lilaya, you should go back to the Slavery Administration building in Slaver Alley and present it to [finch.name].";
		}

		@Override
		public String getCompletedDescription() {
			return "You presented the letter of recommendation to [finch.name], and, after paying the 500 flame fee, you obtained a slaver license!";
		}
	},

	// Accommodation:

	SIDE_ACCOMMODATION_NEED_LILAYAS_PERMISSION(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Lilaya the Landlady";
		}

		@Override
		public String getDescription() {
			return "After getting to know one of the residents of Dominion's alleyways, you'd like to offer them a real home. Lilaya's mansion is full of empty rooms, so you should ask her if you could use one to house your new friend.";
		}

		@Override
		public String getCompletedDescription() {
			return "Lilaya gave you permission to use the empty rooms to house your friends and family, on the condition that you pay for the expenses that are incurred.";
		}
	},

	// Other:

	SIDE_HYPNO_WATCH_VICKY(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Order at Arcane Arts";
		}

		@Override
		public String getDescription() {
			return "Arthur informed you that he was instructed by Zaranix to find an arcane method of changing a person's sexual orientation."
					+ " While he reassured you that he had no intention of ever using such an item himself, Arthur did express an interest in completing his research,"
						+ " and asked you to fetch a special order from the store 'Arcane Arts' in the Shopping Arcade.";
		}

		@Override
		public String getCompletedDescription() {
			return "You retrieved the package from Arcane Arts, and brought it back to Arthur.";
		}
	},

	SIDE_HYPNO_WATCH_TEST_SUBJECT(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Test subject";
		}

		@Override
		public String getDescription() {
			return "After Lilaya followed Arthur's instructions to enchant the watch, she asked if it would be possible to test it on you...";
//					+ " You could either offer yourself, or, if you own any slaves, offer one of those to Arthur instead.";
		}

		@Override
		public String getCompletedDescription() {
			return "The Hypno-Watch appeared to work, although Lilaya stopped the test before it had a permanent effect."
					+ " She warned that it will have a strong corruptive effect upon the mind of the whoever is targeted, and disenchanted it for good measure, before handing it over to you.";
		}
	},

	RELATIONSHIP_NYAN_STOCK_ISSUES(QuestType.RELATIONSHIP, 1, 0) {
		@Override
		public String getName() {
			return "Offer Nyan your help";
		}

		@Override
		public String getDescription() {
			return "Nyan explained that she's unable to sell any enchanted clothing due to the fact that her suppliers don't offer any."
					+ " Apparently, these suppliers have used force to drive all of their rivals out of the area, so she has no alternative but to use them...
"
					+ "Perhaps you could offer to convince these new suppliers to let the old ones back?";
		}

		@Override
		public String getCompletedDescription() {
			return "You offered Nyan your help in convincing the new suppliers to let the old ones back.";
		}
	},

	RELATIONSHIP_NYAN_STOCK_ISSUES_AGREED_TO_HELP(QuestType.RELATIONSHIP, 10, 50) {
		@Override
		public String getName() {
			return "Confront the suppliers";
		}

		@Override
		public String getDescription() {
			return "Nyan explained that the suppliers still work out of the supply depot here in the Shopping Arcane."
					+ " From all that Nyan's told you about these new suppliers, you should be prepared for a tough fight if you decide to go and talk to them...";
		}

		@Override
		public String getCompletedDescription() {
			return "You put an end to the dobermanns' monopoly, and although they'll continue to work as clothing suppliers, they'll stop intimidating the others.";
		}
	},

	RELATIONSHIP_NYAN_STOCK_ISSUES_SUPPLIERS_BEATEN(QuestType.RELATIONSHIP, 10, 100) {
		@Override
		public String getName() {
			return "Reward";
		}

		@Override
		public String getDescription() {
			return "You should return to Nyan and get the reward she promised you.";
		}

		@Override
		public String getCompletedDescription() {
			return "Nyan paid you the reward she promised, and also offered to give you a 25% discount in her store. She also let slip that she's single, in a clumsy attempt to hit on you...";
		}
	},

	// Angry Harpies:

	HARPY_PACIFICATION_ONE(QuestType.SIDE, 6, 25) {
		@Override
		public String getName() {
			return "Nests in chaos";
		}

		@Override
		public String getDescription() {
			return "The Enforcer informed you that the Harpy Nests are extremely dangerous at the moment."
					+ " Upon further questioning, you discovered that there's a hefty reward for the person who's able to calm the three main matriarchs down.";
		}

		@Override
		public String getCompletedDescription() {
			return "You've managed to assume control of one of the harpy nests!";
		}
	},
	HARPY_PACIFICATION_TWO(QuestType.SIDE, 6, 25) {
		@Override
		public String getName() {
			return "One down, two to go";
		}

		@Override
		public String getDescription() {
			return "You've managed to reign in one of the matriarchs, but there are still two more to go!";
		}

		@Override
		public String getCompletedDescription() {
			return "You've managed to assume control of two of the harpy nests!";
		}
	},
	HARPY_PACIFICATION_THREE(QuestType.SIDE, 6, 25) {
		@Override
		public String getName() {
			return "One matriarch left";
		}

		@Override
		public String getDescription() {
			return "You've managed to reign in two of the matriarchs, but there's still one more to go!";
		}

		@Override
		public String getCompletedDescription() {
			return "You've managed to assume control of all three of the major harpy nests!";
		}
	},
	HARPY_PACIFICATION_REWARD(QuestType.SIDE, 6, 50) {
		@Override
		public String getName() {
			return "Harpy "+(Main.game.getPlayer().isFeminine()?"queen":"king");
		}

		@Override
		public String getDescription() {
			return "Return to the Enforcer post to report your success.";
		}

		@Override
		public String getCompletedDescription() {
			return "After informing the Enforcers that you've pacified all three of the major harpy nests, they resumed their regular patrols, resulting in the Harpy Nests being safe to travel through!";
		}
	},

	// Slime Queen:

	SLIME_QUEEN_ONE(QuestType.SIDE, 10, 25) {
		@Override
		public String getName() {
			return "Troublesome Slimes";
		}

		@Override
		public String getDescription() {
			return "When you first arrived in Submission, an Enforcer informed you of an ongoing situation in the tunnels."
					+ " Apparently, there are an increasing number of Slimes who are attacking innocent travellers and transforming them into more Slimes."
					+ " If you're able to offer any information on where these aggressive Slimes are coming from, you could earn a one-thousand flame reward.";
		}

		@Override
		public String getCompletedDescription() {
			return "One of the Slimes that you encountered in the tunnels told you that they'd been given orders to transform people by a certain 'Slime Queen'.";
		}
	},

	SLIME_QUEEN_TWO(QuestType.SIDE, 1, 10) {
		@Override
		public String getName() {
			return "Report Back";
		}

		@Override
		public String getDescription() {
			return "You should report back to one of Submission's Enforcer Posts with this information regarding a 'Slime Queen'.";
		}

		@Override
		public String getCompletedDescription() {
			return "The Enforcer that you reported to told you that they'd heard rumours of a Slime Queen before, but no trace of any such thing has ever been found in Submission."
					+ " They suggested that you could take a look down in the Bat Caverns, and offered you a further twenty-thousand flames if you could find this Queen and put an end to her scheming.";
		}
	},

	SLIME_QUEEN_THREE(QuestType.SIDE, 15, 25) {
		@Override
		public String getName() {
			return "Finding the Slime Queen";
		}

		@Override
		public String getDescription() {
			return "Travel down into the Bat Caverns and search for the rumoured Slime Queen.";
		}

		@Override
		public String getCompletedDescription() {
			return "In the middle of Slime Lake, you discovered the Slime Queen's lair!";
		}
	},

	SLIME_QUEEN_FOUR(QuestType.SIDE, 20, 50) {
		@Override
		public String getName() {
			return "Confront the Queen";
		}

		@Override
		public String getDescription() {
			return "Travel up the tower and find the Slime Queen.";
		}

		@Override
		public String getCompletedDescription() {
			return "You found the Slime Queen at the top of the tower.";
		}
	},

	SLIME_QUEEN_FIVE_SUBMIT(QuestType.SIDE, 1, 25) {
		@Override
		public String getName() {
			return "Help the Queen";
		}

		@Override
		public String getDescription() {
			return "You decided to help the Slime Queen with her plans of transforming Submission's population into slimes.";
		}

		@Override
		public String getCompletedDescription() {
			return "You decided to help the Slime Queen with her plans, and agreed to trick the Enforcers into believing that she's no longer a threat!";
		}
	},

	SLIME_QUEEN_SIX_SUBMIT(QuestType.SIDE, 1, 200) {
		@Override
		public String getName() {
			return "Final Report";
		}

		@Override
		public String getDescription() {
			return "Report back to Claire and tell her that the Slime Queen will no longer be a problem.";
		}

		@Override
		public String getCompletedDescription() {
			return "You told Claire that the Slime Queen is no longer a threat, and received the twenty-thousand flame reward."
				+ " With your Queen now safe from Enforcer investigation, it's only a matter of time before all of Submission is a Slime paradise!";
		}
	},

	SLIME_QUEEN_FIVE_CONVINCE(QuestType.SIDE, 1, 25) {
		@Override
		public String getName() {
			return "Convince the Queen";
		}

		@Override
		public String getDescription() {
			return "You decide to convince the Slime Queen to abandon her plans.";
		}

		@Override
		public String getCompletedDescription() {
			return "You convinced Catherine to abandon her plan of transforming everyone in Submission into slimes.";
		}
	},

	SLIME_QUEEN_SIX_CONVINCE(QuestType.SIDE, 1, 200) {
		@Override
		public String getName() {
			return "Final Report";
		}

		@Override
		public String getDescription() {
			return "Report back to Claire and tell her that the Slime Queen will no longer be a problem.";
		}

		@Override
		public String getCompletedDescription() {
			return "You told Claire that the Slime Queen is no longer a threat, and received the twenty-thousand flame reward.";
		}
	},

	SLIME_QUEEN_FIVE_FORCE(QuestType.SIDE, 1, 25) {
		@Override
		public String getName() {
			return "Force the Queen";
		}

		@Override
		public String getDescription() {
			return "Force the Slime Queen to abandon her plans.";
		}

		@Override
		public String getCompletedDescription() {
			return "You forced Catherine to abandon her plan of transforming everyone in Submission into slimes.";
		}
	},

	SLIME_QUEEN_SIX_FORCE(QuestType.SIDE, 1, 200) {
		@Override
		public String getName() {
			return "Final Report";
		}

		@Override
		public String getDescription() {
			return "Report back to Claire and tell her that the Slime Queen will no longer be a problem.";
		}

		@Override
		public String getCompletedDescription() {
			return "You told Claire that the Slime Queen is no longer a threat, and received the twenty-thousand flame reward.";
		}
	},

	// Teleporting:

	TELEPORTING_START(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Escape from the warehouse";
		}

		@Override
		public String getDescription() {
			return "Having accidentally teleported into the 'SWORD' Enforcer division's storage warehouse, both you and Claire now need to avoid detection and make good your escape.";
		}

		@Override
		public String getCompletedDescription() {
			return "You and Claire managed to escape from SWORD's warehouse.";
		}
	},

	TELEPORTING_CAUGHT(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Endure the stocks";
		}

		@Override
		public String getDescription() {
			if(Main.game.isNonConEnabled()) {
				return "Having been defeated by the Enforcers inside SWORD's warehouse, you've been sentenced to be locked into the public use stocks at slaver alley. Endure this ordeal until Claire comes to rescue you...";
			} else {
				return "Having been defeated by the Enforcers inside SWORD's warehouse, you've been locked into the cells at Enforcer Headquarters. You'll have to wait until Claire comes to rescue you...";
			}
		}

		@Override
		public String getCompletedDescription() {
			if(Main.game.isNonConEnabled()) {
				return "Having been defeated by the Enforcers inside SWORD's warehouse, you had to endure being locked into the public use stocks at slaver alley for several hours before Claire turned up to release you.";
			} else {
				return "Having been defeated by the Enforcers inside SWORD's warehouse, you had to endure being locked into the cells at Enforcer Headquarters for a couple of hours before Claire turned up to release you.";
			}
		}
	},

	// Daddy:

	DADDY_START(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Meeting [daddy.name]";
		}

		@Override
		public String getDescription() {
			return "Rose has asked you to pay [daddy.name] a visit in order to convince [daddy.herHim] to leave Lilaya in peace."
					+ " ([daddy.He] is only available at [daddy.his] apartment in Demon Home between "+Units.time(LocalTime.of(18, 00))+" and "+Units.time(LocalTime.of(21, 00))+".)";
		}

		@Override
		public String getCompletedDescription() {
			return "At Rose's behest, you met with [daddy.name] at [daddy.her] apartment in Demon Home.";
		}
	},

	DADDY_MEETING(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Dinner with [daddy.name]";
		}

		@Override
		public String getDescription() {
			return "[daddy.Name] is insisting upon explaining [daddy.her] motives over dinner. You're going to have to either accept [daddy.her] offer, or bluntly refuse [daddy.herHim] and insist that [daddy.she] leave Lilaya alone.";
		}

		@Override
		public String getCompletedDescription() {
			return "You gave [daddy.name] your answer in response to [daddy.her] request to take you out for dinner.";
		}
	},

	DADDY_REFUSED(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "[daddy.Name] denied";
		}

		@Override
		public String getDescription() {
			return "You told [daddy.name] that you aren't at all interested in going out for a meal with [daddy.herHim], and that [daddy.sheIs] never to bother Lilaya again.";
		}

		@Override
		public String getCompletedDescription() {
			return "You told [daddy.name] that you aren't at all interested in going out for a meal with [daddy.herHim], and that [daddy.sheIs] never to bother Lilaya again.";
		}
	},

	DADDY_REFUSED_2(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "[daddy.Name] denied";
		}

		@Override
		public String getDescription() {
			return "You told [daddy.name] that you aren't interested in convincing Lilaya to meet with [daddy.herHim], and that [daddy.she] should never bother your [lilaya.relation(pc)] again.";
		}

		@Override
		public String getCompletedDescription() {
			return "You told [daddy.name] that you aren't interested in convincing Lilaya to meet with [daddy.herHim], and that [daddy.she] should never bother your [lilaya.relation(pc)] again.";
		}
	},

	DADDY_ACCEPTED(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Convincing Lilaya";
		}

		@Override
		public String getDescription() {
			return "You agreed to convince Lilaya to meet with [daddy.name] for dinner, and to then help persuade her to ask Lyssieth to meet with [daddy.herHim].";
		}

		@Override
		public String getCompletedDescription() {
			return "You convinced Lilaya to meet with [daddy.name] for dinner, on the condition that you go with her. ";
		}
	},

	DADDY_LILAYA_MEETING(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Lilaya's date with [daddy.name]";
		}

		@Override
		public String getDescription() {
			return "Lilaya has agreed to go out for dinner with [daddy.name], so now you just need to accompany her and make sure the evening goes smoothly.";
		}

		@Override
		public String getCompletedDescription() {
			return "You went with Lilaya to meet [daddy.name] for dinner, and while she had bad news for [daddy.herHim] regarding Lyssieth's romantic preferences, she did seem to like [daddy.herHim] well enough...";
		}
	},

	// Buying Brax:

	BUYING_BRAX_START(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Perfume collection";
		}

		@Override
		public String getDescription() {
			return "Candi said that she'd consider selling [brax.name] to you, but before she gives you a definite answer, she wants you to go and fetch her order of perfume from the shop 'Succubi's Secrets' in the shopping arcade.";
		}

		@Override
		public String getCompletedDescription() {
			return "You both paid for and collected Candi's order of perfume from Succubi's Secrets.";
		}
	},

	BUYING_BRAX_DELIVER_PERFUME(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Perfume delivery";
		}

		@Override
		public String getDescription() {
			return "Now that you've collected the bottles of perfume, you need to deliver them to Candi back at the Enforcer headquarters.";
		}

		@Override
		public String getCompletedDescription() {
			return "You delivered Candi's bottles of perfume to her.";
		}
	},

	BUYING_BRAX_LOLLIPOPS(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Lollipop contraband";
		}

		@Override
		public String getDescription() {
			return "Candi said she'd be willing to sell Brax to you, but she needs to think of how much [brax.sheIs] worth."
					+ " She said that she'll have a price for you after you've fetched a box of contraband lollipops from the Harpy Nests' Enforcer checkpoint.";
		}

		@Override
		public String getCompletedDescription() {
			return "You retrieved the lollipops from the Harpy Nests' Enforcer checkpoint.";
		}
	},

	BUYING_BRAX_DELIVER_LOLLIPOPS(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Lollipops for Candi";
		}

		@Override
		public String getDescription() {
			return "Now that the box of contraband lollipops are in your possession, you need to return them to Candi back at the Enforcer headquarters.";
		}

		@Override
		public String getCompletedDescription() {
			return "You delivered the box of contraband lollipops to Candi, who seemed to pay no attention to the warnings stamped all over it.";
		}
	},

	BUYING_BRAX_LIPSTICK(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "A wolf's weight in lipstick";
		}

		@Override
		public String getDescription() {
			return "Candi said that Brax is far too precious to be sold for mere flames, but she'd be willing to give [brax.herHim] to you in exchange for something just as valuable; a box of limited-edition lipsticks, branded as 'A Hundred Kisses'."
					+ " Apparently, Candi has discovered the whereabouts of one of the only boxes left for sale, which is at a store in the shopping arcade called 'Ralph's Snacks'.";
		}

		@Override
		public String getCompletedDescription() {
			return "You retrieved the box of 'A Hundred Kisses' from Ralph.";
		}
	},

	BUYING_BRAX_DELIVER_LIPSTICK(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "At the wolf's door";
		}

		@Override
		public String getDescription() {
			return "Now that you've secured the box of 'A Hundred Kisses', all that's left to do is deliver it to Candi in exchange for ownership of [brax.name].";
		}

		@Override
		public String getCompletedDescription() {
			return "You handed over the box of 'A Hundred Kisses' to Candi, and finally gained your prize; ownership of [brax.name].";
		}
	},

	// Vengar:

	VENGAR_START(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Rat Warrens";
		}
		@Override
		public String getDescription() {
			return "You agreed to help Axel deal with Vengar, who's apparently the leader of Submission's largest and most dangerous gang. You could head directly to his hideout, the 'Rat Warrens', or first go and ask Claire for help.";
		}
		@Override
		public String getCompletedDescription() {
			return "By using the password Axel gave to you, you were able to gain entry to Vengar's hideout; the Rat Warrens.";
		}
	},

	VENGAR_ONE(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Meeting Vengar";
		}
		@Override
		public String getDescription() {
			return "In order to find Vengar, you need to locate the main hall and be there between the hours of "+Units.time(LocalDateTime.of(1, 1, 1, 6, 0))+" and "+Units.time(LocalDateTime.of(1, 1, 1, 22, 0))+".";
		}
		@Override
		public String getCompletedDescription() {
			return "You found Vengar sitting on a throne in the main hall, and after approaching him, you were given the choice to either join his gang, or be set upon by his rat-girl bodyguards.";
		}
	},

	VENGAR_TWO_FIGHT(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Conflict";
		}
		@Override
		public String getDescription() {
			return "Having chosen to refuse Vengar's offer of joining his gang, you now need to fight your way past his bodyguards and then defeat him in combat in order to assert dominance over his gang.";
		}
		@Override
		public String getCompletedDescription() {
			return "You managed to defeat both Vengar and his bodyguards, allowing you to assert your dominance over his gang.";
		}
	},

	VENGAR_TWO_JOIN(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Joining the Gang";
		}
		@Override
		public String getDescription() {
			return "Having accepted Vengar's offer to join his gang, you now need to suck his cock to show your submission...";
		}
		@Override
		public String getCompletedDescription() {
			return "You decided to join Vengar's gang, and after sucking his cock to show your submission, you were told to deal with Axel's treachery...";
		}
	},

	VENGAR_TWO_ENFORCERS(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Raid";
		}
		@Override
		public String getDescription() {
			return "Having confirmed that Vengar is in the Rat Warrens, you've activated the resonance stone, signalling to the waiting SWORD Enforcers to start their raid.";
		}
		@Override
		public String getCompletedDescription() {
			return "The SWORD Enforcers successfully raided the Rat Warrens, and were able to apprehend Vengar.";
		}
	},

	VENGAR_THREE_END(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Return to Axel";
		}
		@Override
		public String getDescription() {
			return "Now that you've dealt with Vengar, you need to return to Axel and let him know what happened.";
		}
		@Override
		public String getCompletedDescription() {
			return "You returned to Axel and told him what the situation will be from now on.";
		}
	},

	VENGAR_OPTIONAL_CLAIRE(QuestType.SIDE, 1, 5) {
		@Override
		public String getName() {
			return "Claire's Help";
		}
		@Override
		public String getDescription() {
			return "Deciding that it would be best to let Claire know of the situation, you asked her if there was anything the Enforcers could do to help."
					+ " Apparently, a SWORD team is already prepared to raid the Rat Warrens, but they need to know Vengar is inside before launching their assault."
					+ " Claire gave you a resonance stone to activate if you want them to back you up once inside.";
		}
		@Override
		public String getCompletedDescription() {
			return "Deciding that it would be best to let Claire know of the situation, you asked her if there was anything the Enforcers could do to help."
					+ " Apparently, a SWORD team is already prepared to raid the Rat Warrens, but they need to know Vengar is inside before launching their assault."
					+ " Claire gave you a resonance stone to activate if you want them to back you up once inside.";
		}
	},

	;

	private int level, experienceReward;
	private QuestType questType;

	private Quest(QuestType questType, int level, int experienceReward) {
		this.questType = questType;

		this.level = level;
		this.experienceReward = experienceReward;
	}

	public abstract String getName();

	public abstract String getDescription();

	public abstract String getCompletedDescription();

	public int getLevel() {
		return level;
	}

	public QuestType getQuestType() {
		return questType;
	}

	public int getExperienceReward() {
		return experienceReward;
	}

}


code:
package com.lilithsthrone.game.character.quests;

import com.lilithsthrone.utils.TreeNode;

/**
 * @since 0.1.1
 * @version 0.2.10
 * @author Innoxia
 */
public enum QuestLine {

	// Main quests:

	MAIN("Lilith's Throne", "You have completed all main quest content in this version!",
			QuestType.MAIN,
			QuestTree.mainQuestTree),

	// Side quests:

//	SIDE_ITEM_DISCOVERY("Item Discovery", "You have found all the different items that are in this version!",
//			QuestType.SIDE,
//			Quest.SIDE_DISCOVER_ALL_ITEMS),
//
//	SIDE_RACE_DISCOVERY("Race Discovery", "You have found all the different races that are in this version!",
//			QuestType.SIDE,
//			Quest.SIDE_DISCOVER_ALL_RACES),

	SIDE_ENCHANTMENT_DISCOVERY("Enchantments, Essences, and Jinxes", "You now know how to create enchanted items and remove jinxes!",
			QuestType.SIDE,
			QuestTree.enchantmentTree),

	SIDE_FIRST_TIME_PREGNANCY("Knocked Up", "With Lilaya's help, you managed to complete your first pregnancy. Perhaps the first of many...",
			QuestType.SIDE,
			QuestTree.pregnancyTree),

	SIDE_SLAVERY("Slaver", "Thanks to Lilaya's letter of recommendation, you managed to obtain a coveted Slaver License!",
			QuestType.SIDE,
			QuestTree.slaveryTree),

	SIDE_ACCOMMODATION("Bed & Board", "Lilaya happily gave you her permission to use the spare rooms to accommodate your friends and family, provided that you pay for the expenses that they incur...",
			QuestType.SIDE,
			QuestTree.accommodationTree),

	SIDE_HYPNO_WATCH("Arthur's Experiment", "You helped Arthur to complete his research into an orientation-changing Hypno-Watch, which is now in your possession!",
			QuestType.SIDE,
			QuestTree.hypnoWatchTree),

	RELATIONSHIP_NYAN_HELP("Supplier Issues", "You helped Nyan solve the problem she was having with her suppliers.",
			QuestType.RELATIONSHIP,
			QuestTree.nyanTree),

	SIDE_HARPY_PACIFICATION("Angry Harpies", "You managed to calm down all three of the harpy matriarchs, resulting in the Harpy Nests being safe to travel through!",
			QuestType.SIDE,
			QuestTree.angryHarpyTree),

	SIDE_SLIME_QUEEN("Slime Queen", "You dealt with the Slime Queen!",
			QuestType.SIDE,
			QuestTree.slimeQueenTree),

	SIDE_TELEPORTATION("The Trouble with Teleporting", "After learning how to teleport, you managed to escape from the Enforcer warehouse.",
			QuestType.SIDE,
			QuestTree.teleportingTree),

	SIDE_DADDY("An Inquiring Incubus", "You dealt with the demon, [daddy.name], who was showing an interest in Lilaya.",
			QuestType.SIDE,
			QuestTree.daddyTree),

	SIDE_BUYING_BRAX("Acquiring a Wolf", "After she'd got you to perform a series of tedious tasks for her, Candi finally sold [brax.name] to you.",
			QuestType.SIDE,
			QuestTree.buyingBraxTree),

	SIDE_VENGAR("Vengar's Tyranny", "You dealt with Vengar and made sure that Axel doesn't have to worry about him again.",
			QuestType.SIDE,
			QuestTree.vengarTree)

	;

	private String name, completedDescription;
	private QuestType type;
	private TreeNode<Quest> questTree;

	private QuestLine(String name, String completedDescription, QuestType type, TreeNode<Quest> questTree) {
		this.name = name;
		this.completedDescription = completedDescription;
		this.type = type;
		this.questTree = questTree;
	}

	public String getName() {
		return name;
	}

	public String getCompletedDescription() {
		return completedDescription;
	}

	public QuestType getType() {
		return type;
	}

	public TreeNode<Quest> getQuestTree() {
		return questTree;
	}

}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.character.quests;

import com.lilithsthrone.utils.TreeNode;

/**
 * @since 0.1.99
 * @version 0.3.5
 * @author Innoxia
 */
public class QuestTree {

	public static TreeNode<Quest> mainQuestTree = new TreeNode<Quest>(Quest.MAIN_PROLOGUE);
	public static TreeNode<Quest> enchantmentTree = new TreeNode<Quest>(Quest.SIDE_ENCHANTMENTS_LILAYA_HELP);
	public static TreeNode<Quest> pregnancyTree = new TreeNode<Quest>(Quest.SIDE_PREGNANCY_CONSULT_LILAYA);
	public static TreeNode<Quest> slaveryTree = new TreeNode<Quest>(Quest.SIDE_SLAVER_NEED_RECOMMENDATION);
	public static TreeNode<Quest> accommodationTree = new TreeNode<Quest>(Quest.SIDE_ACCOMMODATION_NEED_LILAYAS_PERMISSION);
	public static TreeNode<Quest> hypnoWatchTree = new TreeNode<Quest>(Quest.SIDE_HYPNO_WATCH_VICKY);
	public static TreeNode<Quest> nyanTree = new TreeNode<Quest>(Quest.RELATIONSHIP_NYAN_STOCK_ISSUES);
	public static TreeNode<Quest> angryHarpyTree = new TreeNode<Quest>(Quest.HARPY_PACIFICATION_ONE);
	public static TreeNode<Quest> slimeQueenTree = new TreeNode<Quest>(Quest.SLIME_QUEEN_ONE);
	public static TreeNode<Quest> teleportingTree = new TreeNode<Quest>(Quest.TELEPORTING_START);
	public static TreeNode<Quest> daddyTree = new TreeNode<Quest>(Quest.DADDY_START);
	public static TreeNode<Quest> buyingBraxTree = new TreeNode<Quest>(Quest.BUYING_BRAX_START);
	public static TreeNode<Quest> vengarTree = new TreeNode<Quest>(Quest.VENGAR_START);

	static {
		TreeNode<Quest> node1 = new TreeNode<Quest>(Quest.MAIN_1_A_LILAYAS_TESTS);
		mainQuestTree.addChild(node1);
		TreeNode<Quest> node2 = new TreeNode<Quest>(Quest.MAIN_1_B_DEMON_HOME);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_1_C_WOLFS_DEN);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_1_D_SLAVERY);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_1_E_REPORT_TO_ALEXA);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_1_F_SCARLETTS_FATE);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_1_G_SLAVERY);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_1_H_THE_GREAT_ESCAPE);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_1_I_ARTHURS_TALE);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_1_J_ARTHURS_ROOM);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_2_A_INTO_THE_DEPTHS);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_2_B_SIRENS_CALL);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_2_C_SIRENS_FALL);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_2_D_MEETING_A_LILIN);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.MAIN_3_A_FINDING_THE_YOUKO);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.MAIN_3_B_DEBTS_PAID);
		node1.addChild(node2);

		enchantmentTree.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));

		node1 = new TreeNode<Quest>(Quest.SIDE_PREGNANCY_LILAYA_THE_MIDWIFE);
		pregnancyTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node1.addChild(node2);

		accommodationTree.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));

		node1 = new TreeNode<Quest>(Quest.SIDE_SLAVER_RECOMMENDATION_OBTAINED);
		slaveryTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node1.addChild(node2);

		node1 = new TreeNode<Quest>(Quest.SIDE_HYPNO_WATCH_TEST_SUBJECT);
		hypnoWatchTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node1.addChild(node2);

		node1 = new TreeNode<Quest>(Quest.RELATIONSHIP_NYAN_STOCK_ISSUES_AGREED_TO_HELP);
		nyanTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.RELATIONSHIP_NYAN_STOCK_ISSUES_SUPPLIERS_BEATEN);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node2.addChild(node1);

		node1 = new TreeNode<Quest>(Quest.HARPY_PACIFICATION_TWO);
		angryHarpyTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.HARPY_PACIFICATION_THREE);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.HARPY_PACIFICATION_REWARD);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node1.addChild(node2);

		// Slime queen:

		node1 = new TreeNode<Quest>(Quest.SLIME_QUEEN_TWO);
		slimeQueenTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.SLIME_QUEEN_THREE);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.SLIME_QUEEN_FOUR);
		node2.addChild(node1);

		TreeNode<Quest> nodeBranchA = new TreeNode<Quest>(Quest.SLIME_QUEEN_FIVE_FORCE);
		node1.addChild(nodeBranchA);
		TreeNode<Quest> nodeBranchB = new TreeNode<Quest>(Quest.SLIME_QUEEN_FIVE_CONVINCE);
		node1.addChild(nodeBranchB);
		TreeNode<Quest> nodeBranchC = new TreeNode<Quest>(Quest.SLIME_QUEEN_FIVE_SUBMIT);
		node1.addChild(nodeBranchC);

		node2 = new TreeNode<Quest>(Quest.SLIME_QUEEN_SIX_FORCE);
		nodeBranchA.addChild(node2);
		node2.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));

		node2 = new TreeNode<Quest>(Quest.SLIME_QUEEN_SIX_CONVINCE);
		nodeBranchB.addChild(node2);
		node2.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));

		node2 = new TreeNode<Quest>(Quest.SLIME_QUEEN_SIX_SUBMIT);
		nodeBranchC.addChild(node2);
		node2.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));

		// Teleporting:

		node1 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		teleportingTree.addChild(node1);
		node1 = new TreeNode<Quest>(Quest.TELEPORTING_CAUGHT);
		teleportingTree.addChild(node1);
		node2.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));
		node1.addChild(node2);

		// Daddy:

		node1 = new TreeNode<Quest>(Quest.DADDY_MEETING);
		daddyTree.addChild(node1);
		nodeBranchA = new TreeNode<Quest>(Quest.DADDY_REFUSED);
		daddyTree.addChild(nodeBranchA);

		node2 = new TreeNode<Quest>(Quest.DADDY_ACCEPTED);
		node1.addChild(node2);
		nodeBranchA = new TreeNode<Quest>(Quest.DADDY_REFUSED_2);
		node1.addChild(nodeBranchA);

		node1 = new TreeNode<Quest>(Quest.DADDY_LILAYA_MEETING);
		node2.addChild(node1);

		node1.addChild(new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE));

		// Buying Brax:

		node1 = new TreeNode<Quest>(Quest.BUYING_BRAX_DELIVER_PERFUME);
		buyingBraxTree.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.BUYING_BRAX_LOLLIPOPS);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.BUYING_BRAX_DELIVER_LOLLIPOPS);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.BUYING_BRAX_LIPSTICK);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.BUYING_BRAX_DELIVER_LIPSTICK);
		node2.addChild(node1);
		node2 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node1.addChild(node2);

		// Dealing with Vengar:

		node1 = new TreeNode<Quest>(Quest.VENGAR_ONE);
		vengarTree.addChild(node1);

		nodeBranchA = new TreeNode<Quest>(Quest.VENGAR_TWO_FIGHT);
		node1.addChild(nodeBranchA);
		nodeBranchB = new TreeNode<Quest>(Quest.VENGAR_TWO_JOIN);
		nodeBranchB.addChild(nodeBranchB);
		nodeBranchC = new TreeNode<Quest>(Quest.VENGAR_TWO_ENFORCERS);
		nodeBranchC.addChild(nodeBranchC);

		node2 = new TreeNode<Quest>(Quest.VENGAR_THREE_END);
		node1.addChild(node2);
		node1 = new TreeNode<Quest>(Quest.SIDE_UTIL_COMPLETE);
		node2.addChild(node1);
	}
}


code:
package com.lilithsthrone.game.character.quests;

import com.lilithsthrone.utils.Colour;

/**
 * @since 0.1.1
 * @version 0.1.69
 * @author Innoxia
 */
public enum QuestType {
	MAIN(Colour.QUEST_MAIN),
	SIDE(Colour.QUEST_SIDE),
	RELATIONSHIP(Colour.QUEST_RELATIONSHIP);

	private Colour colour;

	private QuestType(Colour colour) {
		this.colour = colour;
	}

	public Colour getColour() {
		return colour;
	}
}


code:
package com.lilithsthrone.game.character.race;

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

import com.lilithsthrone.game.character.body.types.AbstractArmType;
import com.lilithsthrone.game.character.body.types.AbstractAssType;
import com.lilithsthrone.game.character.body.types.AbstractBreastType;
import com.lilithsthrone.game.character.body.types.AbstractEarType;
import com.lilithsthrone.game.character.body.types.AbstractHornType;
import com.lilithsthrone.game.character.body.types.AbstractLegType;
import com.lilithsthrone.game.character.body.types.AntennaType;
import com.lilithsthrone.game.character.body.types.EyeType;
import com.lilithsthrone.game.character.body.types.FaceType;
import com.lilithsthrone.game.character.body.types.HairType;
import com.lilithsthrone.game.character.body.types.HornType;
import com.lilithsthrone.game.character.body.types.PenisType;
import com.lilithsthrone.game.character.body.types.SkinType;
import com.lilithsthrone.game.character.body.types.TailType;
import com.lilithsthrone.game.character.body.types.TentacleType;
import com.lilithsthrone.game.character.body.types.VaginaType;
import com.lilithsthrone.game.character.body.types.WingType;
import com.lilithsthrone.game.character.body.valueEnums.AreolaeSize;
import com.lilithsthrone.game.character.body.valueEnums.AssSize;
import com.lilithsthrone.game.character.body.valueEnums.BodyMaterial;
import com.lilithsthrone.game.character.body.valueEnums.BreastShape;
import com.lilithsthrone.game.character.body.valueEnums.Capacity;
import com.lilithsthrone.game.character.body.valueEnums.ClitorisSize;
import com.lilithsthrone.game.character.body.valueEnums.CumProduction;
import com.lilithsthrone.game.character.body.valueEnums.CupSize;
import com.lilithsthrone.game.character.body.valueEnums.GenitalArrangement;
import com.lilithsthrone.game.character.body.valueEnums.HairLength;
import com.lilithsthrone.game.character.body.valueEnums.HornLength;
import com.lilithsthrone.game.character.body.valueEnums.Lactation;
import com.lilithsthrone.game.character.body.valueEnums.LegConfiguration;
import com.lilithsthrone.game.character.body.valueEnums.LipSize;
import com.lilithsthrone.game.character.body.valueEnums.NippleShape;
import com.lilithsthrone.game.character.body.valueEnums.NippleSize;
import com.lilithsthrone.game.character.body.valueEnums.OrificeElasticity;
import com.lilithsthrone.game.character.body.valueEnums.OrificePlasticity;
import com.lilithsthrone.game.character.body.valueEnums.PenisGirth;
import com.lilithsthrone.game.character.body.valueEnums.TesticleSize;
import com.lilithsthrone.game.character.body.valueEnums.Wetness;
import com.lilithsthrone.game.character.body.valueEnums.WingSize;
import com.lilithsthrone.game.character.gender.Gender;
import com.lilithsthrone.game.character.persona.PersonalityCategory;
import com.lilithsthrone.game.character.persona.PersonalityTrait;
import com.lilithsthrone.game.character.persona.SexualOrientation;
import com.lilithsthrone.game.character.persona.SexualOrientationPreference;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.3.1
 * @version 0.3.5
 * @author Innoxia
 */
public abstract class AbstractRacialBody {
	// Antenna:
	private AntennaType antennaType;

	// Arms:
	private AbstractArmType armType;
	private int armRows;

	// Ass:
	private AbstractAssType assType;
	private int anusCapacity;
	private int anusWetness;
	private int maleAssSize;
	private int femaleAssSize;
	private int anusElasticity;
	private int anusPlasticity;

	// Breasts:
	private AbstractBreastType breastType;
	private List<BreastShape> breastShapes;
	private NippleShape maleNippleShape;
	private NippleShape femaleNippleShape;
	private int noBreastSize;
	private int breastSize;
	private int maleLactationRate;
	private int femaleLactationRate;
	private int femaleBreastCapacity;
	private int maleBreastCapacity;
	private int femaleBreastElasticity;
	private int maleBreastElasticity;
	private int femaleBreastPlasticity;
	private int maleBreastPlasticity;
	private int maleNippleCountPerBreast;
	private int femaleNippleCountPerBreast;
	private int maleAreolaeSize;
	private int femaleAreolaeSize;
	private int maleNippleSize;
	private int femaleNippleSize;
	private int breastCountMale;
	private int breastCountFemale;

	// BreastCrotchs/Crotch-boobs:
	private AbstractBreastType breastCrotchType;
	private List<BreastShape> breastCrotchShapes;
	private NippleShape breastCrotchNippleShape;
	private int breastCrotchSize;
	private int breastCrotchLactationRate;
	private int breastCrotchCapacity;
	private int breastCrotchElasticity;
	private int breastCrotchPlasticity;
	private int nippleCountPerBreastCrotch;
	private int breastCrotchAreolaeSize;
	private int breastCrotchNippleSize;
	private int breastCrotchCount;

	// Core:
	private SkinType skinType;
	private BodyMaterial bodyMaterial;
	private GenitalArrangement genitalArrangement;
	private int maleHeight;
	private int femaleHeight;
	private int maleFemininity;
	private int femaleFemininity;
	private int maleBodySize;
	private int femaleBodySize;
	private int maleMuscle;
	private int femaleMuscle;

	// Hair:
	private HairType hairType;
	private int maleHairLength;
	private int femaleHairLength;

	// Horns:
	private List<AbstractHornType> hornTypes;
	private int maleHornLength;
	private int femaleHornLength;

	// Face:
	private FaceType faceType;
	private EyeType eyeType;
	private AbstractEarType earType;
	private int maleLipSize;
	private int femaleLipSize;

	// Legs:
	private AbstractLegType legType;
	private LegConfiguration legConfiguration;

	// Penis:
	private PenisType penisType;
	private int penisSize;
	private int penisGirth;
	private int testicleSize;
	private int cumProduction;

	// Tail:
	private List<TailType> tailTypes;

	// Tentacle:
	private TentacleType tentacleType;

	// Vagina:
	private VaginaType vaginaType;
	private int vaginaCapacity;
	private int vaginaWetness;
	private int clitSize;
	private int vaginaElasticity;
	private int vaginaPlasticity;
	private int testicleQuantity;

	// Wings:
	private List<WingType> wingTypes;
	private int maleWingSize;
	private int femaleWingSize;

	public AbstractRacialBody(AntennaType antennaType,
			AbstractArmType armType,
			int armRows, AbstractAssType assType,
			AssSize maleAssSize, AssSize femaleAssSize, Wetness anusWetness, Capacity anusCapacity, OrificeElasticity anusElasticity, OrificePlasticity anusPlasticity, AbstractBreastType breastType,
			List<BreastShape> breastShapes, CupSize noBreastSize,
			int breastCountMale, Lactation maleLactationRate, Capacity maleBreastCapacity, OrificeElasticity maleBreastElasticity, OrificePlasticity maleBreastPlasticity, NippleSize maleNippleSize,
				NippleShape maleNippleShape, AreolaeSize maleAreolaeSize, int maleNippleCountPerBreast, CupSize breastSize,
			int breastCountFemale, Lactation femaleLactationRate, Capacity femaleBreastCapacity, OrificeElasticity femaleBreastElasticity, OrificePlasticity femaleBreastPlasticity, NippleSize femaleNippleSize,
				NippleShape femaleNippleShape, AreolaeSize femaleAreolaeSize, int femaleNippleCountPerBreast, AbstractBreastType breastCrotchType,
			List<BreastShape> breastCrotchShapes, CupSize breastCrotchSize,
			int breastCrotchCount, Lactation breastCrotchLactationRate, Capacity breastCrotchCapacity, OrificeElasticity breastCrotchElasticity, OrificePlasticity breastCrotchPlasticity, NippleSize breastCrotchNippleSize,
				NippleShape breastCrotchNippleShape, AreolaeSize breastCrotchAreolaeSize, int nippleCountPerBreastCrotch,
			int maleHeight, int maleFemininity, int maleBodySize, int maleMuscle,
			int femaleHeight, int femaleFemininity, int femaleBodySize, int femaleMuscle, AbstractEarType earType,
			EyeType eyeType,
			FaceType faceType,
			LipSize maleLipSize, LipSize femaleLipSize, HairType hairType,
			HairLength maleHairLength, HairLength femaleHairLength, AbstractLegType legType,
			LegConfiguration legConfiguration, SkinType skinType,
			BodyMaterial bodyMaterial,
			HornLength maleHornLength,
			HornLength femaleHornLength, List<AbstractHornType> hornTypes,
			PenisType penisType,
			int penisSize, PenisGirth penisGirth, TesticleSize testicleSize, int testicleQuantity, CumProduction cumProduction, List<TailType> tailTypes,
			TentacleType tentacleType,
			VaginaType vaginaType,
			Wetness vaginaWetness, Capacity vaginaCapacity, ClitorisSize clitSize, OrificeElasticity vaginaElasticity, OrificePlasticity vaginaPlasticity, List<WingType> wingTypes,
			WingSize maleWingSize, WingSize femaleWingSize, GenitalArrangement genitalArrangement) {

		// Antenna:
		this.antennaType = antennaType;

		// Arms:
		this.armType = armType;
		this.armRows = armRows;

		// Ass:
		this.assType = assType;
		this.anusCapacity = anusCapacity.getMedianValue();
		this.anusWetness = anusWetness.getValue();
		this.maleAssSize = maleAssSize.getValue();
		this.femaleAssSize = femaleAssSize.getValue();
		this.anusElasticity = anusElasticity.getValue();
		this.anusPlasticity = anusPlasticity.getValue();

		// Breasts:
		this.breastType = breastType;
		this.breastShapes = breastShapes;
		this.noBreastSize = noBreastSize.getMeasurement();
		this.breastCountMale = breastCountMale;
		this.maleLactationRate = maleLactationRate.getMedianValue();
		this.maleBreastCapacity = maleBreastCapacity.getMedianValue();
		this.maleBreastElasticity = maleBreastElasticity.getValue();
		this.maleBreastPlasticity = maleBreastPlasticity.getValue();
		this.maleNippleSize = maleNippleSize.getValue();
		this.maleNippleShape = maleNippleShape;
		this.maleAreolaeSize = maleAreolaeSize.getValue();
		this.maleNippleCountPerBreast = maleNippleCountPerBreast;

		this.breastSize = breastSize.getMeasurement();
		this.breastCountFemale = breastCountFemale;
		this.femaleLactationRate = femaleLactationRate.getMedianValue();
		this.femaleBreastCapacity = femaleBreastCapacity.getMedianValue();
		this.femaleBreastElasticity = femaleBreastElasticity.getValue();
		this.femaleBreastPlasticity = femaleBreastPlasticity.getValue();
		this.femaleNippleSize = femaleNippleSize.getValue();
		this.femaleNippleShape = femaleNippleShape;
		this.femaleAreolaeSize = femaleAreolaeSize.getValue();
		this.femaleNippleCountPerBreast = femaleNippleCountPerBreast;

		// BreastCrotchs/Crotch-boobs:
		this.breastCrotchType = breastCrotchType;
		this.breastCrotchShapes = breastCrotchShapes;
		this.breastCrotchSize = breastCrotchSize.getMeasurement();
		this.breastCrotchCount = breastCrotchCount;
		this.breastCrotchLactationRate = breastCrotchLactationRate.getMedianValue();
		this.breastCrotchCapacity = breastCrotchCapacity.getMedianValue();
		this.breastCrotchElasticity = breastCrotchElasticity.getValue();
		this.breastCrotchPlasticity = breastCrotchPlasticity.getValue();
		this.breastCrotchNippleSize = breastCrotchNippleSize.getValue();
		this.breastCrotchNippleShape = breastCrotchNippleShape;
		this.breastCrotchAreolaeSize = breastCrotchAreolaeSize.getValue();
		this.nippleCountPerBreastCrotch = nippleCountPerBreastCrotch;

		// Core:
		this.skinType = skinType;
		this.bodyMaterial = bodyMaterial;
		this.genitalArrangement = genitalArrangement;
		this.maleHeight = maleHeight;
		this.maleFemininity = maleFemininity;
		this.maleBodySize = maleBodySize;
		this.maleMuscle = maleMuscle;
		this.femaleHeight = femaleHeight;
		this.femaleFemininity = femaleFemininity;
		this.femaleBodySize = femaleBodySize;
		this.femaleMuscle = femaleMuscle;

		// Face:
		this.faceType = faceType;
		this.eyeType = eyeType;
		this.earType = earType;
		this.maleLipSize = maleLipSize.getValue();
		this.femaleLipSize = femaleLipSize.getValue();

		// Hair:
		this.hairType = hairType;
		this.maleHairLength = maleHairLength.getMedianValue();
		this.femaleHairLength = femaleHairLength.getMedianValue();

		// Horns:
		this.hornTypes = hornTypes;
		this.maleHornLength = maleHornLength.getMedianValue();
		this.femaleHornLength = femaleHornLength.getMedianValue();

		// Leg:
		this.legType = legType;
		this.legConfiguration = legConfiguration;

		// Penis:
		this.penisType = penisType;
		this.penisSize = penisSize;
		this.penisGirth = penisGirth.getValue();
		this.testicleSize = testicleSize.getValue();
		this.cumProduction = cumProduction.getMedianValue();

		// Tail:
		this.tailTypes = tailTypes;

		// Tentacle:
		this.tentacleType = tentacleType;

		// Vagina:
		this.vaginaType = vaginaType;
		this.clitSize = clitSize.getMedianValue();
		this.vaginaCapacity = vaginaCapacity.getMedianValue();
		this.vaginaWetness = vaginaWetness.getValue();
		this.vaginaElasticity = vaginaElasticity.getValue();
		this.vaginaPlasticity = vaginaPlasticity.getValue();
		this.testicleQuantity = testicleQuantity;

		// Wings:
		this.wingTypes = wingTypes;
		this.maleWingSize = maleWingSize.getValue();
		this.femaleWingSize = femaleWingSize.getValue();

	}

	/**
	 * <b>Does not include angels or slimes</b>
	 * @param gender
	 * @return
	 */
	public static AbstractRacialBody getRandomCommonRacialBodyFromPreferences(Gender gender) {

		List<Race> availableRaces = new ArrayList<>();
		for(Race r : Race.values()) {
			if(r != Race.ANGEL) {
				availableRaces.add(r);
			}
		}

		if(gender.isFeminine()) {
			for(Entry<Subspecies, FurryPreference> entry : Main.getProperties().getSubspeciesFeminineFurryPreferencesMap().entrySet()) {
				if(entry.getValue() == FurryPreference.HUMAN) {
					availableRaces.remove(entry.getKey().getRace());
				}
			}
		} else {
			for(Entry<Subspecies, FurryPreference> entry : Main.getProperties().getSubspeciesMasculineFurryPreferencesMap().entrySet()) {
				if(entry.getValue() == FurryPreference.HUMAN) {
					availableRaces.remove(entry.getKey().getRace());
				}
			}
		}

		if(availableRaces.isEmpty()) {
			return RacialBody.HUMAN;
		}

		return RacialBody.valueOfRace(availableRaces.get(Util.random.nextInt(availableRaces.size())));
	}

	/**
	 * @return A map of personality traits and the percentage chance that a member of this race will spawn with them.
	 */
	public Map<PersonalityTrait, Float> getPersonalityTraitChances() {
		Map<PersonalityTrait, Float> map = new HashMap<>();

		for(PersonalityTrait trait : PersonalityTrait.values()) {
			if(trait.getPersonalityCategory()==PersonalityCategory.SPEECH) {
				map.put(trait, 0.01f); // Speech-related traits should be rare for a normal race.

			} else if(trait.getPersonalityCategory()==PersonalityCategory.SEX && trait!=PersonalityTrait.LEWD) {
				map.put(trait, 0.02f); // Smaller chance for people to be prude or innocent.

			} else {
				map.put(trait, 0.05f); // With each category having two values, it's a ~10% chance to have a special trait in each category.
			}
		}

		return map;
	}

	public SexualOrientation getSexualOrientation(Gender gender) {
		if(gender.isFeminine()) {
			return SexualOrientationPreference.getSexualOrientationFromUserPreferences(15, 50, 35);
		} else {
			return SexualOrientationPreference.getSexualOrientationFromUserPreferences(40, 50, 10);
		}
	}

	public AntennaType getAntennaType() {
		return antennaType;
	}

	public AbstractArmType getArmType() {
		return armType;
	}

	public AbstractAssType getAssType() {
		return assType;
	}

	public AbstractBreastType getBreastType() {
		return breastType;
	}

	public List<BreastShape> getBreastShapes() {
		return breastShapes;
	}

	public FaceType getFaceType() {
		return faceType;
	}

	public EyeType getEyeType() {
		return eyeType;
	}

	public AbstractEarType getEarType() {
		return earType;
	}

	public HairType getHairType() {
		return hairType;
	}

	/**
	 * @return true if this RacialBody requires FaceType to not be human in order to apply hair settings.
	 */
	public boolean isHairTypeLinkedToFaceType() {
		return false;
	}

	public AbstractLegType getLegType() {
		return legType;
	}

	public LegConfiguration getLegConfiguration() {
		return legConfiguration;
	}

	public SkinType getSkinType() {
		return skinType;
	}

	public BodyMaterial getBodyMaterial() {
		return bodyMaterial;
	}

	/**
	 * @param includeTypeNONE Set as true if you want the returned HornType to possibly include HornType.NONE. (Will include NONE anyway if the list is empty.)
	 * @return A random HornType from this race's possible hornTypes.
	 */
	public AbstractHornType getRandomHornType(boolean includeTypeNONE) {
		List<AbstractHornType> hornList = new ArrayList<>(hornTypes);

		if(includeTypeNONE || hornTypes.size()==1) {
			return hornTypes.get(Util.random.nextInt(hornTypes.size()));
		} else {
			hornList.remove(HornType.NONE);
			return hornList.get(Util.random.nextInt(hornList.size()));
		}
	}

	public List<AbstractHornType> getHornTypes(boolean removeTypeNone) {
		if(removeTypeNone) {
			List<AbstractHornType> hornList = new ArrayList<>(hornTypes);
			hornList.remove(HornType.NONE);
			return hornList;
		}
		return hornTypes;
	}

	public PenisType getPenisType() {
		return penisType;
	}

	/**
	 * @param includeTypeNONE Set as true if you want the returned TailType to possibly include TailType.NONE. (Will include NONE anyway if the list is empty.)
	 * @return A random TailType from this race's possible tailTypes.
	 */
	public TailType getRandomTailType(boolean includeTypeNONE) {
		List<TailType> tailList = new ArrayList<>(tailTypes);

		if(includeTypeNONE || tailTypes.size()==1) {
			return tailTypes.get(Util.random.nextInt(tailTypes.size()));
		} else {
			tailList.remove(TailType.NONE);
			return tailList.get(Util.random.nextInt(tailList.size()));
		}
	}

	public List<TailType> getTailType() {
		return tailTypes;
	}

	public TentacleType getTentacleType() {
		return tentacleType;
	}

	public VaginaType getVaginaType() {
		return vaginaType;
	}

	/**
	 * @param includeTypeNONE Set as true if you want the returned TailType to possibly include TailType.NONE. (Will include NONE anyway if the list is empty.)
	 * @return A random TailType from this race's possible tailTypes.
	 */
	public WingType getRandomWingType(boolean includeTypeNONE) {
		List<WingType> wingList = new ArrayList<>(wingTypes);

		if(includeTypeNONE || wingTypes.size()==1) {
			return wingTypes.get(Util.random.nextInt(wingTypes.size()));
		} else {
			wingList.remove(WingType.NONE);
			return wingList.get(Util.random.nextInt(wingList.size()));
		}
	}

	public List<WingType> getWingTypes() {
		return wingTypes;
	}

	public int getArmRows() {
		return armRows;
	}

	public int getAnusCapacity() {
		return anusCapacity;
	}

	public int getAnusWetness() {
		return anusWetness;
	}

	public int getAnusElasticity() {
		return anusElasticity;
	}

	public int getAnusPlasticity() {
		return anusPlasticity;
	}

	public int getMaleHeight() {
		return maleHeight;
	}

	public int getMaleFemininity() {
		return maleFemininity;
	}

	public int getMaleMuscle() {
		return maleMuscle;
	}

	public int getMaleBodySize() {
		return maleBodySize;
	}

	public int getFemaleHeight() {
		return femaleHeight;
	}

	public int getFemaleFemininity() {
		return femaleFemininity;
	}

	public int getFemaleBodySize() {
		return femaleBodySize;
	}

	public int getFemaleMuscle() {
		return femaleMuscle;
	}

	public int getMaleAssSize() {
		return maleAssSize;
	}

	public int getFemaleAssSize() {
		return femaleAssSize;
	}

	public int getMaleHairLength() {
		return maleHairLength;
	}

	public int getFemaleHairLength() {
		return femaleHairLength;
	}

	public int getMaleHornLength() {
		return maleHornLength;
	}

	public int getFemaleHornLength() {
		return femaleHornLength;
	}

	public int getNoBreastSize() {
		return noBreastSize;
	}

	public int getBreastSize() {
		return breastSize;
	}

	public int getMaleLactationRate() {
		return maleLactationRate;
	}

	public int getFemaleLactationRate() {
		return femaleLactationRate;
	}

	public int getFemaleBreastElasticity() {
		return femaleBreastElasticity;
	}

	public int getMaleBreastElasticity() {
		return maleBreastElasticity;
	}

	public int getFemaleBreastPlasticity() {
		return femaleBreastPlasticity;
	}

	public int getMaleBreastPlasticity() {
		return maleBreastPlasticity;
	}

	public int getFemaleBreastCapacity() {
		return femaleBreastCapacity;
	}

	public int getMaleBreastCapacity() {
		return maleBreastCapacity;
	}

	public int getMaleNippleSize() {
		return maleNippleSize;
	}

	public int getFemaleNippleSize() {
		return femaleNippleSize;
	}

	public NippleShape getMaleNippleShape() {
		return maleNippleShape;
	}

	public NippleShape getFemaleNippleShape() {
		return femaleNippleShape;
	}

	public int getMaleNippleCountPerBreast() {
		return maleNippleCountPerBreast;
	}

	public int getFemaleNippleCountPerBreast() {
		return femaleNippleCountPerBreast;
	}

	public int getMaleAreolaeSize() {
		return maleAreolaeSize;
	}

	public int getFemaleAreolaeSize() {
		return femaleAreolaeSize;
	}

	public AbstractBreastType getBreastCrotchType() {
		return breastCrotchType;
	}

	public List<BreastShape> getBreastCrotchShapes() {
		return breastCrotchShapes;
	}

	public NippleShape getBreastCrotchNippleShape() {
		return breastCrotchNippleShape;
	}

	public int getBreastCrotchSize() {
		return breastCrotchSize;
	}

	public int getBreastCrotchLactationRate() {
		return breastCrotchLactationRate;
	}

	public int getBreastCrotchCapacity() {
		return breastCrotchCapacity;
	}

	public int getBreastCrotchElasticity() {
		return breastCrotchElasticity;
	}

	public int getBreastCrotchPlasticity() {
		return breastCrotchPlasticity;
	}

	public int getNippleCountPerBreastCrotch() {
		return nippleCountPerBreastCrotch;
	}

	public int getBreastCrotchAreolaeSize() {
		return breastCrotchAreolaeSize;
	}

	public int getBreastCrotchNippleSize() {
		return breastCrotchNippleSize;
	}

	public int getBreastCrotchCount() {
		return breastCrotchCount;
	}

	public int getClitSize() {
		return clitSize;
	}

	public int getPenisSize() {
		return penisSize;
	}

	public int getPenisGirth() {
		return penisGirth;
	}

	public int getTesticleSize() {
		return testicleSize;
	}

	public int getCumProduction() {
		return cumProduction;
	}

	public int getVaginaCapacity() {
		return vaginaCapacity;
	}

	public int getVaginaWetness() {
		return vaginaWetness;
	}

	public int getVaginaElasticity() {
		return vaginaElasticity;
	}

	public int getVaginaPlasticity() {
		return vaginaPlasticity;
	}

	public int getBreastCountMale() {
		return breastCountMale;
	}

	public int getBreastCountFemale() {
		return breastCountFemale;
	}

	public int getTesticleQuantity() {
		return testicleQuantity;
	}

	public int getMaleLipSize() {
		return maleLipSize;
	}

	public int getFemaleLipSize() {
		return femaleLipSize;
	}

	public int getMaleWingSize() {
		return maleWingSize;
	}

	public int getFemaleWingSize() {
		return femaleWingSize;
	}

	public GenitalArrangement getGenitalArrangement() {
		return genitalArrangement;
	}
}


code:
package com.lilithsthrone.game.character.race;

import com.lilithsthrone.utils.Colour;

/**
 * @since 0.1.0
 * @version 0.1.0
 * @author Innoxia
 */
public enum Disposition {

	CIVILIZED("civilized", Colour.CLOTHING_GREEN),
	NEUTRAL("neutral", Colour.CLOTHING_BLUE),
	UNPREDICTABLE("unpredictable", Colour.CLOTHING_ORANGE),
	SAVAGE("savage", Colour.CLOTHING_RED);

	private String name;
	private Colour colour;

	private Disposition(String name, Colour colour) {
		this.name = name;
		this.colour = colour;
	}

	public String getName() {
		return name;
	}

	public Colour getColour() {
		return colour;
	}
}


code:
package com.lilithsthrone.game.character.race;

import com.lilithsthrone.rendering.SVGImages;
import com.lilithsthrone.utils.Colour;

/**
 * @since 0.1.78
 * @version 0.1.99
 * @author Innoxia
 */
public enum FurryPreference {

	/**No furry parts at all. (NPCs will spawn as regular humans.)*/
	HUMAN("Disabled", Colour.TRANSFORMATION_HUMAN, "X") {
		@Override
		public String getDescriptionFeminine(Subspecies r) {
			return "Feminine "+r.getNamePlural(null)+" will be completely disabled in random encounters. If all feminine preferences are set to 'Disabled', random encounters will default to feminine humans.";
		}
		@Override
		public String getDescriptionMasculine(Subspecies r) {
			return "Masculine "+r.getNamePlural(null)+" will be completely disabled in random encounters. If all masculine preferences are set to 'Disabled', random encounters will default to masculine humans.";
		}
		@Override
		public String getSVGImage(boolean disabled) {
			return disabled?SVGImages.SVG_IMAGE_PROVIDER.getScaleZeroDisabled():SVGImages.SVG_IMAGE_PROVIDER.getScaleZero();
		}
	},

	/**NPCs will spawn with furry ears and eyes, and where applicable, furry tails, horns, antenna, and wings. They will not spawn with furry breasts or genitalia.*/
	MINIMUM("Minimum", Colour.TRANSFORMATION_PARTIAL, "--") {
		@Override
		public String getDescriptionFeminine(Subspecies r) {
			return "Feminine "+r.getNamePlural(null)+" will spawn with furry ears and eyes, and where applicable, furry tails, horns, antenna, and wings. They will not spawn with furry breasts or genitalia.";
		}

		@Override
		public String getDescriptionMasculine(Subspecies r) {
			return "Masculine "+r.getNamePlural(null)+" will spawn with furry ears and eyes, and where applicable, furry tails, horns, antenna, and wings. They will not spawn with furry breasts or genitalia.";
		}

		@Override
		public String getSVGImage(boolean disabled) {
			return disabled?SVGImages.SVG_IMAGE_PROVIDER.getScaleOneDisabled():SVGImages.SVG_IMAGE_PROVIDER.getScaleOne();
		}
	},

	/**NPCs will spawn with all of the furry parts that the 'Minimum' setting enables (ears, eyes, tails, horns, antenna, and wings). They also have the chance to spawn with furry breasts, genitalia, arms, and legs.*/
	REDUCED("Lesser", Colour.TRANSFORMATION_PARTIAL_FULL, "-") {
		@Override
		public String getDescriptionFeminine(Subspecies r) {
			return "Feminine "+r.getNamePlural(null)+" will spawn with all of the furry parts that the 'Minimum' setting enables (ears, eyes, tails, horns, antenna, and wings)."
						+ " They also have the chance to spawn with furry breasts, genitalia, arms, and legs.";
		}

		@Override
		public String getDescriptionMasculine(Subspecies r) {
			return "Masculine "+r.getNamePlural(null)+" will spawn with all of the furry parts that the 'Minimum' setting enables (ears, eyes, tails, horns, antenna, and wings)."
					+ " They also have the chance to spawn with furry breasts, genitalia, arms, and legs.";
		}

		@Override
		public String getSVGImage(boolean disabled) {
			return disabled?SVGImages.SVG_IMAGE_PROVIDER.getScaleTwoDisabled():SVGImages.SVG_IMAGE_PROVIDER.getScaleTwo();
		}
	},

	/**NPCs will spawn with all of the furry parts that the 'Minimum' setting enables (ears, eyes, tails, horns, antenna, and wings). They also have the chance to spawn with furry breasts, genitalia, arms, legs, skin/fur, and faces.*/
	NORMAL("Greater", Colour.TRANSFORMATION_LESSER, "+") {
		@Override
		public String getDescriptionFeminine(Subspecies r) {
			return "Feminine "+r.getNamePlural(null)+" will spawn with all of the furry parts that the 'Minimum' setting enables (ears, eyes, tails, horns, antenna, and wings)."
					+ " They also have the chance to spawn with furry breasts, genitalia, arms, legs, skin/fur, and faces.";
		}

		@Override
		public String getDescriptionMasculine(Subspecies r) {
			return "Masculine "+r.getNamePlural(null)+" will spawn with all of the furry parts that the 'Minimum' setting enables (ears, eyes, tails, horns, antenna, and wings)."
					+ " They also have the chance to spawn with furry breasts, genitalia, arms, legs, skin/fur, and faces.";
		}

		@Override
		public String getSVGImage(boolean disabled) {
			return disabled?SVGImages.SVG_IMAGE_PROVIDER.getScaleThreeDisabled():SVGImages.SVG_IMAGE_PROVIDER.getScaleThree();
		}
	},

	/**NPCs will always spawn with as many furry parts as is possible (ears, eyes, tails, horns, antenna, wings, breasts, genitalia, arms, legs, skin/fur, and face).*/
	MAXIMUM("Maximum", Colour.TRANSFORMATION_GREATER, "++") {
		@Override
		public String getDescriptionFeminine(Subspecies r) {
			return "Feminine "+r.getNamePlural(null)+" will always spawn with as many furry parts as is possible (ears, eyes, tails, horns, antenna, wings, breasts, genitalia, arms, legs, skin/fur, and face).";
		}

		@Override
		public String getDescriptionMasculine(Subspecies r) {
			return "Masculine "+r.getNamePlural(null)+" will always spawn with as many furry parts as is possible (ears, eyes, tails, horns, antenna, wings, breasts, genitalia, arms, legs, skin/fur, and face).";
		}

		@Override
		public String getSVGImage(boolean disabled) {
			return disabled?SVGImages.SVG_IMAGE_PROVIDER.getScaleFourDisabled():SVGImages.SVG_IMAGE_PROVIDER.getScaleFour();
		}
	};

	private String name;
	private Colour colour;
	private String buttonText;

	private FurryPreference(String name, Colour colour, String buttonText) {
		this.name = name;
		this.colour = colour;
		this.buttonText = buttonText;
	}

	public abstract String getSVGImage(boolean disabled);

	public String getName() {
		return name;
	}

	public Colour getColour() {
		return colour;
	}

	public String getButtonText() {
		return buttonText;
	}

	public abstract String getDescriptionFeminine(Subspecies r);
	public abstract String getDescriptionMasculine(Subspecies r);
}