code:
package classes.Items.Consumables
{
	import classes.BodyParts.*;
	import classes.CockTypesEnum;
	import classes.GlobalFlags.*;
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;
	import classes.PerkLib;
	import classes.StatusEffects;

	/**
	 * @since March 26, 2018
	 * @author Stadler76
	 */
	public class GoldenSeed extends Consumable
	{
		public static const STANDARD:int = 0;
		public static const ENHANCED:int = 1;

		private var type:int;

		public function GoldenSeed(_type:int)
		{
			var id:String;
			var shortName:String;
			var longName:String;
			var description:String;
			var value:int;

			type = _type;

			switch (type) {
				case STANDARD:
					id = "GldSeed";
					shortName = "GoldenSeed";
					longName = "a golden seed";
					description = "This seed looks and smells absolutely delicious. Though it has an unusual color,"
					             +" the harpies prize these nuts as delicious treats. Eating one might induce some physical transformations.";
					value = ConsumableLib.DEFAULT_VALUE;
					break;

				case ENHANCED:
					id = "MagSeed";
					shortName = "MagSeed";
					longName = "a magically-enhanced golden seed";
					description = "This seed glows with power.  It's been enhanced by Lumi to unlock its full potential,"
					             +" allowing it to transform you more easily.";
					value = ConsumableLib.DEFAULT_VALUE;
					break;

				default: // Remove this if someone manages to get SonarQQbe to not whine about a missing default ... ~Stadler76
			}

			super(id, shortName, longName, value, description);
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "goldenSeed";
			if (player.hasPerk(PerkLib.HarpyWomb)) tfSource += "-HarpyWomb";
			var temp:int;
			//'type' refers to the variety of seed.
			//0 == standard.
			//1 == enhanced - increase change limit and no pre-reqs for TF
			mutations.initTransformation([2, 2], type === ENHANCED ? 3 : 1);
			//Generic eating text:
			clearOutput();
			outputText("You pop the nut into your mouth, chewing the delicious treat and swallowing it quickly.  No wonder harpies love these things so much!");
			//****************
			//Stats:
			//****************
			//-Speed increase to 100.
			if (player.spe100 < 100 && rand(3) === 0) {
				if (player.spe100 >= 75) outputText("\n\nA familiar chill runs down your spine. Your muscles feel like well oiled machinery, ready to snap into action with lightning speed.");
				else outputText("\n\nA chill runs through your spine, leaving you feeling like your reflexes are quicker and your body faster.");
				//Speed gains diminish as it rises.
				if (player.spe100 < 40) dynStats("spe", .5);
				if (player.spe100 < 75) dynStats("spe", .5);
				dynStats("spe", .5);
			}
			//-Toughness decrease to 50
			if (player.tou100 > 50 && rand(3) === 0 && changes < changeLimit) {
				if (rand(2) === 0) outputText("\n\nA nice, slow warmth rolls from your gut out to your limbs, flowing through them before dissipating entirely. As it leaves, you note that your body feels softer and less resilient.");
				else outputText("\n\nYou feel somewhat lighter, but consequently more fragile.  Perhaps your bones have changed to be more harpy-like in structure?");
				dynStats("tou", -1);
			}
			//antianemone corollary:
			if (changes < changeLimit && player.hair.type == 4 && rand(2) === 0) {
				//-insert anemone hair removal into them under whatever criteria you like, though hair removal should precede abdomen growth; here's some sample text:
				outputText("\n\nAs you down the seed, your head begins to feel heavier.  Reaching up, you notice your tentacles becoming soft and somewhat fibrous.  Pulling one down reveals that it feels soft and fluffy, almost feathery; you watch as it dissolves into many thin, feathery strands.  Your hair is now like that of a harpy!");
				player.hair.type = Hair.FEATHER;
				changes++;
			}
			//-Strength increase to 70
			if (player.str100 < 70 && rand(3) === 0 && changes < changeLimit) {
				//(low str)
				if (player.str100 < 40) outputText("\n\nShivering, you feel a feverish sensation that reminds you of the last time you got sick. Thankfully, it passes swiftly, leaving slightly enhanced strength in its wake.");
				//(hi str – 50+)
				else outputText("\n\nHeat builds in your muscles, their already-potent mass shifting slightly as they gain even more strength.");
				//Faster until 40 str.
				if (player.str100 < 40) dynStats("str", .5);
				dynStats("str", .5);
			}
			//-Libido increase to 90
			if ((player.lib100 < 90 || rand(3) === 0) && rand(3) === 0 && changes < changeLimit) {
				if (player.lib100 < 90) dynStats("lib", 1);
				//(sub 40 lib)
				if (player.lib100 < 40) {
					outputText("\n\nA passing flush colors your " + player.faceDescript() + " for a second as you daydream about sex. You blink it away, realizing the item seems to have affected your libido.");
					if (player.hasVagina()) outputText(" The moistness of your " + player.vaginaDescript() + " seems to agree.");
					else if (player.hasCock()) outputText(" The hardness of " + player.sMultiCockDesc() + " seems to agree.");
					dynStats("lus", 5);
				}
				//(sub 75 lib)
				else if (player.lib100 < 75) outputText("\n\nHeat, blessed heat, works through you from head to groin, leaving you to shudder and fantasize about the sex you could be having right now.\n\n");
				//(hi lib)
				else if (player.lib100 < 90) outputText("\n\nSexual need courses through you, flushing your skin with a reddish hue while you pant and daydream of the wondrous sex you should be having right now.\n\n");
				//(90+)
				else outputText("\n\nYou groan, something about the seed rubbing your libido in just the right way to make you horny. Panting heavily, you sigh and fantasize about the sex you could be having.\n\n");
				//(fork to fantasy)
				if (player.lib100 >= 40) {
					dynStats("lus", (player.lib / 5 + 10));
					//(herm – either or!)
					//Cocks!
					if (player.hasCock() && (player.gender !== 3 || rand(2) === 0)) {
						//(male 1)
						if (rand(2) === 0) {
							outputText("In your fantasy you're winging through the sky, " + player.sMultiCockDesc() + " already hard and drizzling with male moisture while you circle an attractive harpy's nest. Her plumage is as blue as the sky, her eyes the shining teal of the sea, and legs splayed in a way that shows you how ready she is to be bred. You fold your wings and dive, wind whipping through your " + player.hairDescript() + " as she grows larger and larger. With a hard, body-slapping impact you land on top of her, plunging your hard, ready maleness into her hungry box. ");
							if (player.cockTotal() > 1) {
								outputText("The extra penis");
								if (player.cockTotal() > 2) outputText("es rub ");
								else outputText("rubs ");
								outputText("the skin over her taut, empty belly, drooling your need atop her.  ");
								outputText("You jolt from the vision unexpectedly, finding your " + player.sMultiCockDesc() + " is as hard as it was in the dream. The inside of your " + player.armorName + " is quite messy from all the pre-cum you've drooled. Perhaps you can find a harpy nearby to lie with.");
							}
						}
						//(male 2)
						else {
							outputText("In your fantasy you're lying back in the nest your harem built for you, stroking your dick and watching the sexy bird-girl spread her thighs to deposit another egg onto the pile. The lewd moans do nothing to sate your need, and you beckon for another submissive harpy to approach. She does, her thick thighs swaying to show her understanding of your needs. The bird-woman crawls into your lap, sinking down atop your shaft to snuggle it with her molten heat. She begins kissing you, smearing your mouth with her drugged lipstick until you release the first of many loads. You sigh, riding the bliss, secure in the knowledge that this 'wife' won't let up until she's gravid with another egg. Then it'll be her sister-wife's turn. The tightness of " + player.sMultiCockDesc() + " inside your " + player.armorName + " rouses you from the dream, reminding you that you're just standing there, leaking your need into your gear.");
						}
					}
					//Cunts!
					else if (player.hasVagina()) {
						//(female 1)
						if (rand(2) === 0) {
							outputText("In your fantasy you're a happy harpy mother, your womb stretched by the sizable egg it contains. The surging hormones in your body arouse you again, and you turn to the father of your children, planting a wet kiss on his slobbering, lipstick-gilt cock. The poor adventurer writhes, hips pumping futilely in the air. He's been much more agreeable since you started keeping his cock coated with your kisses. You mount the needy boy, fantasizing about that first time when you found him near the portal, in the ruins of your old camp. The feeling of your stiff nipples ");
							if (player.hasFuckableNipples()) outputText("and pussy leaking over ");
							else if (player.biggestLactation() >= 1.5) outputText("dripping milk inside ");
							else outputText("rubbing inside ");
							outputText("your " + player.armorName + " shocks you from the dream, leaving you with nothing but the moistness of your loins for company. Maybe next year you'll find the mate of your dreams?");
						}
						//(female 2)
						else {
							outputText("In your fantasy you're sprawled on your back, thick thighs splayed wide while you're taken by a virile male. The poor stud was wandering the desert all alone, following some map, but soon you had his bright red rod sliding between your butt-cheeks, the pointed tip releasing runnels of submission to lubricate your loins. You let him mount your pussy before you grabbed him with your powerful thighs and took off. He panicked at first, but the extra blood flow just made him bigger. He soon forgot his fear and focused on the primal needs of all males – mating with a gorgeous harpy. You look back at him and wink, feeling his knot build inside you. Your aching, tender " + player.nippleDescript(0) + "s pull you out of the fantasy as they rub inside your " + player.armorName + ". Maybe once your quest is over you'll be able to find a shy, fertile male to mold into the perfect cum-pump.");
						}
					}
				}
			}
			//****************
			//   Sexual:
			//****************
			//-Grow a cunt (guaranteed if no gender)
			if (player.gender == 0 || (!player.hasVagina() && changes < changeLimit && rand(3) === 0)) {
				changes++;
				//(balls)
				if (player.balls > 0) outputText("\n\nAn itch starts behind your " + player.ballsDescriptLight() + ", but before you can reach under to scratch it, the discomfort fades. A moment later a warm, wet feeling brushes your " + player.sackDescript() + ", and curious about the sensation, you lift up your balls to reveal your new vagina.");
				//(dick)
				else if (player.hasCock()) outputText("\n\nAn itch starts on your groin, just below your " + player.multiCockDescriptLight() + ". You pull your manhood aside to give you a better view, and you're able to watch as your skin splits to give you a new vagina, complete with a tiny clit.");
				//(neither)
				else outputText("\n\nAn itch starts on your groin and fades before you can take action. Curious about the intermittent sensation, you peek under your " + player.armorName + " to discover your brand new vagina, complete with pussy lips and a tiny clit.");
				player.createVagina();
				player.setClitLength(.25);
				dynStats("sen", 10);
			}
			//-Remove extra breast rows
			if (changes < changeLimit && player.breastRows.length > 1 && rand(3) === 0 && !flags[kFLAGS.HYPER_HAPPY]) {
				mutations.removeExtraBreastRow(tfSource);
			}
			//-Shrink tits if above DDs.
			//Cannot happen at same time as row removal
			else if (changes < changeLimit && player.breastRows.length == 1 && rand(3) === 0 && player.breastRows[0].breastRating >= 7 && !flags[kFLAGS.HYPER_HAPPY])
			{
				changes++;
				//(Use standard breast shrinking mechanism if breasts are under 'h')
				if (player.breastRows[0].breastRating < 19)
				{
					player.shrinkTits();
				}
				//(H+)
				else {
					player.breastRows[0].breastRating -= (4 + rand(4));
					outputText("\n\nYour chest pinches tight, wobbling dangerously for a second before the huge swell of your bust begins to shrink into itself. The weighty mounds jiggle slightly as they shed cup sizes like old, discarded coats, not stopping until they're " + player.breastCup(0) + "s.");
				}
			}
			//-Grow tits to a B-cup if below.
			if (changes < changeLimit && player.breastRows[0].breastRating < 2 && rand(3) === 0) {
				changes++;
				outputText("\n\nYour chest starts to tingle, the " + player.skin.desc + " warming under your " + player.armorName + ". Reaching inside to feel the tender flesh, you're quite surprised when it puffs into your fingers, growing larger and larger until it settles into a pair of B-cup breasts.");
				if (player.breastRows[0].breastRating < 1) outputText("  You have breasts now!");
				player.breastRows[0].breastRating = 2;
			}
			//Change cock if you have a penis.
			if (changes < changeLimit && player.hasCock() && player.countCocksOfType(CockTypesEnum.AVIAN) < player.cockTotal() && rand(type === ENHANCED ? 4 : 10) === 0 ) { //2.5x chance if magic seed.
				changes++;
				outputText("\n\nYou feel a strange tingling sensation in your cock as erection forms. You " + player.clothedOrNakedLower("open up your " + player.armorName + " and", "") + " look down to see " + (player.cockTotal() == 1 ? "your cock" : "one of your cocks") + " shifting! By the time the transformation's complete, you notice it's tapered, red, and ends in a tip. When you're not aroused, your cock rests nicely in a newly-formed sheath. You now have an avian penis!");
				for (var i:int = 0; i < player.cocks.length; i++) {
					if (player.cocks[i].cockType !== CockTypesEnum.AVIAN) {
						player.cocks[i].cockType = CockTypesEnum.AVIAN;
						break;
					}
				}
			}
			//Neck restore
			if (player.neck.type !== Neck.NORMAL && changes < changeLimit && rand(4) === 0) mutations.restoreNeck(tfSource);
			//Rear body restore
			if (player.hasNonSharkRearBody() && changes < changeLimit && rand(5) === 0) mutations.restoreRearBody(tfSource);
			//Ovi perk
			if (rand(5) === 0) mutations.updateOvipositionPerk(tfSource);
			//****************
			//General Appearance:
			//****************
			//-Femininity to 85
			if (player.femininity < 85 && changes < changeLimit && rand(3) === 0) {
				changes++;
				outputText(player.modFem(85, 3 + rand(5)));
			}
			//-Skin color change – tan, olive, dark, light
			if ((player.skin.tone !== "tan" && player.skin.tone !== "olive" && player.skin.tone !== "dark" && player.skin.tone !== "light") && changes < changeLimit && rand(5) === 0) {
				changes++;
				outputText("\n\nIt takes a while for you to notice, but ");
				if (player.hasFur()) outputText("the skin under your " + player.hair.color + " " + player.skin.desc);
				else outputText("your " + player.skin.desc);
				outputText(" has changed to become ");
				temp = rand(4);
				if (temp == 0) player.skin.tone = "tan";
				else if (temp == 1) player.skin.tone = "olive";
				else if (temp == 2) player.skin.tone = "dark";
				else if (temp == 3) player.skin.tone = "light";
				outputText(player.skin.tone + " colored.");
				player.arms.updateClaws(player.arms.claws.type);
			}
			//-Grow hips out if narrow.
			if (player.hips.rating < 10 && changes < changeLimit && rand(3) === 0) {
				outputText("\n\nYour gait shifts slightly to accommodate your widening " + player.hipDescript() + ". The change is subtle, but they're definitely broader.");
				player.hips.rating++;
				changes++;
			}
			//-Narrow hips if crazy wide
			if (player.hips.rating >= 15 && changes < changeLimit && rand(3) === 0) {
				outputText("\n\nYour gait shifts inward, your " + player.hipDescript() + " narrowing significantly. They remain quite thick, but they're not as absurdly wide as before.");
				player.hips.rating--;
				changes++;
			}
			//-Big booty
			if (player.butt.rating < 8 && changes < changeLimit && rand(3) === 0) {
				player.butt.rating++;
				changes++;
				outputText("\n\nA slight jiggle works through your rear, but instead of stopping it starts again. You can actually feel your " + player.armorName + " being filled out by the growing cheeks. When it stops, you find yourself the proud owner of a " + player.buttDescript() + ".");
			}
			//-Narrow booty if crazy huge.
			if (player.butt.rating >= 14 && changes < changeLimit && rand(4) === 0) {
				changes++;
				player.butt.rating--;
				outputText("\n\nA feeling of tightness starts in your " + player.buttDescript() + ", increasing gradually. The sensation grows and grows, but as it does your center of balance shifts. You reach back to feel yourself, and sure enough your massive booty is shrinking into a more manageable size.");
			}
			//-Body thickness to 25ish
			if (player.thickness > 25 && changes < changeLimit && rand(3) === 0) {
				outputText(player.modThickness(25, 3 + rand(4)));
				changes++;
			}
			//Remove odd eyes
			if (changes < changeLimit && rand(5) === 0 && player.eyes.type > Eyes.HUMAN) {
				if (player.eyes.type == Eyes.BLACK_EYES_SAND_TRAP) {
					outputText("\n\nYou feel a twinge in your eyes and you blink.  It feels like black cataracts have just fallen away from you, and you know without needing to see your reflection that your eyes have gone back to looking human.");
				}
				else {
					outputText("\n\nYou blink and stumble, a wave of vertigo threatening to pull your " + player.feet() + " from under you.  As you steady and open your eyes, you realize something seems different.  Your vision is changed somehow.");
					if (player.eyes.type == Eyes.FOUR_SPIDER_EYES || player.eyes.type == Eyes.SPIDER) outputText("  Your arachnid eyes are gone!");
					outputText("  You have normal, humanoid eyes again.");
				}
				player.eyes.type = Eyes.HUMAN;
				player.eyes.count = 2;
				changes++;
			}
			//****************
			//Harpy Appearance:
			//****************
			//-Harpy legs
			if (player.lowerBody.type !== LowerBody.HARPY && changes < changeLimit && (type === ENHANCED || player.tail.type == Tail.HARPY) && rand(4) === 0) {
				//(biped/taur)
				if (!player.isGoo()) outputText("\n\nYour " + player.legs() + " creak ominously a split-second before they go weak and drop you on the ground. They go completely limp, twisting and reshaping before your eyes in ways that make you wince. Your lower body eventually stops, but the form it's settled on is quite thick in the thighs. Even your " + player.feet() + " have changed.  ");
				//goo
				else outputText("\n\nYour gooey undercarriage loses some of its viscosity, dumping you into the puddle that was once your legs. As you watch, the fluid pulls together into a pair of distinctly leg-like shapes, solidifying into a distinctly un-gooey form. You've even regained a pair of feet!  ");
				player.lowerBody.type = LowerBody.HARPY;
				player.lowerBody.legCount = 2;
				changes++;
				//(cont)
				outputText("While humanoid in shape, they have two large, taloned toes on the front and a single claw protruding from the heel. The entire ensemble is coated in " + player.hair.color + " feathers from ankle to hip, reminding you of the bird-women of the mountains. You now have harpy legs!");
			}
			//-Feathery Tail
			if (player.tail.type !== Tail.HARPY && changes < changeLimit && (type === ENHANCED || player.wings.type == Wings.FEATHERED_LARGE) && rand(4) === 0) {
				//(tail)
				if (player.tail.type > Tail.NONE) outputText("\n\nYour tail shortens, folding into the crack of your " + player.buttDescript() + " before it disappears. A moment later, a fan of feathers erupts in its place, fluffing up and down instinctively every time the breeze shifts. You have a feathery harpy tail!");
				//(no tail)
				else outputText("\n\nA tingling tickles the base of your spine, making you squirm in place. A moment later, it fades, but a fan of feathers erupts from your " + player.skin.desc + " in its place. The new tail fluffs up and down instinctively with every shift of the breeze. You have a feathery harpy tail!");
				player.tail.type = Tail.HARPY;
				changes++;
			}
			//-Propah Wings
			if (player.wings.type == Wings.NONE && changes < changeLimit && (type === ENHANCED || player.arms.type == Arms.HARPY) && rand(4) === 0) {
				outputText("\n\nPain lances through your back, the muscles knotting oddly and pressing up to bulge your " + player.skin.desc + ". It hurts, oh gods does it hurt, but you can't get a good angle to feel at the source of your agony. A loud crack splits the air, and then your body is forcing a pair of narrow limbs through a gap in your " + player.armorName + ". Blood pumps through the new appendages, easing the pain as they fill out and grow. Tentatively, you find yourself flexing muscles you didn't know you had, and");
				player.wings.setProps({
					type: Wings.FEATHERED_LARGE,
					color: player.hasFur() ? player.skin.furColor : player.hair.color
				});
				outputText(" you're able to curve the new growths far enough around to behold your brand new, " + player.wings.color + " wings.");
				changes++;
			}
			//-Remove old wings
			if (([Wings.NONE, Wings.FEATHERED_LARGE].indexOf(player.wings.type) == -1 || player.rearBody.type == RearBody.SHARK_FIN) && changes < changeLimit && rand(4) === 0) {
				if (player.rearBody.type == RearBody.SHARK_FIN) {
					outputText("\n\nSensation fades from your large fin slowly but surely, leaving it a dried out husk that breaks off to fall on the"
					          +" ground. Your back closes up to conceal the loss, as smooth and unbroken as the day you entered the portal.");
					player.rearBody.restore();
				} else {
					outputText("\n\nSensation fades from your [wings] slowly but surely, leaving them dried out husks that break off to fall on the"
					          +" ground. Your back closes up to conceal the loss, as smooth and unbroken as the day you entered the portal.");
				}
				player.wings.restore();
				changes++;
			}
			//-Feathery Arms
			if (player.arms.type !== Arms.HARPY && changes < changeLimit && (type === ENHANCED || player.hair.type === Hair.FEATHER) && rand(4) === 0) {
				outputText("\n\nYou smile impishly as you lick the last bits of the nut from your teeth, but when you go to wipe your mouth, instead of the usual texture of your " + player.skin.desc + " on your lips, you feel feathers! You look on in horror while more of the avian plumage sprouts from your " + player.skin.desc + ", covering your forearms until your arms look vaguely like wings. Your hands remain unchanged thankfully. It'd be impossible to be a champion without hands! The feathery limbs might help you maneuver if you were to fly, but there's no way they'd support you alone.");
				changes++;
				player.arms.setType(Arms.HARPY);
			}
			//-Feathery Hair
			if (player.hair.type !== Hair.FEATHER && changes < changeLimit && (type === ENHANCED || player.face.type == Face.HUMAN) && rand(4) === 0) {
				outputText("\n\nA tingling starts in your scalp, getting worse and worse until you're itching like mad, the feathery strands of your hair tickling your fingertips while you scratch like a dog itching a flea. When you pull back your hand, you're treated to the sight of downy fluff trailing from your fingernails. A realization dawns on you - you have feathers for hair, just like a harpy!");
				player.hair.type = Hair.FEATHER;
				changes++;
			}
			//-Human face
			if (player.face.type !== Face.HUMAN && changes < changeLimit && (type === ENHANCED || (player.ears.type == Ears.HUMAN || player.ears.type == Ears.ELFIN)) && rand(4) === 0) {
				outputText("\n\nSudden agony sweeps over your " + player.faceDescript() + ", your visage turning hideous as bones twist and your jawline shifts. The pain slowly vanishes, leaving you weeping into your fingers. When you pull your hands away you realize you've been left with a completely normal, human face.");
				player.face.type = Face.HUMAN;
				changes++;
			}
			//-Gain human ears (keep elf ears)
			if ((player.ears.type !== Ears.HUMAN && player.ears.type !== Ears.ELFIN) && changes < changeLimit && rand(4) === 0) {
				outputText("\n\nOuch, your head aches! It feels like your ears are being yanked out of your head, and when you reach up to hold your aching noggin, you find they've vanished! Swooning and wobbling with little sense of balance, you nearly fall a half-dozen times before a pair of normal, human ears sprout from the sides of your head. You had almost forgotten what human ears felt like!");
				player.ears.type = Ears.HUMAN;
				changes++;
			}
			// Remove gills
			if (rand(4) === 0 && player.hasGills() && changes < changeLimit) mutations.updateGills();
			//SPECIAL:
			//Harpy Womb – All eggs are automatically upgraded to large, requires legs + tail to be harpy.
			if (player.findPerk(PerkLib.HarpyWomb) < 0 && player.lowerBody.type == LowerBody.HARPY && player.tail.type == Tail.HARPY && rand(4) === 0 && changes < changeLimit) {
				player.createPerk(PerkLib.HarpyWomb, 0, 0, 0, 0);
				outputText("\n\nThere's a rumbling in your womb, signifying that some strange change has taken place in your most feminine area. No doubt something in it has changed to be more like a harpy. (You've gained the Harpy Womb perk! All the eggs you lay will always be large so long as you have harpy legs and a harpy tail.)");
				changes++;
			}
			if (changes < changeLimit && rand(4) === 0 && ((player.ass.analWetness > 0 && player.findPerk(PerkLib.MaraesGiftButtslut) < 0) || player.ass.analWetness > 1)) {
				outputText("\n\nYou feel a tightening up in your colon and your [asshole] sucks into itself.  You feel sharp pain at first but that thankfully fades.  Your ass seems to have dried and tightened up.");
				player.ass.analWetness--;
				if (player.ass.analLooseness > 1) player.ass.analLooseness--;
				changes++;
			}
			//Nipples Turn Back:
			if (player.hasStatusEffect(StatusEffects.BlackNipples) && changes < changeLimit && rand(3) === 0) {
				mutations.removeBlackNipples(tfSource);
			}
			//Debugcunt
			if (changes < changeLimit && rand(3) === 0 && player.vaginaType() == 5 && player.hasVagina()) {
				outputText("\n\nSomething invisible brushes against your sex, making you twinge.  Undoing your clothes, you take a look at your vagina and find that it has turned back to its natural flesh colour.");
				player.vaginaType(0);
				changes++;
			}
			if (changes == 0) outputText("\n\nAside from being a tasty treat, it doesn't seem to do anything to you this time.");
			player.refillHunger(10);
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.Items.Consumable;
	import classes.StatusEffects;

	/**
	 * A spellbook that teaches the player one the following spells: 'Arouse', 'Heal' or 'Might'.
	 * May also raise int.
	 */
	public class GraySpellBook extends Consumable
	{
		private static const ITEM_VALUE:int = 250;

		public function GraySpellBook()
		{
			super("G. Book","G. Book", "a small gray book with white and black runes ", ITEM_VALUE, "This gray grimoire is adorned with beveled white and black runes.  The pages are edged with gold, like some of the fancy books in the monastery back home.");
		}

		override public function useItem():Boolean
		{
			clearOutput();
			outputText("You open the grimoire.  It explains a unique type of magic - a hybrid of black and white magic - that becomes more powerful if you're affected, but not overwhelmed, by your emotions. In no time at all you've read the whole thing, but it disappears into thin air before you can put it away.");
			if (player.inte100 < 30) {
				outputText("\n\nYou feel greatly enlightened by your time spent reading.");
				dynStats("int", 4);
			}
			else if (player.inte100 < 60) {
				outputText("\n\nSpending some time reading was probably good for you, and you definitely feel smarter for it.");
				dynStats("int", 2);
			}
			else if (player.inte100 < 80) {
				outputText("\n\nAfter reading the small tome your already quick mind feels invigorated.");
				dynStats("int", 1);
			}
			else {
				outputText("\n\nThe contents of the book did little for your already considerable intellect.");
				dynStats("int", .6);
			}
			//Smart enough for arouse and doesnt have it
			if (player.inte >= 55 && !player.hasStatusEffect(StatusEffects.KnowsTKBlast)) {
				outputText("\n\nYou blink in surprise, assaulted by the knowledge of a new spell: Telekinetic Blast.");
				player.createStatusEffect(StatusEffects.KnowsTKBlast, 0, 0, 0, 0);
				return false;
			}
			//Smart enough for arouse and doesnt have it
			if (player.inte >= 70 && !player.hasStatusEffect(StatusEffects.KnowsLeech)) {
				outputText("\n\nYou blink in surprise, assaulted by the knowledge of a new spell: Leech.");
				player.createStatusEffect(StatusEffects.KnowsLeech, 0, 0, 0, 0);
				return false;
			}
			return false;
		}
	}
}

license: unknown


code:
/**
 * Created by aimozg on 11.01.14.
 */
package classes.Items.Consumables
{
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;
	import classes.PerkLib;
	import classes.Player;
	import classes.internals.Utils;
	import classes.GlobalFlags.kGAMECLASS;

	public final class GroPlus extends Consumable {

		public function GroPlus() {
			super("GroPlus", "GroPlus", "a needle filled with Gro+", 50, "This is a small needle with a reservoir full of blue liquid.  A faded label marks it as 'GroPlus'.  Its purpose seems obvious.");
		}

		override public function canUse():Boolean {
			return true;
		}

//		override public function hasSubMenu():Boolean { return true; } //Only GroPlus and Reducto use this.

		override public function useItem():Boolean {
			var gpBalls:Function	= (player.balls > 0 ? growPlusBalls : null);
			var gpBreasts:Function	= (player.breastRows.length > 0 ? growPlusBreasts : null);
			var gpClit:Function		= (player.vaginas.length > 0 ? growPlusClit : null);
			var gpCock:Function		= (player.cockTotal() > 0 ? growPlusCock : null);
			var gpNipples:Function	= (player.totalNipples() > 0 ? growPlusNipples : null);
			clearOutput();
			outputText("You ponder the needle in your hand knowing it will enlarge the injection site.  What part of your body will you use it on?  ");
			menu();
			addButton(0, "Balls", gpBalls);
			addButton(1, "Breasts", gpBreasts);
			addButton(2, "Clit", gpClit);
			addButton(3, "Cock", gpCock);
			addButton(4, "Nipples", gpNipples);
			addButton(14, "Nevermind", growPlusCancel);
			return(true);
		}

		private function growPlusBalls():void {
			clearOutput();
			player.slimeFeed();
			outputText("You sink the needle deep into your " + player.sackDescript() + ".  It hurts like hell, but you push down the plunger and the pain vanishes as the needles contents flow into you.\n\n");
			//1 in 4 BIG growth.
			if (Utils.rand(4) == 0) {
				outputText("You feel a trembling in your " + player.ballsDescriptLight() + " as the chemicals start to go to work.  You can tell they're going to be VERY effective.\n");
				player.ballSize += Utils.rand(4) + 2;
				outputText("They shift, stretching your " + player.sackDescript() + " tight as they gain inches of size.  You step to steady yourself as your center of balance shifts due to your newly enlarged " + player.ballsDescriptLight() + ".  ");
			}
			else {
				player.ballSize += Utils.rand(2) + 1;
				outputText("You feel your testicles shift, pulling the skin of your " + player.sackDescript() + " a little bit as they grow to " + player.ballsDescriptLight() + ".  ");
			}
			if (player.ballSize > 10) outputText("Walking gets even tougher with the swollen masses between your legs.  Maybe this was a bad idea.");
			dynStats("lus", 10);
			inventory.itemGoNext();
		}

		private function growPlusBreasts():void {
			clearOutput();
			player.slimeFeed();
			outputText("You sink the needle into the flesh of your " + player.allBreastsDescript() + " injecting each with a portion of the needle.\n\n");
			if (player.breastRows.length == 1)
				player.growTits(Utils.rand(5) + 1, 1, true, 1);
			else
				player.growTits(Utils.rand(2) + 1, player.breastRows.length, true, 1);
			dynStats("lus", 10);
			inventory.itemGoNext();
		}

		private function growPlusClit():void {
			clearOutput();
			player.slimeFeed();
			outputText("You sink the needle into your clit, nearly crying with how much it hurts.  You push down the plunger and the pain vanishes as your clit starts to grow.\n\n");
			player.changeClitLength(1);
			outputText("Your " + player.clitDescript() + " stops growing after an inch of new flesh surges free of your netherlips.  It twitches, feeling incredibly sensitive.");
			dynStats("sen", 2, "lus", 10);
			inventory.itemGoNext();
		}

		private function growPlusCock():void {
			clearOutput();
			player.slimeFeed();
			outputText("You sink the needle into the base of your " + player.multiCockDescriptLight() + ".  It hurts like hell, but as you depress the plunger, the pain vanishes, replaced by a tingling pleasure as the chemicals take effect.\n\n");
			if (player.cocks.length == 1) {
				var amntInc:Number = player.increaseCock(0, 4);
				outputText("Your " + player.cockDescript(0) + " twitches and thickens, pouring "+ (amntInc > 1 ? "more than an inch" : "about an inch") + " of thick new length" +
						" from your ");
			}
			//MULTI
			else {
				outputText("Your " + player.multiCockDescriptLight() + " twitch and thicken, each member pouring out more than an inch of new length from your ");
				for (var i:int = 0; i < player.cocks.length; i++) {
					player.increaseCock(i, 2);
				}
			}
			if (player.hasSheath())
				outputText("sheath.");
			else outputText("crotch.");
			dynStats("sen", 2, "lus", 10);
			inventory.itemGoNext();
		}

		private function growPlusNipples():void {
			clearOutput();
			player.slimeFeed();
			outputText("You sink the needle into each of your " + player.nippleDescript(0) + "s in turn, dividing the fluid evenly between them.  Though each injection hurts, the pain is quickly washed away by the potent chemical cocktail.\n\n");
		//Grow nipples
			outputText("Your nipples engorge, prodding hard against the inside of your " + player.armorName + ".  Abruptly you realize they've grown more than an additional quarter-inch.\n\n");
			player.nippleLength += (Utils.rand(2) + 3) / 10;
			dynStats("lus", 15);
			//NIPPLECUNTZZZ
			if (!player.hasFuckableNipples() && Utils.rand(4) == 0) {
				var nowFuckable:Boolean = false;
				for (var x:int = 0; x < player.breastRows.length; x++) {
					if (!player.breastRows[x].fuckable && player.nippleLength >= 2) {
						player.breastRows[x].fuckable = true;
						nowFuckable = true;
					}
				}
				//Talk about if anything was changed.
				if (nowFuckable) outputText("Your " + player.allBreastsDescript() + " tingle with warmth that slowly migrates to your nipples, filling them with warmth.  You pant and moan, rubbing them with your fingers.  A trickle of wetness suddenly coats your finger as it slips inside the nipple.  Shocked, you pull the finger free.  <b>You now have fuckable nipples!</b>\n\n");
			}
			inventory.itemGoNext();
		}

		private function growPlusCancel():void {
			clearOutput();
			outputText("You put the vial away.\n\n");
			inventory.returnItemToInventory(this);
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.GlobalFlags.kGAMECLASS;
	import classes.internals.Utils;
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;

	public class HairDye extends Consumable
	{
		private var _color:String;

		public function HairDye(id:String, color:String)
		{
			_color = color.toLowerCase();
			var shortName:String = color + " Dye";
			var longName:String = "a vial of " + _color + " hair dye";
			var value:int = ConsumableLib.DEFAULT_VALUE;
			if (color == "rainbow") value = 100;
			var description:String = "This bottle of dye will allow you to change the color of your hair.  Of course if you don't have hair, using this would be a waste.";
			super(id, shortName, longName, value, description);
		}

		override public function canUse():Boolean {
			return true;
		}

		override public function useItem():Boolean {
			clearOutput();
			menu();

			if (player.hair.length > 0) {
				outputText("You have " + player.hair.color + " hair.");
				if (player.hair.color != _color) addButton(0, "Hair", dyeHair);
				else addButtonDisabled(0, "Hair", "Your already have " + player.hair.color + " hair!");
			} else {
				outputText("You have no hair.");
				addButtonDisabled(0, "Hair", "You are bald!");
			}

			if (player.hasFur()) {
				outputText("\n\nYou have " + player.skin.furColor + " fur.");
				if (player.skin.furColor != _color) addButton(1, "Fur", dyeFur);
				else addButtonDisabled(1, "Fur", "Your already have " + _color + " fur!");
			} else if (player.hasFeathers() || player.hasCockatriceSkin()) {
				outputText("\n\nYou have " + player.skin.furColor + " feathers.");
				if (player.skin.furColor != _color) addButton(1, "Feathers", dyeFeathers);
				else addButtonDisabled(1, "Feathers", "Your already have " + _color + " feathers!");
			} else {
				outputText("\n\nYou have no fur.");
				addButtonDisabled(1, "Fur", "You have no fur!");
			}

			if (player.hasFurryUnderBody()) {
				outputText("\n\nYou have " + player.underBody.skin.furColor + " fur on your underbody.");
				if (player.underBody.skin.furColor != _color) addButton(2, "Under Fur", dyeUnderBodyFur);
				else addButtonDisabled(2, "Under Fur", "Your already have " + _color + " fur on your underbody!");
			} else if (player.hasFeatheredUnderBody()) {
				outputText("\n\nYou have " + player.underBody.skin.furColor + " feathers on your underbody.");
				if (player.underBody.skin.furColor != _color) addButton(2, "Under Feathers", dyeUnderBodyFeathers);
				else addButtonDisabled(2, "Under Feathers", "Your already have " + _color + " feathers on your underbody!");
			} else {
				outputText("\n\nYou have no special or furry underbody.");
				addButtonDisabled(2, "Under Fur", "You have no special or furry underbody!");
			}

			if (player.wings.canDye()) {
				outputText("\n\nYou have [wingColor] wings.");
				if (!player.wings.hasDyeColor(_color)) addButton(3, "Wings", dyeWings);
				else addButtonDisabled(3, "Wings", "Your already have " + _color + " wings!");
			} else {
				outputText("\n\nYour wings can't be dyed.");
				addButtonDisabled(3, "Wings", "Your wings can't be dyed!");
			}

			if (player.neck.canDye()) {
				outputText("\n\nYou have a [neckColor] neck.");
				if (!player.neck.hasDyeColor(_color)) addButton(5, "Neck", dyeNeck);
				else addButtonDisabled(5, "Neck", "Your already have a " + _color + " neck!");
			} else {
				outputText("\n\nYour neck can't be dyed.");
				addButtonDisabled(5, "Neck", "Your neck can't be dyed!");
			}

			if (player.rearBody.canDye()) {
				outputText("\n\nYou have a [rearBodyColor] rear body.");
				if (!player.rearBody.hasDyeColor(_color)) addButton(6, "Rear Body", dyeRearBody);
				else addButtonDisabled(6, "Rear Body", "Your already have a " + _color + " rear body!");
			} else {
				outputText("\n\nYour rear body can't be dyed.");
				addButtonDisabled(6, "Rear Body", "Your rear body can't be dyed!");
			}

			addButton(4, "Nevermind", dyeCancel);
			return true;
		}

		private function dyeHair():void {
			clearOutput();
			if (player.hair.length == 0) {
				outputText("You rub the dye into your bald head, but it has no effect.");
			}
			else if (player.hair.color.indexOf("rubbery") != -1 || player.hair.color.indexOf("latex-textured") != -1) {
				outputText("You massage the dye into your " + player.hairDescript() + " but the dye cannot penetrate the impermeable material your hair is composed of.");
			}
			else {
				outputText("You rub the dye into your " + player.hairDescript() + ", then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
				player.hair.color = _color;
				outputText("You now have " + player.hairDescript() + ".");
				if (player.lust100 > 50) {
					outputText("\n\nThe cool water calms your urges somewhat, letting you think more clearly.");
					dynStats("lus", -15);
				}
			}
			inventory.itemGoNext();
		}

		private function dyeFur():void {
			clearOutput();
			outputText("You rub the dye into your fur, then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.skin.furColor = _color;
			outputText("You now have " + player.skin.furColor + " fur.");
			finalize();
		}

		private function dyeUnderBodyFur():void
		{
			clearOutput();
			outputText("You rub the dye into your fur on your underside, then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.underBody.skin.furColor = _color;
			outputText("You now have " + player.underBody.skin.furColor + " fur on your underside.");
			finalize();
		}

		private function dyeFeathers():void
		{
			clearOutput();
			outputText("You rub the dye into your feathers, then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.skin.furColor = _color;
			outputText("You now have " + player.skin.furColor + " feathers.");
			finalize();
		}

		private function dyeUnderBodyFeathers():void
		{
			clearOutput();
			outputText("You rub the dye into your feathers on your underside, then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.underBody.skin.furColor = _color;
			outputText("You now have " + player.underBody.skin.furColor + " feathers on your underside.");
			finalize();
		}

		private function dyeWings():void
		{
			clearOutput();
			outputText("You rub the dye into your [wings], then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.wings.applyDye(_color);
			outputText("You now have [wingColor] wings.");
			finalize();
		}

		private function dyeNeck():void
		{
			clearOutput();
			outputText("You rub the dye onto your [neck], then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.neck.applyDye(_color);
			outputText("You now have a [neckColor] neck.");
			finalize();
		}

		private function dyeRearBody():void
		{
			clearOutput();
			outputText("You rub the dye onto your [rearBody], then use a bucket of cool lakewater to rinse clean a few minutes later.  ");
			player.rearBody.applyDye(_color);
			outputText("You now have a [rearBodyColor] rear body.");
			finalize();
		}

		private function dyeCancel():void {
			clearOutput();
			outputText("You put the dye away.\n\n");
			inventory.returnItemToInventory(this);
		}

		private function finalize():void
		{
			if (player.lust100 > 50) {
				outputText("\n\nThe cool water calms your urges somewhat, letting you think more clearly.");
				dynStats("lus", -15);
			}
			inventory.itemGoNext();
		}
	}
}


code:
/**
 * Created by aimozg on 11.01.14.
 */
package classes.Items.Consumables
{
	import classes.BodyParts.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.Items.Consumable;
	import classes.internals.Utils;
	import classes.Player;

	public final class HairExtensionSerum extends Consumable {

		public function HairExtensionSerum() {
			super("ExtSerm", "ExtSerm", "a bottle of hair extension serum", 6, "This is a bottle of foamy pink liquid, purported by the label to increase the speed at which the user's hair grows.");
		}

		override public function canUse():Boolean {
			if (flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED] <= 2) return true;
			outputText("No way!  Your head itches like mad from using the rest of these, and you will NOT use another.\n");
			return false;
		}

		override public function useItem():Boolean {
			outputText("You open the bottle of hair extension serum and follow the directions carefully, massaging it into your scalp and being careful to keep it from getting on any other skin.  You wash off your hands with lakewater just to be sure.");
			if (player.hair.type == Hair.BASILISK_SPINES) {
				outputText("\n\nYou wait a while, expecting a tingle on your head, but nothing happens. You sigh as you realize, that your "
				          + player.hair.color + " basilisk spines are immune to the serum ...");
				return false;
			}
			if (flags[kFLAGS.INCREASED_HAIR_GROWTH_TIME_REMAINING] <= 0) {
				outputText("\n\nThe tingling on your head lets you know that it's working!");
				flags[kFLAGS.INCREASED_HAIR_GROWTH_TIME_REMAINING] = 7;
				flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED] = 1;
			}
			else if (flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED] == 1) {
				outputText("\n\nThe tingling intensifies, nearly making you feel like tiny invisible faeries are massaging your scalp.");
				flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED]++;
			}
			else if (flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED] == 2) {
				outputText("\n\nThe tingling on your scalp is intolerable!  It's like your head is a swarm of angry ants, though you could swear your hair is growing so fast that you can feel it weighing you down more and more!");
				flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED]++;
			}
			if (flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] > 0 && player.hair.type != Hair.ANEMONE) {
				flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] = 0;
				outputText("\n\nSomehow you know that your " + player.hairDescript() + " is growing again.");
			}
			if (flags[kFLAGS.INCREASED_HAIR_GROWTH_TIME_REMAINING] < 7) flags[kFLAGS.INCREASED_HAIR_GROWTH_TIME_REMAINING] = 7;
			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.Items.Consumable;

	/**
	 * Polly wants a cracker?
	 */
	public class HardBiscuits extends Consumable
	{
		private static const ITEM_VALUE:int = 5;

		public function HardBiscuits()
		{
			super("H.Bisct", "H.Biscuits", "a pack of hard biscuits", ITEM_VALUE, "These biscuits are tasteless, but they can stay edible for an exceedingly long time.");
		}

		override public function useItem():Boolean
		{
			outputText("You eat the flavorless biscuits. It satisfies your hunger a bit, but not much else.");
			player.refillHunger(15);

			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;

	/**
	 * Moderate boost to HP.
	 *
	 * Retro UTG stuff!
	 */
	public class HealPill extends Consumable
	{
		public function HealPill()
		{
			super("H. Pill", "Heal Pill", "a small healing pill", ConsumableLib.DEFAULT_VALUE, "A small healing pill that's guaranteed to heal you by a bit.");
		}

		override public function useItem():Boolean
		{
			var rand:int = Math.random() * 100;
			outputText("You pop the small pill into your mouth and swallow. ");

			if (player.HPChange(50 + player.tou, true)) {
				outputText("Some of your wounds are healed. ");
			}
			else
			{
				outputText("You feel an odd sensation. ");
			}

			if (rand < 70 && player.lib < 40) {
				outputText("You feel a sense of warmth spread through your erogenous areas.");
				dynStats("lib", 1);
			}

			if (rand >= 70 && rand <= 90) {
				outputText("Your body tingles and feels more sensitive.");
				dynStats("sens", 4);
			}

			if (rand > 90) {
				outputText("You shudder as a small orgasm passes through you. When you recover you actually feel more aroused.");
				dynStats("lus", 5);
			}

			return false;
		}

		override public function getMaxStackSize():int {
			return 5;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;
	import classes.StatusEffects;

	public class HerbalContraceptive extends Consumable
	{
		public function HerbalContraceptive()
		{
			super("HrblCnt", "HrblCnt", "a bundle of verdant green leaves", ConsumableLib.DEFAULT_VALUE, "A small bundle of verdant green leaves.");
		}

		override public function useItem():Boolean
		{
			clearOutput();

			// Placeholder, sue me
			outputText("You chew on the frankly awfully bitter leaves as quickly as possible before swallowing them down.");

			player.createStatusEffect(StatusEffects.Contraceptives, 1, 48, 0, 0);

			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;

	/**
	 * A refreshing icicle.
	 */
	public class IceShard extends Consumable
	{
		public function IceShard()
		{
			super("Icicle ","Icicle", "an ice shard", ConsumableLib.DEFAULT_VALUE,"An icicle that seems to be incapable of melting.  It numbs your hands as you hold it. ");
		}

		override public function useItem():Boolean
		{
			clearOutput();
			outputText("You give the icicle a tentative lick, careful not to stick your tongue to it. It tastes refreshing, like cool, clear glacier water.  The ice readily dissolves against the heat of your mouth as you continue to lick away at it.  Before long, the icicle has dwindled into a sliver small enough to pop into your mouth.  As the pinprick of ice melts you slide your chilled tongue around your mouth, savoring the crisp feeling.\n\n")
			if (rand(2) === 0 && (player.str100 < 75 || player.tou100 < 75)) {
				outputText("The rush of cold tenses your muscles and fortifies your body, making you feel hardier than ever.  ");
				if (player.str100 < 75) dynStats("str", ((1 + rand(5)) / 5))
				if (player.tou100 < 75) dynStats("tou", ((1 + rand(5)) / 5))
			}
			if (rand(2) === 0 && (player.spe100 > 25)) {
				outputText("You feel a chill spread through you; when it passes, you feel more slothful and sluggish.  ");
				if (player.spe100 > 25) dynStats("spe", -((1 + rand(5)) / 5))
			}
			if (rand(2) === 0) {
				outputText("You also feel a little numb all over, in more ways than one...  ")
				dynStats("lib", -((1 + rand(2)) / 2))
				dynStats("sen", -((1 + rand(2)) / 2))
			}
			player.refillHunger(5);

			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.BodyParts.*;
	import classes.CockTypesEnum;
	import classes.GlobalFlags.kFLAGS;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;
	import classes.PerkLib;
	import classes.lists.ColorLists;

	/**
	 * Imp transformative item
	 *
	 * fucking overhauled by Foxwells who was depressed by the sorry state of imp food
	 */
	public class ImpFood extends Consumable
	{
		public function ImpFood()
		{
			super("ImpFood", "ImpFood", "a parcel of imp food", ConsumableLib.DEFAULT_VALUE, "This is a small parcel of reddish-brown bread stuffed with some kind of meat.  It smells delicious.");
		}

		override public function useItem():Boolean {
			var tfSource:String = "impFood";
			var temp:int = 0;
			mutations.initTransformation([2, 2]);
			clearOutput();
			if (player.cocks.length > 0) {
				outputText("The food tastes strange and corrupt - you can't really think of a better word for it, but it's unclean.");
				player.refillHunger(20);
				if (player.cocks[0].cockLength < 12 && changes < changeLimit) {
					temp = player.increaseCock(0, rand(2) + 2);
					outputText("\n\n");
					player.lengthChange(temp, 1);
					changes++;
				}
				outputText("\n\nInhuman vitality spreads through your body, invigorating you!\n");
				player.HPChange(30 + player.tou / 3, true);
				dynStats("lus", 3, "cor", 1);
				//Red or orange skin!
				if (rand(30) === 0 && ColorLists.IMP_SKIN.indexOf(player.skin.tone) === -1) {
					if (player.hasFur()) outputText("\n\nUnderneath your fur, your skin ");
					else outputText("\n\nYour " + player.skin.desc + " ");
					player.skin.tone = randomChoice(ColorLists.IMP_SKIN);
					outputText("begins to lose its color, fading until you're as white as an albino.  Then, starting at the crown of your head, a reddish hue rolls down your body in a wave, turning you completely " + player.skin.tone + ".");
					player.arms.updateClaws(player.arms.claws.type);
					game.rathazul.addMixologyXP(20);
				}
			}
			else {
				outputText("The food tastes... corrupt, for lack of a better word.\n");
				player.refillHunger(20);
				player.HPChange(20 + player.tou / 3, true);
				dynStats("lus", 3, "cor", 1);
			}
			//Red or orange skin!
			if (rand(5) === 0 && ColorLists.IMP_SKIN.indexOf(player.skin.tone) === -1 && changes < changeLimit) {
				if (player.hasFur()) outputText("\n\nUnderneath your fur, your skin ");
				else outputText("\n\nYour " + player.skin.desc + " ");
				player.skin.tone = randomChoice(ColorLists.IMP_SKIN);
				outputText("begins to lose its color, fading until you're as white as an albino.  Then, starting at the crown of your head, a reddish hue rolls down your body in a wave, turning you completely " + player.skin.tone + ".");
				dynStats("cor", 2);
				player.skin.type = Skin.PLAIN;
				player.arms.updateClaws(player.arms.claws.type);
				game.rathazul.addMixologyXP(20);
				changes++;
			}

			//Shrinkage!
			if (rand(2) === 0 && player.tallness > 42 && changes < changeLimit) {
				outputText("\n\nYour skin crawls, making you close your eyes and shiver.  When you open them again the world seems... different.  After a bit of investigation, you realize you've become shorter!");
				player.tallness -= 1 + rand(3);
				changes++;
			}

			//Imp wings - I just kinda robbed this from demon changes ~Foxwells
			if (rand(3) == 0 && changes < changeLimit && player.wings.type != Wings.IMP_LARGE && player.isCorruptEnough(25)) {
				//grow smalls to large
				if (player.wings.type === Wings.IMP && player.isCorruptEnough(50)) {
					outputText("\n\n");
					outputText("Your small imp wings stretch and grow, tingling with the pleasure of being attached to such a tainted body. You stretch over your shoulder to stroke them as they unfurl, turning into large imp-wings. Your imp wings have grown!");
					player.wings.type = Wings.IMP_LARGE;
				}
				else if (player.rearBody.type === RearBody.SHARK_FIN) {
					outputText("\n\n");
					outputText("The muscles around your shoulders bunch up uncomfortably, changing to support the new bat-like wings growing from your back. You twist your head as far as you can for a look and realize your fin has changed into imp-wings!");
					player.rearBody.restore();
					player.wings.type = Wings.IMP;
				}
				//No wings
				else if (player.wings.type === Wings.NONE) {
					outputText("\n\n");
					outputText("A knot of pain forms in your shoulders as they tense up.  With a surprising force, a pair of small imp wings sprout from your back, ripping a pair of holes in the back of your " + player.armorName + ".  You now have imp wings.");
					player.wings.type = Wings.IMP;
				}
				//Other wing types
				else {
					outputText("\n\n");
					outputText("The muscles around your shoulders bunch up uncomfortably, changing to support your wings as you feel their weight increasing.  You twist your head as far as you can for a look and realize they've changed into ");
					if ([Wings.BEE_LIKE_SMALL, Wings.HARPY, Wings.DRACONIC_SMALL, Wings.IMP].indexOf(player.wings.type) !== -1) {
						outputText("small ");
						player.wings.type = Wings.IMP;
					}
					else {
						outputText("large ");
						player.wings.type = Wings.IMP_LARGE;
					}
					outputText("imp-wings!");
				}
				dynStats("cor", 2);
				changes++;
			}

			//Imp tail, because that's a unique thing from what I see?
			if (player.tail.type !== Tail.IMP && changes < changeLimit && rand(3) === 0) {
				if (player.tail.type !== Tail.NONE) {
					outputText("\n\n");
					if (player.tail.type === Tail.SPIDER_ABDOMEN || player.tail.type === Tail.BEE_ABDOMEN) outputText("You feel a tingling in your insectile abdomen as it stretches, narrowing, the exoskeleton flaking off as it transforms into an imp's tail, complete with a round fluffed end. ");
					else outputText("You feel a tingling in your tail. You are amazed to discover it has shifted into an imp tail, complete with a fluffy end. ");
					outputText("Your tail is an imp tail!");
				}
				else {
					outputText("\n\nA pain builds in your backside, growing more and more pronounced. The pressure suddenly disappears with a loud ripping and tearing noise. You realize you now have an imp tail... complete with fluffed end.");
				}
				dynStats("cor", 2);
				player.tail.type = Tail.IMP;
				changes++;
			}

			//Feets, needs red/orange skin and tail
			if (["red", "orange"].indexOf(player.skin.tone) !== -1 && player.tail.type === Tail.IMP && player.lowerBody.type !== LowerBody.IMP && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nEvery muscle and sinew below your hip tingles and you begin to stagger. Seconds after you sit down, pain explodes in your " + player.feet() + ". Something hard breaks through your sole from the inside out as your " + player.feet() + " splinter and curve cruelly. The pain slowly diminishes and your eyes look along a skinny, human leg that splinters at the foot into three long claw with a smaller back one for balance. When you relax, your feet grip the ground easily. Your lower body is now that of an imp.");
				player.lowerBody.type = LowerBody.IMP;
				player.lowerBody.legCount = 2;
				dynStats("cor", 2);
				changes++;
		}

			//Imp ears, needs red/orange skin and horns
			if (player.horns.type === Horns.IMP && ["red", "orange"].indexOf(player.skin.tone) !== -1 && player.ears.type !== Ears.IMP && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nYour head suddenly pulses in pain, causing you to double over and grip at it. You feel your ears elongate and curl in slightly, ending at points not much unlike elves. These, however, jut out of the side of your head and are coned, focusing on every sound around you. A realization strikes you. Your ears are now that of an imp!");
				player.ears.type = Ears.IMP;
				dynStats("cor", 2);
				changes++;
		}

			//Horns, because why not?
			if ((player.horns.value === 0 || player.horns.type !== Horns.IMP) && changes < changeLimit && rand(2) === 0) {
				if (player.horns.value === 0) {
					outputText("\n\nA small pair of pointed imp horns erupt from your forehead. They look kind of cute. You have horns!");
				}
				else {
					outputText("\n\n");
					outputText("Your horns shift, turning into two pointed imp horns.");
				}
				player.horns.value = 2;
				player.horns.type = Horns.IMP;
				dynStats("cor", 2);
				changes++;
			}

			//Imp claws, needs orange/red skin. Also your hands turn human.
			if (["red", "orange"].indexOf(player.skin.tone) !== -1 && player.arms.claws.type !== Claws.IMP && rand(3) === 0 && changes < changeLimit) {
				if (player.arms.type !== Arms.HUMAN) {
					outputText("\n\nYour arms twist and mangle, warping back into human-like arms. But that, you realize, is just the beginning.");
				}
				if (player.arms.claws.type === Claws.NORMAL) {
					outputText("\n\nYour hands suddenly ache in pain, and all you can do is curl them up to you. Against your body, you feel them form into three long claws, with a smaller one replacing your thumb but just as versatile. You have imp claws!");
				} else { //has claws
					outputText("\n\nYour claws suddenly begin to shift and change, starting to turn back into normal hands. But just before they do, they stretch out into three long claws, with a smaller one coming to form a pointed thumb. You have imp claws!");
				}
				player.arms.setType(Arms.PREDATOR, Claws.IMP);
				dynStats("cor", 2);
				changes++;
			}

			//Changes hair to red/dark red, shortens it, sets it normal
			if (["red", "dark red"].indexOf(player.hair.color) === -1 && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nYour hair suddenly begins to shed, rapidly falling down around you before it's all completely gone. Just when you think things are over, more hair sprouts from your head, slightly curled and color different.");
				if (rand(2) !== 0) {
					player.hair.color = "red";
				} else {
					player.hair.color = "dark red";
				}
				outputText(" You now have " + player.hair.color + "");
				if (player.hair.type !== Hair.NORMAL) {
					outputText(" human");
				}
				outputText(" hair!");
				player.hair.type = Hair.NORMAL;
				player.hair.length = 1;
				changes++;
			}

			//Shrink titties
			if (player.biggestTitSize() > 0 && changes < changeLimit && rand(3) === 0 && !flags[kFLAGS.HYPER_HAPPY]) {
				var temp2:Number = 0;
				var temp3:Number = 0;
				//temp3 stores how many rows are changed
				for (var k: Number = 0; k < player.breastRows.length; k++) {
					//If this row is over threshhold
					if (player.breastRows[k].breastRating > temp2) {
						//Big change
						if (player.breastRows[k].breastRating > 10) {
							player.breastRows[k].breastRating -= 2 + rand(3);
							if (temp3 === 0) outputText("\n\nThe " + player.breastDescript(0) + " on your chest wobble for a second, then tighten up, losing several cup-sizes in the process!");
							else outputText(" The change moves down to your " + num2Text2(k + 1) + " row of " + player.breastDescript(0) + ". They shrink greatly, losing a couple cup-sizes.");
						}
						//Small change
						else {
							player.breastRows[k].breastRating -= 1;
							if (temp3 === 0) outputText("\n\nAll at once, your sense of gravity shifts. Your back feels a sense of relief, and it takes you a moment to realize your " + player.breastDescript(k) + " have shrunk!");
							else outputText(" Your " + num2Text2(k + 1) + " row of " + player.breastDescript(k) + " gives a tiny jiggle as it shrinks, losing some off its mass.");
						}
						//Increment changed rows
						temp3++;
					}
				}
				changes++;
			}

			//Remove spare titties
			if (player.bRows() > 1 && rand(3) === 0 && changes < changeLimit && !flags[kFLAGS.HYPER_HAPPY]) {
				mutations.removeExtraBreastRow(tfSource);
			}

			//Free extra nipple removal service
			if (player.averageNipplesPerBreast() > 1 && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nA strange burning sensation fills your breasts, and you look in your " + player.armorName + " to see your extra nipples are gone! You've lost your extra nipples!");
				dynStats("sen", -3);
				for(var x:int = 0; x < player.bRows(); x++)
				{
					player.breastRows[x].nipplesPerBreast = 1;
				}
				changes++;
			}

			//Neck restore
			if (player.neck.type != Neck.NORMAL && changes < changeLimit && rand(4) == 0) mutations.restoreNeck(tfSource);
			//Rear body restore
			if (player.hasNonSharkRearBody() && changes < changeLimit && rand(5) == 0) mutations.restoreRearBody(tfSource);
			//Ovi perk loss
			if (rand(5) === 0 && changes < changeLimit) {
				mutations.updateOvipositionPerk(tfSource);
			}

			//You lotta imp? Time to turn male!
			//Unless you're one of the hyper happy assholes I guess
			//For real tho doesn't seem like female imps exist? Guess they're goblins
			if (player.impScore() >= 4 && changes < changeLimit && !flags[kFLAGS.HYPER_HAPPY]) {
				if (player.bRows() > 1) {
					outputText("\n\nYou stumble back when your center of balance shifts, and though you adjust before you can fall over, you're left to watch in awe as your extra breasts shrink down, disappearing completely into your body. The nipples even fade away until they're gone completely. You've lost your extra breasts due to being an imp!");
					player.breastRows.length = 1;
				}
				if (player.biggestTitSize() > 0) {
					outputText("\n\nAll at once, your sense of gravity shifts. Your back feels a sense of relief, and it takes you a moment to realize your breasts have gone flat! You've lost your breasts due to being an imp!");
					player.breastRows[0].breastRating = 0;
				}
				if (player.averageNipplesPerBreast() > 1) {
					outputText("\n\nA strange burning sensation fills your breasts, and you look in your " + player.armorName + " to see your extra nipples are gone! You've lost your extra nipples due to being an imp!");
					for(var z:int = 0; z < player.bRows(); z++)
					{
						player.breastRows[z].nipplesPerBreast = 1;
					}
				}
				if (player.nippleLength > 0.25) {
					outputText("\n\nA strange burning sensation fills you, and you look in your " + player.armorName + " to see your nipples have shrunk! Your nipples have shrunk due to being an imp!");
					player.nippleLength = 0.25;
				}
				if (player.hasVagina()) {
					outputText("\n\nA sudden pain in your groin brings you to your knees. You move your armor out of the way and watch as your cunt seals up, vanishing from your body entirely. Your cunt has gone away due to being an imp!");
					player.removeVagina();
				}
				if (!player.hasCock()) {
					outputText("\n\nPressure builds between your legs, and you barely get your armor off in time to watch a cock grow out of you. You've grown a cock due to being an imp!");
					player.createCock();
					player.cocks[0].cockLength = 12;
					player.cocks[0].cockThickness = 2;
					player.cocks[0].cockType = CockTypesEnum.HUMAN;
				}
				if (player.balls === 0) {
					outputText("\n\nA strange, unpleasant pressure forms between your thighs. You take off your armor and see that you've grown balls. You've grown balls due to being an imp!");
					player.balls = 2;
					player.ballSize = 2;
				}
				changes++;
				dynStats("cor", 20);
			}
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;
			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.BodyParts.*;
	import classes.CockTypesEnum;
	import classes.GlobalFlags.*;
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;
	import classes.PerkLib;

	/**
	 * @since March 31, 2018
	 * @author Stadler76
	 */
	public class IncubiDraft extends Consumable
	{
		public static const TAINTED:int  = 0;
		public static const PURIFIED:int = 1;

		private var tainted:Boolean;

		public function IncubiDraft(type:int)
		{
			var id:String;
			var shortName:String;
			var longName:String;
			var description:String;
			var value:int;

			tainted = type === TAINTED;

			switch (type) {
				case TAINTED:
					id = "IncubiD";
					shortName = "IncubiD";
					longName = "an Incubi draft";
					description = "The cork-topped flask swishes with a slimy looking off-white fluid, purported to give incubi-like powers."
					             +" A stylized picture of a humanoid with a huge penis is etched into the glass.";
					value = ConsumableLib.DEFAULT_VALUE;
					break;

				case PURIFIED:
					id = "P.Draft";
					shortName = "P.Draft";
					longName = "an untainted Incubi draft";
					description = "The cork-topped flask swishes with a slimy looking off-white fluid, purported to give incubi-like powers."
					             +" A stylized picture of a humanoid with a huge penis is etched into the glass."
					             +" Rathazul has purified this to prevent corruption upon use.";
					value = 20;
					break;

				default: // Remove this if someone manages to get SonarQQbe to not whine about a missing default ... ~Stadler76
			}

			super(id, shortName, longName, value, description);
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "incubiDraft";
			if (!tainted) tfSource += "-purified";
			var temp:int;
			player.slimeFeed();
			var temp2:Number = 0;
			var temp3:Number = 0;
			var rando:Number = rand(100);
			if (player.isAlchemist()) rando += 10;
			if (player.isTFResistant()) rando -= 10;
			clearOutput();
			outputText("The draft is slick and sticky, ");
			if (player.cor <= 33) outputText("just swallowing it makes you feel unclean.");
			if (player.cor > 33 && player.cor <= 66) outputText("reminding you of something you just can't place.");
			if (player.cor > 66) outputText("deliciously sinful in all the right ways.");
			if (player.cor >= 90) outputText("  You're sure it must be distilled from the cum of an incubus.");
			//Lowlevel changes
			if (rando < 50) {
				if (player.cocks.length == 1) {
					if (player.cocks[0].cockType !== CockTypesEnum.DEMON) outputText("\n\nYour " + player.cockDescript(0) + " becomes shockingly hard.  It turns a shiny inhuman purple and spasms, dribbling hot demon-like cum as it begins to grow.");
					else outputText("\n\nYour " + player.cockDescript(0) + " becomes shockingly hard.  It dribbles hot demon-like cum as it begins to grow.");
					if (rand(4) === 0) temp = player.increaseCock(0, 3);
					else temp = player.increaseCock(0, 1);
					if (temp < .5) outputText("  It stops almost as soon as it starts, growing only a tiny bit longer.");
					if (temp >= .5 && temp < 1) outputText("  It grows slowly, stopping after roughly half an inch of growth.");
					if (temp >= 1 && temp <= 2) outputText("  The sensation is incredible as more than an inch of lengthened dick-flesh grows in.");
					if (temp > 2) outputText("  You smile and idly stroke your lengthening " + player.cockDescript(0) + " as a few more inches sprout.");
					if (tainted) dynStats("int", 1, "lib", 2, "sen", 1, "lus", 5 + temp * 3, "cor", 1);
					else dynStats("int", 1, "lib", 2, "sen", 1, "lus", 5 + temp * 3);
					if (player.cocks[0].cockType !== CockTypesEnum.DEMON) outputText("  With the transformation complete, your " + player.cockDescript(0) + " returns to its normal coloration.");
					else outputText("  With the transformation complete, your " + player.cockDescript(0) + " throbs in an almost happy way as it goes flaccid once more.");
				}
				if (player.cocks.length > 1) {
					temp = player.cocks.length;
					temp2 = 0;
					//Find shortest cock
					while (temp > 0) {
						temp--;
						if (player.cocks[temp].cockLength <= player.cocks[temp2].cockLength) {
							temp2 = temp;
						}
					}
					if (rand(4) === 0) temp3 = player.increaseCock(temp2, 3);
					else temp3 = player.increaseCock(temp2, 1);
					if (tainted) dynStats("int", 1, "lib", 2, "sen", 1, "lus", 5 + temp * 3, "cor", 1);
					else dynStats("int", 1, "lib", 2, "sen", 1, "lus", 5 + temp * 3);
					//Grammar police for 2 cocks
					if (player.cockTotal() == 2) outputText("\n\nBoth of your " + player.multiCockDescriptLight() + " become shockingly hard, swollen and twitching as they turn a shiny inhuman purple in color.  They spasm, dripping thick ropes of hot demon-like pre-cum along their lengths as your shortest " + player.cockDescript(temp2) + " begins to grow.");
					//For more than 2
					else outputText("\n\nAll of your " + player.multiCockDescriptLight() + " become shockingly hard, swollen and twitching as they turn a shiny inhuman purple in color.  They spasm, dripping thick ropes of hot demon-like pre-cum along their lengths as your shortest " + player.cockDescript(temp2) + " begins to grow.");

					if (temp3 < .5) outputText("  It stops almost as soon as it starts, growing only a tiny bit longer.");
					if (temp3 >= .5 && temp3 < 1) outputText("  It grows slowly, stopping after roughly half an inch of growth.");
					if (temp3 >= 1 && temp3 <= 2) outputText("  The sensation is incredible as more than an inch of lengthened dick-flesh grows in.");
					if (temp3 > 2) outputText("  You smile and idly stroke your lengthening " + player.cockDescript(temp2) + " as a few more inches sprout.");
					outputText("  With the transformation complete, your " + player.multiCockDescriptLight() + " return to their normal coloration.");
				}
				//NO CAWKS?
				if (player.cocks.length == 0) {
					outputText("\n\n");
					mutations.growDemonCock(1);
					if (tainted) dynStats("lib", 3, "sen", 5, "lus", 10, "cor", 3);
					else dynStats("lib", 3, "sen", 5, "lus", 10);
				}
				//TIT CHANGE 25% chance of shrinkage
				if (rand(4) === 0 && !flags[kFLAGS.HYPER_HAPPY])
				{
					player.shrinkTits();
				}
			}
			//Mid-level changes
			if (rando >= 50 && rando < 93) {
				if (player.cocks.length > 1) {
					outputText("\n\nYour cocks fill to full-size... and begin growing obscenely.  ");
					temp = player.cocks.length;
					while (temp > 0) {
						temp--;
						temp2 = player.increaseCock(temp, rand(3) + 2);
						temp3 = player.cocks[temp].thickenCock(1);
						if (temp3 < .1) player.cocks[temp].thickenCock(.05);
					}
					player.lengthChange(temp2, player.cocks.length);
					//Display the degree of thickness change.
					if (temp3 >= 1) {
						if (player.cocks.length == 1) outputText("\n\nYour cock spreads rapidly, swelling an inch or more in girth, making it feel fat and floppy.");
						else outputText("\n\nYour cocks spread rapidly, swelling as they grow an inch or more in girth, making them feel fat and floppy.");
					}
					if (temp3 <= .5) {
						if (player.cocks.length > 1) outputText("\n\nYour cocks feel swollen and heavy. With a firm, but gentle, squeeze, you confirm your suspicions. They are definitely thicker.");
						else outputText("\n\nYour cock feels swollen and heavy. With a firm, but gentle, squeeze, you confirm your suspicions. It is definitely thicker.");
					}
					if (temp3 > .5 && temp2 < 1) {
						if (player.cocks.length == 1) outputText("\n\nYour cock seems to swell up, feeling heavier. You look down and watch it growing fatter as it thickens.");
						if (player.cocks.length > 1) outputText("\n\nYour cocks seem to swell up, feeling heavier. You look down and watch them growing fatter as they thicken.");
					}
					if (tainted) dynStats("lib", 3, "sen", 5, "lus", 10, "cor", 3);
					else dynStats("lib", 3, "sen", 5, "lus", 10);
				}
				if (player.cocks.length == 1) {
					outputText("\n\nYour cock fills to its normal size and begins growing... ");
					temp3 = player.cocks[0].thickenCock(1);
					temp2 = player.increaseCock(0, rand(3) + 2);
					player.lengthChange(temp2, 1);
					//Display the degree of thickness change.
					if (temp3 >= 1) {
						if (player.cocks.length == 1) outputText("  Your cock spreads rapidly, swelling an inch or more in girth, making it feel fat and floppy.");
						else outputText("  Your cocks spread rapidly, swelling as they grow an inch or more in girth, making them feel fat and floppy.");
					}
					if (temp3 <= .5) {
						if (player.cocks.length > 1) outputText("  Your cocks feel swollen and heavy. With a firm, but gentle, squeeze, you confirm your suspicions. They are definitely thicker.");
						else outputText("  Your cock feels swollen and heavy. With a firm, but gentle, squeeze, you confirm your suspicions. It is definitely thicker.");
					}
					if (temp3 > .5 && temp2 < 1) {
						if (player.cocks.length == 1) outputText("  Your cock seems to swell up, feeling heavier. You look down and watch it growing fatter as it thickens.");
						if (player.cocks.length > 1) outputText("  Your cocks seem to swell up, feeling heavier. You look down and watch them growing fatter as they thicken.");
					}
					if (tainted) dynStats("lib", 3, "sen", 5, "lus", 10, "cor", 3);
					else dynStats("lib", 3, "sen", 5, "lus", 10);
				}
				if (player.cocks.length == 0) {
					outputText("\n\n");
					mutations.growDemonCock(1);
					if (tainted) dynStats("lib", 3, "sen", 5, "lus", 10, "cor", 3);
					else dynStats("lib", 3, "sen", 5, "lus", 10);
				}
				//Shrink breasts a more
				//TIT CHANGE 50% chance of shrinkage
				if (rand(2) === 0 && !flags[kFLAGS.HYPER_HAPPY])
				{
					player.shrinkTits();
				}
			}
			//High level change
			if (rando >= 93) {
				if (player.cockTotal() < 10) {
					if (rand(10) < int(player.cor / 25)) {
						outputText("\n\n");
						mutations.growDemonCock(rand(2) + 2);
						if (tainted) dynStats("lib", 3, "sen", 5, "lus", 10, "cor", 5);
						else dynStats("lib", 3, "sen", 5, "lus", 10);
					}
					else {
						mutations.growDemonCock(1);
					}
					if (tainted) dynStats("lib", 3, "sen", 5, "lus", 10, "cor", 3);
					else dynStats("lib", 3, "sen", 5, "lus", 10);
				}
				if (!flags[kFLAGS.HYPER_HAPPY])
				{
					player.shrinkTits();
					player.shrinkTits();
				}
			}
			//Neck restore
			if (player.neck.type !== Neck.NORMAL && changes < changeLimit && rand(4) === 0) {
				mutations.restoreNeck(tfSource);
			}
			//Rear body restore
			if (player.hasNonSharkRearBody() && changes < changeLimit && rand(5) === 0) {
				mutations.restoreRearBody(tfSource);
			}
			//Ovi perk loss
			if (rand(5) === 0) {
				mutations.updateOvipositionPerk(tfSource);
			}
			//Demonic changes - higher chance with higher corruption.
			if (rand(40) + player.cor / 3 > 35 && tainted) {
				mutations.demonChanges(tfSource);
			}
			if (rand(4) === 0 && tainted) outputText(player.modFem(5, 2));
			if (rand(4) === 0 && tainted) outputText(player.modThickness(30, 2));
			player.refillHunger(10);
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;

	/**
	 * Natural energy drink?
	 */
	public class IsabellaMilk extends Consumable
	{
		public function IsabellaMilk()
		{
			super("IzyMilk","IzyMilk", "a bottle of Isabella's milk", ConsumableLib.DEFAULT_VALUE, "This is a bottle of Isabella's milk.  Isabella seems fairly certain it will invigorate you.");
		}

		override public function useItem():Boolean
		{
			player.slimeFeed();
			clearOutput();
			outputText("You swallow down the bottle of Isabella's milk.");
			if (player.fatigue > 0) outputText("  You feel much less tired! (-33 fatigue)");
			player.changeFatigue(-33);
			player.refillHunger(20);

			return false;
		}
	}
}


code:
package classes.Items.Consumables
{
	import classes.BodyParts.*;
	import classes.CockTypesEnum;
	import classes.GlobalFlags.*;
	import classes.Items.Consumable;
	import classes.Items.ConsumableLib;
	import classes.PerkLib;

	/**
	 * @since March 26, 2018
	 * @author Stadler76
	 */
	public class KangaFruit extends Consumable
	{
		public static const STANDARD:int = 0;
		public static const ENHANCED:int = 1;

		private var type:int;

		public function KangaFruit(_type:int)
		{
			var id:String;
			var shortName:String;
			var longName:String;
			var description:String;
			var value:int;

			type = _type;

			switch (type) {
				case STANDARD:
					id = "KangaFt";
					shortName = "KangaFruit";
					longName = "a piece of kanga fruit";
					description = "A yellow, fibrous, tubular pod. A split in the end reveals many lumpy, small seeds inside."
					             +" The smell of mild fermentation wafts from them.";
					value = ConsumableLib.DEFAULT_VALUE;
					break;

				case ENHANCED:
					id = "MghtyVg";
					shortName = "MghtyVg";
					longName = "a mightily enhanced piece of kanga fruit";
					description = "A yellow, fibrous, tubular pod.  A split in the end reveals many lumpy, small seeds inside."
					             +" The smell of mild fermentation wafts from them. It glows slightly from Lumi's enhancements.";
					value = ConsumableLib.DEFAULT_VALUE;
					break;

				default: // Remove this if someone manages to get SonarQQbe to not whine about a missing default ... ~Stadler76
			}

			super(id, shortName, longName, value, description);
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "kangaFruit";
			mutations.initTransformation([2, 2], type === ENHANCED ? 3 : 1);
			clearOutput();
			outputText("You squeeze the pod around the middle, forcing the end open.  Scooping out a handful of the yeasty-smelling seeds, you shovel them in your mouth.  Blech!  Tastes like soggy burnt bread... and yet, you find yourself going for another handful...");
			//Used as a holding variable for biggest dicks and the like
			var biggestCock:Number;
			//****************
			//General Effects:
			//****************
			//-Int less than 10
			if (player.inte < 10 && !player.isTFResistant()) {
				if (player.inte < 8 && player.kangaScore() >= 5) {
					outputText("\n\nWhile you gnaw on the fibrous fruit, your already vacant mind continues to empty, leaving nothing behind but the motion of your jaw as you slowly chew and swallow your favorite food.  Swallow.  Chew.  Swallow.  You don't even notice your posture worsening or your arms shortening.  Without a single thought, you start to hunch over but keep munching on the food in your paws as if were the most normal thing in the world.  Teeth sink into one of your fingers, leaving you to yelp in pain.  With the last of your senses, you look at your throbbing paw to notice you've run out of kanga fruit!");
					outputText("\n\nStill hungry and licking your lips in anticipation, you sniff in deep lungfuls of air.  There's more of that wonderful fruit nearby!  You bound off in search of it on your incredibly muscular legs, their shape becoming more and more feral with every hop.  Now guided completely by instinct, you find a few stalks that grow from the ground.  Your belly rumbles, reminding you of your hunger, as you begin to dig into the kanga fruits...");
					outputText("\n\nLosing more of what little remains of yourself, your body is now entirely that of a feral kangaroo and your mind has devolved to match it.  After you finish the handful of fruits you found, you move on in search for more of the tasty treats.  Though you pass by your camp later on, there's no memory, no recognition, just a slight feeling of comfort and familiarity.  There's no food here so you hop away.");
					//[GAME OVER]
					game.gameOver();
					return false;
				}
				outputText("\n\nWhile chewing, your mind becomes more and more tranquil.  You find it hard to even remember your mission, let alone your name.  Maybe more kanga fruits will help?");
			}
			//-Speed to 70
			if (player.spe100 < 70 && rand(3) === 0) {
				//2 points up if below 40!
				if (player.spe100 < 40) dynStats("spe", 1);
				dynStats("spe", 1);
				outputText("\n\nYour legs fill with energy as you eat the kanga fruit.  You feel like you could set a long-jump record!  You give a few experimental bounds, both standing and running, with your newfound vigor.  Your stride seems longer too; you even catch a bit of air as you push off with every powerful step.");
			}
			//-Int to 10
			if (player.inte > 2 && rand(3) === 0 && changes < changeLimit) {
				//Gain dumb (smart!)
				if (player.inte > 30) outputText("\n\nYou feel... antsy. You momentarily forget your other concerns as you look around you, trying to decide which direction you'd be most likely to find more food in.  You're about to set out on the search when your mind refocuses and you realize you already have some stored at camp.");
				//gain dumb (30-10 int):
				else if (player.inte > 10) outputText("\n\nYour mind wanders as you eat; you think of what it would be like to run forever, bounding across the wastes of Mareth in the simple joy of movement.  You bring the kanga fruit to your mouth one last time, only to realize there's nothing edible left on it.  The thought brings you back to yourself with a start.");
				//gain dumb (10-1 int):
				else outputText("\n\nYou lose track of everything as you eat, staring at the bugs crawling across the ground.  After a while you notice the dull taste of saliva in your mouth and realize you've been sitting there, chewing the same mouthful for five minutes.  You vacantly swallow and take another bite, then go back to staring at the ground.  Was there anything else to do today?");
				dynStats("int", -1);
			}
			//****************
			//Appearance Effects:
			//****************
			//-Hip widening funtimes
			if (changes < changeLimit && rand(4) === 0 && player.hips.rating < 40) {
				outputText("\n\nYou weeble and wobble as your hipbones broaden noticeably, but somehow you don't fall down.  Actually, you feel a bit MORE stable on your new widened stance, if anything.");
				player.hips.rating++;
				changes++;
			}
			//-Restore arms to become human arms again
			if (rand(4) === 0) mutations.restoreArms(tfSource);
			//-Remove feathery hair
			mutations.removeFeatheryHair();
			//Remove odd eyes
			if (changes < changeLimit && rand(5) === 0 && player.eyes.type > Eyes.HUMAN) {
				if (player.eyes.type == Eyes.BLACK_EYES_SAND_TRAP) {
					outputText("\n\nYou feel a twinge in your eyes and you blink.  It feels like black cataracts have just fallen away from you, and you know without needing to see your reflection that your eyes have gone back to looking human.");
				}
				else {
					outputText("\n\nYou blink and stumble, a wave of vertigo threatening to pull your " + player.feet() + " from under you.  As you steady and open your eyes, you realize something seems different.  Your vision is changed somehow.");
					if (player.eyes.type == Eyes.FOUR_SPIDER_EYES || player.eyes.type == Eyes.SPIDER) outputText("  Your arachnid eyes are gone!");
					outputText("  You have normal, humanoid eyes again.");
				}
				player.eyes.type = Eyes.HUMAN;
				player.eyes.count = 2;
				changes++;
			}
			//****************
			//Sexual:
			//****************
			//-Shrink balls down to reasonable size (3?)
			if (player.ballSize >= 4 && changes < changeLimit && rand(2) === 0) {
				player.ballSize--;
				player.cumMultiplier++;
				outputText("\n\nYour " + player.sackDescript() + " pulls tight against your groin, vibrating slightly as it changes.  Once it finishes, you give your " + player.ballsDescriptLight() + " a gentle squeeze and discover they've shrunk.  Even with the reduced volume, they feel just as heavy.");
				changes++;
			}
			//-Shorten clits to reasonable size
			if (player.hasVagina() && player.getClitLength() >= 4 && changes < changeLimit && rand(5) === 0) {
				outputText("\n\nPainful pricks work through your " + player.clitDescript() + ", all the way into its swollen clitoral sheath.  Gods, it feels afire with pain!  Agony runs up and down its length, and by the time the pain finally fades, the feminine organ has lost half its size.");
				player.setClitLength(player.getClitLength() / 2);
				changes++;
			}
			//Find biggest dick!
			biggestCock = player.biggestCockIndex();
			//-Shrink dicks down to 8\" max.
			if (player.hasCock()) {
				if (player.cocks[biggestCock].cockLength >= 16 && changes < changeLimit && rand(5) === 0) {
					outputText("\n\nA roiling inferno of heat blazes in your " + player.cockDescript(biggestCock) + ", doubling you over in the dirt.  You rock back and forth while tears run unchecked down your cheeks.  Once the pain subsides and you're able to move again, you find the poor member has lost nearly half its size.");
					player.cocks[biggestCock].cockLength /= 2;
					player.cocks[biggestCock].cockThickness /= 1.5;
					if (player.cocks[biggestCock].cockThickness * 6 > player.cocks[biggestCock].cockLength) player.cocks[biggestCock].cockThickness -= .2;
					if (player.cocks[biggestCock].cockThickness * 8 > player.cocks[biggestCock].cockLength) player.cocks[biggestCock].cockThickness -= .2;
					if (player.cocks[biggestCock].cockThickness < .5) player.cocks[biggestCock].cockThickness = .5;
					changes++;
				}
				//COCK TF!
				if (player.countCocksOfType(CockTypesEnum.KANGAROO) < player.cockTotal() && (type === ENHANCED && rand(2) === 0) && changes < changeLimit) {
					outputText("\n\nYou feel a sharp pinch at the end of your penis and whip down your clothes to check.  Before your eyes, the tip of it collapses into a narrow point and the shaft begins to tighten behind it, assuming a conical shape before it retracts into ");
					if (player.hasSheath()) outputText("your sheath");
					else outputText("a sheath that forms at the base of it");
					outputText(".  You now have a kangaroo-penis!");
					var cockIdx:int = 0;
					//Find first non-roocock!
					while (cockIdx < player.cockTotal()) {
						if (player.cocks[cockIdx].cockType !== CockTypesEnum.KANGAROO) {
							player.cocks[cockIdx].cockType = CockTypesEnum.KANGAROO;
							break;
						}
						cockIdx++;
					}
					changes++;
				}
			}
			//Neck restore
			if (player.neck.type !== Neck.NORMAL && changes < changeLimit && rand(4) === 0) {
				mutations.restoreNeck(tfSource);
			}
			//Rear body restore
			if (player.hasNonSharkRearBody() && changes < changeLimit && rand(5) === 0) {
				mutations.restoreRearBody(tfSource);
			}
			//Ovi perk loss
			if (rand(5) === 0) {
				mutations.updateOvipositionPerk(tfSource);
			}
			//****************
			//Big Kanga Morphs
			//type 1 ignores normal restrictions
			//****************
			//-Face (Req: Fur + Feet)
			if (mutations.tfNoFur() && player.face.type !== Face.KANGAROO && ((player.hasFur() && player.lowerBody.type == LowerBody.KANGAROO) || type === ENHANCED) && changes < changeLimit && rand(4) === 0) {
				//gain roo face from human/naga/shark/bun:
				if (player.face.type == Face.HUMAN || player.face.type == Face.SNAKE_FANGS || player.face.type == Face.SHARK_TEETH || player.face.type == Face.BUNNY) outputText("\n\nThe base of your nose suddenly hurts, as though someone were pinching and pulling at it.  As you shut your eyes against the pain and bring your hands to your face, you can feel your nose and palate shifting and elongating.  This continues for about twenty seconds as you stand there, quaking.  When the pain subsides, you run your hands all over your face; what you feel is a long muzzle sticking out, whiskered at the end and with a cleft lip under a pair of flat nostrils.  You open your eyes and receive confirmation. You now have a kangaroo face!  Crikey!");
				//gain roo face from other snout:
				else outputText("\n\nYour nose tingles. As you focus your eyes toward the end of it, it twitches and shifts into a muzzle similar to a stretched-out rabbit's, complete with harelip and whiskers.  You now have a kangaroo face!");
				changes++;
				player.face.type = Face.KANGAROO;
			}
			//-Fur (Req: Footsies)
			if (mutations.tfNoFur() && !player.hasFur() && (player.lowerBody.type == LowerBody.KANGAROO || type === ENHANCED) && changes < changeLimit && rand(4) === 0) {
				changes++;
				outputText("\n\nYour " + player.skin.desc + " itches terribly all over and you try cartoonishly to scratch everywhere at once.  ");
				player.skin.type = Skin.FUR;
				player.skin.desc = "fur";
				player.skin.furColor = "brown";
				player.underBody.restore(); // Restore the underbody for now
				outputText("As you pull your hands in, you notice " + player.skin.furColor + " fur growing on the backs of them.  All over your body the scene is repeated, covering you in the stuff.  You now have fur!");
			}
			//-Roo footsies (Req: Tail)
			if (player.lowerBody.type !== LowerBody.KANGAROO && (type === ENHANCED || player.tail.type == Tail.KANGAROO) && changes < changeLimit && rand(4) === 0) {
				//gain roo feet from centaur:
				if (player.isTaur()) outputText("\n\nYour backlegs suddenly wobble and collapse, causing you to pitch over onto your side.  Try as you might, you can't get them to stop spasming so you can stand back up; you thrash your hooves wildly as a pins-and-needles sensation overtakes your lower body.  A dull throbbing along your spine makes you moan in agony; it's as though someone had set an entire bookshelf on your shoulders and your spine were being compressed far beyond its limit.  After a minute of pain, the pressure evaporates and you look down at your legs.  Not only are your backlegs gone, but your forelegs have taken on a dogleg shape, with extremely long feet bearing a prominent middle toe!  You set about rubbing the feeling back into your legs and trying to move the new feet.  You now have kangaroo legs!");
				//gain roo feet from naga:
				else if (player.lowerBody.type == LowerBody.NAGA) outputText("\n\nYour tail quivers, then shakes violently, planting you on your face.  As you try to bend around to look at it, you can just see the tip shrinking out of your field of vision from the corner of your eye.  The scaly skin below your waist tightens intolerably, then splits; you wriggle out of it, only to find yourself with a pair of long legs instead!  A bit of hair starts to grow in as you stand up unsteadily on your new, elongated feet.  You now have kangaroo legs!  Now, what are you going to do with a giant shed snakeskin?");
				//gain roo feet from slime:
				else if (player.lowerBody.type == LowerBody.GOO) outputText("\n\nYour mounds of goo shrink and part involuntarily, exposing your crotch.  Modesty overwhelms you and you try to pull them together, but the shrinkage is continuing faster than you can shift your gooey body around.  Before long you've run out of goo to move, and your lower body now ends in a pair of slippery digitigrade legs with long narrow feet.  They dry in the air and a bit of fur begins to sprout as you look for something to cover up with.  You now have kangaroo legs! You sigh.  Guess this means it's back to wearing underpants again.");
				//gain roo feet from human/bee/demon/paw/lizard:
				else outputText("\n\nYour feet begin to crack and shift as the metatarsal bones lengthen.  Your knees buckle from the pain of your bones rearranging themselves, and you fall over.  After fifteen seconds of what feels like your feet being racked, the sensation stops.  You look down at your legs; they've taken a roughly dog-leg shape, but they have extremely long feet with a prominent middle toe!  As you stand up you find that you're equally comfortable standing flat on your feet as you are on the balls of them!  You now have kangaroo legs!");
				player.lowerBody.type = LowerBody.KANGAROO;
				player.lowerBody.legCount = 2;
				changes++;
			}
			//-Roo tail (Req: Ears)
			if (player.tail.type !== Tail.KANGAROO && changes < changeLimit && rand(4) === 0 && (type === ENHANCED || player.ears.type == Ears.KANGAROO)) {
				//gain roo tail:
				if (player.tail.type == Tail.NONE) outputText("\n\nA painful pressure in your lower body causes you to stand straight and lock up.  At first you think it might be gas.  No... something is growing at the end of your tailbone.  As you hold stock still so as not to exacerbate the pain, something thick pushes out from the rear of your garments.  The pain subsides and you crane your neck around to look; a long, tapered tail is now attached to your butt and a thin coat of fur is already growing in!  You now have a kangaroo tail!");
				//gain roo tail from bee tail:
				else if (player.tail.type == Tail.SPIDER_ABDOMEN || player.tail.type == Tail.BEE_ABDOMEN) {
					outputText("\n\nYour chitinous backside shakes and cracks once you finish eating.  Peering at it as best you can, it appears as though the fuzz is falling out in clumps and the chitin is flaking off.  As convulsions begin to wrack your body and force you to collapse, the ");
					if (player.tail.type == Tail.BEE_ABDOMEN) outputText("hollow stinger drops out of the end, taking the venom organ with it.");
					else outputText("spinnerets drop out of the end, taking the last of your webbing with it.");
					outputText("  By the time you're back to yourself, the insectile carapace has fallen off completely, leaving you with a long, thick, fleshy tail in place of your proud, insectile abdomen.  You now have a kangaroo tail!  You wipe the errant spittle from your mouth as you idly bob your new tail about.");
				}
				//gain roo tail from other tail:
				else {
					outputText("\n\nYour tail twitches as you eat.  It begins to feel fat and swollen, and you try to look at your own butt as best you can.  What you see matches what you feel as your tail thickens and stretches out into a long cone shape.  You now have a kangaroo tail!");
				}
				player.tail.type = Tail.KANGAROO;
				changes++;
			}
			//-Roo ears
			if (player.ears.type !== Ears.KANGAROO && changes < changeLimit && rand(4) === 0) {
				//Bunbun ears get special texts!
				if (player.ears.type == Ears.BUNNY) outputText("\n\nYour ears stiffen and shift to the sides!  You reach up and find them pointed outwards instead of up and down; they feel a bit wider now as well.  As you touch them, you can feel them swiveling in place in response to nearby sounds.  You now have a pair of kangaroo ears!");
				//Everybody else?  Yeah lazy.
				else outputText("\n\nYour ears twist painfully as though being yanked upwards and you clap your hands to your head.  Feeling them out, you discover them growing!  They stretch upwards, reaching past your fingertips, and then the tugging stops.  You cautiously feel along their lengths; they're long and stiff, but pointed outwards now, and they swivel around as you listen.  You now have a pair of kangaroo ears!");
				changes++;
				player.ears.type = Ears.KANGAROO;
			}
			//UBEROOOO
			//kangaroo perk: - any liquid or food intake will accelerate a pregnancy, but it will not progress otherwise
			if (player.findPerk(PerkLib.Diapause) < 0 && player.kangaScore() > 4 && rand(4) === 0 && changes < changeLimit && player.hasVagina()) {
				//Perk name and description:
				player.createPerk(PerkLib.Diapause, 0, 0, 0, 0);
				outputText("\n\nYour womb rumbles as something inside it changes.\n(You have gained the Diapause perk.  Pregnancies will not progress when fluid intake is scarce, and will progress much faster when it isn't.)");
				changes++;
				//trigger effect: Your body reacts to the influx of nutrition, accelerating your pregnancy. Your belly bulges outward slightly.
			}
			// Remove gills
			if (rand(4) === 0 && player.hasGills() && changes < changeLimit) {
				mutations.updateGills();
			}
			if (changes == 0) {
				outputText("\n\nIt did not seem to have any effects, but you do feel better rested.");
				player.changeFatigue(-40);
			}
			player.refillHunger(20);
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}