code:
package com.lilithsthrone.world.places;

import java.util.ArrayList;
import java.util.List;
import com.lilithsthrone.game.character.npc.dominion.Arthur;
import com.lilithsthrone.game.character.quests.Quest;
import com.lilithsthrone.game.character.quests.QuestLine;
import com.lilithsthrone.game.occupantManagement.MilkingRoom;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Units;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.Util.Value;
import com.lilithsthrone.world.Cell;
import com.lilithsthrone.world.WorldType;

/**
 * @since 0.1.85
 * @version 0.3.5
 * @author Innoxia
 */
public enum PlaceUpgrade {

	//**** MISC. UPGRADES ****//

	SLAVERY_ADMINISTRATION_CELLS(true,
			Colour.GENERIC_ARCANE,
			"Dingy Cells",
			"-",
			"",
			"Finch doesn't put any effort into the maintenance of the cells beneath Slavery Administration, and as a result, any slaves kept here will quickly lose whatever affection and obedience they have.",
			200,
			0,
			0,
			1000,
			-0.5f,
			-0.5f,
			null),

	LILAYA_EMPTY_ROOM(true,
			Colour.GENERIC_ARCANE,
			"Empty Room",
			"Rose will return this room to its original state, which will render it unsuitable for housing any of your slaves.",
			"This room is empty, and would need conversion work to be done if you'd like to house any of your slaves here.",
			"This room is unoccupied, and although Rose seems to be doing an excellent job of keeping it clean and well-dusted, it seems a shame that it's not being used to its full potential...",
			2000,
			0,
			0,
			0,
			0,
			0,
			null) {

		@Override
		public boolean isSlaverUpgrade() {
			return false;
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();

			if(place.getPlaceUpgrades().contains(LILAYA_MILKING_ROOM)) {
				Main.game.getOccupancyUtil().removeMilkingRoom(Main.game.getOccupancyUtil().getMilkingRoom(c.getType(), c.getLocation()));
			}

			for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
				if(upgrade != LILAYA_EMPTY_ROOM) {
					place.removePlaceUpgrade(c, upgrade);
				}
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			boolean nonCompanionCharactersPresent = false;
			if(cell.getCharactersPresentIds()!=null) {
				for(String id : cell.getCharactersPresentIds()) {
					if(!id.equals(Main.game.getPlayer().getId()) && !Main.game.getPlayer().getCompanionsId().contains(id)) {
						nonCompanionCharactersPresent = true;
					}
				}
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty() || nonCompanionCharactersPresent) {
				return new Value<>(false, "This room needs to be unoccupied and not currently in use in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	LILAYA_ARTHUR_ROOM(true,
			Colour.RACE_HUMAN,
			"Arthur's Room",
			"Help Rose to move arcane instrumentation into this room in order to make it suitable for Arthur to stay in. <b>This is a permanent modification, and can never be undone!</b>",
			"This room now belongs to Arthur, who uses it as his personal lab-cum-bedroom.",
			"This room is unoccupied, and although Rose seems to be doing an excellent job of keeping it clean and well-dusted, it seems a shame that it's not being used to its full potential...",
			0,
			0,
			0,
			0,
			0,
			0,
			null) {
		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			place.setPlaceType(PlaceType.LILAYA_HOME_ARTHUR_ROOM);
			for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
				if(upgrade != LILAYA_ARTHUR_ROOM) {
					place.removePlaceUpgrade(c, upgrade);
				}
			}
			c.getPlace().setName("Arthur's Room");
			if(Main.game.isStarted()) {
				Main.game.getNpc(Arthur.class).setLocation(c.getType(), c.getLocation(), true);
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(Main.game.getPlayer().isQuestProgressLessThan(QuestLine.MAIN, Quest.MAIN_1_J_ARTHURS_ROOM)
					|| !Main.game.getWorlds().get(WorldType.LILAYAS_HOUSE_GROUND_FLOOR).getCells(LILAYA_ARTHUR_ROOM).isEmpty()
					|| !Main.game.getWorlds().get(WorldType.LILAYAS_HOUSE_FIRST_FLOOR).getCells(LILAYA_ARTHUR_ROOM).isEmpty()) {
				return new Value<>(false, "");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty()) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	//**** GUEST ROOM ****//

	LILAYA_GUEST_ROOM(true,
			Colour.GENERIC_ARCANE,
			"Guest Room",
			"Rose will prepare this room for one of your guests, making it suitable for housing one person."
					+ " While not the most economical option, the occupant of this room will no doubt appreciate having their own personal space.",
			"This room has been converted into a suitable place for housing one of your guests.",
			"You've paid to have this room converted into a basic guest room."
					+ " A single-size bed, covered in a plain white duvet, sits against one wall."
					+ " Beside it, there's a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Other than that, the only other pieces of furniture in here are a wooden wardrobe and chest of drawers.",
			2000,
			0,
			100,
			1,
			0,
			0,
			null) {

		@Override
		public boolean isSlaverUpgrade() {
			return false;
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getPlayer().isQuestCompleted(QuestLine.SIDE_ACCOMMODATION)) {
				return new Value<>(false, "To install a guest bedroom, you'd need to first find someone to invite to live with you, and then get Lilaya's permission to make the upgrade.");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty()) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
				if(upgrade != LILAYA_GUEST_ROOM) {
					place.removePlaceUpgrade(c, upgrade);
				}
			}
		}
	},

	LILAYA_GUEST_ROOM_SUITE(true,//TODOGamma
			Colour.GENERIC_ARCANE,
			"Guest Suite",
			"Rose will prepare this room for a group of your guests, making it suitable for housing friends and family."
					+ " While not the most economical option for you and a little cramped for the occupants, they still appreciate having a place to live.",
			"This room has been converted into a suitable place for housing your guests.",
			"You've paid to have this room converted into a guest suite."
					+ " In each corner sits a single-size bed made up with a a plain white duvet."
					+ " Beside each is a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Note: You can move people in here from a single occupant guest room but can't invite them without a single occupant guest room.",
			10000,
			0,
			500,
			4,
			0,
			0,
			null) {

		@Override
		public boolean isSlaverUpgrade() {
			return false;
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getPlayer().isQuestCompleted(QuestLine.SIDE_ACCOMMODATION)) {
				return new Value<>(false, "To install a guest bedroom, you'd need to first find someone to invite to live with you, and then get Lilaya's permission to make the upgrade.");
			}
			return super.getExtraConditionalAvailability(cell);
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			if(place.getPlaceUpgrades().contains(LILAYA_GUEST_ROOM)) {
				place.removePlaceUpgrade(c, LILAYA_GUEST_ROOM);

			} else {
				for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
					if(upgrade != LILAYA_GUEST_ROOM_SUITE) {
						place.removePlaceUpgrade(c, upgrade);
					}
				}
			}
		}
	},

	//**** SLAVE UPGRADES ****//

