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

	/**
	 * @since  March 27, 2018
	 * @author Stadler76
	 */
	public class RhinoSteak extends Consumable
	{
		public function RhinoSteak()
		{
			super(
				"RhinoSt",
				"RhinoSt",
				"a rhino steak",
				ConsumableLib.DEFAULT_VALUE,
				"Despite the name, it doesn't come from any rhinoceros or a rhino-morph. We can guarantee you that no rhinoceros were harmed in the"+
				" production of this food.\n\nDISCLAIMER: We are not responsible if you find yourself altered."
			);
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "rhinoTFs";
			var temp:int;
			mutations.initTransformation(null, 3);
			player.refillHunger(40);
			// Stats Changes
			//------------
			if (rand(3) == 0 && player.str100 < 100) {
				if (player.str100 < 50) {
					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.");
					dynStats("str", .5);
				}
				else {
					outputText("\n\nHeat builds in your muscles, their already-potent mass shifting slightly as they gain even more strength.");
				}
				dynStats("str", .5);
			}
			if (rand(3) == 0 && player.tou100 < 100) {
				outputText("\n\nYou thump your chest and grin - your foes will have a harder time taking you down while you're fortified by liquid courage.");
				dynStats("tou", 1);
			}
			if (rand(2) == 0 && player.spe100 > 80 && player.str100 >= 50) {
				outputText("\n\nYou begin to feel that the size of your muscles is starting to slow you down.");
				dynStats("spe", -1);
			}
			if (rand(3) == 0 && player.tou100 < 50 && changes < changeLimit) {
				outputText("\n\nYour skin feels clammy and a little rubbery. You touch yourself experimentally and notice that you can barely feel the pressure from your fingertips. Consumed with curiosity, you punch yourself lightly in the arm; the most you feel is a dull throb!");
				dynStats("sen", -1);
			}
			if (rand(3) == 0 && player.inte > 15 && player.face.type == Face.RHINO && player.horns.value == 2) {
				outputText("\n\nYou shake your head and struggle to gather your thoughts, feeling a bit slow.");
				dynStats("int", -1);
			}
			if (rand(3) == 0 && player.rhinoScore() >= 2 && (rand(2) == 0 || !player.inRut) && player.hasCock()) {
				player.goIntoRut(true);
			}
			//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);
			// Special TFs
			//------------
			if (rand(4) == 0 && changes < changeLimit && player.horns.type != Horns.UNICORN && player.ears.type == Ears.HORSE && (player.lowerBody.type == LowerBody.HOOFED || player.lowerBody.type == LowerBody.CLOVEN_HOOFED || player.horseScore() >= 3)) {
				outputText("\n\nYou begin to feel an annoying tingling sensation at the top of your head. Reaching up to inspect it you find the sharp nub of a horn protruding from the center of your forehead and growing. Once it's complete you estimate it to be about six inches long.");
				player.horns.type = Horns.UNICORN;
				player.horns.value = 6;
				changes++;
			}
			if (rand(4) == 0 && changes < changeLimit && player.horns.type == Horns.UNICORN && player.horns.value > 0 && player.horns.value < 12) {
				outputText("\n\nYou begin to feel an intense pinching sensation in your central horn as it pushes out, growing longer and larger. You reach up and find it has developed its own cute little spiral, you estimate it to be about a foot long, two inches thick and very sturdy, a very useful natural weapon.");
				player.horns.value = 12;
				changes++;
			}
			// Normal TFs
			//------------
			//Removes wings
			if (rand(4) == 0 && changes < changeLimit && (player.wings.type != Wings.NONE || player.rearBody.type == RearBody.SHARK_FIN)) {
				if (player.rearBody.type == RearBody.SHARK_FIN) {
					outputText("\n\nA wave of tightness spreads through your back, and it feels as if someone is stabbing a dagger into your spine."
					          +" After a moment the pain passes, though your fin is gone!");
					player.rearBody.restore();
				} else {
					outputText("\n\nA wave of tightness spreads through your back, and it feels as if someone is stabbing a dagger into each of your"
					          +" shoulder-blades. After a moment the pain passes, though your wings are gone!");
				}
				player.wings.restore();
				changes++;
			}
			//Fur/scales fall out
			if (rand(4) == 0 && changes < changeLimit && (!player.hasPlainSkin() || player.skin.tone != "gray" || player.skin.adj != "tough")) {
				outputText("\n\n");
				switch(player.skin.type) {
					case Skin.PLAIN:
						outputText("You feel an itchy sensation as your skin thickens, becoming tough gray skin.");
						break;
					case Skin.FUR:
						outputText("You feel an itching sensation as your fur beings to fall off in clumps, revealing tough gray skin beneath it.");
						break;
					case Skin.LIZARD_SCALES:
					case Skin.DRAGON_SCALES:
					case Skin.FISH_SCALES:
						outputText("You feel an odd rolling sensation as your scales begin to shift, spreading and reforming as they grow and disappear, becoming tough gray skin.");
						break;
					case Skin.GOO:
						outputText("You feel an itchy sensation as your gooey skin solidifies and thickens, becoming tough gray skin.");
						break;
					default:
						outputText("You feel an itchy sensation as your skin thickens, becoming tough gray skin.");
				}
				player.skin.tone = "gray";
				player.skin.adj = "tough";
				player.skin.type = Skin.PLAIN;
				player.skin.desc = "skin";
				player.underBody.restore();
				player.arms.updateClaws(player.arms.claws.type);
				changes++;
			}
			//Arms change to regular
			if (rand(3) == 0 && changes < changeLimit && player.arms.type != Arms.HUMAN) {
				switch(player.arms.type) {
					case Arms.HARPY:
						outputText("\n\nYou scratch at your biceps absentmindedly, but no matter how much you scratch, it isn't getting rid of the itch. Glancing down in irritation, you discover that your feathery arms are shedding their feathery coating. The wing-like shape your arms once had is gone in a matter of moments, leaving " + player.skin.desc + " behind.");
						break;
					case Arms.SPIDER:
						outputText("\n\nYou scratch at your biceps absentmindedly, but no matter how much you scratch, it isn't getting rid of the itch. Glancing down in irritation, you discover that your arms' chitinous covering is flaking away. The glossy black coating is soon gone, leaving " + player.skin.desc + " behind.");
						break;
					default:
				}
				player.arms.restore();
				changes++;
			}
			//Change legs to normal
			if (rand(4) == 0 && changes < changeLimit && player.lowerBody.type != LowerBody.HUMAN) {
				if (player.isBiped()) outputText("You feel an odd sensation in your [feet]. Your [feet] shift and you hear bones cracking as they reform into normal human feet.");
				player.lowerBody.type = LowerBody.HUMAN;
				player.lowerBody.legCount = 2;
				changes++;
			}
			//Removes antennaes!
			if (rand(3) == 0 && changes < changeLimit && player.antennae.type > Antennae.NONE) {
				mutations.removeAntennae();
			}
			//Hair turns back to normal
			if (rand(4) == 0 && changes < changeLimit && player.hair.type != Hair.NORMAL) {
				switch(player.hair.type) {
					case Hair.FEATHER:
						if (player.hair.length >= 6) outputText("\n\nA lock of your downy-soft feather-hair droops over your eye. Before you can blow the offending down away, you realize the feather is collapsing in on itself. It continues to curl inward until all that remains is a normal strand of hair. Your hair is no longer feathery!");
						else outputText("\n\nYou run your fingers through your downy-soft feather-hair while you await the effects of the item you just ingested. While your hand is up there, it detects a change in the texture of your feathers. They're completely disappearing, merging down into strands of regular hair. Your hair is no longer feathery!");
						break;
					case Hair.GOO:
						outputText("\n\nYour gooey hair begins to fall out in globs, eventually leaving you with a bald head. Your head is not left bald for long, though. Within moments, a full head of hair sprouts from the skin of your scalp. Your hair is normal again!");
						break;
					case Hair.GHOST:
						break;
					case Hair.ANEMONE:
						outputText("\n\nYou feel something strange going in on your head. You reach your hands up to feel your tentacle-hair, only to find out that the tentacles have vanished and replaced with normal hair. Your hair is normal again!");
						break;
					default:
						//This shouldn't happen, moving along...
				}
				changes++;
				player.hair.type = Hair.NORMAL;
				flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] = 0;
			}
			//Restart hair growth
			if (rand(3) == 0 && changes < changeLimit && flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] > 0) {
				outputText("\n\nYou feel an itching sensation in your scalp as you realize the change. Your hair is growing normally again!");
				flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] = 0;
				changes++;
			}
			//Remove gills
			if (rand(4) == 0 && changes < changeLimit && player.hasGills()) mutations.updateGills();
			// Rhino TFs
			//------------
			//Change a cock to rhino.
			if (rand(4) == 0 && changes < changeLimit && player.hasCock() && player.countCocksOfType(CockTypesEnum.RHINO) < player.cockTotal()) {
				if (player.cockTotal() == 1) outputText("\n\nYou feel a stirring in your loins as your cock grows rock hard. ");
				else outputText("\n\nOne of your penises begins to feel strange. ");
				outputText("You " + player.clothedOrNakedLower("pull it out from your [armor]", "lean over") + ", right there in the center of The Black Cock, to take a look. You watch as the skin of your cock becomes a smooth, tough pink colored phallus. It takes on a long and narrow shape with an oval shaped bulge along the center. You feel a tightness near the base where your skin seems to be bunching up. A sheath begins forming around your flared rhino cock’s root, tightening as your stiff rhino dick elongates and settles, the thick flared head leaking a steady stream of funky animal-cum. You now have a rhino-dick.");
				for (var i:int = 0; i < player.cocks.length; i++) {
					if (player.cocks[i].cockType != CockTypesEnum.RHINO) {
						player.cocks[i].cockType = CockTypesEnum.RHINO;
						break;
					}
				}
				dynStats("lus", 20);
				changes++;
			}
			//Change ears to rhino
			if (rand(3) == 0 && changes < changeLimit && player.ears.type != Ears.RHINO) {
				outputText("\n\nYou feel an odd uncomfortable sensation in your ears. Reaching up you find your ears shifting into an open tube shape, once they’re done you flick them around, enjoying the sensation of your new ears swishing through the air. You now have rhino ears.");
				player.ears.type = Ears.RHINO;
				changes++;
			}
			//Change face to rhino
			if (mutations.tfNoFur() && rand(4) == 0 && changes < changeLimit && player.ears.type == Ears.RHINO && player.skin.tone == "gray" && player.face.type != Face.RHINO) {
				outputText("\n\nYour face suddenly goes numb. You begin to hear bone cracking as you vision suddenly shifts as you face stretches out and thickens. When your face is done growing you can see the edges of your elongated mouth and noise in the center of your field of vision. They barely impede your vision though. You now have a rhino face.");
				player.face.type = Face.RHINO;
				changes++;
			}
			//Change tail to rhino
			if (rand(3) == 0 && changes < changeLimit && player.isBiped() && player.tail.type != Tail.RHINO) {
				if (player.tail.type > 0) outputText("\n\nYou [tail] suddenly goes numb. Looking back you see it changing, twisting and reforming into a long ropy tail with a little " + player.skin.furColor + " tuft at the end. You now have a rhino tail.");
				else outputText("\n\nYou feel an odd itchy sensation just above your [ass]. Twisting around to inspect it you find a long ropy tail with a little " + player.skin.furColor + " tuft on the end. You now have a rhino tail.");
				player.tail.type = Tail.RHINO;
				changes++;
			}
			//Gain rhino horns
			//Tier 1
			if (rand(4) == 0 && changes < changeLimit && player.face.type == Face.RHINO && player.horns.type != Horns.RHINO) {
				outputText("\n\nYou begin to feel an annoying tingling sensation at the top of your head. Reaching up to inspect it you find the sharp nub of a horn protruding from the center of your forehead and growing. Once it's complete you estimate it to be about six inches long. If it were sharper and a little longer it would make a useful natural weapon.");
				player.horns.value = 1;
				player.horns.type = Horns.RHINO;
				changes++;
			}
			//Tier 2
			if (rand(4) == 0 && changes < changeLimit && player.face.type == Face.RHINO && player.horns.type == Horns.RHINO && player.horns.value == 1) {
				outputText("\n\nYou begin to feel an annoying tingling sensation at the edge of your nose, above your field of vision. Reaching up you feel the sharp edge of a curved horn growing out the edge of your face. The itchy tingle continues as you feel both of your horns become sharp and tall. You estimate your older horn to be a mere seven inches and your new horn to be around a foot long. They’ll be useful natural weapons.");
				outputText("\n(Gained physical special: Upheaval! Any time you lose your rhino face or horns, you will lose this ability.)");
				player.horns.value = 2;
				player.horns.type = Horns.RHINO;
				changes++;
			}
			// Other Changes
			//------------
			//Increase cock size of non-rhino up to 10 inches.
			var cocksAffected:int = 0;
			if (rand(3) == 0 && changes < changeLimit && player.hasCock() && player.smallestCockLength() < 10 && player.cockTotal() - player.countCocksOfType(CockTypesEnum.RHINO) > 0) {
				cocksAffected = 0;
				for (i = 0; i < player.cockTotal(); i++) {
					if (player.cocks[i].cockType == CockTypesEnum.RHINO && player.cocks[i].cockLength >= 10) continue; //Skip over if rhino cock.
					temp = player.increaseCock(player.smallestCockIndex(), rand(2) + 1);
					dynStats("lib", 0.5, "lus", 3);
					cocksAffected++;
				}
				outputText("\n\n");
				player.lengthChange(temp, cocksAffected);
				changes++;
			}
			//Increase girth of rhino cock.
			if (rand(3) == 0 && changes < changeLimit && player.hasCock() && player.countCocksOfType(CockTypesEnum.RHINO) > 0) {
				cocksAffected = 0;
				for (i = 0; i < player.cockTotal(); i++) {
					if (player.cocks[i].cockType == CockTypesEnum.RHINO && player.cocks[i].cockThickness < 3) {
						player.cocks[i].thickenCock(0.5);
						dynStats("lib", 0.5, "lus", 3);
						break;
					}
				}
				changes++;
			}
			//Increase length of rhino cock.
			if (rand(3) == 0 && changes < changeLimit && player.hasCock() && player.countCocksOfType(CockTypesEnum.RHINO) > 0) {
				cocksAffected = 0;
				for (i = 0; i < player.cockTotal(); i++) {
					if (player.cocks[i].cockType == CockTypesEnum.RHINO && player.cocks[i].cockLength < 18) {
						temp = player.increaseCock(i, 1 + rand(2));
						outputText("\n\n");
						player.lengthChange(temp, 1);
						dynStats("lib", 0.5, "lus", 3);
						break;
					}
				}
				changes++;
			}
			//Grow balls
			if (rand(3) == 0 && changes < changeLimit && player.balls > 0 && player.ballSize < 4) {
				if (player.ballSize <= 2) outputText("\n\nA flash of warmth passes through you and a sudden weight develops in your groin. You pause to examine the changes and your roving fingers discover your " + player.simpleBallsDescript() + " have grown larger than a human's.");
				if (player.ballSize > 2) outputText("\n\nA sudden onset of heat envelops your groin, focusing on your " + player.sackDescript() + ". Walking becomes difficult as you discover your " + player.simpleBallsDescript() + " have enlarged again.");
				dynStats("lib", 1, "lus", 3);
				player.ballSize++;
				changes++;
			}
			//Boost vaginal capacity without gaping
			if (rand(3) == 0 && changes < changeLimit && player.hasVagina() && player.statusEffectv1(StatusEffects.BonusVCapacity) < 40) {
				if (!player.hasStatusEffect(StatusEffects.BonusVCapacity)) player.createStatusEffect(StatusEffects.BonusVCapacity, 0, 0, 0, 0);
				player.addStatusValue(StatusEffects.BonusVCapacity, 1, 5);
				outputText("\n\nThere is a sudden... emptiness within your " + player.vaginaDescript(0) + ". Somehow you know you could accommodate even larger... insertions.");
				changes++;
			}
			//Boost anal capacity without gaping
			if (rand(3) == 0 && changes < changeLimit && player.hasVagina() && player.statusEffectv1(StatusEffects.BonusVCapacity) < 60) {
				if (player.statusEffectv1(StatusEffects.BonusACapacity) < 60) {
					if (!player.hasStatusEffect(StatusEffects.BonusACapacity)) player.createStatusEffect(StatusEffects.BonusACapacity, 0, 0, 0, 0);
					player.addStatusValue(StatusEffects.BonusACapacity, 1, 5);
					outputText("\n\nYou feel... more accommodating somehow. Your " + player.assholeDescript() + " is tingling a bit, and though it doesn't seem to have loosened, it has grown more elastic.");
					changes++;
				}
			}
			//Gain height
			if (rand(2) == 0 && changes < changeLimit && player.tallness < 102) {
				temp = rand(5) + 3;
				//Slow rate of growth near ceiling
				if (player.tallness > 90) temp = Math.floor(temp / 2);
				//Constrain height growth
				if (temp == 0) temp = 1; //Never 0
				if (temp > 6) temp = 6; //Constrain growth to 6 inches
				//Flavor texts. Flavored like 1950's cigarettes. Yum.
				if (temp < 3) outputText("\n\nYou shift uncomfortably as you realize you feel off balance. Gazing down, you realize you have grown SLIGHTLY taller.");
				if (temp >= 3 && temp < 6) outputText("\n\nYou feel dizzy and slightly off, but quickly realize it's due to a sudden increase in height.");
				if (temp == 6) outputText("\n\nStaggering forwards, you clutch at your head dizzily. You spend a moment getting your balance, and stand up, feeling noticeably taller.");
				player.tallness += temp;
				changes++;
			}
			//Gain muscle tone
			if (rand(2) == 0 && player.tone < 80) {
				if (player.tone < 50) player.modTone(80, 2 + rand(2));
				else player.modTone(80, 1 + rand(2));
			}
			//Gain thickness
			if (rand(2) == 0 && player.thickness < 80) {
				if (player.thickness < 50) player.modThickness(80, 2 + rand(2));
				else player.modThickness(80, 1 + rand(2));
			}
			//Slow hair production
			if (rand(3) == 0 && changes < changeLimit && flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED] > 0) {
				outputText("\n\nYou feel a tingling sensation in your scalp. After a few seconds it stops... that was odd.");
				flags[kFLAGS.INCREASED_HAIR_GROWTH_SERUM_TIMES_APPLIED] = 0;
				changes++;
			}
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}


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

	/**
	 * Raccoon transformative item.
	 */
	public class RingtailFig extends Consumable
	{
		public function RingtailFig()
		{
			super("RingFig","RingFig","a ringtail fig", ConsumableLib.DEFAULT_VALUE,"A dried fig with two lobes and thin dark rings just below its stem.  The skin is wrinkly and it looks vaguely like a bulging scrotum.");
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "ringtailFig";
			mutations.initTransformation([2, 3, 3]);
			clearOutput();
			//eat it:
			outputText("You split the fruit and scoop out the pulp, eating it greedily.  It's sweet and slightly gritty with seeds, and you quickly finish both halves.");

			//stat gains:
			//gain speed to ceiling of 80
			if (player.spe100 < 80 && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nYou twitch and turn your head this way and that, feeling a bit more alert.  This will definitely help when defending your personal space from violators.");
				if (player.spe100 < 40) dynStats("spe", 1);
				dynStats("spe", 1);
			}
			//gain sensitivity
			if (player.sens100 < 80 && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nThe wrinkled rind suddenly feels alarmingly distinct in your hands, and you drop the remnants of the fruit.  Wonderingly, you touch yourself with a finger - you can feel even the lightest pressure on your " + player.skinFurScales() + " much more clearly now!");
				if (player.sens100 < 60) dynStats("sen", 2);
				dynStats("sen", 2);
			}
			//lose toughness to floor of 50
			if (rand(4) === 0 && player.tou100 > 50 && changes < changeLimit) {
				outputText("\n\nYou find yourself wishing you could just sit around and eat all day, and spend a while lazing about and doing nothing before you can rouse yourself to get moving.");
				if (player.tou100 > 75) dynStats("tou", -1);
				dynStats("tou", -1);
			}

			//Sex stuff
			if (player.hasCock()) {
				//gain ball size
				if (player.balls > 0 && player.ballSize < 15 && rand(4) === 0 && changes < changeLimit) {
					outputText("\n\nYour [balls] inflate, stretching the skin of your sack.  Exposing them, you can see that they've grown several inches!  How magical!");
					player.ballSize += 2 + rand(3);
					dynStats("lib", 1);
				}
			}
			//gain balls up to 2 (only if full-coon face and fur; no dick required)
			if (player.balls === 0 && player.hasFur() && player.face.type === Face.RACCOON && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nAs you eat, you contemplate your masked appearance; it strikes you that you're dangerously close to the classic caricature of a thief.  Really, all it would take is a big, nondescript sack and a hurried gait and everyone would immediately think the worst of you.  In a brief fit of pique, you wish you had such a bag to store your things in, eager to challenge a few assumptions.  A few minutes into that line of thought, a twisting ache in your lower gut bends you double, and you expose yourself hurriedly to examine the region.  As you watch, a balloon of flesh forms on your crotch, and two lumps migrate from below your navel down into it.  Looks like you have a sack, after all.");
				player.balls = 2;
				player.ballSize = 1;
				changes++;
			}
			//gain thickness or lose tone or whatever - standard message
			if (rand(4) === 0 && player.thickness < 80 && changes < changeLimit) {
				outputText(player.modThickness(80, 2));
				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);
			}
			//bodypart changes:
			if (player.tail.type !== Tail.RACCOON && rand(4) === 0 && changes < changeLimit) {
				//grow da tail
				//from no tail:
				if (player.tail.type === Tail.NONE) {
					outputText("\n\nPain shivers through your spine and forces you onto the ground; your body locks up despite your attempt to rise again.  You can feel a tug on your spine from your backside, as if someone is trying to pull it out!  Several nodules form along your back, growing into new vertebrae and pushing the old ones downward and into your [armor].  An uncomfortable pressure grows there, as whatever development is taking place fights to free itself from the constriction.  Finally the shifting stops, and you're able to move again; the first thing you do is loosen your bottoms, allowing a matted tail to slide out.  It twitches involuntarily, fluffing out into a ringed raccoon tail!");
				}
				//from other tail:
				else {
					outputText("\n\nYour tail goes rigid with pain, and soon your body follows.  It feels as though your spine is trying to push the growth off of your body... barely, you manage to turn your head to see almost exactly that!  A new ringed, fluffy tail is growing in behind its predecessor, dark bands after light.  Soon it reaches full length and a tear comes to your eye as your old tail parts from its end and drops to the ground like overripe fruit, dissolving.  You now have a raccoon tail!");
				}
				player.tail.type = Tail.RACCOON;
				changes++;
			}
			//gain fur
			if (mutations.tfNoFur() && (player.lowerBody.type=== LowerBody.RACCOON && player.ears.type === Ears.RACCOON) && !player.hasFur() && changes < changeLimit && rand(4) === 0) {
				outputText("\n\nYou shiver, feeling a bit cold.  Just as you begin to wish for something to cover up with, it seems your request is granted; thick, bushy fur begins to grow all over your body!  You tug at the tufts in alarm, but they're firmly rooted and... actually pretty soft.  Huh.  ");
				player.skin.type = Skin.FUR;
				player.skin.adj = "";
				player.skin.desc = "fur";
				player.skin.furColor = "gray";
				player.underBody.restore(); // Restore the underbody for now
				outputText("You now have a warm coat of " + player.skin.furColor + " raccoon fur!");
				changes++;
			}
			//gain coon ears
			if (player.tail.type === Tail.RACCOON && player.ears.type !== Ears.RACCOON && rand(4) === 0 && changes < changeLimit) {
				//from dog, kangaroo, bunny, other long ears
				if (player.ears.type === Ears.DOG || player.ears.type === Ears.BUNNY || player.ears.type === Ears.KANGAROO) outputText("\n\nYour ears compress, constricting your ear canal momentarily.  You shake your head to get sound back, and reach up to touch the auricles, to find a pair of stubby egg-shaped ears in their place.  You now have raccoon ears!");
				//from cat, horse, cow ears
				else if (player.ears.type === Ears.HORSE || player.ears.type === Ears.COW || player.ears.type === Ears.CAT) outputText("\n\nYour ears tingle.  Huh.  Do they feel a bit rounder at the tip now?  Looks like you have raccoon ears.");
				//from human, goblin, lizard or other short ears
				else outputText("\n\nYour ears prick and stretch uncomfortably, poking up through your " + player.hairDescript() + ".  Covering them with your hands, you feel them shaping into little eggdrop ornaments resting atop your head.  You have raccoon ears!");
				player.ears.type = Ears.RACCOON;
				changes++;
			}
			//gain feet-coon
			if (player.ears.type === Ears.RACCOON && player.lowerBody.type !== LowerBody.RACCOON && changes < changeLimit && rand(4) === 0) {
				//from naga non-feet (gain fatigue and lose lust)
				if (player.isNaga()) {
					outputText("\n\nYour body straightens and telescopes suddenly and without the length of your snake half to anchor you, you're left with your face in the dirt.  A shuffling and scraping of falling scales sounds and a terrible cramp takes you as your back half continues migrating, subducting under your [butt] and making you feel extremely bloated.  As your once prominent tail dwindles to roughly the length of your torso, a sickly ripping noise fills your head and it bursts apart, revealing two new legs!  The tattered snake-skin continues melding into your groin as you examine the fuzzy legs and long-toed, sensitive feet.  Looks like you now have raccoon hind-paws... and an upset stomach.");
					dynStats("lus", -30);
					player.changeFatigue(5);
				}
				//from amoeba non-feet
				else if (player.isGoo()) outputText("\n\nYour gooey undercarriage begins to boil violently, and before you can do anything, it evaporates!  Left sitting on just the small pad of sticky half-dried slime that comprises your [butt], a sudden bulge under you is enough to push you onto your back.  Wondering idly and unable to see what's happening, you close your eyes and try to focus on what sensations you can feel from your lower body.  You feel... a swell of expansion, followed by weak muscles trying to contract for the first time, pulling flimsy, folded limbs apart and laying them flat.  As your attention wanders downward, you feel toes wiggling - far longer toes than you remember.  For several minutes you lie still and test muscles gingerly as your body solidifes, but when you can finally move again and look at your legs properly, what you see surprises you very little.  You have fuzzy legs and a pair of long-toed raccoon paws!");
				//from hooves or hard feet, including centaurs and bees
				else if (player.lowerBody.type === LowerBody.HOOFED || player.lowerBody.type === LowerBody.BEE || player.lowerBody.type === LowerBody.PONY || player.lowerBody.type === LowerBody.CHITINOUS_SPIDER_LEGS || player.isTaur()) {
					outputText("\n\nYour [feet] feel very... wide, all of a sudden.  You clop around experimentally, finding them far less responsive and more cumbersome than usual.  On one step, one of your feet ");
					if (player.lowerBody.type === LowerBody.HOOFED || player.lowerBody.type === LowerBody.PONY) outputText("pops right out of its hoof just in time");
					else outputText("comes loose inside its long boot, and you pull it free with irritation only");
					outputText(" for you to set it back down on a sharp rock!  Biting off a curse, you examine the new bare foot.  It looks much like a human's, except for the nearly-twice-as-long toes.  You find you can even use them to pick things up; the sharp rock is dropped into your hand and tossed far away.  The shed [foot] is quickly joined on the ground by its complement, revealing more long toes.  ");
					if (player.isTaur()) outputText("For a few minutes you amuse yourself with your four prehensile feet... you even make up a game that involves juggling a stone under your body by tossing it between two feet while balancing on the others.  It's only a short while, however, before your lower stomach grumbles and a searing pain makes you miss your catch.  Anticipating what will happen, you lie down carefully and close your eyes, biting down on a soft wad of cloth.  The pain quickly returns and drives you into unconsciousness, and when you awaken, your back legs are gone.  ");
					outputText("You now have two fuzzy, long-toed raccoon legs.");
				}
				//from human, demon, paw feet
				else {
					outputText("\n\nYour toes wiggle of their own accord, drawing your attention.  Looking down, you can see them changing from their current shape, stretching into oblongs.  When they finish, your foot appears humanoid, but with long, prehensile toes!  ");
					if ((player.lowerBody.type === LowerBody.HUMAN || player.lowerBody.type === LowerBody.DEMONIC_HIGH_HEELS || player.lowerBody.type === LowerBody.DEMONIC_CLAWS) && !player.hasFur()) outputText("The sensation of walking around on what feels like a second pair of hands is so weird that you miss noticing the itchy fur growing in over your legs...  ");
					outputText("You now have raccoon paws!");
				}
				player.lowerBody.type = LowerBody.RACCOON;
				player.lowerBody.legCount = 2;
				changes++;
			}
			//gain half-coon face (prevented if already full-coon)
			if (player.face.type !== Face.RACCOON_MASK && player.face.type !== Face.RACCOON && rand(4) === 0 && changes < changeLimit) {
				//from human/naga/shark/bun face
				if (player.face.type === Face.HUMAN || player.face.type === Face.SHARK_TEETH || player.face.type === Face.SNAKE_FANGS || player.face.type === Face.BUNNY) {
					outputText("\n\nA sudden wave of exhaustion passes over you, and your face goes partially numb around your eyes.  ");
					//(nagasharkbunnies)
					if (player.face.type === Face.SHARK_TEETH || player.face.type === Face.SNAKE_FANGS || player.face.type === Face.BUNNY) {
						outputText("Your prominent teeth chatter noisily at first, then with diminishing violence, until you can no longer feel them jutting past the rest!  ");
					}
					outputText("Shaking your head a bit, you wait for your energy to return, then examine your appearance.  ");
					//(if player skinTone = ebony/black/ebony with tats and no fur/scales or if black/midnight fur or if black scales
					if (((player.skin.tone === "ebony" || player.skin.tone === "black") && (player.hasPlainSkin() || player.hasGooSkin())) || ((player.hair.color === "black" || player.hair.color === "midnight") && player.isFurryOrScaley())) {
						outputText("Nothing seems different at first.  Strange... you look closer and discover a darker, mask-line outline on your already inky visage.  You now have a barely-visible raccoon mask.");
					}
					else outputText("A dark, almost black mask shades the " + player.skinFurScales() + " around your eyes and over the topmost portion of your nose, lending you a criminal air!  You now have a raccoon mask!");
				}
				//from snout (will not overwrite full-coon snout but will overwrite others)
				else {
					outputText("\n\nA sudden migraine sweeps over you and you clutch your head in agony as your nose collapses back to human dimensions.  A worrying numb spot grows around your eyes, and you entertain several horrible premonitions until it passes as suddenly as it came.  Checking your reflection in your water barrel, you find ");
					//[(if black/midnight fur or if black scales)
					if (((player.hair.color === "black" || player.hair.color === "midnight") && player.isFurryOrScaley())) outputText("your face apparently returned to normal shape, albeit still covered in " + player.skinFurScales() + ".  You look closer and discover a darker, mask-line outline on your already inky visage.  You now have a barely-visible raccoon mask on your otherwise normal human face.");
					else if ((player.skin.tone === "ebony" || player.skin.tone === "black") && (player.hasPlainSkin() || player.hasGooSkin())) outputText("your face apparently returned to normal shape.  You look closer and discover a darker, mask-line outline on your already inky visage.  You now have a barely-visible raccoon mask on your normal human face.");
					else outputText("your face returned to human dimensions, but shaded by a black mask around the eyes and over the nose!  You now have a humanoid face with a raccoon mask!");
				}
				player.face.type = Face.RACCOON_MASK;
				changes++;
			}
			//gain full-coon face (requires half-coon and fur)
			//from humanoid - should be the only one possible
			else if (mutations.tfNoFur() && player.face.type === Face.RACCOON_MASK && player.lowerBody.type === LowerBody.RACCOON && player.hasFur() && rand(4) === 0 && changes < changeLimit) {
				outputText("\n\nYour face pinches with tension, and you rub the bridge of your nose to release it.  The action starts a miniature slide in your bone structure, and your nose extends out in front of you!  You shut your eyes, waiting for the sinus pressure to subside, and when you open them, a triangular, pointed snout dotted with whiskers and capped by a black nose greets you!  You now have a raccoon's face!");
				//from muzzleoid - should not be possible, but included if things change
				//Your face goes numb, and you can see your snout shifting into a medium-long, tapered shape.  Closing your eyes, you rub at your forehead to try and get sensation back into it; it takes several minutes before full feeling returns.  When it does, you look again at yourself and see a raccoon's pointy face, appointed with numerous whiskers and a black nose!
				changes++;
				player.face.type = Face.RACCOON;
			}
			//fatigue damage (only if face change was not triggered)
			else if (rand(2) === 0 && changes < changeLimit && (player.face.type !== Face.RACCOON_MASK && player.face.type !== Face.RACCOON)) {
				outputText("\n\nYou suddenly feel tired and your eyelids are quite heavy.  Checking your reflection, you can see small dark rings have begun to form under your eyes.");
				player.changeFatigue(10);
				changes++;
			}
			if (changes === 0) {
				outputText("\n\nYawning, you figure you could really use a nap.");
				player.changeFatigue(5);
			}
			player.refillHunger(30);
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}

