code:
package com.lilithsthrone.game.inventory.enchanting;

import java.util.ArrayList;
import java.util.List;

import com.lilithsthrone.game.character.markings.AbstractTattooType;
import com.lilithsthrone.game.character.markings.Tattoo;
import com.lilithsthrone.game.dialogue.utils.EnchantmentDialogue;
import com.lilithsthrone.game.inventory.AbstractCoreItem;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.inventory.clothing.AbstractClothingType;
import com.lilithsthrone.game.inventory.item.AbstractItem;
import com.lilithsthrone.game.inventory.item.AbstractItemType;
import com.lilithsthrone.game.inventory.weapon.AbstractWeapon;
import com.lilithsthrone.game.inventory.weapon.AbstractWeaponType;
import com.lilithsthrone.main.Main;

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

	private String name;
	private AbstractItemType itemType;
	private AbstractClothingType clothingType;
	private AbstractWeaponType weaponType;
	private AbstractTattooType tattooType;
	private List<ItemEffect> effects;

	public LoadedEnchantment(String name, AbstractItemType itemType, List<ItemEffect> effects) {
		this.name = name;
		this.itemType = itemType;
		this.clothingType = null;
		this.weaponType = null;
		this.tattooType = null;
		this.effects = effects;
	}

	public LoadedEnchantment(String name, AbstractClothingType clothingType, List<ItemEffect> effects) {
		this.name = name;
		this.itemType = null;
		this.clothingType = clothingType;
		this.weaponType = null;
		this.tattooType = null;
		this.effects = effects;
	}

	public LoadedEnchantment(String name, AbstractWeaponType weaponType, List<ItemEffect> effects) {
		this.name = name;
		this.itemType = null;
		this.clothingType = null;
		this.weaponType = weaponType;
		this.tattooType = null;
		this.effects = effects;
	}

	public LoadedEnchantment(String name, AbstractTattooType tattooType, List<ItemEffect> effects) {
		this.name = name;
		this.itemType = null;
		this.clothingType = null;
		this.weaponType = null;
		this.tattooType = tattooType;
		this.effects = effects;
	}

	public String getName() {
		return name;
	}

	public boolean isSuitableItemAvailable() {
		return getSuitableItem()!=null;
	}

	public AbstractCoreItem getSuitableItem() {
		if(itemType!=null) {
			for(AbstractItem item : Main.game.getPlayer().getAllItemsInInventory().keySet()) {
				if(item.getItemType().equals(itemType)) {
					return item;
				}
			}

		} else if(clothingType!=null) {
			List<AbstractClothing> clothingList = new ArrayList<>();
			for(AbstractClothing c :  Main.game.getPlayer().getAllClothingInInventory().keySet()) {
				if(c.getClothingType().equals(clothingType) && c.isEnchantmentKnown()) {
					if(c.getEffects().isEmpty()) {
						return c;
					} else {
						clothingList.add(c);
					}
				}
			}
			if(!clothingList.isEmpty()) {
				return clothingList.get(0);
			}

		} else if(weaponType!=null) {
			for(AbstractWeapon w :  Main.game.getPlayer().getAllWeaponsInInventory().keySet()) {
				if(w.getWeaponType().equals(weaponType) && w.getEffects().isEmpty()) {
					return w;
				}
			}

		} else if(tattooType!=null) {
			return EnchantmentDialogue.getIngredient();
		}

		return null;
	}

	public String getSVGString() {
		AbstractCoreItem item = getSuitableItem();

		if(itemType!=null) {
			if(item!=null) {
				return ((AbstractItem)item).getSVGString();
			}
			return itemType.getSVGString();

		} else if(clothingType!=null) {
			if(item!=null) {
				return ((AbstractClothing)item).getSVGString();
			}
			return clothingType.getSVGImage();

		} else if(weaponType!=null) {
			if(item!=null) {
				return ((AbstractWeapon)item).getSVGString();
			}
			return weaponType.getSVGImage();

		} else if(tattooType!=null) {
			return ((Tattoo)item).getSVGString();
		}

		return "";
	}

	public AbstractItemType getItemType() {
		return itemType;
	}

	public AbstractClothingType getClothingType() {
		return clothingType;
	}

	public AbstractWeaponType getWeaponType() {
		return weaponType;
	}

	public AbstractTattooType getTattooType() {
		return tattooType;
	}

	public List<ItemEffect> getEffects() {
		return effects;
	}
}

repo_name: klorpa/Pedo

license: unknown


code:
package com.lilithsthrone.game.inventory.enchanting;

/**
 * @since 0.1.7?
 * @version 0.2.11
 * @author Innoxia
 */
public abstract class RacialEffectUtil {

	private String description;

	public RacialEffectUtil(String description) {
		this.description = description;
	}

	public String getDescription() {
		return description;
	}

	public abstract String applyEffect();

}


code:
package com.lilithsthrone.game.inventory.enchanting;

/**
 * @since 0.2.4
 * @version 0.2.4
 * @author Innoxia
 */
public enum ResourceRestoration {
	HEALTH,
	MANA,
	ALL;
}


code:
package com.lilithsthrone.game.inventory.enchanting;

import java.io.IOException;
import java.io.InputStream;

import com.lilithsthrone.game.inventory.Rarity;
import com.lilithsthrone.game.inventory.item.AbstractItemType;
import com.lilithsthrone.game.inventory.item.ItemType;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.SvgUtil;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.7
 * @version 0.1.83
 * @author Innoxia
 */
public enum TFEssence {

	ARCANE("Arcane",
			"An exceedingly rare pure arcane essence.",
			"arcane",
			"essenceArcane",
			Colour.GENERIC_ARCANE,
			Rarity.LEGENDARY);

	private String name, description, descriptor, SVGString, SVGStringUncoloured;
	private Colour colour;
	private Rarity rarity;