	LILAYA_SLAVE_ROOM(true,
			Colour.GENERIC_ARCANE,
			"Slave's Room",
			"Rose will prepare this room just like she would for any other guest, making it suitable for housing just one of your slaves."
					+ " While not the most economical choice if you plan on owning a large number of slaves, the occupant of this room will no doubt appreciate having their own personal space.",
			"This room has been converted into a suitable place for housing one of your slaves.",
			"You've paid to have this room converted into basic slave's quarters."
					+ " A single-size bed, covered in a plain white duvet, sits against one wall."
					+ " Beside it, there's a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Other than that, the only other pieces of furniture in here are a wooden wardrobe and chest of drawers.",
			2000,
			0,
			100,
			1,
			0,
			0,
			null) {

		@Override
		public String getRoomDescription(Cell c) {
			GenericPlace place = c.getPlace();

			if(place.getPlaceUpgrades().contains(PlaceUpgrade.LILAYA_SLAVE_ROOM_UPGRADE_BED)) {
				return "You've paid to have this room converted into basic slave's quarters."
						+ " A comfortable double size bed, covered in a warm, fluffy duvet, sits against one wall."
						+ " Beside it, there's a simple bedside cabinet, complete with arcane-powered lamp."
						+ " Other than that, the only other pieces of furniture in here are a wooden wardrobe and chest of drawers.";

			} else if(place.getPlaceUpgrades().contains(PlaceUpgrade.LILAYA_SLAVE_ROOM_DOWNGRADE_BED)) {
				return "You've paid to have this room converted into basic slave's quarters."
						+ " An uncomfortable single-size bed, covered in a thin blanket, sits against one wall."
						+ " Beside it, there's a simple bedside cabinet, complete with arcane-powered lamp."
						+ " Other than that, the only other pieces of furniture in here are a wooden wardrobe and chest of drawers.";

			}else {
				return "You've paid to have this room converted into basic slave's quarters."
						+ " A single-size bed, covered in a plain white duvet, sits against one wall."
						+ " Beside it, there's a simple bedside cabinet, complete with arcane-powered lamp."
						+ " Other than that, the only other pieces of furniture in here are a wooden wardrobe and chest of drawers.";
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty()) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
				if(upgrade != LILAYA_SLAVE_ROOM) {
					place.removePlaceUpgrade(c, upgrade);
				}
			}
		}
	},

	LILAYA_SLAVE_ROOM_DOUBLE(true,
			Colour.BASE_MAGENTA,
			"Double Slave Room",
			"Rose will prepare this room just like she would for any other guest, making it suitable for housing two of your slaves."
					+ " While more cost-effective than giving each slave their own room, the occupants will no doubt be a little frustrated at having to share their personal space with another slave,"
						+ " and will also get the opportunity to conspire with one another against you.",
			"This room has been converted into a suitable place for housing two of your slaves.",
			"You've paid to have this room converted so that it's suitable for housing two of your slaves."
					+ " A pair of single-size beds, covered in a plain white duvets, sit against opposite walls."
					+ " Beside each one, there's a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Other than that, the only other pieces of furniture in here are a single wooden wardrobe and solitary chest of drawers.",
			3500,
			0,
			100,
			2,
			-0.05f,
			-0.05f,
			null) {

		@Override
		public String getRoomDescription(Cell c) {
			GenericPlace place = c.getPlace();

			if(place.getPlaceUpgrades().contains(PlaceUpgrade.LILAYA_SLAVE_ROOM_UPGRADE_BED)) {
				return "You've paid to have this room converted so that it's suitable for housing two of your slaves."
							+ " Two double size beds, covered in warm, fluffy duvets, sit against opposite walls."
							+ " On either side of them, there are simple bedside cabinets, each complete with its own arcane-powered lamp."
							+ " Other than those, the only other pieces of furniture in here are a pair of wooden wardrobes and two chests of drawers.";

			} else if(place.getPlaceUpgrades().contains(PlaceUpgrade.LILAYA_SLAVE_ROOM_DOWNGRADE_BED)) {
				return "You've paid to have this room converted so that it's suitable for housing two of your slaves."
						+ " A pair of uncomfortable single-size beds, covered in thin blankets, sit against opposite walls."
						+ " Beside each one, there's a simple bedside cabinet, complete with arcane-powered lamp."
						+ " Other than that, the only other pieces of furniture in here are a single wooden wardrobe and solitary chest of drawers.";

			}else {
				return "You've paid to have this room converted so that it's suitable for housing two of your slaves."
					+ " A pair of single-size beds, covered in a plain white duvets, sit against opposite walls."
					+ " Beside each one, there's a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Other than that, the only other pieces of furniture in here are a single wooden wardrobe and solitary chest of drawers.";
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty() && !cell.getPlace().getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM)) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			if(place.getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM)) {
				place.removePlaceUpgrade(c, LILAYA_SLAVE_ROOM);

			} else {
				for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
					if(upgrade != LILAYA_SLAVE_ROOM_DOUBLE) {
						place.removePlaceUpgrade(c, upgrade);
					}
				}
			}
		}
	},

	LILAYA_SLAVE_ROOM_QUADRUPLE(true,
			Colour.BASE_MAGENTA,
			"Quadruple Slave Room",
			"Rose will prepare this room just like she would for any other guest, making it suitable for housing four of your slaves."
					+ " While a lot more cost-effective than giving each slave their own room, the occupants will no doubt be a little frustrated at having to share their personal space with another slave,"
						+ " and will also get plenty of opportunities to conspire with one another against you.",
			"This room has been converted into a suitable place for housing four of your slaves.",
			"You've paid to have this room converted so that it's suitable for housing four of your slaves."
					+ " Four single-size beds, covered in a plain white duvets, sit against the walls."
					+ " Beside each one, there's a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Other than that, the only other pieces of furniture in here are a pair of wooden wardrobes and two chests of drawers.",
			6000,
			0,
			100,
			4,
			-0.1f,
			-0.2f,
			null) {

		@Override
		public String getRoomDescription(Cell c) {
			GenericPlace place = c.getPlace();

			if(place.getPlaceUpgrades().contains(PlaceUpgrade.LILAYA_SLAVE_ROOM_UPGRADE_BED)) {
				return "You've paid to have this room converted so that it's suitable for housing four of your slaves."
						+ " Four double size beds, covered in warm, fluffy duvets, sit against the walls."
						+ " On either side of each one, there are simple bedside cabinets, upon which there are arcane-powered lamps."
						+ " Other than those, the only other pieces of furniture in here are four wooden wardrobes and four chests of drawers.";

			} else if(place.getPlaceUpgrades().contains(PlaceUpgrade.LILAYA_SLAVE_ROOM_DOWNGRADE_BED)) {
				return "You've paid to have this room converted so that it's suitable for housing four of your slaves."
						+ " Four uncomfortable, single-size beds, covered in thin blankets, sit against the walls."
						+ " Beside each one, there's a simple bedside cabinet, complete with arcane-powered lamp."
						+ " Other than those, the only other pieces of furniture in here are a pair of wooden wardrobes and two chests of drawers.";

			}else {
				return "You've paid to have this room converted so that it's suitable for housing four of your slaves."
					+ " Four single-size beds, covered in plain white duvets, sit against the walls."
					+ " Beside each one, there's a simple bedside cabinet, complete with arcane-powered lamp."
					+ " Other than that, the only other pieces of furniture in here are a single wooden wardrobe and solitary chest of drawers.";
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty()
					 && !cell.getPlace().getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM)
					 && !cell.getPlace().getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM_DOUBLE)) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			if(place.getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM)) {
				place.removePlaceUpgrade(c, LILAYA_SLAVE_ROOM);

			} else if(place.getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM_DOUBLE)) {
				place.removePlaceUpgrade(c, LILAYA_SLAVE_ROOM_DOUBLE);

			} else {
				for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
					if(upgrade != LILAYA_SLAVE_ROOM_QUADRUPLE) {
						place.removePlaceUpgrade(c, upgrade);
					}
				}
			}
		}
	},

	////Notes relating to cabin mod but could be useful regarding the four person room
    ////Need to insert something into the upgrade code just above, not sure what yet
    ////Need to investigate adding passive affection gain with other slaves to these options
    ////Affection gain with other slaves 0.020 per day, this would reflect slaves grouping together and talking/supporting each other?
    ////Is this already a thing that happens if they share a room? - SV

	LILAYA_SLAVE_ROOM_DOWNGRADE_BED(false,
			Colour.GENERIC_BAD,
			"Small Steel Bed",
			"Replace the bed in this room with a steel-framed one, complete with an uncomfortable mattress, a hard pillow, and a thin blanket."
					+ " These changes will leave no doubt in the occupant's mind that they're a slave.",
			"A small, single size bed, complete with an uncomfortable mattress, a hard pillow, and a thin blanket, has been installed in this room.",
			"A small, single size bed, complete with an uncomfortable mattress, a hard pillow, and a thin blanket, sits against one side of the room."
					+ " Providing this room's occupant with such an uncomfortable place to sleep will definitely reinforce the fact that they're a slave, but at the same time, they're bound to dislike you more...",
			250,
			100,
			-10,
			0,
			-0.1f,
			0.2f,
			null) {

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM_UPGRADE_BED)) {
				return new Value<>(false, "The 'Double Size Bed' upgrade must be removed before the 'Small Steel Bed' can be installed.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	LILAYA_SLAVE_ROOM_UPGRADE_BED(false,
			Colour.GENERIC_GOOD,
			"Double Size Bed",
			"Install a double size bed in this room, along with a more comfortable mattress, fluffy pillows, and a warm duvet."
					+ " The occupant of this room is sure to appreciate these upgrades.",
			"A double size bed, complete with a comfortable mattress, fluffy pillows, and a warm duvet, has been installed in this room.",
			"A double size bed, complete with a comfortable mattress, fluffy pillows, and a warm duvet, sits against one side of the room."
					+ " Providing this room's occupant with such a delightful place to sleep will definitely get them to like you more, although such luxury might make them forget their place...",
			500,
			200,
			25,
			0,
			0.2f,
			-0.1f,
			null) {

		@Override
		public String getRoomDescription(Cell c) {
			GenericPlace place = c.getPlace();

			if(place.getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM_DOUBLE)) {
				return "This is a duplicate? This room's pair of single-sized beds have been replaced with double-sized ones, complete with comfortable mattresses, fluffy pillows, and a warm duvet each.";
						//+ " The pair of slaves assigned to be this room's occupants will have to learn to live with the fact that they now sleep in the same bed...";
			} else {
				return "This is a duplicate? A double size bed, complete with a comfortable mattress, fluffy pillows, and a warm duvet, sits against one side of the room."
						+ " Providing this room's occupant with such a delightful place to sleep will definitely get them to like you more, although such luxury might make them forget their place...";
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_SLAVE_ROOM_DOWNGRADE_BED)) {
				return new Value<>(false, "The 'Small Steel Bed' upgrade must be removed before the 'Double Size Bed' can be installed.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	LILAYA_SLAVE_ROOM_OBEDIENCE_TRAINER(false,
			Colour.GENERIC_ARCANE,
			"Obedience Trainer",
			"Lilaya has asked you if you'd consider installing one of her experimental devices in this room; a so-called 'obedience trainer'."
					+ " This particular addition takes the form of a large, glowing crystal that is to be placed in the centre of the room."
					+ " Whenever the room's occupant thinks a disobedient thought, the crystal will shoot out a shocking bolt of arcane energy, thereby training a slave's obedience in the most intrusive fashion imaginable.",
			"You've installed one one of Lilaya's experimental devices in this room; a so-called 'obedience trainer'."
					+ " This particular addition takes the form of a large, glowing crystal that has been placed in the centre of the room."
					+ " Whenever the room's occupant thinks a disobedient thought, the crystal shoots out a shocking bolt of arcane energy, thereby training a slave's obedience in the most intrusive fashion imaginable.",
			"One of Lilaya's experimental devices, a so-called 'obedience trainer', has been installed in the middle of this room."
					+ " Taking the form of a large, glowing crystal, the obedience trainer will shoot a shocking bolt of arcane energy at any slave nearby that dares to think a disobedient thought."
					+ " Although highly effective at training obedience, any slaves subjected to this intrusive training method will be sure to loathe you before long...",
			10000,
			500,
			250,
			0,
			-0.2f,
			0.4f,
			null),

	LILAYA_SLAVE_ROOM_ROOM_SERVICE(false,
			Colour.GENERIC_ARCANE,
			"Room service",
			"You could offer this room's occupant unlimited room service."
					+ " This isn't exactly how most owners treat their slaves, and while it's sure to make the occupant like you more, it's also going to cost quite a bit in upkeep, as well as have some negative effects on their obedience...",
			"You've offered unlimited room service to the occupant of this room."
					+ " It's definitely making them like you more, but it's also costing a fair amount in upkeep, and is having a negative effect on your slave's obedience...",
			"A little push-trolley with a few empty silver plates and glasses stacked on top of it is evidence that the slave who lives here is taking full advantage of the unlimited room service you've offered to them."
					+ " It's definitely making them like you more, but having such a luxury available to them is also having a negative impact on their obedience, not to mention the damage it's doing to your bank account...",
			100,
			0,
			250,
			0,
			0.4f,
			-0.2f,
			null),

	LILAYA_SLAVE_ROOM_ARCANE_INSTRUMENTS(false,
			Colour.GENERIC_ARCANE,
			"Arcane Instruments",
			"Allow Lilaya to install arcane sensors in this room, so that she can gather useful data on your slave's aura."
					+ " Your slaves will find this to be an intrusion on what little personal space they have, and their affection towards you will suffer as a result.",
			"A series of arcane sensors have been set up around this room, allowing Lilaya to gather useful data on your slave's aura."
					+ " Your slaves find this to be an intrusion on what little personal space they have, and their affection towards you will suffer as a result.",
			"In exchange for lowering this room's upkeep, Lilaya has installed several arcane instruments around the room, which allow her to gather data about any slave being housed in here."
					+ " A couple of them give off a very quiet humming noise, which, combined with their faint purple glow, makes them quite intrusive, and will negatively impact the occupant's affection towards you.",
			500,
			100,
			-25,
			0,
			-0.1f,
			0f,
			null),

	//**** MILKING UPGRADES ****//

	LILAYA_MILKING_ROOM(true,
			Colour.BASE_ORANGE,
			"Milking Room",
			"Install milking machines in this room, allowing [style.colourGood(eight)] of your slaves to be assigned to work in here, each of which will be milked of their milk and cum.<br/>"
					+ "<i>Milk: "+Units.fluid(MilkingRoom.BASE_MILKING_AMOUNT)+" per hour<br/>"
					+ "Cum: "+Units.fluid(MilkingRoom.BASE_CUM_MILKING_AMOUNT)+" per hour<br/>"
					+ "Girlcum: "+Units.fluid(MilkingRoom.BASE_GIRLCUM_MILKING_AMOUNT)+" per hour</i>",
			"This room has been converted into a suitable place for milking [style.colourGood(eight)] of your slaves' milk and cum.",
			"This room has been converted into a special milking room, in which eight of your slaves can be milked of their various fluids."
					+ " Four machines are set along the left-hand side of the wall, with the other four being placed on the opposite side of the room.",
			10000,
			0,
			500,
			0,
			0,
			0,
			null) {

		@Override
		public String getRoomDescription(Cell c) {
			MilkingRoom room = Main.game.getOccupancyUtil().getMilkingRoom(c.getType(), c.getLocation());

			return room.getRoomDescription();
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
				if(upgrade != LILAYA_MILKING_ROOM) {
					place.removePlaceUpgrade(c, upgrade);
				}
			}
			if(Main.game.getOccupancyUtil().getMilkingRoom(c.getType(), c.getLocation())==null) {
				Main.game.getOccupancyUtil().addMilkingRoom(new MilkingRoom(c.getType(), c.getLocation()));
			}
		}

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty()) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	LILAYA_MILKING_ROOM_ARTISAN_MILKERS(false,
			Colour.GENERIC_ARCANE,
			"Artisan Milkers",
			"You could replace the standard milking machines in this room with very expensive artisan ones."
					+ " While being far more comfortable for the slaves that use them, these milking machines seem to be designed more for show than practicality, and deliver a slightly lower milk output than the regular machines.<br/>"
					+ "<i>Milk: "+Units.fluid(MilkingRoom.ARTISAN_MILKING_AMOUNT)+" per hour<br/>"
					+ "Cum: "+Units.fluid(MilkingRoom.ARTISAN_CUM_MILKING_AMOUNT)+" per hour<br/>"
					+ "Girlcum: "+Units.fluid(MilkingRoom.ARTISAN_GIRLCUM_MILKING_AMOUNT)+" per hour</i>",
			"You've installed artisan milking machines in this room."
					+ " The slaves that have the good fortune to be locked into these machines are sure to appreciate you for it.<br/>"
					+ "<i>Milk: "+Units.fluid(MilkingRoom.ARTISAN_MILKING_AMOUNT)+" per hour<br/>"
					+ "Cum: "+Units.fluid(MilkingRoom.ARTISAN_CUM_MILKING_AMOUNT)+" per hour<br/>"
					+ "Girlcum: "+Units.fluid(MilkingRoom.ARTISAN_GIRLCUM_MILKING_AMOUNT)+" per hour</i>",
			"The artisan, arcane-powered milking machines that have been placed in this room fill the air with a very soft, almost melodic, humming noise."
					+ " Although they're far more comfortable than regular milking machines, they appear to be designed more for show than practicality, and while your slaves are sure to be happy, milk output is a lot lower than normal.",
			2500,
			500,
			250,
			0,
			1f,
			0.5f,
			null) {

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_MILKING_ROOM_INDUSTRIAL_MILKERS)) {
				return new Value<>(false, "The 'Industrial Milkers' upgrade must be removed before the 'Artisan Milkers' can be installed.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	LILAYA_MILKING_ROOM_INDUSTRIAL_MILKERS(false,
			Colour.GENERIC_ARCANE,
			"Industrial Milkers",
			"You could replace the standard milking machines in this room with industrial-grade ones."
					+ " While being far less comfortable for the slaves that use them, these milking machines maximise both milk output and profit.<br/>"
					+ "<i>Milk: 500ml to 1000ml per hour<br/>"
					+ "Cum: 50ml to 250ml per hour<br/>"
					+ "Girlcum: 10ml to 50ml per hour</i>",
			"You've installed industrial milking machines in this room."
					+ " The slaves that have the misfortune to be locked into these machines are sure to hate you for it.<br/>"
					+ "<i>Milk: "+Units.fluid(MilkingRoom.INDUSTRIAL_MILKING_AMOUNT)+" per hour<br/>"
					+ "Cum: "+Units.fluid(MilkingRoom.INDUSTRIAL_CUM_MILKING_AMOUNT)+" per hour<br/>"
					+ "Girlcum: "+Units.fluid(MilkingRoom.INDUSTRIAL_GIRLCUM_MILKING_AMOUNT)+" per hour</i>",
			"The industrial, arcane-powered milking machines that have been placed in this room fill the air with a steady background humming noise."
					+ " Although they're sure to maximise milk output, and profits, these machines aren't exactly the most comfortable of devices to be strapped in to, and any slaves assigned to me milked in here are sure to hate you for it...",
			1500,
			500,
			100,
			0,
			-1f,
			0.5f,
			null) {

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_MILKING_ROOM_ARTISAN_MILKERS)) {
				return new Value<>(false, "The 'Artisan Milkers' upgrade must be removed before the 'Industrial Milkers' can be installed.");
			}
			return super.getExtraConditionalAvailability(cell);
		}
	},

	LILAYA_MILKING_ROOM_MILK_EFFICIENCY(false,
			Colour.MILK,
			"Lact-o-Cups",
			"The company that makes the milking machines also offers a selection of aftermarket upgrades. One of these is 'Lact-o-Cups', which promises to double the machine's maximum hourly milking efficiency.",
			"You've added the optional 'Lact-o-Cups' to the milking machines in this room, doubling their maximum hourly milking efficiency.",
			"The standard suction cups on each machine have been replaced with aftermarket 'Lact-o-Cups', which are doubling the maximum amount of milk extracted per hour.",
			500,
			100,
			10,
			0,
			0,
			0,
			null),

	LILAYA_MILKING_ROOM_CUM_EFFICIENCY(false,
			Colour.CUM,
			"Succ-u-Buses",
			"The company that makes the milking machines also offers a selection of aftermarket upgrades. One of these is 'Succ-u-Buses', which promises to double the machine's maximum hourly cum-milking efficiency.",
			"You've added the optional 'Succ-u-Buses' to the milking machines in this room, doubling their maximum hourly cum-milking efficiency.",
			"The standard cock-milking tubes on each machine have been replaced with aftermarket 'Succ-u-Buses', which are doubling the maximum amount of cum extracted per hour.",
			500,
			100,
			10,
			0,
			0,
			0,
			null),

	LILAYA_MILKING_ROOM_GIRLCUM_EFFICIENCY(false,
			Colour.GIRLCUM,
			"Vibro-Pumps",
			"The company that makes the milking machines also offers a selection of aftermarket upgrades. One of these is 'Vibro-Pumps', which promises to double the machine's maximum hourly girlcum-milking efficiency.",
			"You've added the optional 'Vibro-Pumps' to the milking machines in this room, doubling their maximum hourly girlcum-milking efficiency.",
			"The standard vaginal pumps on each machine have been replaced with aftermarket 'Vibro-Pumps', which are doubling the maximum amount of girlcum extracted per hour.",
			500,
			100,
			10,
			0,
			0,
			0,
			null),

	//**** OFFICE UPGRADES ****//

	LILAYA_OFFICE(true,
			Colour.BASE_TEAL,
			"Office",
			"Due to the heavily-regulated exotic materials which Lilaya regularly orders for use in her laboratory, she has a significant amount of paperwork which needs to be completed each month."
					+ " By having Rose replace this room's furniture with desks, chairs, and filing cabinets, you could have it turned into an office space in which [style.colourGood(four)] of your slaves could be paid to complete this work for her."
					+ " [style.italicsGood(You will also gain access to the 'Occupancy ledger' when in the office!)]",
			"This room has been converted into an office, with enough desks and room to comfortably accommodate [style.colourGood(four)] workers."
					+ " [style.italicsGood(You have also gained access to the 'Occupancy ledger' when in the office!)]",
			"In order to help Lilaya with her copious amounts of paperwork related to exotic material acquisition, you've had this room converted into a four-person-capacity office."
					+ " Along with the forms related to Lilaya's heavily-regulated purchases, the workers assigned here are tasked with keeping records in a general 'Occupancy ledger', which you can access here at any time.",
			8000,
			500,
			250,
			0,
			0,
			0,
			null) {

		@Override
		protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
			if(cell.getPlace().getPlaceUpgrades().contains(LILAYA_ARTHUR_ROOM)) {
				return new Value<>(false, "");
			}
			if(!Main.game.getWorlds().get(WorldType.LILAYAS_HOUSE_GROUND_FLOOR).getCells(LILAYA_OFFICE).isEmpty()
					|| !Main.game.getWorlds().get(WorldType.LILAYAS_HOUSE_FIRST_FLOOR).getCells(LILAYA_OFFICE).isEmpty()) {
				return new Value<>(false, "There isn't enough paperwork to justify having more than one office.");
			}
			if(!Main.game.getCharactersTreatingCellAsHome(cell).isEmpty()) {
				return new Value<>(false, "This room needs to be unoccupied in order to purchase this modification.");
			}
			return super.getExtraConditionalAvailability(cell);
		}

		@Override
		public void applyInstallationEffects(Cell c) {
			GenericPlace place = c.getPlace();
			for(PlaceUpgrade upgrade : PlaceUpgrade.values()) {
				if(upgrade != LILAYA_OFFICE) {
					place.removePlaceUpgrade(c, upgrade);
				}
			}
		}
	},

	LILAYA_OFFICE_EXECUTIVE_UPGRADE(false,
			Colour.BASE_GOLD,
			"Executive Office",
			"Tell Rose to outfit this office with the most luxurious and extravagant furnishings she can get her hands on."
					+ " Although sure to instill a sense of respect in any worker who's assigned to this office, the finest furniture in Dominion doesn't exactly come cheap...",
			"You've had this office fitted out with the most upmarket furnishings available, which are sure to instill a sense of respect for you in anyone who's assigned to work here.",
			"You've had this office outfitted with the most luxurious and extravagantly opulent furnishings which money can buy."
					+ " Each of the four work stations have their own masterfully carved mahogany desk, and fixed to the walls behind them are shelves filled with artisanal leather-bound record books.",
			500000,
			-200000,
			50,
			0,
			0.25f,
			1f,
			null),

	LILAYA_OFFICE_COFFEE_MACHINE(false,
			Colour.BASE_BROWN_DARK,
			"Coffee Machine",
			"Rose has informed you that she knows of an excellent arcane-powered coffee machine available for purchase."
					+ " Capable of dispensing a wide range of both hot and cold caffeinated beverages, such a machine is sure to be appreciated by the workers assigned to this office.",
			"You've purchased an arcane-powered coffee machine for this office, which is very much appreciated by the slaves assigned to work here.",
			"An arcane-powered coffee machine, capable of dispensing a wide range of both hot and cold caffeinated beverages, sits in one corner of the room.",
			5000,
			100,
			250,
			0,
			0.1f,
			0.05f,
			null),

	LILAYA_OFFICE_PARTITIONING_WALLS(false,
			Colour.BASE_TAN,
			"Partitioning Walls",
			"You could have some partitioning walls set up in this office, which would give each of the four potential workers assigned here their own personal space in which to get on with their work.",
			"You've had several partitioning walls set up in this office, which afford each worker a little more privacy and peace in which to get on with the work that's assigned to them.",
			"Each of the four work stations in this office have been separated from one another by means of partitioning walls, affording the workers some privacy and peace in which to get on with the tasks assigned to them.",
			2500,
			500,
			0,
			0,
			0.05f,
			0,
			null),

	// Player's room:

	LILAYA_PLAYER_ROOM_BED(false,
			Colour.BASE_GOLD,
			"Emperor-Size Bed",
			"Have your current, king-size bed replaced by a huge, 'emperor-size' one. [style.italicsGood(This will improve the 'well rested' bonus gained from resting in your room.)]",
			"Your old, king-size bed has been replaced by a huge, 'emperor-size' one. [style.italicsGood(The 'well rested' bonus gained from resting in your room has been improved!)]",
			"Your old, king-size bed has been replaced by a huge, 'emperor-size' one, which sits in a dominant position against one wall of your room."
					+ " Its comfortable mattress, fluffy pillows, and warm duvet ensure that you always feel extremely well rested after sleeping in it.",
			10000,
			-5000,
			0,
			0,
			0.2f,
			-0.1f,
			null) {
		public Value<Boolean, String> getAvailability(Cell cell) {
			return new Value<>(true, "");
		}
	},

	LILAYA_PLAYER_ROOM_BATH(false,
			Colour.BASE_BLUE_LIGHT,
			"Bathroom Extension",
			"By knocking through into an adjacent storage room, it would be possible to greatly extend the size of your bathroom."
					+ " With this extra space, you could turn it into a private spa, installing not only a huge new bathtub, but also a sauna and self-contained steam room.",
			"By knocking through into an adjacent storage room, you have greatly extended the size of your bathroom."
					+ " With this extra space, you've turned it into a private spa, having installed not only a huge new bathtub, but also a sauna and self-contained steam room.",
			"By knocking through into an adjacent storage room, your old bathroom has been greatly extended and converted into a private spa."
					+ " A massive bathtub, able to hold at least ten people at once, stretches across the entire right-hand side of the room, while to the left, both an enclosed sauna and a self-contained steam room have been constructed.",
			300000,
			100000,
			0,
			0,
			0.5f,
			-0.25f,
			null) {
		public Value<Boolean, String> getAvailability(Cell cell) {
			return new Value<>(true, "");
		}
	},
	;

	private static ArrayList<PlaceUpgrade> coreRoomUpgrades;
	private static ArrayList<PlaceUpgrade> guestRoomUpgrades;
	private static ArrayList<PlaceUpgrade> guestRoomUpgradesSuite;
	private static ArrayList<PlaceUpgrade> slaveQuartersUpgradesSingle;
	private static ArrayList<PlaceUpgrade> slaveQuartersUpgradesDouble;
	private static ArrayList<PlaceUpgrade> slaveQuartersUpgradesQuadruple;
	private static ArrayList<PlaceUpgrade> milkingRoomUpgrades;
	private static ArrayList<PlaceUpgrade> officeUpgrades;

	public static ArrayList<PlaceUpgrade> getCoreRoomUpgrades() {
		return coreRoomUpgrades;
	}

	public static ArrayList<PlaceUpgrade> getGuestRoomUpgrades() {
		return guestRoomUpgrades;
	}

	public static ArrayList<PlaceUpgrade> getGuestRoomUpgradesSuite() {
		return guestRoomUpgradesSuite;
	}

	public static ArrayList<PlaceUpgrade> getSlaveQuartersUpgradesSingle() {
		return slaveQuartersUpgradesSingle;
	}

	public static ArrayList<PlaceUpgrade> getSlaveQuartersUpgradesDouble() {
		return slaveQuartersUpgradesDouble;
	}

	public static ArrayList<PlaceUpgrade> getSlaveQuartersUpgradesQuadruple() {
		return slaveQuartersUpgradesQuadruple;
	}

	public static ArrayList<PlaceUpgrade> getMilkingUpgrades() {
		return milkingRoomUpgrades;
	}

	public static ArrayList<PlaceUpgrade> getOfficeUpgrades() {
		return officeUpgrades;
	}

	static {
		coreRoomUpgrades = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_GUEST_ROOM,
				PlaceUpgrade.LILAYA_GUEST_ROOM_SUITE,

				PlaceUpgrade.LILAYA_SLAVE_ROOM,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_DOUBLE,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_QUADRUPLE,

				PlaceUpgrade.LILAYA_OFFICE,
				PlaceUpgrade.LILAYA_MILKING_ROOM,

				PlaceUpgrade.LILAYA_ARTHUR_ROOM);

		guestRoomUpgrades = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_GUEST_ROOM_SUITE,
				PlaceUpgrade.LILAYA_EMPTY_ROOM);

		guestRoomUpgradesSuite = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_EMPTY_ROOM);

		slaveQuartersUpgradesSingle = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_SLAVE_ROOM_ROOM_SERVICE,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_UPGRADE_BED,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_DOWNGRADE_BED,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_ARCANE_INSTRUMENTS,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_OBEDIENCE_TRAINER,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_DOUBLE,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_QUADRUPLE,
				PlaceUpgrade.LILAYA_EMPTY_ROOM,
				PlaceUpgrade.LILAYA_ARTHUR_ROOM);

		slaveQuartersUpgradesDouble = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_SLAVE_ROOM_ROOM_SERVICE,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_UPGRADE_BED,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_DOWNGRADE_BED,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_ARCANE_INSTRUMENTS,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_OBEDIENCE_TRAINER,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_QUADRUPLE,
				PlaceUpgrade.LILAYA_EMPTY_ROOM,
				PlaceUpgrade.LILAYA_ARTHUR_ROOM);

		slaveQuartersUpgradesQuadruple = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_SLAVE_ROOM_ROOM_SERVICE,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_UPGRADE_BED,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_DOWNGRADE_BED,

				PlaceUpgrade.LILAYA_SLAVE_ROOM_ARCANE_INSTRUMENTS,
				PlaceUpgrade.LILAYA_SLAVE_ROOM_OBEDIENCE_TRAINER,

				PlaceUpgrade.LILAYA_EMPTY_ROOM,
				PlaceUpgrade.LILAYA_ARTHUR_ROOM);

		milkingRoomUpgrades = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_MILKING_ROOM_ARTISAN_MILKERS,
				PlaceUpgrade.LILAYA_MILKING_ROOM_INDUSTRIAL_MILKERS,

				PlaceUpgrade.LILAYA_MILKING_ROOM_MILK_EFFICIENCY,
				PlaceUpgrade.LILAYA_MILKING_ROOM_CUM_EFFICIENCY,
				PlaceUpgrade.LILAYA_MILKING_ROOM_GIRLCUM_EFFICIENCY,

				PlaceUpgrade.LILAYA_EMPTY_ROOM);

		officeUpgrades = Util.newArrayListOfValues(
				PlaceUpgrade.LILAYA_OFFICE_EXECUTIVE_UPGRADE,
				PlaceUpgrade.LILAYA_OFFICE_COFFEE_MACHINE,
				PlaceUpgrade.LILAYA_OFFICE_PARTITIONING_WALLS,

				PlaceUpgrade.LILAYA_EMPTY_ROOM);
	}

	private boolean isCoreRoomUpgrade;

	protected String name;
	protected String descriptionForPurchase;
	protected String descriptionAfterPurchase;
	protected String roomDescription;

	private int installCost;
	private int removalCost;
	private int upkeep;
	private int capacity;

	private Colour colour;

	private float affectionGain;
	private float obedienceGain;

	private List<PlaceUpgrade> prerequisites;

	private PlaceUpgrade(boolean isCoreRoomUpgrade,
			Colour colour,
			String name,
			String descriptionForPurchase,
			String descriptionAfterPurchase,
			String roomDescription,
			int installCost,
			int removalCost,
			int upkeep,
			int capacity,
			float affectionGain,
			float obedienceGain,
			List<PlaceUpgrade> prerequisites) {

		this.isCoreRoomUpgrade = isCoreRoomUpgrade;
		this.colour = colour;
		this.name = name;
		this.descriptionForPurchase = descriptionForPurchase;
		this.descriptionAfterPurchase = descriptionAfterPurchase;
		this.roomDescription = roomDescription;

		this.installCost = installCost;
		this.removalCost = removalCost;
		this.upkeep = upkeep;
		this.capacity = capacity;

		this.affectionGain = affectionGain;

		this.obedienceGain = obedienceGain;

		if(prerequisites==null) {
			this.prerequisites = new ArrayList<>();

		} else {
			this.prerequisites = prerequisites;
		}
	}

	/**
	 * @param cell The cell to check for this upgrade's availability.
	 * @return A value representing availability and reasoning of availability of this upgrade. If the key is false, and the value is an empty string, then this upgrade is not added to any of the available upgrade lists which are disaplyed in-game.
	 */
	protected Value<Boolean, String> getExtraConditionalAvailability(Cell cell) {
		return new Value<>(true, "");
	}

	/**
	 * @param cell The cell to check for this upgrade's availability.
	 * @return A value representing availability and reasoning of availability of this upgrade. If the key is false, and the value is an empty string, then this upgrade is not added to any of the available upgrade lists which are disaplyed in-game.
	 */
	public Value<Boolean, String> getAvailability(Cell cell) {
		if(!(Main.game.getPlayer().isHasSlaverLicense() || (Main.game.getPlayer().isQuestCompleted(QuestLine.SIDE_ACCOMMODATION) && !this.isSlaverUpgrade()))) {
			return new Value<>(false, "You are unable to purchase this upgrade without a slaver license!");
		}

		return getExtraConditionalAvailability(cell);
	}

	public boolean isSlaverUpgrade() {
		return true;
	}

	public boolean isCoreRoomUpgrade() {
		return isCoreRoomUpgrade;
	}

	public Colour getColour() {
		return colour;
	}

	public String getName() {
		return name;
	}

	public String getRoomDescription(Cell c) {
		return roomDescription;
	}

	public String getDescriptionForPurchase() {
		return descriptionForPurchase;
	}

	public String getDescriptionAfterPurchase() {
		return descriptionAfterPurchase;
	}

	public int getInstallCost() {
		return installCost;
	}

	public int getRemovalCost() {
		return removalCost;
	}

	public int getUpkeep() {
		return upkeep;
	}

	public int getCapacity() {
		return capacity;
	}

	public float getHourlyAffectionGain() {
		return affectionGain;
	}

	public float getHourlyObedienceGain() {
		return obedienceGain;
	}

	public List<PlaceUpgrade> getPrerequisites() {
		return prerequisites;
	}

	public boolean isPrerequisitesMet(GenericPlace place) {
		return place.getPlaceUpgrades().containsAll(prerequisites);
	}

	public void applyInstallationEffects(Cell c) {
	}

	public void applyRemovalEffects(Cell c) {
	}
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.world.places;