license: unknown


code:
/**
 * Created by K.Quesom 11.06.14
 */
package classes.Items.Consumables
{
	import classes.BodyParts.Ears;
	import classes.BodyParts.Skin;
	import classes.GlobalFlags.kFLAGS;
	import classes.Items.Consumable;
	import classes.internals.Utils;

	public class RizzaRoot extends Consumable
	{
		public function RizzaRoot()
		{
			super(
				"RizzaRt",
				"Rizza Root",
				"a tube of rizza root strands",
				10,
				"A small ceramic tube full of fine red root strands. They smell something like citrus fruit."
			);
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "rizzaRootEffect";
			var counter:Number = 0;
			mutations.initTransformation([2, 3, 4]);
			clearOutput();
			outputText("You chew on the thin red roots. They have a rubbery texture and the taste is something like"
			          +" lemons and oranges mixed together.  The roots dry out your mouth as you chew them but at the same time they cause a cooling"
			          +" and numbing sensation that’s rather pleasant.");
			if (changes < changeLimit && !player.hasPlainSkin() && rand(6) === 0) {
				if (player.hasFur()) {
					outputText("\n\nYour fur itches incessantly, so you start scratching it. It starts coming off in big clumps before the whole mess"
					          +" begins sloughing off your body.  In seconds, your skin is hairless, or nearly so."
					          +" You've lost your fur!");
				} else if (player.hasScales()) {
					outputText("\n\nYour scales itch incessantly, so you scratch at them.  They start falling off wholesale,"
					          +" leaving you standing in a pile of scales after only a few moments."
					          +" You've lost your scales!");
				} else if (player.hasGooSkin()) {
					outputText("\n\nYour [skinDesc] itches incessantly, and as you scratch it shifts and changes, becoming normal human-like skin."
					          +" Your skin is once again normal!");
				}
				player.skin.desc = "skin";
				player.skin.type = Skin.PLAIN;
				changes += 2;
			}
			if (changes < changeLimit && player.ears.type !== Ears.ELFIN && rand(4) == 0) {
				player.ears.type = Ears.ELFIN;
				changes++;
				outputText("\n\nA weird tingling runs through your scalp as your [hair] shifts slightly."
				          +" You reach up and your hand bumps against your new pointed elfin ears.  You bet they look cute!");
			}
			if (rand(5) === 0) {
				mutations.updateOvipositionPerk(tfSource); // I doubt, that this will ever be affected, but well ... just in case
			}
			if (changes < changeLimit && player.tallness < 108) {
				player.tallness += changeLimit - changes + rand(2); //Add remaining changes as additional height
				if (player.tallness > 108) {
					player.tallness = 108;
				}
				outputText("\n\nA shiver runs down your spine.  You realize that it, along with the rest of your frame, is now a bit taller.");
			}
			else if (player.tallness >= 108) {
				outputText("\n\nYou don’t feel anything happening along your spine.  Perhaps this is as tall as the rizza root can make you.");
			}
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}


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

	/**
	 * Salamander transformative item.
	 */
	public class Salamanderfirewater extends Consumable
	{
		public function Salamanderfirewater()
		{
			super("SalamFW","SalamFW", "a hip flask of Salamander Firewater", ConsumableLib.DEFAULT_VALUE, "This hip flask contains high-proof beverage called 'Salamander Firewater', which one sip can make your throat feel like it been set on fire.  What would happen if you drink the contents of the whole flask?");
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "salamanderfirewater";
			player.slimeFeed();
			//init variables
			var temp2:Number = 0;
			mutations.initTransformation([2, 3, 4]);
			//clear screen
			clearOutput();
			outputText("You uncork the hip flask and drink it down.  The taste is actually quite good, like an alcohol but with a little fire within.  Just as you expected, it makes you feel all hot and ready to take whole world head on.");

			//Statistical changes:
			//-Reduces speed down to 70.
			if (player.spe100 > 70 && changes < changeLimit && rand(4) === 0) {
				outputText("\n\nYou start to feel sluggish.  Lying down and enjoying liquor might make you feel better.");
				dynStats("spe", -1);
			}
			//-Reduces intelligence down to 60.
			if (player.inte100 > 60 && changes < changeLimit && rand(4) === 0) {
				outputText("\n\nYou start to feel a bit dizzy, but the sensation quickly passes.  Thinking hard on it, you mentally brush away the fuzziness that seems to permeate your brain and determine that this firewater may have actually made you dumber.  It would be best not to drink too much of it.");
				dynStats("int", -1);
			}
			//-Raises libido up to 90.
			if (player.lib100 < 90 && changes < changeLimit && rand(3) === 0) {
				outputText("\n\nA knot of fire in your gut doubles you over but passes after a few moments.  As you straighten you can feel the heat seeping into you, ");
				//(DICK)
				if (player.cocks.length > 0 && (player.gender !== 3 || rand(2) === 0)) {
					outputText("filling ");
					if (player.cocks.length > 1) outputText("each of ");
					outputText("your " + player.multiCockDescriptLight() + " with the desire to breed.  You get a bit hornier when you realize your sex-drive has gotten a boost.");
				}
				//(COOCH)
				else if (player.hasVagina()) outputText("puddling in your " + player.vaginaDescript(0) + ".  An instinctive desire to mate spreads through you, increasing your lust and boosting your sex-drive.");
				//(TARDS)
				else outputText("puddling in your featureless crotch for a split-second before it slides into your " + player.assDescript() + ".  You want to be fucked, filled, and perhaps even gain a proper gender again.  Through the lust you realize your sex-drive has been permanently increased.");
				dynStats("lib", 2);
			}
			//-Raises toughness up to 90.
			//(+3 to 50, +2 to 70, +1 to 90)
			if (player.tou100 < 90 && changes < changeLimit && rand(3) === 0) {
				//(+3)
				if (player.tou100 < 50) {
					outputText("\n\nYour body and skin both thicken noticeably.  You pinch your " + player.skin.desc + " experimentally and marvel at how much tougher it is now.");
					dynStats("tou", 3);
				}
				//(+2)
				else if (player.tou100 < 70) {
					outputText("\n\nYou grin as you feel your form getting a little more solid.  It seems like your whole body is toughening up quite nicely, and by the time the sensation goes away, you feel ready to take a hit.");
					dynStats("tou", 2);
				}
				//(+1)
				else {
					outputText("\n\nYou snarl happily as you feel yourself getting even tougher.  It's a barely discernible difference, but you can feel your " + player.skin.desc + " getting tough enough to make you feel invincible.");
					dynStats("tou", 1);
				}
			}
			//-Raises strength to 80.
			if (player.str100 < 80 && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nWhile heat builds in your muscles, their already-potent mass shifting slightly as they gain even more strength than before.");
				dynStats("str", 1);
			}
			//Sexual Changes:
			//-Lizard dick - first one
			if (player.countCocksOfType(CockTypesEnum.LIZARD) === 0 && player.cockTotal() > 0 && changes < changeLimit && rand(4) === 0) {
				//Find the first non-lizzy dick
				for (temp2 = 0; temp2 < player.cocks.length; temp2++) {
					//Stop loopahn when dick be found
					if (player.cocks[temp2].cockType !== CockTypesEnum.LIZARD) break;
				}
				outputText("\n\nA slow tingle warms your groin.  Before it can progress any further, you yank back your " + player.armorName + " to investigate.  Your " + player.cockDescript(temp2) + " is changing!  It ripples loosely from ");
				if (player.hasSheath()) outputText("sheath ");
				else outputText("base ");
				outputText("to tip, undulating and convulsing as its color lightens, darkens, and finally settles on a purplish hue.  Your " + Appearance.cockNoun(CockTypesEnum.HUMAN) + " resolves itself into a bulbous form, with a slightly pointed tip.  The 'bulbs' throughout its shape look like they would provide an interesting ride for your sexual partners, but the perverse, alien pecker ");
				if (player.cor < 33) outputText("horrifies you.");
				else if (player.cor < 66) outputText("is a little strange for your tastes.");
				else {
					outputText("looks like it might be more fun to receive than use on others.  ");
					if (player.hasVagina()) outputText("Maybe you could find someone else with one to ride?");
					else outputText("Maybe you should test it out on someone and ask them exactly how it feels?");
				}
				outputText("  You now have a bulbous, lizard-like cock.");
				//Actually xform it nau
				if (player.hasSheath()) {
					player.cocks[temp2].cockType = CockTypesEnum.LIZARD;
					if (!player.hasSheath()) outputText("\n\nYour sheath tightens and starts to smooth out, revealing ever greater amounts of your " + player.cockDescript(temp2) + "'s lower portions.  After a few moments your groin is no longer so animalistic – the sheath is gone.");
				}
				else player.cocks[temp2].cockType = CockTypesEnum.LIZARD;
				changes++;
				dynStats("lib", 3, "lus", 10);
			}
			//(CHANGE OTHER DICK)
			//Requires 1 lizard cock, multiple cocks
			if (player.cockTotal() > 1 && player.countCocksOfType(CockTypesEnum.LIZARD) > 0 && player.cockTotal() > player.countCocksOfType(CockTypesEnum.LIZARD) && rand(4) === 0 && changes < changeLimit) {
				outputText("\n\nA familiar tingle starts in your crotch, and before you can miss the show, you pull open your " + player.armorName + ".  As if operating on a cue, ");
				for (temp2 = 0; temp2 < player.cocks.length; temp2++) {
					//Stop loopahn when dick be found
					if (player.cocks[temp2].cockType !== CockTypesEnum.LIZARD) break;
				}
				if (player.cockTotal() === 2) outputText("your other dick");
				else outputText("another one of your dicks");
				outputText(" starts to change into the strange reptilian shape you've grown familiar with.  It warps visibly, trembling and radiating pleasurable feelings back to you as the transformation progresses.  ");
				if (player.cumQ() < 50) outputText("Pre-cum oozes from the tip");
				else if (player.cumQ() < 700) outputText("Thick pre-cum rains from the tip");
				else outputText("A wave of pre-cum splatters on the ground");
				outputText(" from the pleasure of the change.  In moments you have a bulbous, lizard-like cock.");
				//(REMOVE SHEATH IF NECESSARY)
				if (player.hasSheath()) {
					player.cocks[temp2].cockType = CockTypesEnum.LIZARD;
					if (!player.hasSheath()) outputText("\n\nYour sheath tightens and starts to smooth out, revealing ever greater amounts of your " + player.cockDescript(temp2) + "'s lower portions.  After a few moments your groin is no longer so animalistic – the sheath is gone.");
				}
				else player.cocks[temp2].cockType = CockTypesEnum.LIZARD;
				changes++;
				dynStats("lib", 3, "lus", 10);
			}
			//-Breasts vanish to 0 rating if male
			if (player.biggestTitSize() >= 1 && player.gender === 1 && changes < changeLimit && rand(3) === 0) {
				//(HUEG)
				if (player.biggestTitSize() > 8) {
					outputText("\n\nThe flesh on your chest tightens up, losing nearly half its mass in the span of a few seconds.  With your center of balance shifted so suddenly, you stagger about trying not to fall on your ass.  You catch yourself and marvel at the massive change in breast size.");
					//Half tit size
				}
				//(NOT HUEG < 4)
				else outputText("\n\nIn an instant, your chest compacts in on itself, consuming every ounce of breast-flesh.  You're left with a  smooth, masculine torso, though your nipples remain.");
				//(BOTH – no new PG)
				outputText("  With the change in weight and gravity, you find it's gotten much easier to move about.");
				//Loop through behind the scenes and adjust all tits.
				for (temp2 = 0; temp2 < player.breastRows.length; temp2++) {
					if (player.breastRows[temp2].breastRating > 8) player.breastRows[temp2].breastRating /= 2;
					else player.breastRows[temp2].breastRating = 0;
				}
				//(+2 speed)
				dynStats("lib", 2);
				changes++;
			}
			//-Nipples reduction to 1 per tit.
			if (player.averageNipplesPerBreast() > 1 && changes < changeLimit && rand(4) === 0) {
				outputText("\n\nA chill runs over your " + player.allBreastsDescript() + " and vanishes.  You stick a hand under your " + player.armorName + " and discover that your extra nipples are missing!  You're down to just one per ");
				if (player.biggestTitSize() < 1) outputText("'breast'.");
				else outputText("breast.");
				changes++;
				//Loop through and reset nipples
				for (temp2 = 0; temp2 < player.breastRows.length; temp2++) {
					player.breastRows[temp2].nipplesPerBreast = 1;
				}
			}
			//Increase player's breast size, if they are big DD or smaller
			if (player.smallestTitSize() < 6 && player.gender === 2 && changes < changeLimit && rand(4) === 0) {
				outputText("\n\nAfter eating it, your chest aches and tingles, and your hands reach up to scratch at it unthinkingly.  Silently, you hope that you aren't allergic to it.  Just as you start to scratch at your " + player.breastDescript(player.smallestTitRow()) + ", your chest pushes out in slight but sudden growth.");
				player.breastRows[player.smallestTitRow()].breastRating++;
				changes++;
			}
			//-Remove extra breast rows
			if (changes < changeLimit && player.breastRows.length > 1 && rand(3) == 0 && !flags[kFLAGS.HYPER_HAPPY]) {
				mutations.removeExtraBreastRow(tfSource);
			}
			//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);
			}
			//Physical changes:
			//Tail - 1st gain reptilian tail, 2nd unlocks enhanced with fire tail whip attack
			if (player.tail.type !== Tail.LIZARD && player.tail.type !== Tail.SALAMANDER && changes < changeLimit && rand(3) === 0) {
				//No tail
				if (player.tail.type === Tail.NONE) outputText("\n\nYou drop onto the ground as your spine twists and grows, forcing the flesh above your " + player.assDescript() + " to bulge out.  New bones form, one after another, building a tapered, prehensile tail onto the back of your body.  You now have a reptilian tail!");
				//Yes tail
				else outputText("\n\nYou drop to the ground as your tail twists and grows, changing its shape in order to gradually taper to a point.  It flicks back and forth, prehensile and totally under your control.  You now have a reptilian tail.");
				player.tail.type = Tail.LIZARD;
				changes++;
			}
			if (player.tail.type === Tail.LIZARD && changes < changeLimit && rand(3) === 0) {
				outputText("\n\nYou feel a strange heating sensation in your tail and when you grab your own tail, you can see that it retains the same shape though the color changes to red. It becomes hotter to the touch and you let go of your tail before it gets too hot. For a brief moment it tip ignite with a red-colored flame that with as little as your merely thought vanish moment later.  Still you somehow know you can set ablaze any part or whole your tail at any moment and even use it to burn enemies after lashing them with your tail.  You now have a salamander tail!");
				player.tail.type = Tail.SALAMANDER;
				changes++;
			}
			//Legs
			if (player.lowerBody.type !== LowerBody.SALAMANDER && player.tail.type === Tail.SALAMANDER && changes < changeLimit && rand(3) === 0) {
				//Hooves -
				if (player.lowerBody.type === LowerBody.HOOFED) outputText("\n\nYou scream in agony as you feel your hooves crack and break apart, beginning to rearrange.  Your legs change to a digitigrade shape while your feet grow claws and shift to have three toes on the front and a smaller toe on the heel.");
				//TAURS -
				else if (player.isTaur()) outputText("\n\nYour lower body is wracked by pain!  Once it passes, you discover that you're standing on digitigrade legs with salamander-like claws.");
				//feet types -
				else if (player.lowerBody.type === LowerBody.HUMAN || player.lowerBody.type === LowerBody.DOG || player.lowerBody.type === LowerBody.DEMONIC_HIGH_HEELS || player.lowerBody.type === LowerBody.DEMONIC_CLAWS || player.lowerBody.type === LowerBody.BEE || player.lowerBody.type === LowerBody.CAT || player.lowerBody.type === LowerBody.LIZARD) outputText("\n\nYou scream in agony as you feel the bones in your legs break and begin to rearrange. They change to a digitigrade shape while your feet grow claws and shift to have three toes on the front and a smaller toe on the heel.");
				//Else –
				else outputText("\n\nPain rips through your " + player.legs() + ", morphing and twisting them until the bones rearrange into a digitigrade configuration.  The strange legs have three-toed, clawed feet, complete with a small vestigial claw-toe on the back for added grip.");
				outputText("  You have salamander legs and claws!");
				player.lowerBody.type = LowerBody.SALAMANDER;
				player.lowerBody.legCount = 2;
				changes++;
			}
			//Arms
			if (player.arms.type !== Arms.SALAMANDER && player.lowerBody.type === LowerBody.SALAMANDER && changes < changeLimit && rand(3) === 0) {
				outputText("\n\nYou scratch your biceps absentmindedly, but no matter how much you scratch, you can't get rid of the itch.  After a longer moment of ignoring it you finally glance down in irritation, only to discover that your arms former appearance has changed into those of a salamander with leathery, red scales and short, fiery-red claws replacing your fingernails.  You now have salamander arms.");
				player.arms.setType(Arms.SALAMANDER, Claws.SALAMANDER);
				changes++;
			}
			//Remove odd eyes
			if (changes < changeLimit && rand(4) === 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++;
			}
			//Human face
			if (player.face.type !== Face.HUMAN && changes < changeLimit && 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++;
			}
			//Human ears
			if (player.face.type === Face.HUMAN && player.ears.type !== Ears.HUMAN && 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++;
			}
			//-Skin color change
			if (ColorLists.SALAMANDER_SKIN.indexOf(player.skin.tone) < 0 && changes < changeLimit && rand(4) === 0) {
				changes++;
				outputText("\n\nIt takes a while for you to notice, but ");
				if (player.hasFur()) outputText("the skin under your " + player.skin.furColor + " " + player.skin.desc + " has ");
				else outputText("your " + player.skin.desc + (player.skin.desc.indexOf("scales") !== -1 ? " have " : " has "));
				player.skin.tone = randomChoice(ColorLists.SALAMANDER_SKIN);
				player.arms.updateClaws(player.arms.claws.type);
				outputText("changed to become " + player.skin.tone + " colored.");
			}
			//Change skin to normal
			if (!player.hasPlainSkin() && player.ears.type === Ears.HUMAN && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\nA slowly-building itch spreads over your whole body, and as you idly scratch yourself, you find that your " + player.skinFurScales());
				outputText(" " + (player.hasScales() ? "are" : "is") + " falling to the ground, revealing flawless skin below.  You now have normal skin.");
				player.skin.type = Skin.PLAIN;
				player.skin.desc = "skin";
				player.skin.adj  = "";
				player.underBody.restore();
				changes++;
			}
			//Removing gills
			if (rand(4) === 0 && player.hasGills() && changes < changeLimit) {
				mutations.updateGills();
			}
			//FAILSAFE CHANGE
			if (changes === 0) {
				outputText("\n\nInhuman vitality spreads through your body, invigorating you!\n");
				player.HPChange(100, true);
				dynStats("lus", 5);
			}
			player.refillHunger(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.StatusEffects;

	/**
	 * Satyr Wine, part of the Black Cock by Foxxling
	 * @author Kitteh6660
	 */
	public class SatyrWine extends Consumable
	{

		public function SatyrWine()
		{
			super("SatyrWn", "SatyrWine", "a bottle of satyr wine", 30, "A dark bottle with a brilliant red liquid sloshing around inside. On the label there is a picture of a satyr playing pipes.");
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "satyrTFs";
			outputText("Feeling parched you tug the cork from a bottle of wine. As you put the bottle to your lips and drink the rich, invigorating liquid you soon find yourself with an empty bottle and a smile. ");
			player.refillHunger(10);
			mutations.initTransformation(null, 3);
			//Stats and genital changes
			if (rand(2) == 0) {
				outputText("\n\nHeat floods your loins as thoughts of tight round asses and dripping pussies flood your mind.");
				dynStats("lus", 25);
				if (player.lib100 < 100) {
					if (player.lib100 < 50) dynStats("lib", 1);
					dynStats("lib", 1);
				}
			}
			if (rand(3) == 0 && changes < changeLimit && player.hasCock() && player.cocks[player.smallestCockIndex()].cockLength < 12) {
				outputText("\n\nHeat funnels into your cock as the alcohol flushes through you. Reaching down to inspect it, you find it has grown longer.");
				player.cocks[player.smallestCockIndex()].cockLength++;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.hasCock() && player.cocks[player.smallestCockIndex()].cockThickness < 4) {
				outputText("\n\nYou cock feels warm. When you reach down to inspect it your suspicions are confirmed; it's gotten thicker.");
				player.cocks[player.smallestCockIndex()].thickenCock(0.5);
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.balls > 0) {
				outputText("\n\nYou feel a warmth rising into your face along with a bubbling of alcohol tickling your nose. Once it's subsided, you notice your face has a more masculine, angular shape to it.");
				//player.modFem(0, 2 + rand(4));
				dynStats("lus", 20);
				if (player.cumMultiplier < 10) player.cumMultiplier += 1;
				if (player.cumMultiplier < 50) player.cumMultiplier += 0.5;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.hasVagina() && player.hasStatusEffect(StatusEffects.BonusVCapacity)) {
				outputText("\n\nYou feel a tingling sensation in your vagina... that was weird.");
				if (player.statusEffectv1(StatusEffects.BonusVCapacity) >= 0) {
					player.addStatusValue(StatusEffects.BonusVCapacity, 1, -(rand(5) + 5));
					if (player.statusEffectv1(StatusEffects.BonusVCapacity) <= 0) player.removeStatusEffect(StatusEffects.BonusVCapacity);
				}
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.hasVagina() && !player.hasCock()) {
				outputText("\n\nYour vagina begins to feel hot. Removing your [armor], you look down and watch your vagina shrinks to nothing, while your clitoris enlarges to form a human dick.");
				player.removeVagina();
				player.createCock(6, 1, CockTypesEnum.HUMAN);
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.hasCock() && player.balls <= 0) {
				outputText("Without warning your body begins to tremble as just below [eachCock] you feel a warm trickling sensation of fluid sliding down your body. Before you can check it, the sensation becomes overwhelming as [eachCock] grows hard and ejaculates " + player.clothedOrNaked("into your [armor]", "all over the ground") + ". Once you've recovered from your intense orgasm you " + player.clothedOrNakedLower("remove your [armor] to ") + "clean yourself and find a new pair of balls hanging just below [eachCock].");
				player.balls = 2;
				player.ballSize = 1;
				player.orgasm('Generic');
				changes++;
			}
			//Transformations
			//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);

			if (rand(3) == 0 && changes < changeLimit && player.hasScales()) {
				outputText("\n\nYou feel an odd rolling sensation as your scales begin to shift, spreading and reforming as they grow and disappear, becoming normal human skin.");
				player.skin.type = Skin.PLAIN;
				player.underBody.restore();
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.arms.type != Arms.HUMAN) {
				outputText("\n\nYou feel a pleasant heat in your arms as smoke rises from them, leaving normal human arms.");
				player.arms.type = Arms.HUMAN;
				changes++;
			}
			if (rand(4) == 0 && changes < changeLimit && player.lowerBody.type != LowerBody.CLOVEN_HOOFED) {
				outputText("\n\nYou feel an odd sensation in your lower region. Your [feet] shift and you hear bones cracking as they reform. Fur grows on your legs and soon you're looking at a new pair of goat legs.");
				player.lowerBody.type = LowerBody.CLOVEN_HOOFED;
				player.lowerBody.legCount = 2;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.lowerBody.type == LowerBody.CLOVEN_HOOFED && player.horns.type == Horns.GOAT && player.face.type != Face.HUMAN) {
				outputText("\n\nYour face grows warm as suddenly your vision is engulfed in smoke, coughing and beating the smoke back you noticed a marked change in your features. Touching yourself you confirm you have a normal human shaped face once again.");
				player.face.type = Face.HUMAN;
				changes++;
			}
			if (rand(4) == 0 && changes < changeLimit && !player.hasScales() && player.ears.type != Ears.ELFIN) {
				outputText("\n\nYou feel an odd shifting sensation on the side of your head and, reaching up to inspect it, find a pair of fleshy pointed ears. ");
				if (player.hasFur()) ("As you examine your new elvish ears you feel fur grow around them, matching the rest of you.");
				player.ears.type = Ears.ELFIN;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.horns.type == Horns.NONE) {
				outputText("\n\nYou begin to feel a prickling sensation at the top of your head. Reaching up to inspect it, you find a pair of hard stubs. You now have a pair of goat horns.");
				player.horns.type = Horns.GOAT;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.horns.type != Horns.GOAT) {
				outputText("\n\nYou begin to feel an odd itching sensation as you feel your horns repositioning. Once it's over, you reach up and find a pair of hard stubs. You now have a pair of goat horns.");
				player.horns.value = 1;
				player.horns.type = Horns.GOAT;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.horns.type == Horns.GOAT && player.horns.value == 1) {
				outputText("\n\nYou feel heat blooming in your forehead. Confused you reach up to find your goat horns growing and thickening into a pair of horns with ridges and a slight curve. You now have a pair of tall-standing goat horns.");
				player.horns.value = 2;
				changes++;
			}
			if (rand(4) == 0 && changes < changeLimit && player.antennae.type != Antennae.NONE) {
				mutations.removeAntennae();
			}
			if (rand(3) == 0 && changes < changeLimit && player.cockTotal() == 1 && player.countCocksOfType(CockTypesEnum.HUMAN) == 0) {
				outputText("\n\nYou feel a stirring in your loins as your cock grows rock hard. You " + player.clothedOrNakedLower("pull it out from your [armor], to ") + "take a look. It seems you now have a human dick again.");
				player.cocks[0].cockType = CockTypesEnum.HUMAN;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.cockTotal() > 1 && (player.cockTotal() - player.countCocksOfType(CockTypesEnum.HUMAN)) > 0) {
				outputText("\n\nOne of your penises begins to feel strange. You " + player.clothedOrNakedLower("pull it out from your [armor], releasing", "notice") + " a plume of thick smoke. When you look down you see it has become a human dick.");
				for (var i:int = 0; i < player.cockTotal(); i++) {
					if (player.cocks[i].cockType != CockTypesEnum.HUMAN) {
						player.cocks[i].cockType = CockTypesEnum.HUMAN;
						break;
					}
				}
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.tail.type == 0) {
				outputText("\n\nYou feel an odd itchy sensation just above your [ass]. Twisting around to inspect it you find a short stubby tail that wags when you're happy. You now have a goat tail.");
				player.tail.type = Tail.GOAT;
				changes++;
			}
			if (rand(3) == 0 && changes < changeLimit && player.tail.type > 0 && player.tail.type != Tail.GOAT) {
				outputText("\n\nYou [tail] suddenly goes numb. Looking back you see it changing, twisting and reforming into a short stubby goat-like tail.");
				player.tail.type = Tail.GOAT;
				changes++;
			}
			//No changes?
			if (changes == 0) {
				outputText("\n\nAside from a mild buzz, the wine has no further effect.");
			}
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;
			return false;
		}
	}
}


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

	/**
	 * Item that increases INT
	 */
	public class ScholarsTea extends Consumable
	{
		private static const ITEM_VALUE:int = 15;

		public function ScholarsTea()
		{
			super("Smart T", "Scholars T.", "a cup of scholar's tea", ITEM_VALUE, "This powerful brew supposedly has mind-strengthening effects.");
		}

		override public function useItem():Boolean
		{
			player.slimeFeed();
			clearOutput();
			outputText("Following the merchant's instructions, you steep and drink the tea. Its sharp taste fires up your palate and in moments, you find yourself more alert and insightful. As your mind wanders, a creative, if somewhat sordid, story comes to mind. It is a shame that you do not have writing implements as you feel you could make a coin or two off what you have conceived. The strange seller was not lying about the power of the tea.");
			if (rand(3) === 0) {
				outputText(player.modTone(15, 1));
			}
			//Now NERFED!
			if (player.inte100 < 40) {
				dynStats("int", 1.5 + rand(4));
			}
			else if (player.inte100 < 60) {
				dynStats("int", 1 + rand(3));
			}
			else if (player.inte100 < 80) {
				dynStats("int", 0.5 + rand(2));
			}
			else {
				dynStats("int", 0.2 + rand(2));
			}

			player.refillHunger(10);

			return false;
		}
	}
}


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

	/**
	 * Increases sensitivity.
	 */
	public class SensitivityDraft extends Consumable
	{
		private static const ITEM_VALUE:int = 15;

		public function SensitivityDraft()
		{
			super("SensDrf","SensDraft", "a bottle of sensitivity draft", ITEM_VALUE, "This carefully labelled potion is a 'Sensitivity Draft', and if the diagrams are any indication, it will make your body more sensitive.");
		}

		override public function useItem():Boolean
		{
			player.slimeFeed();
			clearOutput();
			outputText("You pop the cork on this small vial and drink down the clear liquid.  It makes your lips and tongue tingle strangely, letting you feel each globule of spit in your mouth and each breath of air as it slides past your lips.");

			if (player.hasStatusEffect(StatusEffects.Dysfunction)) {
				outputText("\n\nThankfully, the draft invigorates your groin, replacing the numbness with waves of raw sensation.  It seems your crotch is back to normal and <b>you can masturbate again!</b>");
				player.removeStatusEffect(StatusEffects.Dysfunction);
			}
			if (rand(4) === 0 && !player.hasStatusEffect(StatusEffects.LustyTongue)) {
				outputText("The constant tingling in your mouth grows and grows, particularly around your lips, until they feel as sensitive as ");
				if (player.hasVagina()) outputText("your");
				else outputText("a woman's");
				outputText(" lower lips.  You'll have to be careful not to lick them!");
				//(Lustytongue status)
				player.createStatusEffect(StatusEffects.LustyTongue, 25, 0, 0, 0);
			}
			outputText("\n\nAfter the wave of sensation passes, your " + player.skin.desc + " feels a little more receptive to touch.  ");
			if (player.lust100 > 70 || player.lib100 > 70) {
				outputText("You shiver and think of how much better it'll make sex and masturbation.");
			}
			else outputText("You worry it'll make it harder to resist the attentions of a demon.");
			dynStats("sen", 10, "lus", 5);
			player.refillHunger(5);

			return false;
		}
	}

}


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

	public class SharkTooth extends Consumable
	{

		public function SharkTooth(tiger:Boolean)
		{
			super(tiger ? "TSTooth" : "Shark.T", tiger ? "TSTooth" : "Shark.T", tiger ? "a glowing tiger shark tooth" : "a sharp shark tooth", ConsumableLib.DEFAULT_VALUE, tiger ? "This looks like a normal shark tooth, though with an odd purple glow." : "A glinting white tooth, very sharp and intimidating.");
		}

		override public function useItem():Boolean
		{
			sharkTooth(this.id == "TSTooth" ? 1 : 0);
			return false;
		}

		public function sharkTooth(type:Number):void
		{
			var tfSource:String = "sharkTooth";
			if (type == 1) tfSource += "-tigershark";
			mutations.initTransformation([2, 2], 2);
			clearOutput();
			if (type == 0) outputText("You have no idea why, but you decide to eat the pointed tooth. To your surprise, it's actually quite brittle, turning into a fishy-tasting dust. You figure it must just be a tablet made to look like a shark's tooth.");
			else if (type == 1) outputText("You have no idea why, but you decide to eat the pointed, glowing tooth. To your surprise, it's actually quite brittle, crumbling into a fishy-tasting dust. Maybe it's just a tablet made to look like a shark's tooth.");
			//STATS
			//Increase strength 1-2 points (Up to 50) (60 for tiger)
			if (((player.str100 < 60 && type == 1) || player.str100 < 50) && rand(3) === 0) {
				dynStats("str", 1 + rand(2));
				outputText("\n\nA painful ripple passes through the muscles of your body.  It takes you a few moments, but you quickly realize you're a little bit stronger now.");
			}
			//Increase Speed 1-3 points (Up to 75) (100 for tigers)
			if (((player.spe100 < 100 && type == 1) || player.spe100 < 75) && rand(3) === 0) {
				dynStats("spe", 1 + rand(3));
				outputText("\n\nShivering without warning, you nearly trip over yourself as you walk.  A few tries later you realize your muscles have become faster.");
			}
			//Reduce sensitivity 1-3 Points (Down to 25 points)
			if (player.sens100 > 25 && rand(1.5) === 0 && changes < changeLimit) {
				dynStats("sen", (-1 - rand(3)));
				outputText("\n\nIt takes a while, but you eventually realize your body has become less sensitive.");
			}
			//Increase Libido 2-4 points (Up to 75 points) (100 for tigers)
			if (((player.lib100 < 100 && type == 1) || player.lib100 < 75) && rand(3) === 0 && changes < changeLimit) {
				dynStats("lib", (1 + rand(3)));
				outputText("\n\nA blush of red works its way across your skin as your sex drive kicks up a notch.");
			}
			//Decrease intellect 1-3 points (Down to 40 points)
			if (player.inte100 > 40 && rand(3) === 0 && changes < changeLimit) {
				dynStats("int", -(1 + rand(3)));
				outputText("\n\nYou shake your head and struggle to gather your thoughts, feeling a bit slow.");
			}
			//Smexual stuff!
			//-TIGGERSHARK ONLY: Grow a cunt (guaranteed if no gender)
			if (type == 1 && (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 the 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);
			}
			//WANG GROWTH - TIGGERSHARK ONLY
			if (type == 1 && (!player.hasCock()) && changes < changeLimit && rand(3) === 0) {
				//Genderless:
				if (!player.hasVagina()) outputText("\n\nYou feel a sudden stabbing pain in your featureless crotch and bend over, moaning in agony. Your hands clasp protectively over the surface - which is swelling in an alarming fashion under your fingers! Stripping off your clothes, you are presented with the shocking site of once-smooth flesh swelling and flowing like self-animate clay, resculpting itself into the form of male genitalia! When the pain dies down, you are the proud owner of a new human-shaped penis");
				//Female:
				else outputText("\n\nYou feel a sudden stabbing pain just above your " + player.vaginaDescript() + " and bend over, moaning in agony. Your hands clasp protectively over the surface - which is swelling in an alarming fashion under your fingers! Stripping off your clothes, you are presented with the shocking site of once-smooth flesh swelling and flowing like self-animate clay, resculpting itself into the form of male genitalia! When the pain dies down, you are the proud owner of not only a " + player.vaginaDescript() + ", but a new human-shaped penis");
				if (player.balls == 0) {
					outputText(" and a pair of balls");
					player.balls = 2;
					player.ballSize = 2;
				}
				outputText("!");
				player.createCock(7, 1.4);
				dynStats("lib", 4, "sen", 5, "lus", 20);
				changes++;
			}
			//(Requires the player having two testicles)
			if (type == 1 && (player.balls == 0 || player.balls == 2) && player.hasCock() && changes < changeLimit && rand(3) === 0) {
				if (player.balls == 2) {
					outputText("\n\nYou gasp in shock as a sudden pain racks your abdomen. Within seconds, two more testes drop down into your " + player.sackDescript() + ", your skin stretching out to accommodate them. Once the pain clears, you examine your new quartet of testes.");
					player.balls = 4;
				}
				else if (player.balls == 0) {
					outputText("\n\nYou gasp in shock as a sudden pain racks your abdomen. Within seconds, two balls drop down into a new sack, your skin stretching out to accommodate them. Once the pain clears, you examine your new pair of testes.");
					player.balls = 2;
					player.ballSize = 2;
				}
				dynStats("lib", 2, "sen", 3, "lus", 10);
				changes++;
			}
			//-Remove extra breast rows
			if (changes < changeLimit && player.breastRows.length > 1 && rand(3) === 0 && !flags[kFLAGS.HYPER_HAPPY]) {
				mutations.removeExtraBreastRow(tfSource);
			}
			//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);
			//Transformations:
			//Mouth TF
			if (player.face.type !== Face.SHARK_TEETH && rand(3) === 0 && changes < changeLimit) {
				outputText("\n\n");
				if (player.face.type > Face.HUMAN && player.face.type < Face.SHARK_TEETH) outputText("Your " + player.faceDescript() + " explodes with agony, reshaping into a more human-like visage.  ");
				player.face.type = Face.SHARK_TEETH;
				outputText("You firmly grasp your mouth, an intense pain racking your oral cavity. Your gums shift around and the bones in your jaw reset. You blink a few times wondering what just happened. You move over to a puddle to catch sight of your reflection, and you are thoroughly surprised by what you see. A set of retractable shark fangs have grown in front of your normal teeth, and your face has elongated slightly to accommodate them!  They even scare you a little.\n(Gain: 'Bite' special attack)");
				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++;
			}
			//Tail TF
			if (player.tail.type !== Tail.SHARK && rand(3) === 0 && changes < changeLimit) {
				changes++;
				if (player.tail.type == Tail.NONE) outputText("\n\nJets of pain shoot down your spine, causing you to gasp in surprise and fall to your hands and knees. Feeling a bulging at the end of your back, you lower your " + player.armorName + " down just in time for a fully formed shark tail to burst through. You swish it around a few times, surprised by how flexible it is. After some modifications to your clothing, you're ready to go with your brand new shark tail.");
				else outputText("\n\nJets of pain shoot down your spine into your tail.  You feel the tail bulging out until it explodes into a large and flexible shark-tail.  You swish it about experimentally, and find it quite easy to control.");
				player.tail.type = Tail.SHARK;
			}
			//Gills TF
			if (player.gills.type !== Gills.FISH && player.tail.type == Tail.SHARK && player.face.type == Face.SHARK_TEETH && changes < changeLimit && rand(3) === 0)
				mutations.updateGills(Gills.FISH);
			//Hair
			if (player.hair.color !== "silver" && rand(4) === 0 && changes < changeLimit) {
				changes++;
				outputText("\n\nYou feel a tingling in your scalp and reach up to your head to investigate. To your surprise, your hair color has changed into a silvery color, just like that of a shark girl!");
				player.hair.color = "silver";
			}
			//Skin
			if (((player.skin.tone !== "rough gray" && player.skin.tone !== "orange and black striped") || !player.hasPlainSkin()) && rand(7) === 0 && changes < changeLimit) {
				outputText("\n\n");
				if (player.isFurryOrScaley()) outputText("Your " + player.skin.desc + " falls out, collecting on the floor and exposing your supple skin underneath.  ");
				else if (player.hasGooSkin()) outputText("Your gooey skin solidifies, thickening up as your body starts to solidify into a more normal form. ");
				else if (type == 0) outputText("Your skin itches and tingles becoming slightly rougher and turning gray.  ");
				if (type == 0) {
					outputText("You abruptly stop moving and gasp sharply as a shudder goes up your entire frame. Your skin begins to shift and morph, growing slightly thicker and changing into a shiny gray color. Your skin now feels oddly rough too, comparable to that of a marine mammal. You smile and run your hands across your new shark skin.");
					player.skin.type = Skin.PLAIN;
					player.skin.desc = "skin";
					player.skin.tone = "rough gray";
					player.underBody.restore();
					player.arms.updateClaws(player.arms.claws.type);
					game.rathazul.addMixologyXP(20);
					changes++;
				}
				else {
					outputText("Your skin begins to tingle and itch, before rapidly shifting to a shiny orange color, marked by random black stripes. You take a quick look in a nearby pool of water, to see your skin has morphed in appearance and texture to become more like a tigershark!");
					player.skin.type = Skin.PLAIN;
					player.skin.desc = "skin";
					player.skin.tone = "orange and black striped";
					player.underBody.restore();
					player.arms.updateClaws(player.arms.claws.type);
					game.rathazul.addMixologyXP(20);
					changes++;
				}
			}
			//FINZ R WINGS
			if ((player.wings.type !== Wings.NONE || player.rearBody.type !== RearBody.SHARK_FIN) && changes < changeLimit && rand(3) === 0) {
				outputText("\n\n");
				if (player.wings.type !== Wings.NONE) outputText("Your wings fold into themselves, merging together with your back.  ");
				outputText("You groan and slump down in pain, almost instantly regretting eating the tooth. You start sweating profusely and panting loudly, feeling the space between your shoulder blades shifting about. You hastily remove your " + player.armorName + " just in time before a strange fin-like structure bursts from in-between your shoulders. You examine it carefully and make a few modifications to your " + player.armorName + " to accommodate your new fin.");
				player.rearBody.type = RearBody.SHARK_FIN;
				player.wings.restore();
				changes++;
			}
			if (changes == 0) {
				outputText("\n\nNothing happened.  Weird.");
			}
			player.refillHunger(5);
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;
		}

	}

}


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

	public class SheepMilk extends Consumable
	{
		public function SheepMilk()
		{
			super("SheepMk","SheepMk", "a bottle of sheep milk", ConsumableLib.DEFAULT_VALUE,"This bottle of sheep milk is said to have corruption-fighting properties.  It may be useful.");
		}

		override public function useItem():Boolean
		{
			player.slimeFeed();
			clearOutput();
			outputText("You gulp the bottle's contents, and its sweet taste immediately invigorates you, making you feel calm and concentrated");
			//-30 fatigue, -2 libido, -10 lust]
			player.changeFatigue(-30);
			dynStats("lib", -.25, "lus", -10, "cor", -0.5);
			player.refillHunger(20);

			return false;
		}
	}
}


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

	/**
	 * Tentacle transformative item.
	 */
	public class ShriveledTentacle extends Consumable
	{
		public function ShriveledTentacle()
		{
			super("DryTent","DryTent", "a shriveled tentacle", ConsumableLib.DEFAULT_VALUE, "A dried tentacle from one of the lake anemones.  It's probably edible, but the stingers are still a little active.");
		}

		override public function useItem():Boolean
		{
			var tfSource:String = "shriveledTentacle";
			var temp:int = 0;
			mutations.initTransformation([2, 3]);
			clearOutput();
			outputText("You chew on the rubbery tentacle; its texture and taste are somewhat comparable to squid, but the half-dormant nematocysts cause your mouth to tingle sensitively.");

			//possible use effects:
			//- toughess up, sensitivity down
			if (rand(3) === 0 && player.tou100 < 50 && changes < changeLimit) {
				outputText("\n\nYour skin feels clammy and a little rubbery.  You touch yourself experimentally and notice that you can barely feel the pressure from your fingertips.  Consumed with curiosity, you punch yourself lightly in the arm; the most you feel is a dull throb!");
				dynStats("tou", 1, "sen", -1);
			}
			//- speed down
			if (rand(3) === 0 && player.spe100 > 40 && changes < changeLimit) {
				outputText("\n\nA pinprick sensation radiates from your stomach down to your knees, as though your legs were falling asleep.  Wobbling slightly, you stand up and take a few stumbling steps to work the blood back into them.  The sensation fades, but your grace fails to return and you stumble again.  You'll have to be a little more careful moving around for a while.");
				dynStats("spe", -1);
			}
			//- corruption increases by 1 up to low threshold (~20)
			if (rand(3) === 0 && player.cor < 20 && changes < changeLimit) {
				outputText("\n\nYou shiver, a sudden feeling of cold rushing through your extremities.");
				changes++;
				dynStats("cor", 1);
			}
			//-always increases lust by a function of sensitivity
			//"The tingling of the tentacle

			//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);
			}

			//physical changes:
			//- may randomly remove bee abdomen, if present; always checks and does so when any changes to hair might happen
			if (rand(4) === 0 && changes < changeLimit && player.tail.type === Tail.BEE_ABDOMEN) {
				outputText("\n\nAs the gentle tingling of the tentacle's remaining venom spreads through your body, it begins to collect and intensify above the crack of your butt.  Looking back, you notice your abdomen shivering and contracting; with a snap, the chitinous appendage parts smoothly from your backside and falls to the ground.  You no longer have a bee abdomen!\n\n");
				player.tail.type = Tail.NONE;
				changes++;
			}
			//-may randomly remove bee wings:
			if (rand(4) === 0 && (player.wings.type === Wings.BEE_LIKE_SMALL || player.wings.type === Wings.BEE_LIKE_LARGE) && changes < changeLimit) {
				outputText("\n\nYour wings twitch and flap involuntarily.  You crane your neck to look at them as best you are able; from what you can see, they seem to be shriveling and curling up.  They're starting to look a lot like they did when they first popped out, wet and new.  As you watch, they shrivel all the way, then recede back into your body.");
				player.wings.type = Wings.NONE;
				changes++;
			}
			//-hair morphs to anemone tentacles, retains color, hair shrinks back to med-short('shaggy') and stops growing, lengthening treatments don't work and goblins won't cut it, but more anemone items can lengthen it one level at a time
			if (player.gills.type === Gills.ANEMONE && player.hair.type !== 4 && changes < changeLimit && rand(5) === 0) {
				outputText("\n\nYour balance slides way off, and you plop down on the ground as mass concentrates on your head.  Reaching up, you give a little shriek as you feel a disturbingly thick, squirming thing where your hair should be.  Pulling it down in front of your eyes, you notice it's still attached to your head; what's more, it's the same color as your hair used to be.  You now have squirming tentacles in place of hair!  As you gaze at it, a gentle heat starts to suffuse your hand.  The tentacles must be developing their characteristic stingers!  You quickly let go; you'll have to take care to keep them from rubbing on your skin at all hours.  On the other hand, they're quite short and you find you can now flex and extend them as you would any other muscle, so that shouldn't be too hard.  You settle on a daring, windswept look for now.");
				player.hair.type = 4;
				player.hair.length = 5;
				if (flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] === 0) {
					outputText("  (Your hair has stopped growing.)");
					flags[kFLAGS.HAIR_GROWTH_STOPPED_BECAUSE_LIZARD] = 1;
				}
				changes++;
				changes++;
				changes++;
				//(reset hair to 'shaggy', add tentacle hair status, stop hair growth)
				//appearance screen: replace 'hair' with 'tentacle-hair'
			}

			//-feathery gills sprout from chest and drape sensually over nipples (cumulative swimming power boost with fin, if swimming is implemented)
			if (rand(5) === 0 && player.gills.type !== Gills.ANEMONE && player.skin.tone === "aphotic blue-black" && changes < changeLimit) {
				mutations.updateGills(Gills.ANEMONE);
			}

			//-[aphotic] skin tone (blue-black)
			if (rand(5) === 0 && changes < changeLimit && player.skin.tone !== "aphotic blue-black") {
				outputText("\n\nYou absently bite down on the last of the tentacle, then pull your hand away, wincing in pain.  How did you bite your finger so hard?  Looking down, the answer becomes obvious; your hand, along with the rest of your skin, is now the same aphotic color as the dormant tentacle was!");
				player.skin.tone = "aphotic blue-black";
				player.arms.updateClaws(player.arms.claws.type);
				game.rathazul.addMixologyXP(20);
				changes++;
			}
			//-eat more, grow more 'hair':
			if (player.hair.type === Hair.ANEMONE && player.hair.length < 36 &&
					rand(2) === 0 && changes < changeLimit) {
				temp = 5 + rand(3);
				player.hair.length += temp;
				outputText("\n\nAs you laboriously chew the rubbery dried anemone, your head begins to feel heavier.  Using your newfound control, you snake one of your own tentacles forward; holding it out where you can see it, the first thing you notice is that it appears quite a bit longer.  Your head-tentacles are now " + num2Text(temp) + " inches longer!");
				//(add one level of hairlength)
				changes++;
			}
			player.refillHunger(20);
			flags[kFLAGS.TIMES_TRANSFORMED] += changes;

			return false;
		}
	}
}


code:
/**
 * Created by aimozg on 10.01.14.
 */
package classes.Items.Consumables
{
	import classes.Items.Consumable;

	public class SimpleConsumable extends Consumable {
		private var effect:Function;

		/**
		 * @param effect Function(player:Player)
		 */
		public function SimpleConsumable(id:String, shortName:String, longName:String, effect:Function, value:Number = 0, description:String = null) {
			super(id, shortName, longName, value, description);
			this.effect = effect;
		}

		override public function useItem():Boolean {
			clearOutput();
			effect(player);
			return(false); //Any normal consumable does not have a sub-menu. Return false so that the inventory runs the itemDoNext function after useItem.
		}
	}
}