	private TFEssence(String name, String description, String descriptor, String SVGString, Colour colour, Rarity rarity) {
		this.name = name;
		this.description = description;
		this.descriptor = descriptor;
		this.SVGString = SVGString;
		this.SVGStringUncoloured = SVGString;
		this.colour = colour;
		this.rarity = rarity;

		// Set this item's file image:
		try {
			InputStream is = this.getClass().getResourceAsStream("/com/lilithsthrone/res/crafting/" + SVGString + ".svg");
			if(is==null) {
				System.err.println("Error! TFEssence icon file does not exist (Trying to read from '"+SVGString+"')!");
			}
			String base = Util.inputStreamToString(is);

			String s = base;
			s = SvgUtil.colourReplacement(this.toString(), Colour.BASE_GREY, s);
			this.SVGStringUncoloured = s;

			String s2 = base;
			s2 = SvgUtil.colourReplacement(this.toString(), colour, s2);
			this.SVGString = s2;

			is.close();

		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	public String getName() {
		return name;
	}

	public String getDescription() {
		return description;
	}

	public String getDescriptor() {
		return descriptor;
	}

	public String getSVGString() {
		return SVGString;
	}

	public String getSVGStringUncoloured() {
		return SVGStringUncoloured;
	}

	public Colour getColour() {
		return colour;
	}

	public Rarity getRarity() {
		return rarity;
	}

	public static AbstractItemType essenceToItem(TFEssence essence) {
		return ItemType.BOTTLED_ESSENCE_ARCANE;
	}
}


code:
package com.lilithsthrone.game.inventory.enchanting;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.lilithsthrone.game.character.attributes.Attribute;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.character.race.Subspecies;
import com.lilithsthrone.game.inventory.Rarity;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.SvgUtil;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.7
 * @version 0.2.11
 * @author Innoxia
 */
public enum TFModifier {

	NONE("Empty",
		"No modifier",
		"nullification",
		"modifier_circle",
		Colour.TEXT_GREY,
		Rarity.COMMON),

	// Pos/Neg

	ARCANE_BOOST("arcane booster",
			"Applies a more powerful effect in relation to the primary essence.",
			"boosted",
			"modifier_circle_arcane",
			Colour.GENERIC_ARCANE,
			Rarity.COMMON),

	REMOVAL("removal",
			"Applies an effect such that the primary modifier's body part is removed.",
			"vanishing",
			"modifier_circle_removal",
			Colour.GENERIC_TERRIBLE,
			Rarity.UNCOMMON),

	// Misc:

	ORIENTATION_GYNEPHILIC("gynephilia",
			"Applies an effect related to changing orientation to gynephilic.",
			"gynephilia",
			"modifier_circle_orientation_gynephilic",
			Colour.FEMININE_PLUS,
			Rarity.LEGENDARY),

	ORIENTATION_AMBIPHILIC("ambiphilia",
			"Applies an effect related to changing orientation to ambiphilic.",
			"ambiphilia",
			"modifier_circle_orientation_ambiphilic",
			Colour.ANDROGYNOUS,
			Rarity.LEGENDARY),

	ORIENTATION_ANDROPHILIC("androphilia",
			"Applies an effect related to changing orientation to androphilic.",
			"androphilia",
			"modifier_circle_orientation_androphilic",
			Colour.MASCULINE_PLUS,
			Rarity.LEGENDARY),

	// Attributes:

	HEALTH_MAXIMUM(AttributeCategory.STRENGTH,
			Attribute.HEALTH_MAXIMUM,
			"Applies an effect related to the primary attribute 'Maximum Health'.",
			"modifier_circle_strength",//"modifier_circle_health",
			Rarity.EPIC),

	MANA_MAXIMUM(AttributeCategory.INTELLIGENCE,
			Attribute.MANA_MAXIMUM,
			"Applies an effect related to the primary attribute 'Maximum Aura'.",
			"modifier_circle_mana",
			Rarity.EPIC),

	STRENGTH(AttributeCategory.STRENGTH,
			Attribute.MAJOR_PHYSIQUE,
			"Applies an effect related to the primary attribute 'Physique'.",
			"modifier_circle_strength",
			Rarity.LEGENDARY),

	INTELLIGENCE(AttributeCategory.INTELLIGENCE,
			Attribute.MAJOR_ARCANE,
			"Applies an effect related to the primary attribute 'Arcane'.",
			"modifier_circle_intelligence",
			Rarity.LEGENDARY),

	CORRUPTION(AttributeCategory.CORRUPTION,
			Attribute.MAJOR_CORRUPTION,
			"Applies an effect related to the primary attribute 'Corruption'.",
			"modifier_circle_corruption",
			Rarity.LEGENDARY),

	FERTILITY(AttributeCategory.CORRUPTION,
			Attribute.FERTILITY,
			"Applies an effect related to the secondary attribute 'Fertility'.",
			"modifier_circle_fertility",
			Rarity.RARE),

	VIRILITY(AttributeCategory.CORRUPTION,
			Attribute.VIRILITY,
			"Applies an effect related to the secondary attribute 'Virility'.",
			"modifier_circle_virility",
			Rarity.RARE),

	SPELL_COST_MODIFIER(AttributeCategory.INTELLIGENCE,
			Attribute.SPELL_COST_MODIFIER,
			"Applies an effect related to the secondary attribute '"+Attribute.SPELL_COST_MODIFIER.getName()+"'.",
			"modifier_circle_spell_efficiency",
			Rarity.RARE),

	CRITICAL_DAMAGE(AttributeCategory.STRENGTH,
			Attribute.CRITICAL_DAMAGE,
			"Applies an effect related to the secondary attribute 'Critical power'.",
			"modifier_circle_critical_damage",
			Rarity.RARE),

	DAMAGE_LUST(AttributeCategory.CORRUPTION,
			Attribute.DAMAGE_LUST,
			"Applies an effect related to the secondary attribute 'Seduction damage'.",
			"modifier_circle_damage",
			Rarity.RARE),

	DAMAGE_SPELLS(AttributeCategory.INTELLIGENCE,
			Attribute.DAMAGE_SPELLS,
			"Applies an effect related to the secondary attribute 'Spell damage'.",
			"modifier_circle_damage",
			Rarity.RARE),

	DAMAGE_UNARMED(AttributeCategory.STRENGTH,
			Attribute.DAMAGE_UNARMED,
			"Applies an effect related to the secondary attribute 'Unarmed damage'.",
			"modifier_circle_damage_unarmed",
			Rarity.RARE),

	DAMAGE_MELEE_WEAPON(AttributeCategory.STRENGTH,
			Attribute.DAMAGE_MELEE_WEAPON,
			"Applies an effect related to the secondary attribute 'Melee weapon damage'.",
			"modifier_circle_damage_melee",
			Rarity.RARE),

	DAMAGE_RANGED_WEAPON(AttributeCategory.STRENGTH,
			Attribute.DAMAGE_RANGED_WEAPON,
			"Applies an effect related to the secondary attribute 'Ranged weapon damage'.",
			"modifier_circle_damage_ranged",
			Rarity.RARE),

	DAMAGE_PHYSICAL(AttributeCategory.STRENGTH,
			Attribute.DAMAGE_PHYSICAL,
			"Applies an effect related to the secondary attribute 'Physical damage'.",
			"modifier_circle_damage",
			Rarity.RARE),

	DAMAGE_FIRE(AttributeCategory.INTELLIGENCE,
			Attribute.DAMAGE_FIRE,
			"Applies an effect related to the secondary attribute 'Fire damage'.",
			"modifier_circle_damage",
			Rarity.RARE),

	DAMAGE_ICE(AttributeCategory.INTELLIGENCE,
			Attribute.DAMAGE_ICE,
			"Applies an effect related to the secondary attribute 'Ice damage'.",
			"modifier_circle_damage",
			Rarity.RARE),

	DAMAGE_POISON(AttributeCategory.INTELLIGENCE,
			Attribute.DAMAGE_POISON,
			"Applies an effect related to the secondary attribute 'Poison damage'.",
			"modifier_circle_damage",
			Rarity.RARE),

	/**
	 * Utility value for initialising a weapon to have attribute bonuses related to its damage type.
	 */
	DAMAGE_WEAPON(AttributeCategory.STRENGTH,
			Attribute.DAMAGE_PHYSICAL,
			"Applies a damage effect related to the weapon's damage type.",
			"modifier_circle_damage",
			Rarity.RARE),

	RESISTANCE_LUST(AttributeCategory.CORRUPTION,
			Attribute.RESISTANCE_LUST,
			"Applies an effect related to the secondary attribute 'Seduction shielding'.",
			"modifier_circle_resistance",
			Rarity.RARE),

	RESISTANCE_PHYSICAL(AttributeCategory.STRENGTH,
			Attribute.RESISTANCE_PHYSICAL,
			"Applies an effect related to the secondary attribute 'Physical shielding'.",
			"modifier_circle_resistance",
			Rarity.RARE),

	RESISTANCE_FIRE(AttributeCategory.INTELLIGENCE,
			Attribute.RESISTANCE_FIRE,
			"Applies an effect related to the secondary attribute 'Fire shielding'.",
			"modifier_circle_resistance",
			Rarity.RARE),

	RESISTANCE_ICE(AttributeCategory.INTELLIGENCE,
			Attribute.RESISTANCE_ICE,
			"Applies an effect related to the secondary attribute 'Ice shielding'.",
			"modifier_circle_resistance",
			Rarity.RARE),

	RESISTANCE_POISON(AttributeCategory.INTELLIGENCE,
			Attribute.RESISTANCE_POISON,
			"Applies an effect related to the secondary attribute 'Poison shielding'.",
			"modifier_circle_resistance",
			Rarity.RARE),

	/**
	 * Utility value for initialising a weapon to have attribute bonuses related to its damage type.
	 */
	RESISTANCE_WEAPON(AttributeCategory.STRENGTH,
			Attribute.RESISTANCE_PHYSICAL,
			"Applies a shielding effect related to the weapon's damage type.",
			"modifier_circle_resistance",
			Rarity.RARE),

	// Clothing parts:

	CLOTHING_MAJOR_ATTRIBUTE("core attribute",
			"Applies a modifier to a core attribute.",
			"attribute",
			"modifier_circle_attribute_major",
			Colour.GENERIC_ATTRIBUTE,
			Rarity.LEGENDARY),

	CLOTHING_ATTRIBUTE("attribute",
			"Applies a modifier to an attribute.",
			"attribute",
			"modifier_circle_attribute",
			Colour.GENERIC_ATTRIBUTE,
			Rarity.UNCOMMON),

	CLOTHING_SPECIAL("special effects",
			"Applies a special effect.",
			"special",
			"modifier_circle_special",
			Colour.BASE_TEAL,
			Rarity.LEGENDARY),

	CLOTHING_ENSLAVEMENT("enslavement",
			"Makes this piece of clothing enslave the wearer.",
			"enslavement",
			"modifier_circle_enslavement",
			Colour.BASE_PURPLE,
			Rarity.LEGENDARY),

	CLOTHING_SEALING("sealing",
			"Makes this piece of clothing seal itself onto the wearer.",
			"sealing",
			"modifier_circle_sealing",
			Colour.SEALED,
			Rarity.LEGENDARY),

	CLOTHING_CONDOM("condom strength",
			"Provides underlying strength to the condom.",
			"condom strength",
			"modifier_circle_resistance",
			Colour.BASE_GREEN,
			Rarity.COMMON),

	// Racial parts:

	TF_MATERIAL_FLESH("flesh",
			"Turns a person's body material to flesh.",
			"flesh",
			"modifier_circle_tf_material_flesh",
			Colour.BASE_CRIMSON,
			Rarity.LEGENDARY),

	TF_ANTENNA("antennae",
			"Applies a transformative effect to your antennae.",
			"antennae",
			"modifier_circle_tf_antenna",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_ARMS("arms",
			"Applies a transformative effect to your arms.",
			"arms",
			"modifier_circle_tf_arm",
			Colour.TRANSFORMATION_LESSER,
			Rarity.RARE),

	TF_ASS("ass",
			"Applies a transformative effect to your ass.",
			"asses",
			"modifier_circle_tf_ass",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_BREASTS("breasts",
			"Applies a transformative effect to your breasts.",
			"breasts",
			"modifier_circle_tf_breast",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_BREASTS_CROTCH("crotch-boobs",
			"Applies a transformative effect to your crotch-boobs/udders.",
			"crotch-boobs",
			"modifier_circle_tf_breast_crotch",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_CORE("core",
			"Applies a transformative effect to your body.",
			"core",
			"modifier_circle_tf_core",
			Colour.TRANSFORMATION_GREATER,
			Rarity.RARE),

	TF_EARS("ears",
			"Applies a transformative effect to your ears.",
			"ears",
			"modifier_circle_tf_ear",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_EYES("eyes",
			"Applies a transformative effect to your eyes.",
			"eyes",
			"modifier_circle_tf_eye",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_FACE("face",
			"Applies a transformative effect to your face.",
			"faces",
			"modifier_circle_tf_face",
			Colour.TRANSFORMATION_GREATER,
			Rarity.EPIC),

	TF_HAIR("hair",
			"Applies a transformative effect to your hair.",
			"hair",
			"modifier_circle_tf_hair",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_HORNS("horns",
			"Applies a transformative effect to your horns.",
			"horns",
			"modifier_circle_tf_horn",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_LEGS("legs",
			"Applies a transformative effect to your legs.",
			"legs",
			"modifier_circle_tf_leg",
			Colour.TRANSFORMATION_LESSER,
			Rarity.RARE),

	TF_PENIS("penis",
			"Applies a transformative effect to your penis.",
			"cocks",
			"modifier_circle_tf_penis",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_SKIN("torso",
			"Applies a transformative effect to your torso.",
			"torso",
			"modifier_circle_tf_skin",
			Colour.TRANSFORMATION_GREATER,
			Rarity.EPIC),

	TF_TAIL("tail",
			"Applies a transformative effect to your tail.",
			"tails",
			"modifier_circle_tf_tail",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_VAGINA("vagina",
			"Applies a transformative effect to your vagina.",
			"pussies",
			"modifier_circle_tf_vagina",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_WINGS("wings",
			"Applies a transformative effect to your wings.",
			"wings",
			"modifier_circle_tf_wing",
			Colour.TRANSFORMATION_PARTIAL,
			Rarity.UNCOMMON),

	TF_MILK("milk",
			"Applies a transformative effect to your milk.",
			"milk",
			"modifier_circle_tf_milk",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_MILK_CROTCH("udder-milk",
			"Applies a transformative effect to your udder-milk.",
			"udder-milk",
			"modifier_circle_tf_milk_crotch",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_CUM("cum",
			"Applies a transformative effect to your cum.",
			"cum",
			"modifier_circle_tf_cum",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	TF_GIRLCUM("girlcum",
			"Applies a transformative effect to your girlcum.",
			"girlcum",
			"modifier_circle_tf_girlcum",
			Colour.TRANSFORMATION_SEXUAL,
			Rarity.UNCOMMON),

	// Body part modifiers:

	TF_TYPE_1("transformative I",
			"Transforms the related body part into that of a different race.",
			"transformative",
			"modifier_circle_tf_1",
			Colour.TRANSFORMATION_GENERIC,
			Rarity.COMMON),

	TF_TYPE_2("transformative II",
			"Transforms the related body part into that of a different race.",
			"transformative",
			"modifier_circle_tf_2",
			Colour.TRANSFORMATION_GENERIC,
			Rarity.COMMON),

	TF_TYPE_3("transformative III",
			"Transforms the related body part into that of a different race.",
			"transformative",
			"modifier_circle_tf_3",
			Colour.TRANSFORMATION_GENERIC,
			Rarity.COMMON),

	TF_TYPE_4("transformative IV",
			"Transforms the related body part into that of a different race.",
			"transformative",
			"modifier_circle_tf_4",
			Colour.TRANSFORMATION_GENERIC,
			Rarity.COMMON),

	TF_TYPE_5("transformative V",
			"Transforms the related body part into that of a different race.",
			"transformative",
			"modifier_circle_tf_5",
			Colour.TRANSFORMATION_GENERIC,
			Rarity.COMMON),

	TF_MOD_FEMININITY("femininity",
			"Applies an effect to change the user's femininity.",
			"feminine",
			"modifier_circle_femininity",
			Colour.ANDROGYNOUS,
			Rarity.COMMON),

	TF_MOD_COUNT("count",
			"Applies an effect related to adding or removing extra body parts.",
			"counting",
			"modifier_circle_count",
			Colour.BASE_AQUA,
			Rarity.COMMON),

	TF_MOD_COUNT_SECONDARY("secondary count",
			"Applies an effect related to adding or removing extra body parts.",
			"counting",
			"modifier_circle_count_secondary",
			Colour.BASE_TEAL,
			Rarity.COMMON),

	TF_MOD_BODY_HAIR("hairiness",
			"Applies an effect related to adding or removing body hair.",
			"hairy",
			"modifier_circle_bodyHair",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_FOOT_STRUCTURE_PLANTIGRADE("plantigrade feet",
			"Applies an effect to give the user a plantigrade foot structure.",
			"plantigrade feet",
			"modifier_circle_tf_footStructure_plantigrade",
			Colour.BASE_BLUE_LIGHT,
			Rarity.LEGENDARY),

	TF_MOD_FOOT_STRUCTURE_DIGITIGRADE("digitigrade feet",
			"Applies an effect to give the user a digitigrade foot structure.",
			"digitigrade feet",
			"modifier_circle_tf_footStructure_digitigrade",
			Colour.BASE_BROWN_DARK,
			Rarity.LEGENDARY),

	TF_MOD_FOOT_STRUCTURE_UNGULIGRADE("unguligrade feet",
			"Applies an effect to give the user an unguligrade foot structure.",
			"unguligrade feet",
			"modifier_circle_tf_footStructure_unguligrade",
			Colour.BASE_TAN,
			Rarity.LEGENDARY),

	TF_MOD_LEG_CONFIG_BIPEDAL("bipedal body",
			"Applies an effect to give the user a bipedal body.",
			"bipedal body",
			"modifier_circle_tf_legConfig_bipedal",
			Colour.BASE_BLUE_LIGHT,
			Rarity.LEGENDARY),

	TF_MOD_LEG_CONFIG_TAUR("taur body",
			"Applies an effect to give the user a taur body.",
			"taur body",
			"modifier_circle_tf_legConfig_taur",
			Colour.BASE_TAN,
			Rarity.LEGENDARY),

	TF_MOD_LEG_CONFIG_TAIL_LONG("long-tailed body",
			"Applies an effect to give the user a long-tailed body.",
			"long-tailed body",
			"modifier_circle_tf_legConfig_tail_long",
			Colour.BASE_GREEN,
			Rarity.LEGENDARY),

	TF_MOD_LEG_CONFIG_TAIL("tailed body",
			"Applies an effect to give the user a tailed body.",
			"tailed body",
			"modifier_circle_tf_legConfig_tail",
			Colour.BASE_AQUA,
			Rarity.LEGENDARY),

	TF_MOD_LEG_CONFIG_ARACHNID("arachnid body",
			"Applies an effect to give the user an arachnid body.",
			"arachnid body",
			"modifier_circle_tf_legConfig_arachnid",
			Colour.BASE_BLACK,
			Rarity.LEGENDARY),

	TF_MOD_LEG_CONFIG_CEPHALOPOD("cephalopod body",
			"Applies an effect to give the user a cephalopod body.",
			"cephalopod body",
			"modifier_circle_tf_legConfig_cephalopod",
			Colour.BASE_RED,
			Rarity.LEGENDARY),

	TF_MOD_INTERNAL("internal",
			"Applies an effect related to making a body part internal.",
			"internal",
			"modifier_circle_internal",
			Colour.BASE_BLUE_STEEL,
			Rarity.COMMON),

	TF_MOD_SIZE("size",
			"Applies an effect related to the change in size of a certain body part.",
			"resizing",
			"modifier_circle_size",
			Colour.BASE_LILAC,
			Rarity.COMMON),

	TF_MOD_SIZE_SECONDARY("secondary size",
			"Applies an effect related to the change in size of a different body part.",
			"resizing",
			"modifier_circle_size_secondary",
			Colour.BASE_LILAC_LIGHT,
			Rarity.COMMON),

	TF_MOD_SIZE_TERTIARY("tertiary size",
			"Applies an effect related to the change in size of yet another body part.",
			"resizing",
			"modifier_circle_size_tertiary",
			Colour.BASE_ROSE,
			Rarity.COMMON),

	TF_MOD_REGENERATION("regeneration",
			"Applies an effect related to the regeneration rate of fluids.",
			"refilling",
			"modifier_circle_regeneration",
			Colour.BASE_GREEN_LIGHT,
			Rarity.COMMON),

	// Orifices:

	TF_MOD_CAPACITY("capacity",
			"Applies an effect related to changing an orifice's capacity.",
			"capacity",
			"modifier_circle_capacity",
			Colour.BASE_PINK_LIGHT,
			Rarity.COMMON),

	TF_MOD_CAPACITY_2("capacity II",
			"Applies an effect related to changing an orifice's capacity.",
			"capacity",
			"modifier_circle_capacity",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_WETNESS("wetness",
			"Applies an effect related to changing the wetness of an orifice, or the fluid production of a body part.",
			"wet",
			"modifier_circle_wetness",
			Colour.BASE_BLUE_LIGHT,
			Rarity.COMMON),

	TF_MOD_ELASTICITY("elasticity",
			"Applies an effect related to changing the elasticity of an orifice.",
			"elastic",
			"modifier_circle_elasticity",
			Colour.BASE_AQUA,
			Rarity.COMMON),

	TF_MOD_ELASTICITY_2("elasticity II",
			"Applies an effect related to changing the elasticity of an orifice.",
			"elastic",
			"modifier_circle_elasticity",
			Colour.BASE_BLUE_LIGHT,
			Rarity.COMMON),

	TF_MOD_PLASTICITY("plasticity",
			"Applies an effect related to changing the plasticity of an orifice.",
			"plastic",
			"modifier_circle_plasticity",
			Colour.BASE_TEAL,
			Rarity.COMMON),

	TF_MOD_PLASTICITY_2("plasticity II",
			"Applies an effect related to changing the plasticity of an orifice.",
			"plastic",
			"modifier_circle_plasticity",
			Colour.BASE_BLUE,
			Rarity.COMMON),

	// modifiers:

	TF_MOD_ORIFICE_PUFFY("puffiness",
			"Applies an effect related to making an orifice puffy.",
			"puffy",
			"modifier_circle_orifice_puffy",
			Colour.BASE_BLUE_LIGHT,
			Rarity.COMMON),

	TF_MOD_ORIFICE_RIBBED("ribbing",
			"Applies an effect related to making an orifice internally-ribbed.",
			"ribbed",
			"modifier_circle_orifice_ribbed",
			Colour.BASE_PINK_LIGHT,
			Rarity.COMMON),

	TF_MOD_ORIFICE_TENTACLED("tentacled",
			"Applies an effect related to making an orifice internally-tentacled.",
			"tentacled",
			"modifier_circle_orifice_tentacled",
			Colour.BASE_CRIMSON,
			Rarity.COMMON),

	TF_MOD_ORIFICE_MUSCLED("muscled",
			"Applies an effect related to making an orifice internally-muscled.",
			"muscled",
			"modifier_circle_orifice_muscled",
			Colour.BASE_MAGENTA,
			Rarity.COMMON),

	TF_MOD_ORIFICE_PUFFY_2("puffiness II",
			"Applies an effect related to making an orifice puffy.",
			"puffy",
			"modifier_circle_orifice_puffy",
			Colour.BASE_BLUE,
			Rarity.COMMON),

	TF_MOD_ORIFICE_RIBBED_2("ribbing II",
			"Applies an effect related to making an orifice internally-ribbed.",
			"ribbed",
			"modifier_circle_orifice_ribbed",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_ORIFICE_TENTACLED_2("tentacled II",
			"Applies an effect related to making an orifice internally-tentacled.",
			"tentacled",
			"modifier_circle_orifice_tentacled",
			Colour.BASE_RED,
			Rarity.COMMON),

	TF_MOD_ORIFICE_MUSCLED_2("muscled II",
			"Applies an effect related to making an orifice internally-muscled.",
			"muscled",
			"modifier_circle_orifice_muscled",
			Colour.BASE_PURPLE,
			Rarity.COMMON),

	// eye shapes:

	TF_MOD_EYE_IRIS_CIRCLE("circular irises",
			"Applies an effect related to making irises shaped like normal circles.",
			"circular irises",
			"modifier_circle_eye_iris_normal",
			Colour.BASE_PURPLE,
			Rarity.COMMON),

	TF_MOD_EYE_IRIS_HORIZONTAL("horizontal irises",
			"Applies an effect related to making irises take a more horizontal shape.",
			"horizontal irises",
			"modifier_circle_eye_iris_horizontal",
			Colour.BASE_LILAC_LIGHT,
			Rarity.COMMON),

	TF_MOD_EYE_IRIS_VERTICAL("vertical irises",
			"Applies an effect related to making irises take a more vertical shape.",
			"vertical irises",
			"modifier_circle_eye_iris_vertical",
			Colour.BASE_PURPLE_LIGHT,
			Rarity.COMMON),

	TF_MOD_EYE_IRIS_HEART("heart-shaped irises",
			"Applies an effect related to making irises shaped like hearts.",
			"heart-shaped irises",
			"modifier_circle_eye_iris_heart",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_EYE_IRIS_STAR("star-shaped irises",
			"Applies an effect related to making irises shaped like stars.",
			"star-shaped irises",
			"modifier_circle_eye_iris_star",
			Colour.BASE_YELLOW,
			Rarity.COMMON),

	TF_MOD_EYE_PUPIL_CIRCLE("circular pupils",
			"Applies an effect related to making pupils shaped like normal circles.",
			"circular pupils",
			"modifier_circle_eye_iris_normal",
			Colour.BASE_BLACK,
			Rarity.COMMON),

	TF_MOD_EYE_PUPIL_HORIZONTAL("horizontal pupils",
			"Applies an effect related to making pupils take a more horizontal shape.",
			"horizontal pupils",
			"modifier_circle_eye_iris_horizontal",
			Colour.BASE_AQUA,
			Rarity.COMMON),

	TF_MOD_EYE_PUPIL_VERTICAL("vertical pupils",
			"Applies an effect related to making pupils take a more vertical shape.",
			"vertical pupils",
			"modifier_circle_eye_iris_vertical",
			Colour.BASE_TEAL,
			Rarity.COMMON),

	TF_MOD_EYE_PUPIL_HEART("heart-shaped pupils",
			"Applies an effect related to making pupils shaped like hearts.",
			"heart-shaped pupils",
			"modifier_circle_eye_iris_heart",
			Colour.BASE_BLUE_LIGHT,
			Rarity.COMMON),

	TF_MOD_EYE_PUPIL_STAR("star-shaped pupils",
			"Applies an effect related to making pupils shaped like stars.",
			"star-shaped pupils",
			"modifier_circle_eye_iris_star",
			Colour.BASE_BLUE,
			Rarity.COMMON),

	// breast shapes:

	TF_MOD_BREAST_SHAPE_UDDERS("udders",
			"Applies an effect related to turning crotch-boobs into udders.",
			"udders",
			"modifier_circle_breastShape_udders",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_BREAST_SHAPE_ROUND("round breasts",
			"Applies an effect related to making breasts take on a round shape.",
			"round",
			"modifier_circle_breastShape_round",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_BREAST_SHAPE_NARROW("narrow breasts",
			"Applies an effect related to making breasts take on a narrow shape.",
			"narrow",
			"modifier_circle_breastShape_narrow",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_BREAST_SHAPE_WIDE("wide breasts",
			"Applies an effect related to making breasts take on a wide shape.",
			"wide",
			"modifier_circle_breastShape_wide",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_BREAST_SHAPE_POINTY("pointy breasts",
			"Applies an effect related to making breasts take on a pointy shape.",
			"pointy",
			"modifier_circle_breastShape_pointy",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_BREAST_SHAPE_PERKY("perky breasts",
			"Applies an effect related to making breasts take on a perky shape.",
			"perky",
			"modifier_circle_breastShape_perky",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_BREAST_SHAPE_SIDESET("side-set breasts",
			"Applies an effect related to making breasts take on a side-set shape.",
			"side-set",
			"modifier_circle_breastShape_sideset",
			Colour.BASE_TAN,
			Rarity.COMMON),

	// nipple shapes:

	TF_MOD_NIPPLE_NORMAL("normal nipples",
			"Applies an effect related to making nipples look normal.",
			"normal nipples",
			"modifier_circle_nipple_normal",
			Colour.BASE_PURPLE_LIGHT,
			Rarity.COMMON),

	TF_MOD_NIPPLE_VAGINA("nipple cunts",
			"Applies an effect related to making nipples look like pussies.",
			"nipple cunts",
			"modifier_circle_nipple_vagina",
			Colour.BASE_PINK_LIGHT,
			Rarity.COMMON),

	TF_MOD_NIPPLE_LIPS("lipples",
			"Applies an effect related to making nipples look like a pair of lips.",
			"lipples",
			"modifier_circle_nipple_lips",
			Colour.BASE_MAGENTA,
			Rarity.COMMON),

	// areolae shapes:

	TF_MOD_AREOLAE_CIRCLE("circular areolae",
			"Applies an effect related to making areolae shaped like normal circles.",
			"circular areolae",
			"modifier_circle_areolae_normal",
			Colour.BASE_PURPLE,
			Rarity.COMMON),

	TF_MOD_AREOLAE_HEART("heart-shaped areolae",
			"Applies an effect related to making areolae shaped like hearts.",
			"heart-shaped areolae",
			"modifier_circle_areolae_heart",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_AREOLAE_STAR("star-shaped areolae",
			"Applies an effect related to making areolae shaped like stars.",
			"star-shaped areolae",
			"modifier_circle_areolae_star",
			Colour.BASE_YELLOW,
			Rarity.COMMON),

	// tongue modifiers:

	TF_MOD_TONGUE_RIBBED("ribbing",
			"Applies an effect related to adding ribbing to a tongue.",
			"ribbed",
			"modifier_circle_orifice_ribbed",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_TONGUE_TENTACLED("tentacled",
			"Applies an effect related to adding tentacles to a tongue.",
			"tentacled",
			"modifier_circle_orifice_tentacled",
			Colour.BASE_PINK_SALMON,
			Rarity.COMMON),

	TF_MOD_TONGUE_BIFURCATED("bifurcated",
			"Applies an effect related to making a tongue bifurcated.",
			"bifurcated",
			"modifier_circle_tongue_bifurcated",
			Colour.BASE_CRIMSON,
			Rarity.COMMON),

	// penis & clit modifiers:

	TF_MOD_PENIS_SHEATHED("sheathing",
			"Applies an effect related to making a body part sheathed.",
			"sheathed",
			"modifier_circle_penis_sheathed",
			Colour.BASE_ORANGE,
			Rarity.COMMON),

	TF_MOD_PENIS_RIBBED("ribbing",
			"Applies an effect related to making a body part ribbed.",
			"ribbed",
			"modifier_circle_penis_ribbed",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_PENIS_TENTACLED("tentacled",
			"Applies an effect related to making a body part tentacled.",
			"tentacled",
			"modifier_circle_orifice_tentacled",
			Colour.BASE_PINK_SALMON,
			Rarity.COMMON),

	TF_MOD_PENIS_KNOTTED("knotting",
			"Applies an effect related to making a body part knotted.",
			"knotted",
			"modifier_circle_penis_knotted",
			Colour.BASE_CRIMSON,
			Rarity.COMMON),

	TF_MOD_PENIS_TAPERED("tapering",
			"Applies an effect related to making a body part tapered.",
			"tapered",
			"modifier_circle_penis_tapered",
			Colour.BASE_LILAC,
			Rarity.COMMON),

	TF_MOD_PENIS_FLARED("flaring",
			"Applies an effect related to making a body part flared.",
			"flared",
			"modifier_circle_penis_flared",
			Colour.BASE_BROWN,
			Rarity.COMMON),

	TF_MOD_PENIS_BLUNT("blunting",
			"Applies an effect related to making a body part blunted.",
			"blunt",
			"modifier_circle_penis_blunt",
			Colour.BASE_TAN,
			Rarity.COMMON),

	TF_MOD_PENIS_BARBED("barbing",
			"Applies an effect related to making a body part barbed.",
			"barbed",
			"modifier_circle_penis_barbed",
			Colour.BASE_RED,
			Rarity.COMMON),

	TF_MOD_PENIS_VEINY("veins",
			"Applies an effect related to making a body part veiny.",
			"veiny",
			"modifier_circle_penis_veiny",
			Colour.BASE_PINK_SALMON,
			Rarity.COMMON),

	TF_MOD_PENIS_PREHENSILE("prehensile",
			"Applies an effect related to making a body part prehensile.",
			"prehensile",
			"modifier_circle_penis_prehensile",
			Colour.BASE_TEAL,
			Rarity.COMMON),

	TF_MOD_CUM_EXPULSION("cum expulsion",
			"Applies an effect related to modifying the amount of cum expelled at each orgasm.",
			"cumming",
			"modifier_circle_squirter",
			Colour.BASE_AQUA,
			Rarity.COMMON),

	// vagina:

	TF_MOD_VAGINA_SQUIRTER("squirter",
			"Applies an effect related to making someone a squirter.",
			"squirting",
			"modifier_circle_squirter",
			Colour.BASE_AQUA,
			Rarity.COMMON),

	// fluid modifiers:

	TF_MOD_FLUID_MUSKY("musky",
			"Applies an effect related to changing a fluid.",
			"musk",
			"modifier_circle_fluid_modifier",
			Colour.BASE_BROWN,
			Rarity.COMMON),

	TF_MOD_FLUID_VISCOUS("viscous",
			"Applies an effect related to changing a fluid.",
			"viscous",
			"modifier_circle_fluid_modifier",
			Colour.BASE_GREY,
			Rarity.COMMON),

	TF_MOD_FLUID_STICKY("sticky",
			"Applies an effect related to changing a fluid.",
			"sticky",
			"modifier_circle_fluid_modifier",
			Colour.BASE_YELLOW_LIGHT,
			Rarity.COMMON),

	TF_MOD_FLUID_SLIMY("slimy",
			"Applies an effect related to changing a fluid.",
			"slimy",
			"modifier_circle_fluid_modifier",
			Colour.BASE_BLUE_LIGHT,
			Rarity.COMMON),

	TF_MOD_FLUID_BUBBLING("bubbling",
			"Applies an effect related to changing a fluid.",
			"bubbling",
			"modifier_circle_fluid_modifier",
			Colour.BASE_AQUA,
			Rarity.COMMON),

	TF_MOD_FLUID_ALCOHOLIC("alcoholic",
			"Applies an effect related to changing a fluid.",
			"alcoholic",
			"modifier_circle_fluid_modifier",
			Colour.BASE_ORANGE,
			Rarity.COMMON),

	TF_MOD_FLUID_ADDICTIVE("addictive",
			"Applies an effect related to changing a fluid.",
			"addictive",
			"modifier_circle_fluid_modifier",
			Colour.BASE_PINK_DEEP,
			Rarity.COMMON),

	TF_MOD_FLUID_HALLUCINOGENIC("psychoactive",
			"Applies an effect related to changing a fluid.",
			"psychoactive",
			"modifier_circle_fluid_modifier",
			Colour.BASE_MAGENTA,
			Rarity.COMMON),

	TF_MOD_FLUID_MINERAL_OIL("mineral oil",
			"Applies an effect related to changing a fluid.",
			"mineral oil",
			"modifier_circle_fluid_modifier",
			Colour.BASE_BLACK,
			Rarity.COMMON),

	// fluid flavours: TODO background

	TF_MOD_FLAVOUR_CUM("cum-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"cum-flavour",
			"modifier_circle_flavour_cum",
			Colour.BASE_YELLOW_LIGHT,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_MILK("milk-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"milk-flavour",
			"modifier_circle_flavour_cum",
			Colour.BASE_WHITE,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_GIRLCUM("girlcum-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"milk-flavour",
			"modifier_circle_flavour_cum",
			Colour.BASE_PINK_LIGHT,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_BUBBLEGUM("bubblegum-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"bubblegum-flavour",
			"modifier_circle_flavour_bubblegum",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_BEER("beer-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"beer-flavour",
			"modifier_circle_flavour_beer",
			Colour.BASE_ORANGE,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_VANILLA("vanilla-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"vanilla-flavour",
			"modifier_circle_flavour_vanilla",
			Colour.BASE_YELLOW_LIGHT,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_STRAWBERRY("strawberry-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"strawberry-flavour",
			"modifier_circle_flavour_strawberry",
			Colour.BASE_RED,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_CHOCOLATE("chocolate-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"chocolate-flavour",
			"modifier_circle_flavour_chocolate",
			Colour.BASE_BROWN_DARK,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_PINEAPPLE("pineapple-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"pineapple-flavour",
			"modifier_circle_flavour_pineapple",
			Colour.BASE_YELLOW_LIGHT,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_HONEY("honey-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"honey-flavour",
			"modifier_circle_flavour_honey",
			Colour.BASE_YELLOW,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_MINT("mint-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"mint-flavour",
			"modifier_circle_flavour_mint",
			Colour.BASE_GREEN_LIME,
			Rarity.COMMON),

	TF_MOD_FLAVOUR_CHERRY("cherry-flavour",
			"Applies an effect related to changing a fluid's flavour.",
			"cherry-flavour",
			"modifier_circle_flavour_cherry",
			Colour.BASE_CRIMSON,
			Rarity.COMMON),

	// Fetishes:

	TF_MOD_FETISH_BODY_PART("body part fetishes",
			"Applies an effect related to a body part fetish.",
			"fetish",
			"modifier_circle_desires",
			Colour.BASE_PINK,
			Rarity.COMMON),

	TF_MOD_FETISH_BEHAVIOUR("behavioural fetishes",
			"Applies an effect related to a behavioural fetish.",
			"fetish",
			"modifier_circle_desires",
			Colour.BASE_PURPLE,
			Rarity.COMMON),

	TF_MOD_FETISH_ANAL_GIVING(Fetish.FETISH_ANAL_GIVING),
	TF_MOD_FETISH_ANAL_RECEIVING(Fetish.FETISH_ANAL_RECEIVING),
	TF_MOD_FETISH_VAGINAL_GIVING(Fetish.FETISH_VAGINAL_GIVING),
	TF_MOD_FETISH_VAGINAL_RECEIVING(Fetish.FETISH_VAGINAL_RECEIVING),
	TF_MOD_FETISH_PENIS_GIVING(Fetish.FETISH_PENIS_GIVING),
	TF_MOD_FETISH_PENIS_RECEIVING(Fetish.FETISH_PENIS_RECEIVING),
	TF_MOD_FETISH_BREASTS_OTHERS(Fetish.FETISH_BREASTS_OTHERS),
	TF_MOD_FETISH_BREASTS_SELF(Fetish.FETISH_BREASTS_SELF),
	TF_MOD_FETISH_ORAL_GIVING(Fetish.FETISH_ORAL_GIVING),
	TF_MOD_FETISH_ORAL_RECEIVING(Fetish.FETISH_ORAL_RECEIVING),
	TF_MOD_FETISH_LEG_LOVER(Fetish.FETISH_LEG_LOVER),
	TF_MOD_FETISH_STRUTTER(Fetish.FETISH_STRUTTER),
	TF_MOD_FETISH_FOOT_GIVING(Fetish.FETISH_FOOT_GIVING),
	TF_MOD_FETISH_FOOT_RECEIVING(Fetish.FETISH_FOOT_RECEIVING),
	TF_MOD_FETISH_LACTATION_OTHERS(Fetish.FETISH_LACTATION_OTHERS),
	TF_MOD_FETISH_LACTATION_SELF(Fetish.FETISH_LACTATION_SELF),

	TF_MOD_FETISH_DOMINANT(Fetish.FETISH_DOMINANT),
	TF_MOD_FETISH_SUBMISSIVE(Fetish.FETISH_SUBMISSIVE),
	TF_MOD_FETISH_CROSS_DRESSER(Fetish.FETISH_CROSS_DRESSER),
	TF_MOD_FETISH_CUM_ADDICT(Fetish.FETISH_CUM_ADDICT),
	TF_MOD_FETISH_CUM_STUD(Fetish.FETISH_CUM_STUD),
	TF_MOD_FETISH_DEFLOWERING(Fetish.FETISH_DEFLOWERING),
	TF_MOD_FETISH_DENIAL(Fetish.FETISH_DENIAL),
	TF_MOD_FETISH_DENIAL_SELF(Fetish.FETISH_DENIAL_SELF),
	TF_MOD_FETISH_EXHIBITIONIST(Fetish.FETISH_EXHIBITIONIST),
	TF_MOD_FETISH_VOYEURIST(Fetish.FETISH_VOYEURIST),
	TF_MOD_FETISH_IMPREGNATION(Fetish.FETISH_IMPREGNATION),
	TF_MOD_FETISH_INCEST(Fetish.FETISH_INCEST),
	TF_MOD_FETISH_MASOCHIST(Fetish.FETISH_MASOCHIST),
	TF_MOD_FETISH_MASTURBATION(Fetish.FETISH_MASTURBATION),
	TF_MOD_FETISH_NON_CON_DOM(Fetish.FETISH_NON_CON_DOM),
	TF_MOD_FETISH_NON_CON_SUB(Fetish.FETISH_NON_CON_SUB),
	TF_MOD_FETISH_PREGNANCY(Fetish.FETISH_PREGNANCY),
	TF_MOD_FETISH_PURE_VIRGIN(Fetish.FETISH_PURE_VIRGIN),
	TF_MOD_FETISH_SADIST(Fetish.FETISH_SADIST),
	TF_MOD_FETISH_TRANSFORMATION_GIVING(Fetish.FETISH_TRANSFORMATION_GIVING),
	TF_MOD_FETISH_TRANSFORMATION_RECEIVING(Fetish.FETISH_TRANSFORMATION_RECEIVING),
	TF_MOD_FETISH_BIMBO(Fetish.FETISH_BIMBO),
	TF_MOD_FETISH_KINK_GIVING(Fetish.FETISH_KINK_GIVING),
	TF_MOD_FETISH_KINK_RECEIVING(Fetish.FETISH_KINK_RECEIVING),
	;

	private static List<TFModifier> TFModStrengthList = new ArrayList<>();
	private static List<TFModifier> TFModIntelligenceList = new ArrayList<>();
	private static List<TFModifier> TFModCorruptionList = new ArrayList<>();
	private static List<TFModifier> TFModSexualList = new ArrayList<>();
	private static List<TFModifier> TFAttributeList = new ArrayList<>();
	private static List<TFModifier> TFRacialBodyPartsList = new ArrayList<>();
	private static List<TFModifier> TFBodyPartFetishList = new ArrayList<>();
	private static List<TFModifier> TFBehaviouralFetishList = new ArrayList<>();

	private static List<TFModifier> clothingPrimaryList = new ArrayList<>();
	private static List<TFModifier> clothingAttributeList = new ArrayList<>();
	private static List<TFModifier> clothingMajorAttributeList = new ArrayList<>();

	private static List<TFModifier> tattooPrimaryList = new ArrayList<>();

	private static List<TFModifier> weaponPrimaryList = new ArrayList<>();
	private static List<TFModifier> weaponAttributeList = new ArrayList<>();
	private static List<TFModifier> weaponMajorAttributeList = new ArrayList<>();

	static {

		TFModStrengthList.add(NONE);
		TFModIntelligenceList.add(NONE);
		TFModCorruptionList.add(NONE);
		TFModSexualList.add(NONE);

		for(TFModifier tfMod : TFModifier.values()) {
			if(tfMod.getAttributeCategory()!=null && tfMod!=TFModifier.DAMAGE_WEAPON && tfMod!=TFModifier.RESISTANCE_WEAPON) {
				switch(tfMod.getAttributeCategory()) {
					case CORRUPTION:
						TFModCorruptionList.add(tfMod);
						break;
					case INTELLIGENCE:
						TFModIntelligenceList.add(tfMod);
						break;
					case STRENGTH:
						TFModStrengthList.add(tfMod);
						break;
				}
			}
		}

		TFModSexualList.add(FERTILITY);
		TFModSexualList.add(VIRILITY);
		TFModSexualList.add(DAMAGE_LUST);
		TFModSexualList.add(RESISTANCE_LUST);

		// Body parts:

		TFRacialBodyPartsList.add(NONE);
		TFRacialBodyPartsList.add(TF_FACE);
		TFRacialBodyPartsList.add(TF_SKIN);
		TFRacialBodyPartsList.add(TF_CORE);

		TFRacialBodyPartsList.add(TF_ARMS);
		TFRacialBodyPartsList.add(TF_LEGS);

		TFRacialBodyPartsList.add(TF_EARS);
		TFRacialBodyPartsList.add(TF_EYES);
		TFRacialBodyPartsList.add(TF_HAIR);
		TFRacialBodyPartsList.add(TF_ANTENNA);
		TFRacialBodyPartsList.add(TF_HORNS);
		TFRacialBodyPartsList.add(TF_TAIL);
		TFRacialBodyPartsList.add(TF_WINGS);

		TFRacialBodyPartsList.add(TF_ASS);
		TFRacialBodyPartsList.add(TF_BREASTS);
		TFRacialBodyPartsList.add(TF_BREASTS_CROTCH);
		TFRacialBodyPartsList.add(TF_PENIS);
		TFRacialBodyPartsList.add(TF_VAGINA);

		TFRacialBodyPartsList.add(TF_MILK);
		TFRacialBodyPartsList.add(TF_MILK_CROTCH);
		TFRacialBodyPartsList.add(TF_CUM);
		TFRacialBodyPartsList.add(TF_GIRLCUM);

//		TFAttributeList.add(NONE);
		TFAttributeList.add(ARCANE_BOOST);

		TFBodyPartFetishList.add(TF_MOD_FETISH_ANAL_GIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_ANAL_RECEIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_BREASTS_OTHERS);
		TFBodyPartFetishList.add(TF_MOD_FETISH_BREASTS_SELF);
		TFBodyPartFetishList.add(TF_MOD_FETISH_ORAL_GIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_ORAL_RECEIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_VAGINAL_GIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_VAGINAL_RECEIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_PENIS_GIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_PENIS_RECEIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_LEG_LOVER);
		TFBodyPartFetishList.add(TF_MOD_FETISH_STRUTTER);
		TFBodyPartFetishList.add(TF_MOD_FETISH_FOOT_GIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_FOOT_RECEIVING);
		TFBodyPartFetishList.add(TF_MOD_FETISH_LACTATION_OTHERS);
		TFBodyPartFetishList.add(TF_MOD_FETISH_LACTATION_SELF);

		TFBehaviouralFetishList.add(TF_MOD_FETISH_DOMINANT);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_SUBMISSIVE);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_CUM_STUD);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_CUM_ADDICT);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_DEFLOWERING);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_PURE_VIRGIN);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_IMPREGNATION);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_PREGNANCY);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_TRANSFORMATION_GIVING);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_TRANSFORMATION_RECEIVING);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_SADIST);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_MASOCHIST);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_NON_CON_DOM);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_NON_CON_SUB);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_DENIAL);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_DENIAL_SELF);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_VOYEURIST);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_EXHIBITIONIST);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_BIMBO);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_CROSS_DRESSER);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_MASTURBATION);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_INCEST);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_KINK_GIVING);
		TFBehaviouralFetishList.add(TF_MOD_FETISH_KINK_RECEIVING);

		clothingPrimaryList.add(TFModifier.CLOTHING_MAJOR_ATTRIBUTE);
		clothingPrimaryList.add(TFModifier.CLOTHING_ATTRIBUTE);
		clothingPrimaryList.add(TFModifier.CLOTHING_SPECIAL);
		clothingPrimaryList.add(TFModifier.TF_MOD_FETISH_BODY_PART);
		clothingPrimaryList.add(TFModifier.TF_MOD_FETISH_BEHAVIOUR);
		clothingPrimaryList.add(TF_FACE);
		clothingPrimaryList.add(TF_CORE);
		clothingPrimaryList.add(TF_ARMS);
		clothingPrimaryList.add(TF_HAIR);
		clothingPrimaryList.add(TF_ASS);
		clothingPrimaryList.add(TF_BREASTS);
		clothingPrimaryList.add(TF_BREASTS_CROTCH);
		clothingPrimaryList.add(TF_PENIS);
		clothingPrimaryList.add(TF_VAGINA);

		clothingMajorAttributeList.add(TFModifier.HEALTH_MAXIMUM);
		clothingMajorAttributeList.add(TFModifier.MANA_MAXIMUM);
		clothingMajorAttributeList.add(TFModifier.STRENGTH);
		clothingMajorAttributeList.add(TFModifier.INTELLIGENCE);
		clothingMajorAttributeList.add(TFModifier.CORRUPTION);

		clothingAttributeList.add(TFModifier.FERTILITY);
		clothingAttributeList.add(TFModifier.VIRILITY);
		clothingAttributeList.add(TFModifier.DAMAGE_UNARMED);
		clothingAttributeList.add(TFModifier.DAMAGE_MELEE_WEAPON);
		clothingAttributeList.add(TFModifier.DAMAGE_RANGED_WEAPON);
		clothingAttributeList.add(TFModifier.DAMAGE_PHYSICAL);
		clothingAttributeList.add(TFModifier.DAMAGE_LUST);
		clothingAttributeList.add(TFModifier.DAMAGE_FIRE);
		clothingAttributeList.add(TFModifier.DAMAGE_ICE);
		clothingAttributeList.add(TFModifier.DAMAGE_POISON);
		clothingAttributeList.add(TFModifier.DAMAGE_SPELLS);
		clothingAttributeList.add(TFModifier.RESISTANCE_FIRE);
		clothingAttributeList.add(TFModifier.RESISTANCE_ICE);
		clothingAttributeList.add(TFModifier.RESISTANCE_LUST);
		clothingAttributeList.add(TFModifier.RESISTANCE_PHYSICAL);
		clothingAttributeList.add(TFModifier.RESISTANCE_POISON);
		clothingAttributeList.add(TFModifier.SPELL_COST_MODIFIER);
		clothingAttributeList.add(TFModifier.CRITICAL_DAMAGE);

		tattooPrimaryList.add(TFModifier.CLOTHING_ATTRIBUTE);
		tattooPrimaryList.add(TFModifier.TF_MOD_FETISH_BODY_PART);
		tattooPrimaryList.add(TFModifier.TF_MOD_FETISH_BEHAVIOUR);
		tattooPrimaryList.add(TF_FACE);
		tattooPrimaryList.add(TF_CORE);
		tattooPrimaryList.add(TF_HAIR);
		tattooPrimaryList.add(TF_ASS);
		tattooPrimaryList.add(TF_BREASTS);
		tattooPrimaryList.add(TF_BREASTS_CROTCH);
		tattooPrimaryList.add(TF_PENIS);
		tattooPrimaryList.add(TF_VAGINA);

		weaponPrimaryList.add(TFModifier.CLOTHING_MAJOR_ATTRIBUTE);
		weaponPrimaryList.add(TFModifier.CLOTHING_ATTRIBUTE);

//		weaponAttributeList.add(TFModifier.RESISTANCE_WEAPON);
//		weaponAttributeList.add(TFModifier.DAMAGE_WEAPON);

		weaponMajorAttributeList.add(TFModifier.HEALTH_MAXIMUM);
		weaponMajorAttributeList.add(TFModifier.MANA_MAXIMUM);
		weaponMajorAttributeList.add(TFModifier.STRENGTH);
		weaponMajorAttributeList.add(TFModifier.INTELLIGENCE);
		weaponMajorAttributeList.add(TFModifier.CORRUPTION);

		weaponAttributeList.add(TFModifier.FERTILITY);
		weaponAttributeList.add(TFModifier.VIRILITY);
		weaponAttributeList.add(TFModifier.DAMAGE_UNARMED);
		weaponAttributeList.add(TFModifier.DAMAGE_MELEE_WEAPON);
		weaponAttributeList.add(TFModifier.DAMAGE_RANGED_WEAPON);
		weaponAttributeList.add(TFModifier.DAMAGE_PHYSICAL);
		weaponAttributeList.add(TFModifier.DAMAGE_LUST);
		weaponAttributeList.add(TFModifier.DAMAGE_FIRE);
		weaponAttributeList.add(TFModifier.DAMAGE_ICE);
		weaponAttributeList.add(TFModifier.DAMAGE_POISON);
		weaponAttributeList.add(TFModifier.DAMAGE_SPELLS);
		weaponAttributeList.add(TFModifier.RESISTANCE_FIRE);
		weaponAttributeList.add(TFModifier.RESISTANCE_ICE);
		weaponAttributeList.add(TFModifier.RESISTANCE_LUST);
		weaponAttributeList.add(TFModifier.RESISTANCE_PHYSICAL);
		weaponAttributeList.add(TFModifier.RESISTANCE_POISON);
		weaponAttributeList.add(TFModifier.SPELL_COST_MODIFIER);
		weaponAttributeList.add(TFModifier.CRITICAL_DAMAGE);
	}

	private enum AttributeCategory {
		STRENGTH,
		INTELLIGENCE,
		CORRUPTION;
	}

	private AttributeCategory attributeCategory;
	private Attribute associatedAttribute;

	private String name;
	private String description;
	private String descriptor;
	private String SVGString;

	private Colour colour;
	private Rarity rarity;
	private Fetish fetish;

	private TFModifier(AttributeCategory attributeCategory, Attribute associatedAttribute, String description, String SVGString, Rarity rarity) {
		this.attributeCategory=attributeCategory;
		this.associatedAttribute=associatedAttribute;
		this.name = associatedAttribute.getName();
		this.description = description;
		this.descriptor = associatedAttribute.getPositiveEnchantment();
		this.colour = associatedAttribute.getColour();
		this.rarity=rarity;

		// Set this item's file image:
		try {
			InputStream is = this.getClass().getResourceAsStream("/com/lilithsthrone/res/crafting/" + SVGString + ".svg");
			if(is==null) {
				System.err.println("Error! TFModifier icon file does not exist (Trying to read from '"+SVGString+"')! (Code 1)");
			}
			String s = Util.inputStreamToString(is);

			is.close();

			if(SVGString.contains("flavour")) {
				String SVGStringBackground = "";
				is = Subspecies.class.getClassLoader().getResourceAsStream("com/lilithsthrone/res/crafting/modifier_circle_flavour_background.svg");
				if(is==null) {
					System.err.println("Error! Subspecies background icon file does not exist (Trying to read from 'modifier_circle_flavour_background')!");
				}
				SVGStringBackground = "<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>"+SvgUtil.colourReplacement(this.toString()+"_B", colour, Util.inputStreamToString(is))+"</div>";

				s = SVGStringBackground + "<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>" + SvgUtil.colourReplacement(this.toString(), colour, s)+"</div>";

			} else {
				s = SvgUtil.colourReplacement(this.toString(), colour, s);
			}

			this.SVGString = s;

			is.close();

		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	private TFModifier(String name, String description, String descriptor, String SVGString, Colour colour, Rarity rarity) {
		this.name = name;
		this.description = description;
		this.descriptor = descriptor;
		this.rarity=rarity;

		if (colour == null) {
			this.colour = Colour.CLOTHING_BLACK;
		} else {
			this.colour = colour;
		}

		// Set this item's file image:
		try {
			InputStream is = this.getClass().getResourceAsStream("/com/lilithsthrone/res/crafting/" + SVGString + ".svg");
			if(is==null) {
				System.err.println("Error! TFModifier icon file does not exist (Trying to read from '"+SVGString+"')! (Code 2)");
			}
			String s = Util.inputStreamToString(is);

			is.close();

			if(SVGString.contains("flavour")) {
				String SVGStringBackground = "";
				is = Subspecies.class.getClassLoader().getResourceAsStream("com/lilithsthrone/res/crafting/modifier_circle_flavour_background.svg");
				if(is==null) {
					System.err.println("Error! Subspecies background icon file does not exist (Trying to read from 'modifier_circle_flavour_background')!");
				}
				SVGStringBackground = "<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>"+SvgUtil.colourReplacement(this.toString()+"_B", colour, Util.inputStreamToString(is))+"</div>";

				s = SVGStringBackground + "<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>" + SvgUtil.colourReplacement(this.toString(), colour, s)+"</div>";

			} else {
				s = SvgUtil.colourReplacement(this.toString(), colour, s);
			}

			this.SVGString = s;

			is.close();

		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	private TFModifier(Fetish f) {
		this.name = f.getName(null);
		this.description = "Applies an effect related to the "+name+" fetish. ("+f.getShortDescriptor(null)+")";
		this.descriptor = name;
		this.rarity = Rarity.EPIC;
		this.colour = Colour.FETISH;
		this.fetish = f;
		this.SVGString = f.getSVGString(null);
	}

	public int getValue() {
		switch(getRarity()) {
			case JINXED:
				return 1;
			case COMMON:
				return 1;
			case UNCOMMON:
				return 2;
			case RARE:
				return 4;
			case EPIC:
				return 8;
			case LEGENDARY:
				return 12;
			case QUEST:
				return 1;
		}
		return 1;
	}

	public AttributeCategory getAttributeCategory() {
		return attributeCategory;
	}

	public Attribute getAssociatedAttribute() {
		return associatedAttribute;
	}

	public String getName() {
		return name;
	}

	public String getDescription() {
		return description;
	}

	public String getDescriptor() {
		return descriptor;
	}

	public String getSVGString() {
		return SVGString;
	}

	public Colour getColour() {
		return colour;
	}

	public boolean isSoloDescriptor() {
		return false;
	}

	public Rarity getRarity() {
		return rarity;
	}

	public static List<TFModifier> getTFModStrengthList() {
		return TFModStrengthList;
	}

	public static List<TFModifier> getTFModIntelligenceList() {
		return TFModIntelligenceList;
	}

	public static List<TFModifier> getTFModCorruptionList() {
		return TFModCorruptionList;
	}

	public static List<TFModifier> getTFModSexualList() {
		return TFModSexualList;
	}

	public static List<TFModifier> getTFRacialBodyPartsList() {
		if(Main.getProperties().udders==0) {
			return TFRacialBodyPartsList.stream().filter(mod -> mod!=TFModifier.TF_BREASTS_CROTCH && mod!=TFModifier.TF_MILK_CROTCH).collect(Collectors.toList());
		}
		return TFRacialBodyPartsList;
	}

	public static List<TFModifier> getTFAttributeList() {
		return TFAttributeList;
	}

	public static List<TFModifier> getTFBodyPartFetishList() {
		return TFBodyPartFetishList;
	}

	public static List<TFModifier> getTFBehaviouralFetishList() {
		return TFBehaviouralFetishList;
	}

	public Fetish getFetish() {
		return fetish;
	}

	public static List<TFModifier> getClothingAttributeList() {
		return clothingAttributeList;
	}

	public static List<TFModifier> getClothingMajorAttributeList() {
		return clothingMajorAttributeList;
	}

	public static List<TFModifier> getClothingPrimaryList() {
		if(!Main.game.isBodyHairEnabled()) {
			List<TFModifier> noArms = new ArrayList<>(clothingPrimaryList);
			noArms.remove(TF_ARMS);
			return noArms;
		}
		return clothingPrimaryList;
	}

	public static List<TFModifier> getTattooPrimaryList() {
		return tattooPrimaryList;
	}

	public static List<TFModifier> getWeaponPrimaryList() {
		return weaponPrimaryList;
	}

	public static List<TFModifier> getWeaponMajorAttributeList() {
		return weaponMajorAttributeList;
	}

	public static List<TFModifier> getWeaponAttributeList() {
		return weaponAttributeList;
	}
}


code:
package com.lilithsthrone.game.inventory.enchanting;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.lilithsthrone.utils.Colour;

/**
 * @since 0.1.83
 * @version 0.2.11
 * @author Innoxia
 */
public enum TFPotency {

	MAJOR_DRAIN("Major Drain", Colour.GENERIC_TERRIBLE, 8, -3),
	DRAIN("Drain", Colour.GENERIC_BAD, 4, -2),
	MINOR_DRAIN("Minor Drain", Colour.GENERIC_MINOR_BAD, 1, -1),
	MINOR_BOOST("Minor Boost", Colour.GENERIC_MINOR_GOOD, 1, 1),
	BOOST("Boost", Colour.GENERIC_GOOD, 4, 2),
	MAJOR_BOOST("Major Boost", Colour.GENERIC_EXCELLENT, 8, 3);

	private static List<TFPotency> allPotencies = new ArrayList<>();

	static {
		Collections.addAll(allPotencies, TFPotency.values());
	}

	private String name;
	private Colour colour;
	private int value;
	private int clothingBonusValue;

	private TFPotency(String name, Colour colour, int value, int clothingBonusValue) {
		this.name = name;
		this.colour = colour;
		this.value = value;
		this.clothingBonusValue = clothingBonusValue;
	}

	public String getName() {
		return name;
	}

	public Colour getColour() {
		return colour;
	}

	public int getValue() {
		return value;
	}

	public int getClothingBonusValue() {
		return clothingBonusValue;
	}

	public boolean isNegative() {
		return this==TFPotency.MINOR_DRAIN || this==TFPotency.DRAIN || this==TFPotency.MAJOR_DRAIN;
	}

	public static List<TFPotency> getAllPotencies() {
		return allPotencies;
	}

	public static TFPotency getRandomWeightedPositivePotency() {
		double rnd = Math.random();

		if(rnd<0.6) {
			return TFPotency.MINOR_BOOST;
		} else if (rnd<0.9) {
			return TFPotency.BOOST;
		} else {
			return TFPotency.MAJOR_BOOST;
		}
	}

	public static TFPotency getRandomWeightedNegativePotency() {
		double rnd = Math.random();

		if(rnd<0.6) {
			return TFPotency.MAJOR_DRAIN;
		} else if (rnd<0.9) {
			return TFPotency.DRAIN;
		} else {
			return TFPotency.MAJOR_DRAIN;
		}
	}

}


code:
package com.lilithsthrone.game.inventory.item;

import java.io.IOException;
import java.io.InputStream;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.lilithsthrone.game.character.CharacterUtils;
import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.FluidMilk;
import com.lilithsthrone.game.character.body.types.FluidType;
import com.lilithsthrone.game.character.body.valueEnums.FluidModifier;
import com.lilithsthrone.game.inventory.enchanting.ItemEffect;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.SvgUtil;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.XMLSaving;

/**
 * @since 0.2.1
 * @version 0.2.1
 * @author Innoxia
 */
public class AbstractFilledBreastPump extends AbstractItem implements XMLSaving {

	private String milkProvider;
	private FluidMilk milk;
	private int millilitresStored;

	public AbstractFilledBreastPump(AbstractItemType itemType, Colour colour, GameCharacter milkProvider, FluidMilk milk, int millilitresStored) {
		super(itemType);

		this.milkProvider = milkProvider.getId();
		this.milk = new FluidMilk(milk.getType(), milk.isCrotchMilk());
		this.milk.setFlavour(milkProvider, milk.getFlavour());
		for(FluidModifier fm : milk.getFluidModifiers()) {
			this.milk.addFluidModifier(milkProvider, fm);
		}
		this.colourShade = colour;
		SVGString = getSVGString(itemType.getPathName(), colour);
		this.millilitresStored = millilitresStored;
	}

	public AbstractFilledBreastPump(AbstractItemType itemType, Colour colour, String milkProviderId, FluidMilk milk, int millilitresStored) {
		super(itemType);

		this.milkProvider = milkProviderId;
		this.milk = new FluidMilk(milk.getType(), milk.isCrotchMilk());
		this.milk.setFlavour(null, milk.getFlavour());
		for(FluidModifier fm : milk.getFluidModifiers()) {
			this.milk.addFluidModifier(null, fm);
		}
		this.colourShade = colour;
		SVGString = getSVGString(itemType.getPathName(), colour);
		this.millilitresStored = millilitresStored;
	}

	@Override
	public boolean equals(Object o) {
		if(super.equals(o)) {
			return (o instanceof AbstractFilledBreastPump)
					&& ((AbstractFilledBreastPump)o).getMilkProviderId().equals(this.getMilkProviderId())
					&& ((AbstractFilledBreastPump)o).getMilk().equals(milk);
		} else {
			return false;
		}
	}

	@Override
	public int hashCode() {
		int result = super.hashCode();
		result = 31 * result + milkProvider.hashCode();
		result = 31 * result + milk.hashCode();
		return result;
	}

	@Override
	public Element saveAsXML(Element parentElement, Document doc) {
		Element element = doc.createElement("item");
		parentElement.appendChild(element);

		CharacterUtils.addAttribute(doc, element, "id", this.getItemType().getId());
		CharacterUtils.addAttribute(doc, element, "colour", String.valueOf(this.getColour()));
		CharacterUtils.addAttribute(doc, element, "milkProvider", this.getMilkProviderId());
		CharacterUtils.addAttribute(doc, element, "millilitresStored", String.valueOf(this.getMillilitresStored()));

		Element innerElement = doc.createElement("itemEffects");
		element.appendChild(innerElement);
		for(ItemEffect ie : this.getEffects()) {
			ie.saveAsXML(innerElement, doc);
		}

		innerElement = doc.createElement("milk");
		element.appendChild(innerElement);
		this.getMilk().saveAsXML(innerElement, doc);

		return element;
	}

	public static AbstractFilledBreastPump loadFromXML(Element parentElement, Document doc) {
		String provider = parentElement.getAttribute("milkProvider");
		if(provider.isEmpty()) {
			provider = parentElement.getAttribute("milkProvidor"); // Support for old versions in which I could not spell
		}
		return new AbstractFilledBreastPump(
				ItemType.getIdToItemMap().get(parentElement.getAttribute("id")),
				Colour.valueOf(parentElement.getAttribute("colour")),
				provider,
				((Element) parentElement.getElementsByTagName("milk").item(0)==null
					?new FluidMilk(FluidType.MILK_HUMAN, false)
					:FluidMilk.loadFromXML((Element) parentElement.getElementsByTagName("milk").item(0), doc)),
				(parentElement.getAttribute("millilitresStored").isEmpty()
					?25
					:Integer.valueOf(parentElement.getAttribute("millilitresStored"))));
	}

	private String getSVGString(String pathName, Colour colour) {
		try {
			InputStream is = this.getClass().getResourceAsStream("/com/lilithsthrone/res/items/" + pathName + ".svg");
			String s = Util.inputStreamToString(is);

			s = SvgUtil.colourReplacement(String.valueOf(this.hashCode()), colour, s);

			is.close();

			return s;

		} catch (IOException e1) {
			e1.printStackTrace();
		}

		return "";
	}

	@Override
	public String applyEffect(GameCharacter user, GameCharacter target) {
		return target.ingestFluid(getMilkProvider(), milk, SexAreaOrifice.MOUTH, millilitresStored)
				+ target.addItem(AbstractItemType.generateItem(ItemType.MOO_MILKER_EMPTY), false);
	}

	public String getMilkProviderId() {
		return milkProvider;
	}

	public GameCharacter getMilkProvider() {
		try {
			return Main.game.getNPCById(milkProvider);
		} catch (Exception e) {
			Util.logGetNpcByIdError("getMilkProvider()", milkProvider);
			return null;
		}
	}

	public FluidMilk getMilk() {
		return milk;
	}

	public int getMillilitresStored() {
		return millilitresStored;
	}

	public void setMillilitresStored(int millilitresStored) {
		this.millilitresStored = millilitresStored;
	}

}


code:
package com.lilithsthrone.game.inventory.item;

import java.io.IOException;
import java.io.InputStream;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.lilithsthrone.game.character.CharacterUtils;
import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.FluidCum;
import com.lilithsthrone.game.character.body.types.FluidType;
import com.lilithsthrone.game.character.body.valueEnums.FluidModifier;
import com.lilithsthrone.game.character.fetishes.Fetish;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.enchanting.ItemEffect;
import com.lilithsthrone.game.sex.SexAreaOrifice;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.SvgUtil;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.XMLSaving;

/**
 * @since 0.1.86
 * @version 0.1.88
 * @author Innoxia
 */
public class AbstractFilledCondom extends AbstractItem implements XMLSaving {

	private String cumProvider;
	private FluidCum cum;
	private int millilitresStored;

	public AbstractFilledCondom(AbstractItemType itemType, Colour colour, GameCharacter cumProvider, FluidCum cum, int millilitresStored) {
		super(itemType);

		this.cumProvider = cumProvider.getId();
		this.cum = new FluidCum(cum.getType());
		this.cum.setFlavour(cumProvider, cum.getFlavour());
		for(FluidModifier fm : cum.getFluidModifiers()) {
			this.cum.addFluidModifier(cumProvider, fm);
		}
		this.colourShade = colour;
		SVGString = getSVGString(itemType.getPathName(), colour);
		this.millilitresStored = millilitresStored;
	}

	public AbstractFilledCondom(AbstractItemType itemType, Colour colour, String cumProviderId, FluidCum cum, int millilitresStored) {
		super(itemType);

		this.cumProvider = cumProviderId;
		this.cum = new FluidCum(cum.getType());
		this.cum.setFlavour(null, cum.getFlavour());
		for(FluidModifier fm : cum.getFluidModifiers()) {
			this.cum.addFluidModifier(null, fm);
		}
		this.colourShade = colour;
		SVGString = getSVGString(itemType.getPathName(), colour);
		this.millilitresStored = millilitresStored;
	}

	@Override
	public boolean equals(Object o) {
		if(super.equals(o)) {
			return (o instanceof AbstractFilledCondom)
					&& ((AbstractFilledCondom)o).getCumProviderId().equals(this.getCumProviderId())
					&& ((AbstractFilledCondom)o).getCum().equals(cum);
		} else {
			return false;
		}
	}

	@Override
	public int hashCode() {
		int result = super.hashCode();
		result = 31 * result + cumProvider.hashCode();
		result = 31 * result + cum.hashCode();
		return result;
	}

	@Override
	public Element saveAsXML(Element parentElement, Document doc) {
		Element element = doc.createElement("item");
		parentElement.appendChild(element);

		CharacterUtils.addAttribute(doc, element, "id", this.getItemType().getId());
		CharacterUtils.addAttribute(doc, element, "colour", String.valueOf(this.getColour()));
		CharacterUtils.addAttribute(doc, element, "cumProvider", this.getCumProviderId());
		CharacterUtils.addAttribute(doc, element, "millilitresStored", String.valueOf(this.getMillilitresStored()));

		Element innerElement = doc.createElement("itemEffects");
		element.appendChild(innerElement);
		for(ItemEffect ie : this.getEffects()) {
			ie.saveAsXML(innerElement, doc);
		}

		innerElement = doc.createElement("cum");
		element.appendChild(innerElement);
		this.getCum().saveAsXML(innerElement, doc);

		return element;
	}

	public static AbstractFilledCondom loadFromXML(Element parentElement, Document doc) {
		String provider = parentElement.getAttribute("cumProvider");
		if(provider.isEmpty()) {
			provider = parentElement.getAttribute("cumProvidor"); // Support for old versions in which I could not spell
		}

		return new AbstractFilledCondom(
				ItemType.getIdToItemMap().get(parentElement.getAttribute("id")),
				Colour.valueOf(parentElement.getAttribute("colour")),
				provider,
				((Element) parentElement.getElementsByTagName("cum").item(0)==null
					?new FluidCum(FluidType.CUM_HUMAN)
					:FluidCum.loadFromXML((Element) parentElement.getElementsByTagName("cum").item(0), doc)),
				(parentElement.getAttribute("millilitresStored").isEmpty()
					?25
					:Integer.valueOf(parentElement.getAttribute("millilitresStored"))));
	}

	private String getSVGString(String pathName, Colour colour) {
		try {
			InputStream is = this.getClass().getResourceAsStream("/com/lilithsthrone/res/items/" + pathName + ".svg");
			String s = Util.inputStreamToString(is);

			s = SvgUtil.colourReplacement(String.valueOf(this.hashCode()), colour, s);

			is.close();

			return s;

		} catch (IOException e1) {
			e1.printStackTrace();
		}

		return "";
	}

	@Override
	public String applyEffect(GameCharacter user, GameCharacter target) {
		if(target.hasFetish(Fetish.FETISH_CUM_ADDICT)) {
			return UtilText.parse(user, target,
					"
"
						+ "[npc.Name] can't help but let out a delighted [npc.moan] as [npc.she] greedily [npc.verb(gulp)] down the slimy fluid."
						+ " Darting [npc.her] [npc.tongue] out, [npc.she] desperately [npc.verb(lick)] up every last drop of cum; only discarding the condom once [npc.sheIs] sure that's it's completely empty."
					+ "
"
					+ target.ingestFluid(getCumProvider(), cum, SexAreaOrifice.MOUTH, millilitresStored));
		} else {
			return UtilText.parse(user, target,
					"
"
						+ "[npc.Name] scrunches [npc.her] [npc.eyes] shut as [npc.she] [npc.verb(gulp)] down the slimy fluid,"
						+ " trying [npc.her] best not to think about what [npc.sheHas] just done as "+(user.equals(target)?"[npc.she] [npc.verb(throw)]":"[npc2.name] [npc2.verb(throw)]")+" the now-empty condom to the floor..."
					+ "
"
					+ target.ingestFluid(getCumProvider(), cum, SexAreaOrifice.MOUTH, millilitresStored));
		}

	}

	public String getCumProviderId() {
		return cumProvider;
	}

	public GameCharacter getCumProvider() {
		try {
			return Main.game.getNPCById(cumProvider);
		} catch (Exception e) {
			Util.logGetNpcByIdError("getCumProvider()", cumProvider);
			return null;
		}
	}

	public FluidCum getCum() {
		return cum;
	}

	public int getMillilitresStored() {
		return millilitresStored;
	}

	public void setMillilitresStored(int millilitresStored) {
		this.millilitresStored = millilitresStored;
	}

}


code:
package com.lilithsthrone.game.inventory.item;

import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import com.lilithsthrone.game.character.CharacterUtils;
import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.AbstractCoreItem;
import com.lilithsthrone.game.inventory.AbstractCoreType;
import com.lilithsthrone.game.inventory.enchanting.AbstractItemEffectType;
import com.lilithsthrone.game.inventory.enchanting.EnchantingUtils;
import com.lilithsthrone.game.inventory.enchanting.ItemEffect;
import com.lilithsthrone.game.inventory.enchanting.TFEssence;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.Util;
import com.lilithsthrone.utils.XMLSaving;

/**
 * @since 0.1.0
 * @version 0.1.97
 * @author Innoxia
 */
public abstract class AbstractItem extends AbstractCoreItem implements XMLSaving {

	protected AbstractItemType itemType;
	protected List<ItemEffect> itemEffects;

	public AbstractItem(AbstractItemType itemType) {
		super(itemType.getName(false), itemType.getNamePlural(false), itemType.getSVGString(), itemType.getColourPrimary(), itemType.getRarity(), null, itemType.getItemTags());

		this.itemType = itemType;
		this.itemEffects = itemType.getEffects();
	}

	@Override
	public boolean equals(Object o) {
		if(super.equals(o)) {
			return (o instanceof AbstractItem)
					&& ((AbstractItem)o).getItemType().equals(itemType)
					&& ((AbstractItem)o).getEffects().equals(itemEffects);
		} else {
			return false;
		}
	}

	@Override
	public int hashCode() {
		int result = super.hashCode();
		result = 31 * result + itemType.hashCode();
		result = 31 * result + itemEffects.hashCode();
		return result;
	}

	public Element saveAsXML(Element parentElement, Document doc) {
		Element element = doc.createElement("item");
		parentElement.appendChild(element);

		CharacterUtils.addAttribute(doc, element, "id", this.getItemType().getId());
		CharacterUtils.addAttribute(doc, element, "name", this.getName());
		CharacterUtils.addAttribute(doc, element, "colour", this.getColour().toString());

		Element innerElement = doc.createElement("itemEffects");
		element.appendChild(innerElement);

		for(ItemEffect ie : this.getEffects()) {
			ie.saveAsXML(innerElement, doc);
		}

		return element;
	}

	public static AbstractItem loadFromXML(Element parentElement, Document doc) {
		try {
			AbstractItem item = AbstractItemType.generateItem(ItemType.getIdToItemMap().get(parentElement.getAttribute("id")));

			if(!parentElement.getAttribute("name").isEmpty()) {
				item.setName(parentElement.getAttribute("name"));
			}

			List<ItemEffect> effectsToBeAdded = new ArrayList<>();
			NodeList element = ((Element) parentElement.getElementsByTagName("itemEffects").item(0)).getElementsByTagName("effect");
			for(int i = 0; i < element.getLength(); i++){
				Element e = ((Element)element.item(i));
				ItemEffect itemEffect = ItemEffect.loadFromXML(e, doc);
				if(itemEffect != null) {
					effectsToBeAdded.add(itemEffect);
				}
			}
			item.setItemEffects(effectsToBeAdded);

			if(!effectsToBeAdded.isEmpty()
					&& (item.getItemType().getId().equals(ItemType.ELIXIR.getId()) || item.getItemType().getId().equals(ItemType.POTION.getId()) || item.getItemType().getId().equals(ItemType.ORIENTATION_HYPNO_WATCH.getId()))) {
				item.setSVGString(EnchantingUtils.getImportedSVGString(item, (parentElement.getAttribute("colour").isEmpty()?Colour.GENERIC_ARCANE:Colour.valueOf(parentElement.getAttribute("colour"))), effectsToBeAdded));
			}

			return item;
		} catch(Exception ex) {
			System.err.println("Warning: An instance of AbstractItem was unable to be imported. ("+parentElement.getAttribute("id")+")");
			return null;
		}
	}

	public AbstractItemType getItemType() {
		return itemType;
	}

	public boolean isBreakOutOfInventory() {
		for(ItemEffect effect : this.getEffects()) {
			if(effect.getItemEffectType().isBreakOutOfInventory()) {
				return true;
			}
		}
		return false;
	}

	@Override
	public List<ItemEffect> getEffects() {
		return itemEffects;
	}

	public void setItemEffects(List<ItemEffect> itemEffects) {
		this.itemEffects = itemEffects;
	}

	public String applyEffect(GameCharacter user, GameCharacter target) {
		StringBuilder sb = new StringBuilder();

		for(ItemEffect ie : getEffects()) {
			sb.append(UtilText.parse(target, ie.applyEffect(user, target, 1)));
		}

		return sb.toString();
	}

	// Enchantments:

	@Override
	public int getEnchantmentLimit() {
		return itemType.getEnchantmentLimit();
	}

	@Override
	public AbstractItemEffectType getEnchantmentEffect() {
		return itemType.getEnchantmentEffect();
	}

	@Override
	public AbstractCoreType getEnchantmentItemType(List<ItemEffect> effects) {
		return itemType.getEnchantmentItemType(effects);
	}

	@Override
	public TFEssence getRelatedEssence() {
		return itemType.getRelatedEssence();
	}

	// Getters & setters:

	public String getName(boolean withDeterminer, boolean withRarityColour) {
		return (withDeterminer
				? (!itemType.getDeterminer().equalsIgnoreCase("a") && !itemType.getDeterminer().equalsIgnoreCase("an")
					? itemType.getDeterminer() + " "
					: (Util.isVowel(name.charAt(0)) ? "an " : "a "))
				: " ")
				+ (withRarityColour ? (" " + name + "") : " "+name);
	}

	public String getDisplayName(boolean withRarityColour) {
		return Util.capitaliseSentence(
				(!itemType.getDeterminer().equalsIgnoreCase("a") && !itemType.getDeterminer().equalsIgnoreCase("an")
						? itemType.getDeterminer() + " "
						: (Util.isVowel(name.charAt(0)) ? "an " : "a "))
				+ (withRarityColour ? ("" + name + "") : name));
	}

	public String getDisplayNamePlural(boolean withRarityColour) {
		return Util.capitaliseSentence((withRarityColour ? ("" + namePlural + "") : namePlural));
	}

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

	@Override
	public int getValue() {
		return itemType.getValue(this.getEffects());
	}

	public String getExtraDescription(GameCharacter user, GameCharacter target) {
		StringBuilder sb = new StringBuilder();

		sb.append("
"
					+ "Effects:
");

		for(ItemEffect ie : getEffects()) {
			for(String s : ie.getEffectsDescription(user, target)) {
				sb.append(s+"
");
			}
		}

		sb.append("
"
				+ "
"
					+ (this.getItemType().isPlural()?"They have":"It has")+" a value of " + UtilText.formatAsMoney(getValue()) + "."
				+ "
");

		return sb.toString();
	}

	public String getPathName() {
		return itemType.getPathName();
	}

	public boolean isConsumedOnUse() {
		return itemType.isConsumedOnUse();
	}

	public String getUseDescription(GameCharacter user, GameCharacter target) {
		return itemType.getUseDescription(user, target);
	}

	public boolean isAbleToBeUsedFromInventory() {
		return itemType.isAbleToBeUsedFromInventory();
	}

	public String getUnableToBeUsedFromInventoryDescription() {
		return itemType.getUnableToBeUsedFromInventoryDescription();
	}

	public boolean isAbleToBeUsed(GameCharacter target) {
		return itemType.isAbleToBeUsed(target);
	}

	public String getUnableToBeUsedDescription(GameCharacter target) {
		return itemType.getUnableToBeUsedDescription(target);
	}

	public boolean isAbleToBeUsedInCombat(){
		return !this.isBreakOutOfInventory() && itemType.isAbleToBeUsedInCombat();
	}

	public boolean isAbleToBeUsedInSex(){
		return !this.isBreakOutOfInventory() && itemType.isAbleToBeUsedInSex();
	}

	public boolean isGift() {
		return itemType.isGift();
	}

}


code:
package com.lilithsthrone.game.inventory.item;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.character.body.FluidCum;
import com.lilithsthrone.game.character.body.FluidMilk;
import com.lilithsthrone.game.combat.DamageType;
import com.lilithsthrone.game.dialogue.utils.UtilText;
import com.lilithsthrone.game.inventory.AbstractCoreType;
import com.lilithsthrone.game.inventory.ItemTag;
import com.lilithsthrone.game.inventory.Rarity;
import com.lilithsthrone.game.inventory.clothing.AbstractClothing;
import com.lilithsthrone.game.inventory.enchanting.AbstractItemEffectType;
import com.lilithsthrone.game.inventory.enchanting.ItemEffect;
import com.lilithsthrone.game.inventory.enchanting.TFEssence;
import com.lilithsthrone.game.inventory.weapon.AbstractWeapon;
import com.lilithsthrone.main.Main;
import com.lilithsthrone.utils.Colour;
import com.lilithsthrone.utils.SvgUtil;
import com.lilithsthrone.utils.Util;

/**
 * @since 0.1.84
 * @version 0.3
 * @author Innoxia
 */
public abstract class AbstractItemType extends AbstractCoreType {

	private String determiner, name, namePlural, description, pathName;
	private boolean plural;
	private Colour colourPrimary;
	private Colour colourSecondary;
	private Colour colourTertiary;
	private int value;
	private Rarity rarity;
	protected String SVGString;
	private TFEssence relatedEssence;
	protected List<ItemEffect> effects;
	protected Set<ItemTag> itemTags;

	public AbstractItemType(
			int value,
			String determiner,
			boolean plural,
			String name,
			String namePlural,
			String description,
			String pathName,
			Colour colourPrimary,
			Colour colourSecondary,
			Colour colourTertiary,
			Rarity rarity,
			TFEssence relatedEssence,
			List<ItemEffect> effects,
			List<ItemTag> itemTags) {

		this.determiner = determiner;
		this.plural = plural;
		this.name = name;
		this.namePlural = namePlural;
		this.description = description;
		this.pathName = pathName;

		this.value = value;
		this.rarity = rarity;

		this.relatedEssence = relatedEssence;

		this.itemTags = new HashSet<>();
		if(itemTags!=null) {
			this.itemTags.addAll(itemTags);
		}

		if(effects==null) {
			this.effects = new ArrayList<>();
		} else {
			this.effects=effects;
		}

		if (colourPrimary == null) {
			this.colourPrimary = Colour.CLOTHING_BLACK;
		} else {
			this.colourPrimary = colourPrimary;
		}
		if (colourSecondary == null) {
			this.colourSecondary = Colour.CLOTHING_BLACK;
		} else {
			this.colourSecondary = colourSecondary;
		}
		if (colourTertiary == null) {
			this.colourTertiary = Colour.CLOTHING_BLACK;
		} else {
			this.colourTertiary = colourTertiary;
		}

		// Set this item's file image:
		try {
			InputStream is = this.getClass().getResourceAsStream("/com/lilithsthrone/res/items/" + pathName + ".svg");
			if(is==null) {
				System.err.println("Error! AbstractItemType icon file does not exist (Trying to read from '"+pathName+"')!");
			}
			String s = Util.inputStreamToString(is);

			SVGString = colourReplacement(this.getColourPrimary(), this.getColourSecondary(), this.getColourTertiary(), s);

			is.close();

		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	private String colourReplacement(Colour colour, Colour colourSecondary, Colour colourTertiary, String inputString) {
		return SvgUtil.colourReplacement(Integer.toString(this.hashCode()), colour, colourSecondary, colourTertiary, inputString);
	}

	@Override
	public boolean equals(Object o) { // I know it doesn't include everything, but this should be enough to check for equality.
		if(super.equals(o)){
			if(o instanceof AbstractItemType){
				if(((AbstractItemType)o).getName(false).equals(getName(false))
						&& ((AbstractItemType)o).getPathName().equals(getPathName())
						&& ((AbstractItemType)o).getRarity() == getRarity()
						&& ((AbstractItemType)o).getRelatedEssence() == getRelatedEssence()
						&& ((AbstractItemType)o).getEffects().equals(getEffects())
						){
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public int hashCode() { // I know it doesn't include everything, but this should be enough to check for equality.
		int result = super.hashCode();
		result = 31 * result + getName(false).hashCode();
		result = 31 * result + getPathName().hashCode();
		result = 31 * result + getRarity().hashCode();
		if(getRelatedEssence() != null)
			result = 31 * result + getRelatedEssence().hashCode();
		result = 31 * result + getEffects().hashCode();
		return result;
	}

	public static AbstractItem generateItem(AbstractItemType itemType) {
		return new AbstractItem(itemType) {};
	}

	public static AbstractItem generateFilledCondom(Colour colour, GameCharacter character, FluidCum cum, int millilitres) {
		return new AbstractFilledCondom(ItemType.CONDOM_USED, colour, character, cum, millilitres) {};
	}

	public static AbstractItem generateFilledBreastPump(Colour colour, GameCharacter character, FluidMilk milk, int quantity) {
		return new AbstractFilledBreastPump(ItemType.MOO_MILKER_FULL, colour, character, milk, quantity) {};
	}

	public String getId() {
		return ItemType.getItemToIdMap().get(this);
	}

	public List<ItemEffect> getEffects() {
		return effects;
	}

	public boolean isAbleToBeSold() {
		return getRarity()!=Rarity.QUEST;
	}

	public boolean isAbleToBeDropped() {
		return getRarity()!=Rarity.QUEST;
	}

	// Enchantments:

	public int getEnchantmentLimit() {
		return 100;
	}

	public AbstractItemEffectType getEnchantmentEffect() {
		return null;
	}

	public TFEssence getRelatedEssence() {
		return relatedEssence;
	}

	public AbstractItemType getEnchantmentItemType(List<ItemEffect> effects) {
		return null;
	}

	// Getters & setters:

	public String getDeterminer() {
		return (determiner!=null?determiner:"");
	}

	public boolean isPlural() {
		return plural;
	}

	public String getName(boolean displayName) {
		if(displayName) {
			return Util.capitaliseSentence((determiner!=null?determiner:"") + " " + (this.isPlural()?namePlural:name) + "");
		} else {
			return (this.isPlural()?namePlural:name);
		}
	}

	public String getNamePlural(boolean displayName) {
		if(displayName) {
			return Util.capitaliseSentence((determiner!=null?determiner:"") + " " + namePlural + "");
		} else {
			return namePlural;
		}
	}

	public String getDescription() {
		return description;
	}

	public String getDisplayName(boolean withRarityColour) {
		return Util.capitaliseSentence((determiner!=null?determiner:"") + (withRarityColour
				? (" " + (this.isPlural()?getNamePlural(false):getName(false)) + "")
				: (this.isPlural()?getNamePlural(false):getName(false))));
	}

	public String getPathName() {
		return pathName;
	}

	public Colour getColourPrimary() {
		return colourPrimary;
	}

	public Colour getColourSecondary() {
		return colourSecondary;
	}

	public Colour getColourTertiary() {
		return colourTertiary;
	}

	public int getValue(List<ItemEffect> effects) {
		return value;
	}

	public String getSVGString() {
		return SVGString;
	}

	public Rarity getRarity() {
		return rarity;
	}

	public String getUseName() {
		return "use";
	}

	public String getUseTooltipDescription(GameCharacter user, GameCharacter target) {
		if(user.equals(target)) {
			return Util.capitaliseSentence(getUseName()) + " the " + getName(false) + ".";
		} else {
			return UtilText.parse(target, "Get [npc.name] to " + getUseName() + " the " + getName(false) + ".");
		}
	}

	public String getUseDescription(GameCharacter user, GameCharacter target) {
		return "
"
					+ "You use the item."
				+ "
";
	}

	public boolean isAbleToBeUsedFromInventory() {
		return true;
	}

	public boolean isAbleToBeUsed(GameCharacter target) {
		return !Main.game.isInCombat() || target.isPlayer();
	}

	public boolean isAbleToBeUsedInSex() {
		return true;
	}

	public boolean isAbleToBeUsedInCombat() {
		return true;
	}

	public boolean isConsumedOnUse() {
		return true;
	}

	public boolean isTransformative() {
		return false;
	}

	public boolean isGift() {
		return false;
	}

	public boolean isFetishGiving() {
		return false;
	}

	public String getUnableToBeUsedFromInventoryDescription() {
		return "This item cannot be used in this way!";
	}

	public String getUnableToBeUsedDescription(GameCharacter target) {
		return "This item cannot be used in this way!";
	}

	public String getDyeBrushEffects(AbstractClothing clothing, Colour colour) {
		return "
"
					+ "As you take hold of the Dye-brush, you see the purple glow around the tip growing in strength."
					+ " The closer you move it to your " + clothing.getName() + ", the brighter the glow becomes, until suddenly, images of different colours start flashing through your mind."
					+ " As you touch the bristles to the " + clothing.getName() + "'s surface, the Dye-brush instantly evaporates!"
					+ " You see that the arcane enchantment has dyed the " + clothing.getName() + " " + colour.getName() + "."
				+ "
";
	}

	public String getDyeBrushEffects(AbstractWeapon weapon, Colour colour) {
		return "
"
					+ "As you take hold of the Dye-brush, you see the purple glow around the tip growing in strength."
					+ " The closer you move it to your " + weapon.getName() + ", the brighter the glow becomes, until suddenly, images of different colours start flashing through your mind."
					+ " As you touch the bristles to the " + weapon.getName() + "'s surface, the Dye-brush instantly evaporates!"
					+ " You see that the arcane enchantment has dyed the " + weapon.getName() + " " + colour.getName() + "."
				+ "
";
	}

	public String getReforgeHammerEffects(AbstractWeapon weapon, DamageType damageType) {
		return "
"
					+ "As you take hold of the reforging hammer, you see the metal head start to emit a deep purple glow."
					+ " The closer you move it to your " + weapon.getName() + ", the brighter this glow becomes, until suddenly, images of different damage types start flashing through your mind."
					+ " As you touch the metal head  to the " + weapon.getName() + ", the reforge hammer instantly evaporates!"
					+ " You see that the arcane enchantment has reforged the " + weapon.getName() + " so that it now deals " + damageType.getName() + " damage."
				+ "
";
	}

	public Set<ItemTag> getItemTags() {
		return itemTags;
	}
}


code:
package com.lilithsthrone.game.inventory.item;

import java.util.List;

import com.lilithsthrone.game.character.GameCharacter;
import com.lilithsthrone.game.inventory.enchanting.ItemEffect;

/**
 * @since 0.3.1
 * @version 0.3.1
 * @author Innoxia
 */
public abstract class AbstractItemUseEffect {

	protected List<ItemEffect> effects;

	public AbstractItemUseEffect(List<ItemEffect> effects) {
		this.effects = effects;
	}

	public abstract String getUseName(GameCharacter target);

	public abstract String getUseDescription(GameCharacter target);

	public List<ItemEffect> getEffects() {
		return effects;
	}

	public boolean isAbleToBeUsed(GameCharacter target) {
		return getCannotUseDescription(target)==null || getCannotUseDescription(target).isEmpty();
	}

	public String getCannotUseDescription(GameCharacter target) {
		return null;
	}

	public boolean isAbleToBeUsedInSex() {
		return true;
	}

	public boolean isAbleToBeUsedInCombat() {
		return true;
	}

	public boolean isConsumedOnUse() {
		return true;
	}

	public boolean isTransformative() {
		return false;
	}

	public boolean isGift() {
		return false;
	}

	public boolean isFetishGiving() {
		return false;
	}

}