import java.util.Map;

import com.lilithsthrone.game.character.race.Subspecies;
import com.lilithsthrone.game.character.race.SubspeciesSpawnRarity;

/**
 * @since 0.2.12
 * @version 0.3.1
 * @author Innoxia
 */
public class Population {

	private PopulationType type;
	private PopulationDensity density;
	private Map<Subspecies, SubspeciesSpawnRarity> species;

	public Population(PopulationType type, PopulationDensity density, Map<Subspecies, SubspeciesSpawnRarity> species) {
		this.type = type;
		this.density = density;
		this.species = species;
	}

	public Map<Subspecies, SubspeciesSpawnRarity> getSpecies() {
		return species;
	}

	public PopulationType getType() {
		return type;
	}

	public PopulationDensity getDensity() {
		return density;
	}

	public String getDescription(boolean includeDeterminer) {
		StringBuilder sb = new StringBuilder();

		switch(this.getDensity()) {
			case COUPLE:
				if(includeDeterminer) {
					sb.append("a ");
				}
				if(getType().isPlural()) {
					sb.append("tiny");
				} else {
					sb.append("couple of");
				}
				break;
			case DENSE:
				if(includeDeterminer) {
					sb.append("a ");
				}
				if(getType().isPlural()) {
					sb.append("large");
				} else {
					sb.append("large amount of");
				}
				break;
			case FEW:
				if(includeDeterminer) {
					sb.append("a ");
				}
				if(getType().isPlural()) {
					sb.append("small");
				} else {
					sb.append("few");
				}
				break;
			case NUMEROUS:
				if(getType().isPlural()) {
					if(includeDeterminer) {
						sb.append("a ");
					}
					sb.append("sizable");
				} else {
					sb.append("numerous");
				}
				break;
			case SEVERAL:
				if(getType().isPlural()) {
					if(includeDeterminer) {
						sb.append("a ");
					}
					sb.append("modestly-sized");
				} else {
					sb.append("several");
				}
				break;
			case SPARSE:
				if(includeDeterminer) {
					sb.append("a ");
				}
				if(getType().isPlural()) {
					sb.append("small");
				} else {
					sb.append("few");
				}
				break;
		}
		sb.append(" "+getType().getName());
		return sb.toString();
	}

}


code:
package com.lilithsthrone.world.places;

/**
 * @since 0.2.12
 * @version 0.3
 * @author Innoxia
 */
public enum PopulationDensity {

	COUPLE("one or two"),

	FEW("few"),

	SPARSE("sparse"),

	SEVERAL("several"),

	NUMEROUS("numerous"),

	DENSE("dense");

	String name;

	private PopulationDensity(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}


code:
package com.lilithsthrone.world.places;

/**
 * @since 0.2.12
 * @version 0.3.5.5
 * @author Innoxia
 */
public enum PopulationType {

	PEOPLE("people", true),

	HARPIES("harpies", true),

	HARPIES_SILLY("birbs", true),

	CROWD("crowd", false),

	CROWDS("crowds", true),

	ENFORCERS("Enforcers", true),

	SHOPPERS("shoppers", true),

	DINERS("diners", true),

	VIPS("VIPs", true),

	GUARDS("guards", true),

	MAIDS("maids", true),

	OFFICE_WORKERS("office-workers", true),

	GANG_MEMBERS("gang members", true),
	;

	private String name;
	private boolean plural;

	private PopulationType(String name, boolean plural) {
		this.name = name;
		this.plural = plural;
	}

	public String getName() {
		return name;
	}

	public boolean isPlural() {
		return plural;
	}
}


code:
# Lilith's Throne SVGO configuration
#
# To use SVGO, Node.js (https://nodejs.org/en/) is required.
# It can then be installed using "npm install -g svgo" from the command line.
#
# Usage follows with "svgo --config=svgoConfig.yml target.svg", where absolute
# paths may be required if the config file or the target file are not located
# in the current working directory. The target may also be a directory.

# Replace entire default configuration
full: true

# No plugins disabled by default
plugins:
  - removeDoctype
  - removeXMLProcInst
  - removeComments
  - removeMetadata
  - removeEditorsNSData
  - cleanupAttrs
  - inlineStyles
  - minifyStyles
  - convertStyleToAttrs
  # Preserve gradient IDs by disabling minification
  - cleanupIDs:
      minify: false
      preserve: [patternLayer]
  - removeRasterImages
  - removeUselessDefs
  - cleanupNumericValues
  - cleanupListOfValues
  # Prevent converting colors to names for color replacement
  - convertColors:
      shortname: false
  - removeUnknownsAndDefaults
  - removeNonInheritableGroupAttrs
  - removeUselessStrokeAndFill
  - removeViewBox
  - cleanupEnableBackground
  - removeHiddenElems
  - removeEmptyText
  - convertShapeToPath
  - moveElemsAttrsToGroup
  - moveGroupAttrsToElems
  # Prevent pattern layer group collapse (enable for non-pattern items)
  - collapseGroups: false
  - convertPathData
  - convertTransform
  - removeEmptyAttrs
  - removeEmptyContainers
  - mergePaths
  - removeUnusedNS
  # Sort attributes for readability
  - sortAttrs: true
  - removeTitle
  - removeDesc

# Use indented markup for readability
js2svg:
  pretty: true


code:
[submodule "vim-commentary"]
	path = start/vim-commentary
	url = https://github.com/tpope/vim-commentary.git
[submodule "vim-easy-align"]
	path = start/vim-easy-align
	url = https://github.com/junegunn/vim-easy-align.git
[submodule "vim-polyglot"]
	path = start/vim-polyglot
	url = https://github.com/sheerun/vim-polyglot.git
[submodule "vim-rsi"]
	path = start/vim-rsi
	url = https://github.com/tpope/vim-rsi.git
[submodule "vim-signify"]
	path = start/vim-signify
	url = https://github.com/mhinz/vim-signify.git
[submodule "vim-solarized8"]
	path = opt/vim-solarized8
	url = https://github.com/lifepillar/vim-solarized8.git
[submodule "ale"]
	path = opt/ale
	url = https://github.com/w0rp/ale.git
[submodule "jedi-vim"]
	path = opt/jedi-vim
	url = https://github.com/davidhalter/jedi-vim.git
[submodule "vim-fugitive"]
	path = start/vim-fugitive
	url = https://github.com/tpope/vim-fugitive.git
[submodule "vimwiki"]
	path = opt/vimwiki
	url = https://github.com/vimwiki/vimwiki.git

repo_name: vdrandom/vdvim

path: .gitmodules


code:
vdvim
=====
As if vdotfiles repo wasn't enough.

A separate repo for the simplicity of config management.

vimrc is executed as start/0/plugin/init.vim.


code:
" Name:         cosmic_latte
" Author:       nightsense
" Maintainer:   nightsense
" License:      MIT

if !(has('termguicolors') && &termguicolors) && !has('gui_running')
    \ && (!exists('&t_Co') || &t_Co < 256)
  echoerr '[cosmic_latte] There are not enough colors.'
  finish
endif

hi clear
if exists('syntax_on')
  syntax reset
endif

let g:colors_name = 'cosmic_latte'

if &background ==# 'dark'
  hi Bold ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,bold gui=NONE,bold
  hi Conceal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Directory ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,bold gui=NONE,bold
  hi EndOfBuffer ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi FoldColumn ctermfg=145 ctermbg=NONE guifg=#abb0c0 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Ignore ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Italic ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,italic gui=NONE,italic
  hi ModeMsg ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi MoreMsg ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi NonText ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Normal ctermfg=145 ctermbg=235 guifg=#abb0c0 guibg=#202a31 guisp=NONE cterm=NONE gui=NONE
  hi Question ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi SignColumn ctermfg=145 ctermbg=NONE guifg=#abb0c0 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Terminal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Title ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,bold gui=NONE,bold
  hi Underlined ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,underline gui=NONE,underline
  hi Comment ctermfg=246 ctermbg=NONE guifg=#898f9e guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi CursorLineNr ctermfg=246 ctermbg=NONE guifg=#898f9e guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi LineNr ctermfg=246 ctermbg=NONE guifg=#898f9e guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi ColorColumn ctermfg=NONE ctermbg=237 guifg=NONE guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi CursorColumn ctermfg=NONE ctermbg=237 guifg=NONE guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi CursorLine ctermfg=NONE ctermbg=237 guifg=NONE guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi DiffChange ctermfg=NONE ctermbg=237 guifg=NONE guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi Folded ctermfg=NONE ctermbg=237 guifg=NONE guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi Pmenu ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi QuickFixLine ctermfg=NONE ctermbg=237 guifg=NONE guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi StatusLineNC ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi StatusLineTermNC ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi TabLine ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi ToolbarButton ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE,bold gui=NONE,bold
  hi VisualNOS ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi WildMenu ctermfg=145 ctermbg=237 guifg=#abb0c0 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi PmenuSel ctermfg=145 ctermbg=235 guifg=#abb0c0 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi StatusLine ctermfg=145 ctermbg=235 guifg=#abb0c0 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi StatusLineTerm ctermfg=145 ctermbg=235 guifg=#abb0c0 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi TabLineSel ctermfg=145 ctermbg=235 guifg=#abb0c0 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Cursor ctermfg=252 ctermbg=235 guifg=#c5cbdb guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi MatchParen ctermfg=252 ctermbg=240 guifg=#c5cbdb guibg=#4c5764 guisp=NONE cterm=NONE gui=NONE
  hi Visual ctermfg=252 ctermbg=240 guifg=#c5cbdb guibg=#4c5764 guisp=NONE cterm=NONE gui=NONE
  hi PmenuSbar ctermfg=240 ctermbg=240 guifg=#4c5764 guibg=#4c5764 guisp=NONE cterm=NONE gui=NONE
  hi PmenuThumb ctermfg=145 ctermbg=145 guifg=#abb0c0 guibg=#abb0c0 guisp=NONE cterm=NONE gui=NONE
  hi TabLineFill ctermfg=237 ctermbg=237 guifg=#2b3740 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi ToolbarLine ctermfg=237 ctermbg=237 guifg=#2b3740 guibg=#2b3740 guisp=NONE cterm=NONE gui=NONE
  hi VertSplit ctermfg=240 ctermbg=240 guifg=#4c5764 guibg=#4c5764 guisp=NONE cterm=NONE gui=NONE
  hi SpellBad ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#c17b8d cterm=NONE,underline gui=NONE,undercurl
  hi SpellCap ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#5496bd cterm=NONE,underline gui=NONE,undercurl
  hi SpellLocal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#459d90 cterm=NONE,underline gui=NONE,undercurl
  hi SpellRare ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#9b85bb cterm=NONE,underline gui=NONE,undercurl
  hi StorageClass ctermfg=139 ctermbg=NONE guifg=#9b85bb guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Structure ctermfg=139 ctermbg=NONE guifg=#9b85bb guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Type ctermfg=139 ctermbg=NONE guifg=#9b85bb guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Typedef ctermfg=139 ctermbg=NONE guifg=#9b85bb guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi TooLong ctermfg=139 ctermbg=235 guifg=#9b85bb guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi WarningMsg ctermfg=139 ctermbg=235 guifg=#9b85bb guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Function ctermfg=168 ctermbg=NONE guifg=#c17b8d guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Identifier ctermfg=168 ctermbg=NONE guifg=#c17b8d guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi DiffDelete ctermfg=168 ctermbg=235 guifg=#c17b8d guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi DiffRemoved ctermfg=168 ctermbg=235 guifg=#c17b8d guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Error ctermfg=168 ctermbg=235 guifg=#c17b8d guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi ErrorMsg ctermfg=168 ctermbg=235 guifg=#c17b8d guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Debug ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Delimiter ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Special ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi SpecialChar ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi SpecialComment ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi SpecialKey ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Tag ctermfg=137 ctermbg=NONE guifg=#b28761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi DiffChanged ctermfg=137 ctermbg=235 guifg=#b28761 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi DiffText ctermfg=137 ctermbg=235 guifg=#b28761 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Search ctermfg=137 ctermbg=235 guifg=#b28761 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Conditional ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Exception ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Keyword ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Label ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Operator ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Repeat ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Statement ctermfg=107 ctermbg=NONE guifg=#7d9761 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi DiffAdd ctermfg=107 ctermbg=235 guifg=#7d9761 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi DiffAdded ctermfg=107 ctermbg=235 guifg=#7d9761 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Define ctermfg=37 ctermbg=NONE guifg=#459d90 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Include ctermfg=37 ctermbg=NONE guifg=#459d90 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Macro ctermfg=37 ctermbg=NONE guifg=#459d90 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi PreCondit ctermfg=37 ctermbg=NONE guifg=#459d90 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi PreProc ctermfg=37 ctermbg=NONE guifg=#459d90 guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Todo ctermfg=37 ctermbg=235 guifg=#459d90 guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  hi Boolean ctermfg=67 ctermbg=NONE guifg=#5496bd guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Character ctermfg=67 ctermbg=NONE guifg=#5496bd guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Constant ctermfg=67 ctermbg=NONE guifg=#5496bd guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Float ctermfg=67 ctermbg=NONE guifg=#5496bd guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi Number ctermfg=67 ctermbg=NONE guifg=#5496bd guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi String ctermfg=67 ctermbg=NONE guifg=#5496bd guibg=NONE guisp=NONE cterm=NONE gui=NONE
  hi IncSearch ctermfg=67 ctermbg=235 guifg=#5496bd guibg=#202a31 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
  if has("nvim")
    let g:terminal_color_0 = "#202a31"
    let g:terminal_color_1 = "#c17b8d"
    let g:terminal_color_2 = "#7d9761"
    let g:terminal_color_3 = "#b28761"
    let g:terminal_color_4 = "#5496bd"
    let g:terminal_color_5 = "#9b85bb"
    let g:terminal_color_6 = "#459d90"
    let g:terminal_color_7 = "#abb0c0"
    let g:terminal_color_8 = "#2b3740"
    let g:terminal_color_9 = "#c17b8d"
    let g:terminal_color_10 = "#7d9761"
    let g:terminal_color_11 = "#b28761"
    let g:terminal_color_12 = "#5496bd"
    let g:terminal_color_13 = "#9b85bb"
    let g:terminal_color_14 = "#459d90"
    let g:terminal_color_15 = "#c5cbdb"
  elseif has("terminal")
    let g:terminal_ansi_colors = [
        \ "#202a31",
        \ "#c17b8d",
        \ "#7d9761",
        \ "#b28761",
        \ "#5496bd",
        \ "#9b85bb",
        \ "#459d90",
        \ "#abb0c0",
        \ "#2b3740",
        \ "#c17b8d",
        \ "#7d9761",
        \ "#b28761",
        \ "#5496bd",
        \ "#9b85bb",
        \ "#459d90",
        \ "#c5cbdb"
        \ ]
  endif
  finish
endif

hi Bold ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,bold gui=NONE,bold
hi Conceal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Directory ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,bold gui=NONE,bold
hi EndOfBuffer ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi FoldColumn ctermfg=240 ctermbg=NONE guifg=#485a62 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Ignore ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Italic ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,italic gui=NONE,italic
hi ModeMsg ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi MoreMsg ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi NonText ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Normal ctermfg=240 ctermbg=231 guifg=#485a62 guibg=#fff8e7 guisp=NONE cterm=NONE gui=NONE
hi Question ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi SignColumn ctermfg=240 ctermbg=NONE guifg=#485a62 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Terminal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Title ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,bold gui=NONE,bold
hi Underlined ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=NONE cterm=NONE,underline gui=NONE,underline
hi Comment ctermfg=243 ctermbg=NONE guifg=#63757e guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi CursorLineNr ctermfg=243 ctermbg=NONE guifg=#63757e guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi LineNr ctermfg=243 ctermbg=NONE guifg=#63757e guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi ColorColumn ctermfg=NONE ctermbg=254 guifg=NONE guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi CursorColumn ctermfg=NONE ctermbg=254 guifg=NONE guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi CursorLine ctermfg=NONE ctermbg=254 guifg=NONE guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi DiffChange ctermfg=NONE ctermbg=254 guifg=NONE guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi Folded ctermfg=NONE ctermbg=254 guifg=NONE guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi Pmenu ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi QuickFixLine ctermfg=NONE ctermbg=254 guifg=NONE guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi StatusLineNC ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi StatusLineTermNC ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi TabLine ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi ToolbarButton ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE,bold gui=NONE,bold
hi VisualNOS ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi WildMenu ctermfg=240 ctermbg=254 guifg=#485a62 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi PmenuSel ctermfg=240 ctermbg=231 guifg=#485a62 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi StatusLine ctermfg=240 ctermbg=231 guifg=#485a62 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi StatusLineTerm ctermfg=240 ctermbg=231 guifg=#485a62 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi TabLineSel ctermfg=240 ctermbg=231 guifg=#485a62 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Cursor ctermfg=238 ctermbg=231 guifg=#364850 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi MatchParen ctermfg=238 ctermbg=144 guifg=#364850 guibg=#b1b4a2 guisp=NONE cterm=NONE gui=NONE
hi Visual ctermfg=238 ctermbg=144 guifg=#364850 guibg=#b1b4a2 guisp=NONE cterm=NONE gui=NONE
hi PmenuSbar ctermfg=144 ctermbg=144 guifg=#b1b4a2 guibg=#b1b4a2 guisp=NONE cterm=NONE gui=NONE
hi PmenuThumb ctermfg=240 ctermbg=240 guifg=#485a62 guibg=#485a62 guisp=NONE cterm=NONE gui=NONE
hi TabLineFill ctermfg=254 ctermbg=254 guifg=#efe4d2 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi ToolbarLine ctermfg=254 ctermbg=254 guifg=#efe4d2 guibg=#efe4d2 guisp=NONE cterm=NONE gui=NONE
hi VertSplit ctermfg=144 ctermbg=144 guifg=#b1b4a2 guibg=#b1b4a2 guisp=NONE cterm=NONE gui=NONE
hi SpellBad ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#ff0056 cterm=NONE,underline gui=NONE,undercurl
hi SpellCap ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#0096ff cterm=NONE,underline gui=NONE,undercurl
hi SpellLocal ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#00a6c0 cterm=NONE,underline gui=NONE,undercurl
hi SpellRare ctermfg=NONE ctermbg=NONE guifg=NONE guibg=NONE guisp=#de3ffc cterm=NONE,underline gui=NONE,undercurl
hi StorageClass ctermfg=133 ctermbg=NONE guifg=#a154ae guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Structure ctermfg=133 ctermbg=NONE guifg=#a154ae guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Type ctermfg=133 ctermbg=NONE guifg=#a154ae guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Typedef ctermfg=133 ctermbg=NONE guifg=#a154ae guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi TooLong ctermfg=133 ctermbg=231 guifg=#a154ae guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi WarningMsg ctermfg=133 ctermbg=231 guifg=#a154ae guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Function ctermfg=131 ctermbg=NONE guifg=#c44756 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Identifier ctermfg=131 ctermbg=NONE guifg=#c44756 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi DiffDelete ctermfg=131 ctermbg=231 guifg=#c44756 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi DiffRemoved ctermfg=131 ctermbg=231 guifg=#c44756 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Error ctermfg=131 ctermbg=231 guifg=#c44756 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi ErrorMsg ctermfg=131 ctermbg=231 guifg=#c44756 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Debug ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Delimiter ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Special ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi SpecialChar ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi SpecialComment ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi SpecialKey ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Tag ctermfg=94 ctermbg=NONE guifg=#916d03 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi DiffChanged ctermfg=94 ctermbg=231 guifg=#916d03 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi DiffText ctermfg=94 ctermbg=231 guifg=#916d03 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Search ctermfg=222 ctermbg=238 guifg=#f6c967 guibg=#364850 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Conditional ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Exception ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Keyword ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Label ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Operator ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Repeat ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Statement ctermfg=28 ctermbg=NONE guifg=#1f8332 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi DiffAdd ctermfg=28 ctermbg=231 guifg=#1f8332 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi DiffAdded ctermfg=28 ctermbg=231 guifg=#1f8332 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Define ctermfg=30 ctermbg=NONE guifg=#007f8a guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Include ctermfg=30 ctermbg=NONE guifg=#007f8a guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Macro ctermfg=30 ctermbg=NONE guifg=#007f8a guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi PreCondit ctermfg=30 ctermbg=NONE guifg=#007f8a guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi PreProc ctermfg=30 ctermbg=NONE guifg=#007f8a guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Todo ctermfg=30 ctermbg=231 guifg=#007f8a guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
hi Boolean ctermfg=32 ctermbg=NONE guifg=#0075c9 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Character ctermfg=32 ctermbg=NONE guifg=#0075c9 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Constant ctermfg=32 ctermbg=NONE guifg=#0075c9 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Float ctermfg=32 ctermbg=NONE guifg=#0075c9 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi Number ctermfg=32 ctermbg=NONE guifg=#0075c9 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi String ctermfg=32 ctermbg=NONE guifg=#0075c9 guibg=NONE guisp=NONE cterm=NONE gui=NONE
hi IncSearch ctermfg=32 ctermbg=231 guifg=#0075c9 guibg=#fff8e7 guisp=NONE cterm=NONE,reverse gui=NONE,reverse
if has("nvim")
  let g:terminal_color_0 = "#fff8e7"
  let g:terminal_color_1 = "#c44756"
  let g:terminal_color_2 = "#1f8332"
  let g:terminal_color_3 = "#916d03"
  let g:terminal_color_4 = "#0075c9"
  let g:terminal_color_5 = "#a154ae"
  let g:terminal_color_6 = "#007f8a"
  let g:terminal_color_7 = "#485a62"
  let g:terminal_color_8 = "#efe4d2"
  let g:terminal_color_9 = "#c44756"
  let g:terminal_color_10 = "#1f8332"
  let g:terminal_color_11 = "#916d03"
  let g:terminal_color_12 = "#0075c9"
  let g:terminal_color_13 = "#a154ae"
  let g:terminal_color_14 = "#007f8a"
  let g:terminal_color_15 = "#364850"
elseif has("terminal")
  let g:terminal_ansi_colors = [
      \ "#fff8e7",
      \ "#c44756",
      \ "#1f8332",
      \ "#916d03",
      \ "#0075c9",
      \ "#a154ae",
      \ "#007f8a",
      \ "#485a62",
      \ "#efe4d2",
      \ "#c44756",
      \ "#1f8332",
      \ "#916d03",
      \ "#0075c9",
      \ "#a154ae",
      \ "#007f8a",
      \ "#364850"
      \ ]
endif
finish

" Background: light
" Color:      gry0 #fff8e7 ~
" Color:      gry1 #efe4d2 ~
" Color:      gry2 #63757e ~
" Color:      gry3 #485a62 ~
" Color:      gryc #364850 ~
" Color:      srch #f6c967 ~
" Color:      grys #364850 ~
" Color:      gryp #b1b4a2 ~
" Color:      sprd #ff0056 ~
" Color:      spbl #0096ff ~
" Color:      spcy #00a6c0 ~
" Color:      spmg #de3ffc ~
" Color:      red_ #c44756 ~
" Color:      gold #916d03 ~
" Color:      gren #1f8332 ~
" Color:      cyan #007f8a ~
" Color:      blue #0075c9 ~
" Color:      mgnt #a154ae ~
" Bold               none   none   bold
" Conceal            none   none
" Directory          none   none   bold
" EndOfBuffer        none   none
" FoldColumn         gry3   none
" Ignore             none   none
" Italic             none   none   italic
" ModeMsg            none   none
" MoreMsg            none   none
" NonText            none   none
" Normal             gry3   gry0
" Question           none   none
" SignColumn         gry3   none
" Terminal           none   none
" Title              none   none   bold
" Underlined         none   none   underline
" Comment            gry2   none
" CursorLineNr       gry2   none
" LineNr             gry2   none
" ColorColumn        none   gry1
" CursorColumn       none   gry1
" CursorLine         none   gry1
" DiffChange         none   gry1
" Folded             none   gry1
" Pmenu              gry3   gry1
" QuickFixLine       none   gry1
" StatusLineNC       gry3   gry1
" StatusLineTermNC   gry3   gry1
" TabLine            gry3   gry1
" ToolbarButton      gry3   gry1   bold
" VisualNOS          gry3   gry1
" WildMenu           gry3   gry1
" PmenuSel           gry3   gry0   reverse
" StatusLine         gry3   gry0   reverse
" StatusLineTerm     gry3   gry0   reverse
" TabLineSel         gry3   gry0   reverse
" Cursor             gryc   gry0   reverse
" MatchParen         gryc   gryp
" Visual             gryc   gryp
" PmenuSbar          gryp   gryp
" PmenuThumb         gry3   gry3
" TabLineFill        gry1   gry1
" ToolbarLine        gry1   gry1
" VertSplit          gryp   gryp
" SpellBad           none   none   g=undercurl   s=sprd   t=underline
" SpellCap           none   none   g=undercurl   s=spbl   t=underline
" SpellLocal         none   none   g=undercurl   s=spcy   t=underline
" SpellRare          none   none   g=undercurl   s=spmg   t=underline
" StorageClass       mgnt   none
" Structure          mgnt   none
" Type               mgnt   none
" Typedef            mgnt   none
" TooLong            mgnt   gry0   reverse
" WarningMsg         mgnt   gry0   reverse
" Function           red_   none
" Identifier         red_   none
" DiffDelete         red_   gry0   reverse
" DiffRemoved        red_   gry0   reverse
" Error              red_   gry0   reverse
" ErrorMsg           red_   gry0   reverse
" Debug              gold   none
" Delimiter          gold   none
" Special            gold   none
" SpecialChar        gold   none
" SpecialComment     gold   none
" SpecialKey         gold   none
" Tag                gold   none
" DiffChanged        gold   gry0   reverse
" DiffText           gold   gry0   reverse
" Search             srch   grys   reverse
" Conditional        gren   none
" Exception          gren   none
" Keyword            gren   none
" Label              gren   none
" Operator           gren   none
" Repeat             gren   none
" Statement          gren   none
" DiffAdd            gren   gry0   reverse
" DiffAdded          gren   gry0   reverse
" Define             cyan   none
" Include            cyan   none
" Macro              cyan   none
" PreCondit          cyan   none
" PreProc            cyan   none
" Todo               cyan   gry0   reverse
" Boolean            blue   none
" Character          blue   none
" Constant           blue   none
" Float              blue   none
" Number             blue   none
" String             blue   none
" IncSearch          blue   gry0   reverse
" Background: dark
" Color:      gry0 #202a31 ~
" Color:      gry1 #2b3740 ~
" Color:      gry2 #898f9e ~
" Color:      gry3 #abb0c0 ~
" Color:      gryc #c5cbdb ~
" Color:      srch #b28761 ~
" Color:      grys #202a31 ~
" Color:      gryp #4c5764 ~
" Color:      sprd #c17b8d ~
" Color:      spbl #5496bd ~
" Color:      spcy #459d90 ~
" Color:      spmg #9b85bb ~
" Color:      red_ #c17b8d ~
" Color:      gold #b28761 ~
" Color:      gren #7d9761 ~
" Color:      cyan #459d90 ~
" Color:      blue #5496bd ~
" Color:      mgnt #9b85bb ~
" Bold               none   none   bold
" Conceal            none   none
" Directory          none   none   bold
" EndOfBuffer        none   none
" FoldColumn         gry3   none
" Ignore             none   none
" Italic             none   none   italic
" ModeMsg            none   none
" MoreMsg            none   none
" NonText            none   none
" Normal             gry3   gry0
" Question           none   none
" SignColumn         gry3   none
" Terminal           none   none
" Title              none   none   bold
" Underlined         none   none   underline
" Comment            gry2   none
" CursorLineNr       gry2   none
" LineNr             gry2   none
" ColorColumn        none   gry1
" CursorColumn       none   gry1
" CursorLine         none   gry1
" DiffChange         none   gry1
" Folded             none   gry1
" Pmenu              gry3   gry1
" QuickFixLine       none   gry1
" StatusLineNC       gry3   gry1
" StatusLineTermNC   gry3   gry1
" TabLine            gry3   gry1
" ToolbarButton      gry3   gry1   bold
" VisualNOS          gry3   gry1
" WildMenu           gry3   gry1
" PmenuSel           gry3   gry0   reverse
" StatusLine         gry3   gry0   reverse
" StatusLineTerm     gry3   gry0   reverse
" TabLineSel         gry3   gry0   reverse
" Cursor             gryc   gry0   reverse
" MatchParen         gryc   gryp
" Visual             gryc   gryp
" PmenuSbar          gryp   gryp
" PmenuThumb         gry3   gry3
" TabLineFill        gry1   gry1
" ToolbarLine        gry1   gry1
" VertSplit          gryp   gryp
" SpellBad           none   none   g=undercurl   s=sprd   t=underline
" SpellCap           none   none   g=undercurl   s=spbl   t=underline
" SpellLocal         none   none   g=undercurl   s=spcy   t=underline
" SpellRare          none   none   g=undercurl   s=spmg   t=underline
" StorageClass       mgnt   none
" Structure          mgnt   none
" Type               mgnt   none
" Typedef            mgnt   none
" TooLong            mgnt   gry0   reverse
" WarningMsg         mgnt   gry0   reverse
" Function           red_   none
" Identifier         red_   none
" DiffDelete         red_   gry0   reverse
" DiffRemoved        red_   gry0   reverse
" Error              red_   gry0   reverse
" ErrorMsg           red_   gry0   reverse
" Debug              gold   none
" Delimiter          gold   none
" Special            gold   none
" SpecialChar        gold   none
" SpecialComment     gold   none
" SpecialKey         gold   none
" Tag                gold   none
" DiffChanged        gold   gry0   reverse
" DiffText           gold   gry0   reverse
" Search             srch   grys   reverse
" Conditional        gren   none
" Exception          gren   none
" Keyword            gren   none
" Label              gren   none
" Operator           gren   none
" Repeat             gren   none
" Statement          gren   none
" DiffAdd            gren   gry0   reverse
" DiffAdded          gren   gry0   reverse
" Define             cyan   none
" Include            cyan   none
" Macro              cyan   none
" PreCondit          cyan   none
" PreProc            cyan   none
" Todo               cyan   gry0   reverse
" Boolean            blue   none
" Character          blue   none
" Constant           blue   none
" Float              blue   none
" Number             blue   none
" String             blue   none
" IncSearch          blue   gry0   reverse