code:
/**
 * Created by aimozg on 26.03.2017.
 */
package classes.Scenes {
import classes.Appearance;
import classes.BaseContent;
import classes.GlobalFlags.kFLAGS;
import classes.GlobalFlags.kGAMECLASS;
import classes.lists.*;
import classes.PerkLib;
import classes.Scenes.API.Encounter;
import classes.Scenes.API.Encounters;
import classes.Scenes.API.FnHelpers;
import classes.Scenes.Monsters.Goblin;
import classes.Scenes.Monsters.Imp;
import classes.display.SpriteDb;
import classes.internals.*;
import classes.Vagina;

public class CommonEncounters extends BaseContent implements Encounter {

	// This could be moved to ImpScene class
	private var _impEncounter:Encounter = null;
	public function get impEncounter():Encounter {
		const fn:FnHelpers = Encounters.fn;
		return _impEncounter ||= Encounters.build({
			chance: impEncounterBaseChance,
			mods  : [lethiteMod],
			call  : Encounters.complex(1, "imps", {
				name  : "twoimpsclash",
				chance: fn.lineByLevel(1, 20, 0.1, 0.01), // x0.1 at level 1, x0.01 at level 20+
				call  : twoImpsClashing
			}, {
				name  : "imp",
				chance: fn.lineByLevel(1, 20, 1.0, 0.5), // x1 at level 1, x0.5 at level 20+
				call  : impCombatEncounter
			}, {
				name  : "alice",
				call  : game.forest.aliceScene,
				when  : function ():Boolean {
					return flags[kFLAGS.UNDERAGE_ENABLED] >= 0;
				},
				chance: fn.lineByLevel(1, 20, 0.1, 0.3) // x0.1 at level 1, x0.3 at level 20+
			}, {
				name  : "implord",
				call  : game.impScene.impLordEncounter,
				when  : fn.ifLevelMin(8),
				chance: fn.lineByLevel(8, 16, 0.5, 2.0) // x0.5 at level 8, x2 at level 16+
			}, {
				name  : "impwarlord",
				call  : game.impScene.impWarlordEncounter,
				when  : fn.ifLevelMin(12),
				chance: fn.lineByLevel(12, 20, 0.5, 3.0) // x0.5 at level 12, x3 at level 20+
			}, {
				name  : "impoverlord",
				call  : game.impScene.impOverlordEncounter,
				when  : fn.ifLevelMin(16),
				chance: fn.lineByLevel(16, 20, 0.5, 4.0) // x0.5 at level 16, x4 at level 20+
			})
		});
	}

	private var _goblinEncounter:Encounter = null;
	public function get goblinEncounter():Encounter {
		const fn:FnHelpers = Encounters.fn;
		return _goblinEncounter ||= Encounters.build({
			chance: 0.5,
			call  : Encounters.complex(1, "goblins", {
				name  : "goblin",
				chance: fn.lineByLevel(1, 20, 1.0, 0.5), // x1 at level 1, x0.5 at level 20+
				call  : goblinCombatEncounter
			}, {
				name  : "gobass",
				call  : game.goblinAssassinScene.goblinAssassinEncounter,
				when  : fn.ifLevelMin(10),
				chance: fn.lineByLevel(10, 14, 0.5, 2.0) // x0.5 at level 10, x2 at level 16+
			}, {
				name  : "gobwar",
				call  : game.goblinWarriorScene.goblinWarriorEncounter,
				when  : fn.ifLevelMin(12),
				chance: fn.lineByLevel(12, 18, 0.5, 3.0) // x0.5 at level 12, x3 at level 18+
			}, {
				name  : "gobsha",
				call  : game.goblinShamanScene.goblinShamanEncounter,
				when  : fn.ifLevelMin(12),
				chance: fn.lineByLevel(12, 18, 0.5, 3.0) // x0.5 at level 12, x3 at level 18+
			}/*, {
				name  : "gobeld",
				call  : game.goblinElderScene.goblinElderEncounter,
				when  : fn.ifLevelMin(16),
				chance: fn.lineByLevel(16, 20, 0.5, 4.0) // x0.5 at level 16, x4 at level 20+
			}*/)
		})
	}

	public function encounterChance():Number {
		return theCommonEncounters.encounterChance();
	}

	public function execEncounter():void {
		theCommonEncounters.execEncounter();
	}

	public function encounterName():String {
		return "common";
	}

	/**
	 * Imp, Goblin, Helia sex ambush
	 */
	public function get withImpGob():Encounter {
		return _withImpGob ||= Encounters.group("common",
				impEncounter,
				goblinEncounter,
				theCommonEncounters);
	}

	private var _withImpGob:Encounter = null;
	/* Alternative version:
	 public const withImpGob2:Encounter = new LateinitEncounter(this,function():Encounter{
	 return Encounters.group("common",impEncounter,
	 goblinEncounter,
	 theCommonEncounters);
	 });*/

	/**
	 * Helia sex ambush
	 */
	public function get theCommonEncounters():Encounter {
		return _tce ||= Encounters.group("common",
				game.helScene.helSexualAmbushEncounter);
	}

	private var _tce:Encounter = null;

	public function furriteMod():Number {
		return furriteFnGen()();
	}

	public function lethiteMod():Number {
		return lethiteFnGen()();
	}

	public function furriteFnGen(iftrue:Number = 3, iffalse:Number = 1):Function {
		return function ():Number {
			return player.findPerk(PerkLib.PiercedFurrite) >= 0 ? iftrue : iffalse;
		}
	}

	public function lethiteFnGen(iftrue:Number = 3, iffalse:Number = 1):Function {
		return function ():Number {
			return player.findPerk(PerkLib.PiercedLethite) >= 0 ? iftrue : iffalse;
		}
	}

	public function impEncounterBaseChance():Number {
		var impch:Number = 5;
		if (player.totalCocks() > 0) impch--;
		if (player.hasVagina()) impch++;
		if (player.totalFertility() >= 30) impch++;
		if (player.cumQ() >= 200) impch--;
		return impch / 10;
	}

	private function twoImpsClashing():void {
		//Two imps clashing, UTG stuff.
		//game.counters.mImp.encountered++; // <- call this on non-combat encounters
		clearOutput();
		outputText("A small imp bursts from behind a rock and buzzes towards you. You prepare for a fight, but it stays high and simply flies above you. Suddenly another imp appears from nowhere and attacks the first. In the tussle one of them drops an item, which you handily catch, as the scrapping demons fight their way out of sight. ");
		unlockCodexEntry(kFLAGS.CODEX_ENTRY_IMPS);
		inventory.takeItem(randomChoice(consumables.SUCMILK, consumables.INCUBID,
				consumables.IMPFOOD), camp.returnToCampUseOneHour);
	}

	private function impCombatEncounter():void {
		clearOutput();
		outputText("An imp wings out of the sky and attacks!");
		unlockCodexEntry(kFLAGS.CODEX_ENTRY_IMPS);
		doNext(playerMenu);
		startCombat(new Imp());
		spriteSelect(SpriteDb.s_imp);
	}

	public function goblinCombatEncounter():void {
		clearOutput();
		if (player.gender == Gender.NONE) outputText("A goblin saunters out of the bushes with a dangerous glint in her eyes.\n\nShe says, \"Time to get fuc-oh shit, you don't even have anything to play with!  This is for wasting my time!\"");
		else if (player.isChild()) outputText("A goblin saunters out of the bushes with a dangerous glint in her eyes.\n\n\"Seldom see a traveler so close to my size, and you certainly don't look like any imp I've ever seen.\" she says, continuing, \"That makes it all the more fun to hold you down and fuck you like the little slut you are.\"");
		else outputText("A goblin saunters out of the bushes with a dangerous glint in her eyes.\n\nShe says, \"Time to get fucked, " + player.mf("stud", "slut") + ".\"");
		unlockCodexEntry(kFLAGS.CODEX_ENTRY_GOBLINS);
		startCombat(new Goblin());
		spriteSelect(SpriteDb.s_goblin);
	}

	public function bigJunkChance():Number {
		return (player.longestCockLength() >= player.tallness
				&& player.totalCockThickness() >= 12)
				? 1 + (player.longestCockLength() - player.tallness) / 24
				: 0;
	}

	// TODO merge
	//[RANDOM SCENE IF CHARACTER HAS AT LEAST ONE COCK LARGER THAN THEIR HEIGHT, AND THE TOTAL COMBINED WIDTH OF ALL THEIR COCKS IS TWELVE INCHES OR GREATER]
	public function bigJunkForestScene(lake:Boolean = false):void {
		clearOutput();
		var x:Number = player.longestCock();

		//PARAGRAPH 1
		outputText("Walking along the ");
		if (lake) outputText("grassy and muddy shores of the lake");
		else outputText("various paths of the forest");
		outputText(", you find yourself increasingly impeded by the bulk of your " + player.cockDescript(x) + " dragging along the ");
		if (lake) outputText("wet ground behind you.");
		else outputText("earth behind you.");
		if (player.cocks.length == 1) {
			if (lake) outputText("  As it drags through the lakeside mud, the sensation forces you to imagine the velvety folds of a monstrous pussy sliding along the head of your " + Appearance.cockNoun(player.cocks[x].cockType) + ", gently attempting to suck it off.");
			else outputText("  As it drags across the grass, twigs, and exposed tree roots, the sensation forces you to imagine the fingers of a giant hand sliding along the head of your " + Appearance.cockNoun(player.cocks[x].cockType) + ", gently jerking it off.");
		}
		else if (player.cocks.length >= 2) {
			if (lake) outputText("  With all of your " + player.multiCockDescriptLight() + " dragging through the mud, they begin feeling as if the lips of " + num2Text(player.cockTotal()) + " different cunts were slobbering over each one.");
			else outputText("  With all of your " + player.multiCockDescriptLight() + " dragging across the grass, twigs, and exposed tree roots, they begin feeling as if the rough fingers of " + num2Text(player.cockTotal()) + " different monstrous hands were sliding over each shaft, gently jerking them off.");
		}
		outputText("\n\n");

		//PARAGRAPH 2
		//FOR NON-CENTAURS]
		if (!player.isTaur()) {
			outputText("The impending erection can't seem to be stopped.  Your sexual frustration forces stiffness into your " + player.multiCockDescriptLight() + ", which forces your torso to the ground.  Normally your erection would merely raise itself skyward, but your genitals have grown too large and heavy for your " + player.hipDescript() + " to hold them aloft.  Instead, you feel your body forcibly pivoting at the hips until your torso is compelled to rest face down atop your " + player.multiCockDescriptLight() + ".");
			//IF CHARACTER HAS GIANT BREASTS ADD SENTENCE
			if (player.biggestTitSize() >= 35) {
				if (lake) outputText("  Your " + player.chestDesc() + " hang lewdly off your torso to rest in the lakeside mud, covering much of the ground to either side of you.  Their immense weight anchors your body, further preventing your torso from lifting itself up.  Mud cakes against their undersides and coats your " + player.nippleDescript(0) + "s.");
				else outputText("  Your " + player.chestDesc() + " hang lewdly off your torso to rest on the twings and dirt, covering up much of the ground to either side of you.  Their immense weight anchors your body, further preventing your torso from lifting itself up.  The rough texture of the bark on various tree roots teases your " + player.nippleDescript(0) + "s mercilessly.");
			}
			//IF CHARACTER HAS A BALLS ADD SENTENCE
			if (player.balls > 0) {
				outputText("  Your " + player.skin.tone + " " + player.sackDescript() + " rests beneath your raised " + player.buttDescript() + ".  Your " + player.ballsDescriptLight() + " pulse with the need to release their sperm through your " + player.multiCockDescriptLight() + " and ");
				if (lake) outputText("into the waters of the nearby lake.");
				else outputText("onto the fertile soil of the forest.");
			}
			//IF CHARACTER HAS A VAGINA ADD SENTENCE
			if (player.vaginas.length >= 1) {
				outputText("  Your " + player.vaginaDescript() + " and " + player.clitDescript() + " are thoroughly squashed between the bulky flesh where your male genitals protrude from between your hips and the " + player.buttDescript() + " above.");
				//IF CHARACTER HAS A DROOLING PUSSY ADD SENTENCE
				if (player.vaginas[0].vaginalWetness >= Vagina.WETNESS_DROOLING) {
					outputText("  Juices stream from your womanhood and begin pooling on the dirt and twigs beneath you.  ");
					if (lake) outputText("The drooling fem-spunk only makes the ground more muddy.");
					else outputText("The sticky fem-spunk immediately soaks down into the rich soil.");
				}
			}
		}
		//FOR CENTAURS
		else if (player.isTaur()) {
			outputText("  The impending erection can't seem to be stopped.  Your sexual frustration forces stiffness into your " + player.multiCockDescriptLight() + ", which forces the barrel of your bestial torso to the ground.  Normally your erection would merely hover above the ground in between your legs, but your genitals have grown too large and heavy for your " + player.hipDescript() + " to hold them aloft.  Instead, you feel your body being forcibly pulled down at your hind legs until your bestial body is resting on top of your " + player.multiCockDescriptLight() + ".");
			//IF CHARACTER HAS GIANT BREASTS ADD SENTENCE
			if (player.biggestTitSize() >= 35) {
				if (lake) outputText("  Your " + player.chestDesc() + " pull your human torso forward until it also is forced to face the ground, obscured as it is in boob-flesh.  Your tits rest on the wet earth to either side of you.  Their immense weight anchors you, further preventing any part of your equine body from lifting itself up.  Mud cakes their undersides and coats your " + player.nippleDescript(0) + "s.");
				else outputText("  Your " + player.chestDesc() + " pull your human torso forward until it also is forced to face the ground, obscured as it is in boob-flesh.  Your tits rest on the dirt and twigs to either side of you.  Their immense weight anchors you, further preventing any part of your equine body from lifting itself up.  The rough texture of the bark on various tree roots teases your " + player.nippleDescript(0) + "s mercilessly.");
			}
			//IF CHARACTER HAS A BALLS ADD SENTENCE
			if (player.balls > 0) {
				outputText("  Your " + player.skin.tone + player.sackDescript() + " rests beneath your raised " + player.buttDescript() + ".  Your " + player.ballsDescriptLight() + " pulse with the need to release their sperm through your " + player.multiCockDescriptLight() + " and ");
				if (lake) outputText("into the waters of the nearby lake.");
				else outputText("onto the fertile soil of the forest floor.");
			}
			//IF CHARACTER HAS A VAGINA ADD SENTENCE
			if (player.vaginas.length >= 1) {
				outputText("  Your " + player.vaginaDescript() + " and " + player.clitDescript() + " are thoroughly squashed between the bulky flesh where your male genitals protrude from between your hips and the " + player.buttDescript() + " above.");
				//IF CHARACTER HAS A DROOLING PUSSY ADD SENTENCE
				if (player.vaginas[0].vaginalWetness >= Vagina.WETNESS_DROOLING) {
					if (lake) outputText("  A leaf falls from a tree and lands on the wet lips of your cunt, its light touch teasing your sensitive skin.  Like a mare or cow in heat, your juices stream from your womanhood and pool in the mud beneath you.  The sloppy fem-spunk only makes the ground more muddy.");
					else outputText("  A leaf falls from a tree and lands on the wet lips of your cunt, its light touch teasing your sensitive skin.  Like a mare or cow in heat, your juices stream from your womanhood and pool in the dirt and twigs beneath you.");
				}
			}
		}
		outputText("\n\n");
		//PARAGRAPH 3
		outputText("You realize you are effectively trapped here by your own body.");
		//CORRUPTION BASED CHARACTER'S VIEW OF SITUATION
		if (player.cor < 33) outputText("  Panic slips into your heart as you realize that if any dangerous predator were to find you in this state, you'd be completely defenseless.  You must find a way to regain your mobility immediately!");
		else if (player.cor < 66) outputText("  You realize that if any dangerous predator were to find you in this state, you'd be completely defenseless!  You must find a way to regain your mobility... yet there is a certain appeal to imagining how pleasurable it would be for a sexual predator to take advantage of your obscene body.");
		else outputText("  Your endowments have rendered you completely helpless should any predators find you.  Somewhere in your heart, you find this prospect almost exhilarating.  The idea of being a helpless fucktoy for a wandering beast is unusually inviting to you.  Were it not for the thought that you might starve to death, you'd be incredibly tempted to remain right where you are.");

		if (lake) {
			//SCENE END = IF CHARACTER HAS FULL WINGS ADD SENTENCE
			if (player.canFly()) outputText("  You extend your wings and flap as hard as you can until at last, you manage to lighten the bulk of your body.  It helps just enough to let you drag your genitals out of the mud and back to camp.  The ordeal takes nearly an hour for you to return and deal with.");
			//Taurs
			else if (player.isTaur()) outputText("  You struggle and work your multiple legs against the wet ground.  Your " + player.feet() + " have consistent trouble finding footing as the mud fails to provide enough leverage to lift your bulk.  You breathe in deeply and lean side to side, trying to find some easier vertical leverage beneath your feet.  Eventually, with a crude crawl, your legs manages to push the bulk of your body onto more solid ground.  With great difficulty, you spend the next hour shuffling your genitals back to camp.");
			//SCENE END = FOR ALL OTHER CHARACTERS
			else outputText("  You struggle and push with your " + player.legs() + " as hard as you can, but it's no use.  You do the only thing you can and begin stroking your " + player.multiCockDescriptLight() + " with as much vigor as you can muster.  Eventually, your body tenses and a light load of jizz erupts from your body, but the orgasm is truly mild compared to what you need.  You're far too weary from struggling to give yourself the masturbation you truly need, but you continue to try.  Nearly an hour later, " + player.sMultiCockDesc() + " has softened enough to allow you to stand again, and you make your way back to camp, still dragging your genitals through the mud.");
		}
		else {
			//SCENE END = IF CHARACTER HAS FULL WINGS ADD SENTENCE
			if (player.canFly()) outputText("  You extend your wings and flap as hard as you can, until at last, you manage to lighten the bulk of your body.  It helps just enough to let you drag your genitals out of the forest and back to camp.  The ordeal takes nearly an hour for you to return and deal with.");
			//SCENE END IF CHARACTER HAS CENTAUR BODY
			else if (player.isTaur()) outputText("  You struggle and work your multiple legs against the soft dirt.  Your " + player.feet() + " have consistent trouble finding footing as the ground fails to provide enough leverage to lift your bulk.  You breathe in deeply and lean side to side, until eventually, your feet brace against the various roots of the trees around you.  With a crude crawl, your legs manage to shuffle your body and genitals out of the forest and back to camp.");
			//SCENE END = FOR ALL OTHER CHARACTERS
			else outputText("  You struggle and push with your " + player.legs() + " as hard as you can, but it's no use.  You do the only thing you can and begin stroking your " + player.multiCockDescriptLight() + " with as much vigor as you can muster.  Eventually, your body tenses and a light load of jizz erupts from your loins, but the orgasm is truly mild compared to what you need.  You're far too weary from struggling to give yourself the masturbation you truly need, but you continue to try.  Nearly an hour later, " + player.sMultiCockDesc() + " has softened enough to allow you to stand again, and you make your way back to camp, still dragging your genitals across the forest floor.");
		}
		dynStats("lus", 25 + rand(player.cor / 5), "scale", false);
		player.changeFatigue(5);
		doNext(camp.returnToCampUseOneHour);
	}

	//Massive bodyparts scene
	//[DESERT]
	//[RANDOM SCENE IF CHARACTER HAS AT LEAST ONE COCK LARGER THAN THEIR HEIGHT,
	//AND THE TOTAL COMBINED WIDTH OF ALL THEIR COCKS IS TWELVE INCHES OR GREATER]
	public function bigJunkDesertScene():void {
		clearOutput();
		var x:Number = player.longestCock();
		//PARAGRAPH 1
		outputText("Walking along the sandy dunes of the desert you find yourself increasingly impeded by the bulk of your " + player.cockDescript(x) + " dragging along the sandscape behind you.  The incredibly hot surface of the desert causes your loins to sweat heavily and fills them with relentless heat.");

		if (player.cocks.length == 1) outputText("  As it drags along the dunes, the sensation forces you to imagine the rough textured tongue of a monstrous animal sliding along the head of your " + Appearance.cockNoun(player.cocks[x].cockType) + ".");
		else if (player.cocks.length >= 2) outputText("  With all of your " + player.multiCockDescriptLight() + " dragging through the sands they begin feeling as if the rough textured tongues of " + num2Text(player.cockTotal()) + " different monstrous animals were slobbering over each one.");
		outputText("\n\n");

		//PARAGRAPH 2

		//FOR NON-CENTAURS]
		if (!player.isTaur()) {
			outputText("The impending erection can't seem to be stopped.  Your sexual frustration forces stiffness into your " + player.multiCockDescriptLight() + ", which forces your torso to the ground.  Normally your erection would merely raise itself skyward but your genitals have grown too large and heavy for your " + player.hipDescript() + " to hold them aloft.  Instead you feel your body forcibly pivoting at the hips until your torso is compelled to rest face down on top of your obscene " + player.multiCockDescriptLight() + ".");

			//IF CHARACTER HAS GIANT BREASTS ADD SENTENCE
			if (player.biggestTitSize() >= 35) outputText("  Your " + player.allBreastsDescript() + " hang lewdly off your torso to rest on the desert sands, seeming to bury the dunes on either side of you.  Their immense weight anchors your body, further preventing your torso from lifting itself up.  The burning heat of the desert teases your " + player.nippleDescript(0) + "s mercilessly as they grind in the sand.");
			//IF CHARACTER HAS A BALLS ADD SENTENCE
			if (player.balls > 0) outputText("  Your " + player.skin.tone + player.sackDescript() + " rests beneath your raised " + player.buttDescript() + ".  The fiery warmth of the desert caresses it, causing your " + player.ballsDescriptLight() + " to pulse with the need to release their sperm through your " + player.multiCockDescriptLight() + ".");
			//IF CHARACTER HAS A VAGINA ADD SENTENCE
			if (player.vaginas.length >= 1) {
				outputText("  Your " + player.vaginaDescript() + " and " + player.clitDescript() + " are thoroughly squashed between the bulky flesh where your male genitals protrude from between your hips and the " + player.buttDescript() + " above.");
				//IF CHARACTER HAS A DROOLING PUSSY ADD SENTENCE
				if (player.vaginas[0].vaginalWetness >= Vagina.WETNESS_DROOLING) outputText("  Juices stream from your womanhood and begin pooling on the hot sand beneath you.  Wisps of steam rise up into the air only to tease your genitals further.  ");
			}
		}
		//FOR CENTAURS
		else {
			outputText("The impending erection can't seem to be stopped.  Your sexual frustration forces stiffness into your " + player.multiCockDescriptLight() + ", which forces the barrel of your horse-like torso to the ground.  Normally your erection would merely hover above the ground in between your centaurian legs, but your genitals have grown too large and heavy for your " + player.hipDescript() + " to hold them aloft.  Instead, you feel your body being forcibly pulled down at your hindquarters until you rest atop your " + player.multiCockDescriptLight() + ".");
			//IF CHARACTER HAS GIANT BREASTS ADD SENTENCE
			if (player.biggestTitSize() >= 35) outputText("  Your " + player.allBreastsDescript() + " pull your human torso forward until it also is forced to rest facedown, just like your horse half.  Your tits rest, pinned on the desert sand to either side of you.  Their immense weight anchors you, further preventing any part of your equine body from lifting itself up.  The burning heat of the desert teases your " + player.nippleDescript(0) + "s incessantly.");
			//IF CHARACTER HAS A BALLS ADD SENTENCE
			if (player.balls > 0) outputText("  Your " + player.skin.tone + player.sackDescript() + " rests beneath your raised " + player.buttDescript() + ".  The airy warmth of the desert teases it, causing your " + player.ballsDescriptLight() + " pulse with the need to release their sperm through your " + player.multiCockDescriptLight() + ".");
			//IF CHARACTER HAS A VAGINA ADD SENTENCE
			if (player.vaginas.length >= 1) {
				outputText("  Your " + player.vaginaDescript() + " and " + player.clitDescript() + " are thoroughly squashed between the bulky flesh where your male genitals protrude from between your hips and the " + player.buttDescript() + " above.");
				//IF CHARACTER HAS A DROOLING PUSSY ADD SENTENCE
				if (player.vaginas[0].vaginalWetness >= Vagina.WETNESS_DROOLING) outputText("  The desert sun beats down on your body, its fiery heat inflaming the senses of your vaginal lips.  Juices stream from your womanhood and begin pooling on the hot sand beneath you.");
			}
		}
		outputText("\n\n");
		//PARAGRAPH 3
		outputText("You realize you are effectively trapped here by your own body.");
		//CORRUPTION BASED CHARACTER'S VIEW OF SITUATION
		if (player.cor < 33) outputText("  Panic slips into your heart as you realize that if any dangerous predator were to find you in this state, you'd be completely defenseless.  You must find a way to regain your mobility immediately!");
		else if (player.cor < 66) outputText("  You realize that if any dangerous predator were to find you in this state you'd be completely defenseless.  You must find a way to regain your mobility... yet there is a certain appeal to imagining how pleasurable it would be for a sexual predator to take advantage of your obscene body.");
		else outputText("  Your endowments have rendered you completely helpless should any predators find you.  Somewhere in your heart, you're exhilarated at the prospect.  The idea of being a helpless fucktoy for a wandering beast is unusually inviting to you.  Were it not for the thought that you might die of thirst in the desert, you'd be incredibly tempted to remain right where you are.");

		//SCENE END = IF CHARACTER HAS FULL WINGS ADD SENTENCE
		if (player.canFly()) outputText("  You extend your wings and flap as hard as you can, until at last you manage to lighten the bulk of your body somewhat - enough to allow yourself to drag your genitals across the hot sands and back to camp.  The ordeal takes nearly an hour.");
		//SCENE END IF CHARACTER HAS CENTAUR BODY
		else if (player.isTaur()) outputText("  You struggle and work your equine legs against the surface of the dune you are trapped on.  Your " + player.feet() + " have consistent trouble finding footing, the soft sand failing to provide enough leverage to lift your bulk.  You breathe in deeply and lean from side to side, trying to find some easier vertical leverage.  Eventually, with a crude crawl, your legs manage to push the bulk of your body onto more solid ground.  With great difficulty, you spend the next hour shuffling your genitals across the sandscape and back to camp.");
		//SCENE END = FOR ALL OTHER CHARACTERS
		else outputText("  You struggle and push with your " + player.legs() + " as hard as you can, but it's no use.  You do the only thing you can and begin stroking your " + player.multiCockDescriptLight() + " with as much vigor as you can muster.  Eventually your body tenses and a light load of jizz erupts from your body, but the orgasm is truly mild compared to what you need.  You're simply too weary from struggling to give yourself the masturbation you truly need, but you continue to try.  Nearly an hour later " + player.sMultiCockDesc() + " softens enough to allow you to stand again, and you make your way back to camp, still dragging your genitals across the warm sand.");
		dynStats("lus", 25 + rand(player.cor / 5), "scale", false);
		player.changeFatigue(5);
		doNext(camp.returnToCampUseOneHour);
	}

	public function CommonEncounters() {
	}
}
}


code:
package classes.Scenes
{
	import classes.*;
	import classes.BaseContent;
	import classes.GlobalFlags.*;
	import classes.Items.*;

	public class Crafting extends BaseContent
	{
		public static const TYPE_ALCHEMY:int = 0;
		public static const TYPE_COOKING:int = 1;
		public static const TYPE_SMITHING:int = 2;
		public static const TYPE_TAILORING:int = 3;

		private var item1:ItemType = null;
		private var item1Quantity:int = 0;
		private var item2:ItemType = null;
		private var item2Quantity:int = 0;
		private var item3:ItemType = null;
		private var item3Quantity:int = 0;
		private var item4:ItemType = null;
		private var item4Quantity:int = 0;
		private var itemResult:ItemType = null;

		public function Crafting() {}

		public function accessCraftingMenu(type:int, page:int = 1):void {
			clearOutput();
			outputText("What would you like to craft?");
			menu();
			if (type == TYPE_ALCHEMY) {

			}
			else if (type == TYPE_COOKING) {

			}
			else if (type == TYPE_SMITHING) {

			}
			else if (type == TYPE_TAILORING) {

			}
			addButton(14, "Back", playerMenu);
		}

		private function createCraftingRecipe(item:*, recipe:Array):void {
			var button:int = 0;
			var temp:int = 0;
			var goal:int = 14;
			while (temp < goal)
			{
				if (output.buttonIsVisible(temp)) {
					button++;
				}
				if (button == 4 || button == 9) button++;
				temp++;
			}
			addButton(button, item.shortName, displayCraftingRequirement, item, recipe);
		}

		private function meetsItemRequirement(id:int):Boolean {
			if (id == 1) {
				if (item1 == null) return true;
				if (player.hasItem(item1, item1Quantity)) return true;
			}
			else if (id == 2) {
				if (item2 == null) return true;
				if (player.hasItem(item2, item2Quantity)) return true;
			}
			else if (id == 3) {
				if (item3 == null) return true;
				if (player.hasItem(item3, item3Quantity)) return true;
			}
			else if (id == 4) {
				if (item4 == null) return true;
				if (player.hasItem(item4, item4Quantity)) return true;
			}
			return false;
		}

		private function displayCraftingRequirement(item:ItemType, recipe:Array):void {
			//Item #1
			if (recipe[0] != undefined) item1 = recipe[0];
			else item1 = null;
			if (recipe[1] != undefined) item1Quantity = recipe[1];
			//Item #2
			if (recipe[2] != undefined) item2 = recipe[2];
			else item2 = null;
			if (recipe[3] != undefined) item2Quantity = recipe[3];
			//Item #3
			if (recipe[4] != undefined) item3 = recipe[4];
			else item3 = null;
			if (recipe[5] != undefined) item3Quantity = recipe[5];
			//Item #4
			if (recipe[6] != undefined) item4 = recipe[6];
			else item4 = null;
			if (recipe[7] != undefined) item4Quantity = recipe[7];
			//Set result item
			itemResult = item;
			clearOutput();
			outputText("Item: " + item.longName + "\n\n");
			outputText("Items Needed:\n");
			if (item1 != null) {
				if (player.hasItem(item1, item1Quantity)) outputText("" + player.itemCount(item1) + " / " + item1Quantity + " " + item1.longName + "");
				else outputText("" + player.itemCount(item1) + " / " + item1Quantity + " " + item1.longName + "");
				outputText("\n");
			}
			if (item2 != null) {
				if (player.hasItem(item2, item2Quantity)) outputText("" + player.itemCount(item2) + " / " + item2Quantity + " " + item2.longName + "");
				else outputText("" + player.itemCount(item2) + " / " + item2Quantity + " " + item2.longName + "");
				outputText("\n");
			}
			if (item3 != null) {
				if (player.hasItem(item3, item3Quantity)) outputText("" + player.itemCount(item3) + " / " + item3Quantity + " " + item3.longName + "");
				else outputText("" + player.itemCount(item3) + " / " + item3Quantity + " " + item3.longName + "");
				outputText("\n");
			}
			if (item4 != null) {
				if (player.hasItem(item4, item4Quantity)) outputText("" + player.itemCount(item4) + " / " + item4Quantity + " " + item4.longName + "");
				else outputText("" + player.itemCount(item4) + " / " + item4Quantity + " " + item4.longName + "");
				outputText("\n");
			}
			outputText("\n");
			//Is it okay to craft this shit?
			if (meetsItemRequirement(1) && meetsItemRequirement(2) && meetsItemRequirement(3) && meetsItemRequirement(4)) {
				outputText("Would you like to craft this item?");
				doYesNo(craftItem, accessCraftingMenu);
			}
			else {
				outputText("You do not have the required ingredients to craft this item.");
				doNext(accessCraftingMenu);
			}
		}

		private function craftItem():void {
			clearOutput();
			if (item1 != null) player.destroyItems(item1, item1Quantity);
			if (item2 != null) player.destroyItems(item2, item2Quantity);
			if (item3 != null) player.destroyItems(item3, item3Quantity);
			if (item4 != null) player.destroyItems(item4, item4Quantity);
			inventory.takeItem(itemResult, accessCraftingMenu);
		}
	}

}

license: unknown


code:
//Anzu's Palace
package classes.Scenes.Dungeons
{
	import classes.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.BaseContent;
	import classes.Scenes.Dungeons.AnzuPalace.AnzuScene;
	import classes.Scenes.Dungeons.DungeonAbstractContent;
	import classes.Scenes.Dungeons.DungeonCore;

	public class AnzuPalace extends DungeonAbstractContent
	{
		/*
		//Floor 1
		public static const DUNGEON_ANZU_OUTSIDE = 39;
		public static const DUNGEON_ANZU_HALL_FLOOR1 = 40;
		public static const DUNGEON_ANZU_LIVING_ROOM = 41;
		public static const DUNGEON_ANZU_BATHROOM = 42;
		public static const DUNGEON_ANZU_DINING_ROOM = 43;
		public static const DUNGEON_ANZU_KITCHEN = 44;
		//Floor 2
		public static const DUNGEON_ANZU_HALL_FLOOR2 = 45;
		public static const DUNGEON_ANZU_BEDROOM = 46;
		public static const DUNGEON_ANZU_LIBRARY = 47;
		public static const DUNGEON_ANZU_MULTIUSE_ROOM = 48;
		//Floor 3
		public static const DUNGEON_ANZU_HALL_FLOOR3 = 49;
		public static const DUNGEON_ANZU_PALACE_VAULTS = 50;
		public static const DUNGEON_ANZU_ALCHEMY_ROOM = 51;
		//Roof
		public static const DUNGEON_ANZU_ROOF = 52;
		//Basement
		public static const DUNGEON_ANZU_BASEMENT = 53;
		public static const DUNGEON_ANZU_ARMORY = 54;
		*/
		public var anzuScene:AnzuScene = new AnzuScene();
		private var anzuLocationTimes:Array = []; //First is 12am. Uses room IDs.
		private var anzuLocationInitialized:Boolean = false;

		public function AnzuPalace() {
			if (!anzuLocationInitialized) {
				anzuLocationInitialized = true;
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_KITCHEN);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_DINING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIVING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIVING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIVING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_KITCHEN);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_DINING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIBRARY);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIBRARY);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIBRARY);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_ROOF);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_LIVING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_KITCHEN);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_DINING_ROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BATHROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
				anzuLocationTimes.push(DungeonCore.DUNGEON_ANZU_BEDROOM);
			}
		}

		public function enterDungeon():void {
			clearOutput();
			if ((flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] < 2 && flags[kFLAGS.ANZU_AFFECTION] >= 25) || (flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] < 3 && flags[kFLAGS.ANZU_AFFECTION] >= 50) || (flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] < 4 && flags[kFLAGS.ANZU_AFFECTION] >= 75)) {
				anzuScene.anzuTransition();
				return;
			}
			outputText(images.showImage("dungeon-entrance-palace"));
			game.inDungeon = true;
			outputText("You make your way through the frigid climates and your memory takes you back to Anzu's palace.");
			doNext(roomEntrance);
		}

		private function exitDungeon():void {
			game.inDungeon = false;
			clearOutput();
			outputText("You leave the palace behind and take off through the glacial rift back towards camp.");
			doNext(camp.returnToCampUseOneHour);
		}

		internal function setAnzuButton():void {
			if (game.dungeonLoc == anzuLocationTimes[game.time.hours] && game.dungeonLoc >= 39 && game.dungeonLoc < 55) {
				addButton(0, "Anzu", anzuScene.anzuMenus).hint("Interact with Anzu the avian deity.");
			}
		}

		//ROOMS
		//Floor 1
		public function roomEntrance():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_OUTSIDE;
			clearOutput();
			outputText("Palace Grounds\n");
			outputText("The outsides of the palace look way different from how it was before Anzu’s arrival. Mostly covered in snow, but visible, instead of the original shape of a Norse castle made of stone, with the majolica tiles in a vibrant teal, and ornaments in gold covering the walls, and the new shape, looks more like a palace from ancient times. During the night, the lights from the inside contrast against the darkness of the Rift.");
			outputText("\n\nThe gate, in turquoise tiles, leads to a huge door made of solid iron which serves as the palace principal entrance. The area around the palace is mostly covered in snow and pines, except a small path made of stones, that lead to the bottom of the hill.");
			/*
			 * The exterior part of the Palaces exudes and otherworldly beauty. Now free of snow thanks to the more templated climate on this part of the Rift, you can appreciate better his magnificent architecture.
			 * The door, of double, reflects on itself the whiteness of silver.
			 * */
			dungeons.setDungeonButtons(roomFoyer, null, null, null);
			addButton(11, "Leave", exitDungeon);
		}
		public function roomFoyer():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_HALL_FLOOR1;
			clearOutput();
			outputText("Hall, Floor 1\n");
			outputText("You’re standing inside the first floor of Anzu’s Palace. A long hall, marked with a beautiful red rug and flanked with two rows of columns in golden marble, connecting all the rooms in this floor. Immediately near the start of the hall, to the west, is the living room.");
			outputText("\n\nTo the east you can see a dining room, with two wooden tables and chairs. Connected to the dining room from the north is the kitchen. Near the end of the hall, a door leads to the baths.");
			outputText("\n\nThe hall has a staircase located not far from the entrance, leading to the second floor, and another at the end, leading to the basement.");
			dungeons.setDungeonButtons(null, roomEntrance, roomLivingRoom, roomDiningRoom);
			addButton(5, "Upstairs", roomHallFloor2);
			addButton(7, "Downstairs", roomBasement);
		}
		public function roomLivingRoom():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_LIVING_ROOM;
			clearOutput();
			outputText("Living Room\n");
			outputText("Like most of the house, the living room is richly decorated. Golden columns with ornamented chapiters surround the area, with very colorful patterned decorations in silk hanging from them. The walls are decorated with mosaics in the shape of flowers and stars, made of semiprecious stones. The floor is made of mosaics and covered with some rugs.");
			outputText("\n\nAncient looking statues made of alabaster and beautiful vases containing violets decorate the area. The entire room is illuminated by a lamp hanging from the ceiling, with an almost white flame, bright enough to enlighten all the room. In the center, a big fireplace brings warmth to the place.");
			outputText("\n\nComfortable armchairs, with soft cushions, covered in red velvet provide a good place to rest. On the left part of the room, are several shelves containing books about the story of Mittani and other similar things.");
			outputText("\n\nTo the east is the hall which connects the rest of the rooms in this floor. In a corner, on the end of the room, leading to the north, a door leads to the baths.");
			dungeons.setDungeonButtons(roomBathroom, null, null, roomFoyer);
		}
		public function roomBathroom():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_BATHROOM;
			clearOutput();
			outputText("Bathroom\n");
			outputText("A central round pool, with almost thirty feet of diameter, dominates the center of the room. The warm water of the pool is so clear that you can see the light blue colored tiles of its bottom. Several columns in a light golden marble surround the pool, and give the room a cozy feeling. They’re eleven in total, now that you can count them well.");
			outputText("\n\nThe rest of the room is covered with light brown tiles on the floor and the lower part of the walls, and a pattern of golden tiles and gold inlaids on the upper walls, separated by a band of mosaics displaying fish in exotic colors, sea serpents and aquatic monsters of a kind that you can’t recognize.");
			outputText("\n\nSome lamps around the room keep the bath well illuminated, and a door to the south leads back to living room.");
			dungeons.setDungeonButtons(null, roomLivingRoom, null, null);
		}
		public function roomDiningRoom():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_DINING_ROOM;
			clearOutput();
			outputText("Dining Room\n");
			outputText("Two polished wooden tables, pretty large, occupy the center of the room. Surrounding them, between forty and fifty chairs give enough sitting room for a small army. Anzu must feel quite lonely when dining.");
			outputText("\n\nDecorating the corners are vases with violets, whose smell perfumes the air. The columns in golden marble and the colorful decorations in silk hanging from them complete the room atmosphere.");
			outputText("\n\nTo the north, there is a door that leads to the kitchen. Another, leading to the west, goes back to the principal hall.");
			dungeons.setDungeonButtons(roomKitchen, null, roomFoyer, null);
		}
		public function roomKitchen():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_KITCHEN;
			clearOutput();
			outputText("Kitchen\n");
			outputText("A big oven made of iron dominates the kitchen. To the sides many drawers contain a wide variety of cooking utensils. Knives, spoons, forks, dishes, glasses, all stored in their respective place. A place for cleaning the utensils and a stove have a place too on opposite sides of the kitchen.");
			outputText("\n\nIn the back of the room, a wooden door leads to the place where Anzu stores food. Inside are grains, bread, cheese, several crates containing wine, and in some containers, wrapped inside snow and ice, are big pieces of meat.");
			outputText("\n\nThe constant heat from the oven and the stove makes this room as warm as the bedroom or the living room.");
			dungeons.setDungeonButtons(null, roomDiningRoom, null, null);
		}
		//Floor 2
		public function roomHallFloor2():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_HALL_FLOOR2;
			clearOutput();
			outputText("Hall, Floor 2\n");
			outputText("The second floor is in U-shaped, with two different rooms on each side and one at the end. The remaining space is occupied by the staircases which go to the third floor and to the first floor, with the hall connecting the three rooms. This hall is decorated too with a red rug and golden columns.");
			outputText("\n\nThe room in the west is Anzu’s bedroom. A calm and peaceful sensation emanates from the door that leads to it.");
			outputText("\n\nThe room located at the end of the floor is the palace’s library and study. Judging by its size,  looks like Anzu brought with him half of books of Mittani.");
			outputText("\n\nAnzu has stated that the third room is not currently in use...");
			dungeons.setDungeonButtons(roomLibrary, null, roomBedroom, roomMultiuse);
			addButton(5, "Upstairs", roomHallFloor3);
			addButton(7, "Downstairs", roomFoyer);
		}
		public function roomBedroom():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_BEDROOM;
			clearOutput();
			outputText("Bedroom\n");
			outputText("The golden columns decorate this room too. More silken colorful decorations cover them, with the mosaics doing the same to the bedroom walls. In a similar fashion of the living room, vases with violets and alabaster statues complete the room ornaments, with some armchairs giving place of rest.");
			outputText("\n\nAnzu’s bed is huge, even for Marethian standards. Soft cushions and linen sheets cover the mattress. The bed itself releases an aromatic smell. You have the temptation of climb in and sleep on it all day.");
			outputText("\n\nAnother fireplace, smaller than the one in the living room, warms the place atmosphere.");
			dungeons.setDungeonButtons(null, null, null, roomHallFloor2);
		}
		public function roomLibrary():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_LIBRARY;
			clearOutput();
			outputText("Library\n");
			outputText("Many bookshelves filled with at least one thousand books occupy most of the walls. The ambience inside is quiet and peaceful. Some armchairs give a comfortable place to read. This books must’ve been the only friendly company of your avian friend in many years. ");
			outputText("\n\nOn the end of the place, is Anzu’s private study. A desk, a chair, some bookcases next to it. Nothing extraordinary.");
			outputText("\n\nTo the south is the exit to the hall, that connects all rooms in the third floor.");
			dungeons.setDungeonButtons(null, roomHallFloor2, null, null);
		}
		public function roomMultiuse():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_MULTIUSE_ROOM;
			clearOutput();
			outputText("Multi-use Room\n");
			outputText("This room used to be the bedroom of most of the Valkyries that used to live there. Since he has his own bedroom now, Anzu has little use for this room, and given his word, it remains empty. Actually, you could peek inside if you want...");
			outputText("\n\nYeah, empty. There is nothing else to do there that look the corners.");
			outputText("\n\nTo the south is the exit to the hall, that connects all rooms in the third floor.");
			dungeons.setDungeonButtons(null, null, roomHallFloor2, null);
		}
		//Floor 3
		public function roomHallFloor3():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_HALL_FLOOR3;
			clearOutput();
			outputText("Hall, Floor 3\n");
			outputText("This floor has a disposition similar to the second, with the only difference being only two rooms and a huge window which gives a great view of the snow covered hills and the forest across the Rift. The usual staircase leads down to the second floor and up to the roof.");
			outputText("\n\nTo the left is the treasure room, the place when probably half of Mareth treasures are stored.");
			dungeons.setDungeonButtons(null, null, roomVault, roomAlchemyRoom);
			addButton(5, "Upstairs", roomRoof);
			addButton(7, "Downstairs", roomHallFloor2);
		}
		public function roomVault():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_PALACE_VAULTS;
			clearOutput();
			outputText("Vault\n");
			outputText("As expected from a treasure room, it's filled to the brim with boxes of golden coins and jewels. Diamonds, rubies, amethysts, sapphires, alexandrites, name a jewel and you probably could find here in insane quantities.");
			outputText("\n\nGold objects, like plates, coins, goblets, chains, rings and utensils are stored in crates. Rugs and carpets are folded in many heaps in one corner. Bottles with aromatic oils are stored in shelves in another side of the room.");
			outputText("\n\nThe sources of the wealth in the palace’s vault is a mix of things which Anzu brought with him from Mittani and the loot which the avian took from the valkyries and other monsters which wandered in the Rift.");
			outputText("\n\nTo the east is a door leading back to the hall.");
			dungeons.setDungeonButtons(null, null, null, roomHallFloor3);
		}
		public function roomAlchemyRoom():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_ALCHEMY_ROOM;
			clearOutput();
			outputText("Alchemy Room\n");
			outputText("In the north of the room is a kind of desk, with many alchemical devices. Currently, are some metals made liquid, in an attempt to made an alloy. This is probably the place where Anzu creates electrum. A bookshelf containing books of alchemy is located close.");
			outputText("\n\nThe center of the room has what looks like a scale map from Mareth, the transmutation table, and the drawers containing ingredients are in the south of the room. Many concoctions and liquid metals are saved in shelves next to it.");
			outputText("\n\nOn the right side of the room is the combination . A sort of drawings in the floor in a concentric shape, which Anzu uses to make energy flow inside living or organic things to combinate, extract or infuse energy on them");
			outputText("\n\nA door that leads back to the hall is on the west.");
			dungeons.setDungeonButtons(null, null, roomHallFloor3, null);
		}
		//Roof
		public function roomRoof():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_ROOF;
			clearOutput();
			outputText("Roof\n");
			outputText("The view here is amazing! This places offers a magnificent sight of the sky above and the hills and forest around.");
			outputText("\n\nThe forest and the snow covered hills extend as far as the eye can see. The fresh air, though cold, bring you a peace which takes you away from the corruption and the horrors of this land for a moment.");
			dungeons.setDungeonButtons(null, null, null, null);
			addButton(7, "Downstairs", roomHallFloor3);
		}
		//Basement
		public function roomBasement():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_BASEMENT;
			clearOutput();
			outputText("Basement\n");
			outputText("A chariot dominates most of the open area of the basement. It's made of strong and sturdy wood, with a soft mattress and covered in silk. It doesn’t look like it’s designed to be pulled in a normal way, and judging by its nature and origin, probably moves by a magical force.");
			outputText("\n\nSome feet behind the chariot, a door leads to Anzu’s armory. Inside is a collection of swords, knives, spears, and blades big enough to equip a small army. ");
			dungeons.setDungeonButtons(null, null, roomArmory, null);
			addButton(5, "Upstairs", roomFoyer);
		}
		public function roomArmory():void {
			game.dungeonLoc = DungeonCore.DUNGEON_ANZU_ARMORY;
			clearOutput();
			outputText("Armory\n");
			outputText("This room contains a collection of swords, knives, spears, and blades big enough to equip a small army. At the end is an ornate armor probably once worn by the elite valkyries. You don't think Anzu would like you taking it without his permission.");
			outputText("\n\nThere is a door leading back to the main basement room.");
			dungeons.setDungeonButtons(null, null, null, roomBasement);
		}
	}

}


code:
package classes.Scenes.Dungeons.DeepCave
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;

	/**
	 * ...
	 * @author Fake-Name
	 */

	// This doesn't work, because there is some obnoxious issues with the fact that we only have one instance of monster at any time, and static evaluation
	// of the game leads the compiler to not know if setDescriptionForPlantPot() is available, therefore resulting in an error

	public class EncapsulationPod extends Monster
	{

		public function encapsulationPodAI():void {
			//[Round 1 Action]
			if (!hasStatusEffect(StatusEffects.Round)) {
				outputText("You shiver from the feeling of warm wetness crawling up your " + player.legs() + ".   Tentacles brush against your ");
				if (player.balls > 0) {
					outputText(player.ballsDescriptLight() + " ");
					if (player.hasVagina()) outputText("and ");
				}
				if (player.hasVagina()) outputText(player.vaginaDescript() + " ");
				else if (player.balls == 0) outputText("taint ");
				outputText("as they climb ever-further up your body.  In spite of yourself, you feel the touch of arousal licking at your thoughts.");
				if (player.lust < 35) {
					player.takeLustDamage(1, true);
					player.lust = 35;
					statScreenRefresh();
				}
				outputText("\n");
			}
			//[Round 2 Action]
			else if (statusEffectv1(StatusEffects.Round) == 2) {
				outputText("The tentacles under your " + player.armorName + " squirm against you, seeking out openings to penetrate and genitalia to caress.  ");
				if (player.balls > 0) outputText("One of them wraps itself around the top of your " + player.sackDescript() + " while its tip slithers over your " + player.ballsDescriptLight() + ".  Another ");
				else outputText("One ");
				if (player.cockTotal() > 0) {
					outputText("prods your " + player.cockDescript(0) + " for a second before it begins slithering around it, snake-like.  Once it has you encircled from " + player.cockHead(0) + " to ");
					if (!player.hasSheath()) outputText("base");
					else outputText("sheath");
					outputText(", it begins to squeeze and relax to a pleasant tempo.  ");
				}
				else {
					if (player.hasVagina()) {
						outputText("prods at your groin, circling around your " + player.vaginaDescript(0) + " deliberately, as if seeking other toys to play with.  ");
						if (player.getClitLength() > 4) outputText("It brushes your " + player.clitDescript() + " then curls around it, squeezing and gently caressing it with a slow, pleasing rhythm.  ");
					}
					else {
						outputText("prods your groin before curling around to circle your " + player.assholeDescript() + " playfully.  The entire tendril pulses in a pleasant, relaxing way.  ");
					}
				}
				if (player.cockTotal() > 1) {
					outputText("Your other ");
					if (player.cockTotal() == 2) outputText(player.cockDescript(1) + " gets the same treatment, and soon both of your " + player.multiCockDescriptLight() + " are quite happy to be here.  ");
					else outputText(player.multiCockDescriptLight() + " get the same treatment and soon feel quite happy to be here.  ");
				}
				if (player.hasVagina()) {
					outputText("The violation of your " + player.vaginaDescript() + " is swift and painless.  The fungus' slippery lubricants make it quite easy for it to slip inside, and you find your " + player.vaginaDescript() + " engorging with pleasure in spite of your need to escape.  The tentacle folds up so that it can rub its stalk over your " + player.clitDescript() + ", ");
					if (player.getClitLength() > 3) outputText("and once it discovers how large it is, it wraps around it and squeezes.  It feels good!  ");
					else outputText("and it has quite an easy time making your bud grow hard and sensitive.  The constant rubbing feels good!  ");
				}
				outputText("One 'lucky' stalk manages to find your " + player.assholeDescript() + ".  As soon as it touches your rear 'entrance', it lunges forward to penetrate you.  The fluids coating the tentacle make your muscles relax, allowing it to slide inside you with ease.\n\n");

				outputText("The rest of the mass continues to crawl up you.  They tickle at your ");
				if (player.pregnancyIncubation > 0 && player.pregnancyIncubation < 120) outputText("pregnant ");
				outputText("belly as they get closer and closer to ");
				if (player.biggestTitSize() < 1) outputText("your chest");
				else outputText("the underside of your " + player.allBreastsDescript());
				outputText(".  Gods above, this is turning you on!  Your lower body is being violated in every conceivable way and it's only arousing you more.  Between the mind-numbing smell and the sexual assault you're having a hard time focusing.");
				if (player.lust < 65) {
					player.takeLustDamage(1, true);
					player.lust = 65;
					statScreenRefresh();
				}
				outputText("\n");
			}
			//[Round 3 Action]
			else if (statusEffectv1(StatusEffects.Round) == 3) {
				outputText("The wet, warm pressure of the fungus' protrusion working their way up your body feels better than it has any right to be.  It's like a combination of a warm bath and a gentle massage, and when combined with the thought-numbing scent in the air, it's nigh-impossible to resist relaxing a little.  In seconds the mass of tentacles is underneath your " + player.armorName + " and rubbing over your chest and " + player.nippleDescript(0) + "s.  You swoon from the sensation and lean back against the wall while they stroke and caress you, teasing your sensitive " + player.nippleDescript(0) + ".");
				if (player.hasFuckableNipples()) outputText("  Proof of your arousal leaks from each " + player.nippleDescript(0) + " as their entrances part for the probing tentacles.  They happily dive inside to begin fucking your breasts, doubling your pleasure.");
				outputText("  Moans escape your mouth as your hips begin to rock in time with the tentacles and the pulsing luminance of your fungus-pod.  It would be easy to lose yourself here.  You groan loudly enough to startle yourself back to attention.  You've got to get out!\n\n");

				outputText("The tentacles that aren't busy with your " + player.allBreastsDescript() + " are already climbing higher, and the slime has reached your waist.  If anything it actually makes the constant violation more intense and relaxing.  You start to sink down into it, but catch yourself and pull yourself back up.  No! You've got to fight!");
				if (player.lust < 85) {
					player.takeLustDamage(1, true);
					player.lust = 85;
					statScreenRefresh();
				}
				outputText("\n");
			}
			//[Round 4 Action]
			else {
				game.dynStats("lus", 1);
				player.lust = player.maxLust();
				statScreenRefresh();
				outputText("What's happening to you definitely isn't rape.  Not any more.  You like it too much.  You lean back against a wall of the pod and thrust your " + game.player.hipDescript() + " pitifully against a phantom lover, moaning lewdly as you're forcibly pleasured.  You grab hold of the fleshy walls with your hands and try to hold yourself up, but your " + player.legs() + " have the consistency of jello.   They fold neatly underneath you as you slide into the ooze and begin to float inside it.  It's comforting in an odd way, and while you're gasping in between moans, your balance finally gives out.  You sink deeper into the fluid and lose all sense of direction.  Up and down become meaningless constructs that no longer matter to you.\n\n");

				outputText("The thick slime passes over your lips and nose as you sink into the rising tide of bliss, and you find yourself wondering how you'll breathe.  Instinctively, you hold your breath.  Even riddled with sexual bliss and thought-obliterating drugs, you won't let yourself open your mouth when 'underwater'.  The lack of oxygen makes your heart hammer in your chest");
				if (player.totalCocks() > 0) {
					outputText(", and " + player.SMultiCockDesc() + " bloats with blood, getting larger than ever");
				}
				outputText(".  Before you can pass out, the constant penetration forces a moan from your lips.\n\n");

				outputText("A tentacle takes the opportunity to slip into your mouth along with a wave of the slime.  You try to cough out the fluid, but there isn't any air left in your lungs to push it out.  The orally-fixated tendril widens and begins to pour more of it inside you, and with nowhere else to go, it packs your goo-filled lungs to the brim before you start to swallow.  You relax and exhale the last of your air from your nose as your body calms itself.  Somehow you can breathe the fungus-pod's fluids!\n\n");

				outputText("You're floating in pure liquid bliss.  Thoughts melt away before they can form, and every inch of your body is being caressed, squeezed, or penetrated by the warm, slime-slicked tentacles.  Nearly every muscle in your body goes completely slack as you're cradled with bliss.  Without your thoughts or stress bothering you, the pleasure swiftly builds to a crescendo.\n\n");

				outputText("The wave of need starts out inside your crotch, begging to be let out, but you can't even be bothered to move your " + game.player.hipDescript() + " anymore.  Without your help, release stays just out of reach, but the tentacles working your body seem intent on spurring it on.  The one inside your " + player.assholeDescript() + " begins to pump more quickly, and with the added pressure, you cum quickly.  ");
				if(player.hasStatusEffect(StatusEffects.ParasiteSlugReproduction)) player.changeStatusValue(StatusEffects.ParasiteSlugReproduction, 1, 1); //This pleases your parasite overlord
				if (!player.hasVagina()) {
					outputText("Your body twitches weakly, too relaxed to move while it gets off from anal penetration.");
				}
				else outputText("Your body twitches weakly, too relaxed to move while it gets off from being double-penetrated.");
				if (player.hasFuckableNipples()) {
					outputText("  Your " + player.nippleDescript(0) + "s squirt around their phallic partners, leaking sexual lubricant ");
					if (player.biggestLactation() > 1) outputText("and milk ");
					outputText("while the fucking continues.");
				}
				if (player.cockTotal() > 0) {
					outputText("  The tentacles around " + player.sMultiCockDesc() + " squeeze and rotate, screwing you silly through your orgasm while cum dribbles in a steady stream from your loins.  Normally it would be squirting out in thick ropes, but the muscle-relaxing drugs in your system make the spurts a steady, weak flow.");
					if (player.cumQ() > 800) outputText("  Of course with all the semen you produce, the flesh-pod's ooze clouds over quite quickly, blocking your vision with a purple-white haze.");
				}
				if (player.biggestLactation() > 1) {
					outputText("Milk leaks out too, ");
					if (player.biggestLactation() < 2) outputText("though the slight dribble is barely noticeable to you.");
					else if (player.biggestLactation() < 3) outputText("coloring things a little more white.");
					else outputText("thickening your fluid-filled prison with nutrients.");
				}
				//[NEXT – CHOOSE APPRORIATE]
				doNext(game.dungeons.deepcave.loseToThisShitPartII);
				return;
			}
			//Set flags for rounds
			if (!hasStatusEffect(StatusEffects.Round)) {
				createStatusEffect(StatusEffects.Round,2,0,0,0);
			}
			else addStatusValue(StatusEffects.Round,1,1);

		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void{
			doNext(game.dungeons.deepcave.loseToThisShitPartII);
		}

		override protected function performCombatAction():void
		{
			encapsulationPodAI();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.dungeons.deepcave.encapsulationVictory();
		}

		override public function get long():String {
			//[Round 1 Description]
			var _long:String;
			if (!hasStatusEffect(StatusEffects.Round)) _long = "You're totally trapped inside a pod!  The walls are slimy and oozing moisture that makes the air sickeningly sweet.  It makes you feel a little dizzy.  Tentacles are climbing up your " + game.player.legs() + " towards your crotch, doing their best to get under you " + game.player.armorName + ".  There's too many to try to pull away.  Your only chance of escape is to create a way out!";
			//[Round 2 Description]
			else if (statusEffectv1(StatusEffects.Round) == 2) {
				_long = "You're still trapped inside the pod!  By now the walls are totally soaked with some kind of viscous slime.  The smell of it is unbearably sweet and you have to put a hand against the wall to steady yourself.  Warm tentacles are curling and twisting underneath your armor, caressing every ";
				if (player.hasFur()) _long += "furry ";
				if (player.hasScales()) _long += "scaley ";
				_long += "inch of your " + player.legs() + ", crotch, and " + game.player.assDescript() + ".";
			}
			//[Round 3 Description]
			else if (statusEffectv1(StatusEffects.Round) == 3) {
				_long = "You're trapped inside the pod and being raped by its many tentacles!   The pooling slime is constantly rising, and in a few moments it will have reached your groin.  The viscous sludge makes it hard to move and the smell of it is making it even harder to think or stand up.  The tentacles assaulting your groin don't stop moving for an instant, and in spite of yourself, some part of you wants them to make you cum quite badly.";
			}
			//[Round 4 Description]
			else {
				_long = "You're trapped inside the pod and being violated by tentacles from the shoulders down!  The slime around your waist is rising even faster now.  It will probably reach ";
				if (player.biggestTitSize() >= 1) _long += "the underside of your " + game.player.allBreastsDescript();
				else _long += "your chest";
				_long += " in moments.  You're being fucked by a bevy of tentacles while your nipples are ";
				if (!player.hasFuckableNipples()) _long += "fondled ";
				else _long += "fucked ";
				_long += "by more of the slippery fungal protrusions.  It would be so easy to just relax back in the fluid and let it cradle you while you're pleasured.  You barely even smell the sweet, thought-killing scent from before, but your hips are rocking on their own and you stumble every time you try to move.  Your resistance is about to give out!";
			}
			//[DAMAGE DESCRIPTS – Used All Rounds]
			//[Greater than 80% Life]
			if (HPRatio() > 0.8) {
				_long += "  The pulsing luminescence continues to oscillate in a regular rhythm.  You haven't done enough damage to the thing to affect it in the slightest.";
			}
			//[Greater than 60% Life]
			else if (HPRatio() > 0.6) {
				_long += "  Your attacks have turned a part of the wall a sickly black color, and it no longer glows along with the rest of your chamber.";
			}
			//[Greater than 40% Life]
			else if (HPRatio() > 0.4) {
				_long += "  You've dented the wall with your attacks.  It's permanently deformed and bruised solid black from your struggles.  Underneath the spongy surface you can feel a rock-solid core that's beginning to give.";
			}
			//Greater than 20% Life]
			else if (HPRatio() > 0.2) {
				_long += "  You have to blink your eyes constantly because the capsule's bio-luminescent lighting is going nuts.  The part of the wall you're going after is clearly dead, but the rest of your fungal prison is flashing in a crazy, panicked fashion.";
			}
			//[Greater than 0% Life]
			else {
				_long += "  You can see light through the fractured wall in front of you!  One more solid strike should let you escape!";
			}
			return _long;
		}

		public function EncapsulationPod()
		{
			this.a = "the ";
			this.short = "pod";
			this.imageName = "pod";
			this.long = "";
			this.race = "Abomination";
			// this.plural = false;
			initGenderless();
			createBreastRow(0,0);
			this.tallness = 120;
			this.hips.rating = Hips.RATING_SLENDER;
			this.butt.rating = Butt.RATING_BUTTLESS;
			this.skin.tone = "purple";
			this.skin.type = Skin.PLAIN;
			this.skin.desc = "covering";
			this.hair.color = "black";
			this.hair.length = 0;
			initStrTouSpeInte(90, 1, 1, 1);
			initLibSensCor(1, 1, 100);
			this.weaponName = "pod";
			this.weaponVerb="pod";
			this.armorName = "pod";
			this.bonusHP = 450;
			this.lust = 10;
			this.lustVuln = 0;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 12;
			this.gems = 1;
			this.additionalXP = 80;
			this.drop = new WeightedDrop(weapons.JRAPIER, 1);
			this.special1 = special1;
			this.special2 = special2;
			this.special3 = special3;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.DeepCave
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.CoC;
	import classes.internals.*;

	public class ImpHorde extends Monster
	{
		private var dungeon:String = "DeepCave";//for simple reuse in Liddellium Dungeon.

		public function impGangAI():void {
			if (hasStatusEffect(StatusEffects.ImpUber)) impGangUber();
			else if (lust100 > 50 && rand(2) == 0) impGangBukkake();
			else {
				var choice:Number = rand(4);
				if (choice < 3 && !(this.dungeon == "Liddellium" && player.hasStatusEffect(StatusEffects.Grappled))) imtacularMultiHitzilla();//Only one that makes no sense if the imps do during the liddelium camp battle.
				else impGangUber();
			}
			//(½ chance during any round):
			if (rand(2) == 0) {
				outputText("\nOne of the tiny demons latches onto one of your " + player.legs() + " and starts humping it.  You shake the little bastard off and keep fighting!");
				player.takeLustDamage(1, true);
			}

		}

		public function impGangUber():void {
			if (!hasStatusEffect(StatusEffects.ImpUber)) {
				outputText("Three imps on the far side of the room close their eyes and begin murmuring words of darkness and power.  Your eyes widen, recognizing the spell.  Anything but that!  They're building up a massive arousal spell!  They keep muttering and gesturing, and you realize you've got one round to stop them!\n");
				createStatusEffect(StatusEffects.ImpUber,0,0,0,0);
			}
			else {
				//(OH SHIT IT GOES OFF)
				//+50 lust!
				outputText("The imps in the back finish their spell-casting, and point at you in unison.  A wave of pure arousal hits you with the force of a freight train.   Your equipment rubs across your suddenly violently sensitive " + player.nippleDescript(0));
				if (player.biggestLactation() > 1) outputText(" as they begin to drip milk");
				outputText(".  The lower portions of your coverings ");
				if (player.cockTotal() > 0) {
					outputText("are pulled tight by your " + player.multiCockDescript() + ", ");
					if (player.totalCocks() > 1) outputText("each ");
					outputText("beading a drop of pre-cum at the tip");
					if (player.hasVagina()) outputText(", and in addition, the clothes around your groin ");
				}
				if (player.hasVagina()) {
					outputText("become stained with feminine moisture");
					if (player.getClitLength() > 3) outputText(" as your clit swells up in a more sensitive imitation of a cock");
				}
				if (player.gender == 0) outputText("rub the sensitive skin of your thighs and featureless groin in a way that makes you wish you had a sex of some sort");
				player.takeLustDamage(50, true);
				outputText(".\n");
				removeStatusEffect(StatusEffects.ImpUber);
			}
		}

		public function impGangBukkake():void {
			outputText("Many of the imps are overcome by the lust you've inspired.  They hover in the air around you, pumping their many varied demonic rods as they bring themselves to orgasm.\n");

			//(2-6 hits)
			var hits:Number = rand(5) + 2;
			//Initial damage variable.
			var damage:Number = 0;
			//Loop through and apply dodges and whatnot for each hit.
			while (hits > 0) {
				var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
				//+30% chance to avoid attack for evade
				//Clear damage from last loop
				damage = 0;
				//Blind dodge change
				if (result.dodge == EVASION_BLIND) {
					outputText(capitalA + short + "' misguided spooge flies everyone.  A few bursts of it don't even land anywhere close to you!\n");
				}
				//Determine if dodged!
				else if (result.dodge != null) {
					damage = rand(4);
					if (damage == 0) outputText("A wad of cum spatters into the floor as you narrowly sidestep it.\n");
					else if (damage == 1) outputText("One of the imps launches his seed so hard it passes clean over you, painting the wall white.\n");
					else if (damage == 2) outputText("You duck a glob of spooge and it passes harmlessly by.  A muffled grunt of disgust can be heard from behind you.\n");
					else if (damage == 3) outputText("You easily evade a blast of white fluid.\n");
				}
				//(2-6 hits for +10 lust each!) (-5 lust per successful hit)
				else {
					damage = rand(6);
					if (damage == 0) outputText("A squirt of hot demonic cum splatters into your face!\n");
					if (damage == 1) outputText("Your " + player.allBreastsDescript() + " are coated with thick demonic spunk!\n");
					if (damage == 2) outputText("Some of the fluid splatters into your midriff and drools down to your waist, making your " + player.armorName + " slimy and wet.\n");
					if (damage == 3) outputText("Seed lands in your " + player.hairDescript() + ", slicking you with demonic fluid.\n");
					if (damage == 4) outputText("Another blast of jizz splatters against your face, coating your lips and forcing a slight taste of it into your mouth.\n");
					if (damage == 5) outputText("The last eruption of cum soaks your thighs and the lower portions of your " + player.armorName + ", turning it a sticky white.\n");
					player.takeLustDamage((7+int(player.lib/40+player.cor/40)), true);
				}
				lust -= 5;
				hits--;
			}
		}

		public function imtacularMultiHitzilla():void {
			//Multiattack:
			if (!hasStatusEffect(StatusEffects.Blind)) outputText("The imps come at you in a wave, tearing at you with claws!\n");
			//(ALT BLINDED TEXT)
			else outputText("In spite of their blindness, most of them manage to find you, aided by the clutching claws of their brothers.\n");
			//(2-6 hits for 10 damage each)
			var hits:Number = rand(5) + 2;
			//Initial damage variable.
			var damage:Number = 0;
			//Loop through and apply dodges and whatnot for each hit.
			while(hits > 0) {
				//Clear damage from last loop
				damage = 0;
				//Blind dodge change
				if (!playerAvoidDamage({})) {
				//OH SHIT SON YOU GOT REAPED
					if (hits == 6) outputText("You're clawed viciously by an imp!");
					if (hits == 5) outputText("One bites your ankle!");
					if (hits == 4) outputText("An imp rakes his claws down your back.");
					if (hits == 3) outputText("One of the little bastards manages to scratch up your legs!");
					if (hits == 2) outputText("Another imp punches you in the gut, hard!");
					if (hits == 1) outputText("Your arm is mauled by the clawing!");
					damage = 20 - rand(player.tou/10);
					if (damage <= 0) damage = 1;
					outputText(" ");
					damage = player.takeDamage(damage, true);
					outputText("\n");
				}
				hits--;
			}
		}

		override protected function performCombatAction():void
		{
			impGangAI();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			if(dungeon=="DeepCave")
				game.dungeons.deepcave.impGangVICTORY();
			else if (dungeon == "Liddellium")
				game.liddelliumEventDungeon.demonCampScene(true);
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (pcCameWorms){
				outputText("\n\nYour foes don't seem put off enough to leave...");
				doNext(game.combat.endLustLoss);
			} else {
				game.dungeons.deepcave.loseToImpMob();
			}
		}

		public function ImpHorde(dungeon:String)
		{
			this.dungeon = dungeon;
			//trace("ImpHorde Constructor!");
			this.a = "the ";
			this.short = "imp horde";
			this.imageName = "impmob";
			this.long = "Imps of all shapes and sizes fill the room around you, keeping you completely surrounded by their myriad forms.  You can see more than a few sporting disproportionate erections, and there's even some with exotic dog-dicks, horse-pricks, and the odd spiny cat-cock.  Escape is impossible, you'll have to fight or seduce your way out of this one!";
			this.race = "Imp";
			this.plural = true;
			this.pronoun1 = "they";
			this.pronoun2 = "them";
			this.pronoun3 = "their";
			this.createCock(12,2,CockTypesEnum.DEMON);
			this.balls = 2;
			this.ballSize = 1;
			createBreastRow(0);
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,10,0,0,0);
			this.tallness = 36;
			this.hips.rating = Hips.RATING_SLENDER;
			this.butt.rating = Butt.RATING_TIGHT;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length = 1;
			initStrTouSpeInte(20, 10, 25, 12);
			initLibSensCor(45, 45, 100);
			this.weaponName = "fists";
			this.weaponVerb="punches";
			this.armorName = "skin";
			this.bonusHP = 450;
			this.lust = 10;
			this.lustVuln = .5;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 10;
			this.gems = 20 + rand(25);
			this.additionalXP = 50;
			this.drop = new WeightedDrop(armors.NURSECL, 1);
			this.wings.type = Wings.IMP;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.DeepCave
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.internals.*;

	public class Vala extends Monster
	{
		//Vala AI

		//Blood magic?
		public function valaSpecial1():void {
			outputText("Vala dabs at one of her wounds and swoons.  Is she actually getting off from the wounds?  Damn she's damaged!  Vala licks the blood from her fingers, winks, and blows pink mist from her mouth.");
			//Lightly wounded.
			if (HPRatio() > .7) {
				outputText("  The sweet-smelling cloud rapidly fills the room, but the volume of mist is low enough that you don't end up breathing in that much of it.  It does make your pulse quicken in the most pleasant way though...");
				player.takeLustDamage(5 + player.lib/20, true);
			}
			else if (HPRatio() > .4) {
				outputText("  The rose-colored vapor spreads throughout the room, forcing you to breathe it in or pass out from lack of air.  It smells sweet and makes your head swim with sensual promises and your crotch tingle with desire.  Panicked by the knowledge that you're being drugged, you gasp, but it only draws more of the rapidly dissipating cloud into your lungs, fueling your lust.");
				player.takeLustDamage(10 + player.lib/20, true);
			}
			else {
				outputText("  The cloying, thick cloud of pink spools out from her mouth and fills the room with a haze of bubblegum-pink sweetness.  Even the shallowest, most experimental breath makes your heart pound and your crotch thrum with excitement.  You gasp in another quick breath and sway back and forth on your feet, already on the edge of giving in to the faerie.");
				player.takeLustDamage(30 + player.lib/10, true);
			}

		}
		//Milk magic
		public function valaSpecial2():void {
			outputText("With a look of ecstasy on her face, Vala throws back her head and squeezes her pillowy chest with her hands, firing gouts of thick faerie milk from her over-sized bosom!  You try to dodge, but she's squirting so much it's impossible to dodge it all, and in no time you're drenched with a thick coating of Vala's milk.");
			outputText("  She releases her breasts, shaking them back and forth for your benefit, and flutters her wings, blowing shiny, glitter-like flakes at you.  They stick to the milk on your skin, leaving you coated in milk and faerie-dust.");
			outputText("\nVala says, \"Now you can be sexy like Vala!\"\n");

			if (hasStatusEffect(StatusEffects.Milk)) {
				addStatusValue(StatusEffects.Milk,1,5);
				outputText("Your " + player.skin.desc + " tingles pleasantly, making you feel sexy and exposed.  Oh no!  It seems each coating of milk and glitter is stronger than the last!");
			}
			else {
				createStatusEffect(StatusEffects.Milk,5,0,0,0);
				outputText("You aren't sure if there's something in her milk, the dust, or just watching her squirt and shake for you, but it's turning you on.");
			}
			player.takeLustDamage(statusEffectv1(StatusEffects.Milk) + player.lib/20, true);

		}
		//Masturbation
		public function valaMasturbate():void {
			outputText("The mind-fucked faerie spreads her alabaster thighs and dips a finger into the glistening slit between her legs, sliding in and out, only pausing to circle her clit.  She brazenly masturbates, putting on quite the show.  Vala slides another two fingers inside herself and finger-fucks herself hard, moaning and panting lewdly.  Then she pulls them out and asks, \"Did you like that?  Will you fuck Vala now?\"");
			player.takeLustDamage(4 + player.cor/10, true);

		}

		//[Fight dialog]
		public function valaCombatDialogue():void {
			if (!hasStatusEffect(StatusEffects.Vala)) {
				outputText("\"Sluts needs to service the masters!\" the faerie wails, flying high. \"If they are not pleased, Bitch doesn't get any cum!\"");
				createStatusEffect(StatusEffects.Vala,0,0,0,0);
			}
			else {
				addStatusValue(StatusEffects.Vala,1,1);
				if (statusEffectv1(StatusEffects.Vala) == 1) outputText("\"If you won't fuck Bitch, you must not be a master,\" she realizes, the fight invigorating her lust-deadened brain. \"You get to be a pet for the masters, too!\"");
				else if (statusEffectv1(StatusEffects.Vala) == 2) outputText("\"If the masters like you, maybe they will let Bitch keep you for herself! Won't you like that?\"");
				else if (statusEffectv1(StatusEffects.Vala) == 3) outputText("\"We obey the masters. They fed Bitch until she became big enough to please them. The masters love their pets so much, you'll see.\"");
				else if (statusEffectv1(StatusEffects.Vala) == 4) outputText("\"Thoughts are so hard. Much easier to be a toy slut. Won't you like being a toy? All that nasty memory fucked out of your head.\"");
				else if (statusEffectv1(StatusEffects.Vala) == 5) outputText("\"Bitch has given birth to many of the masters' children. She will teach you to please the masters. Maybe you can birth more masters for us to fuck?\"");
				else outputText("\"Bitch loves when her children use her as their fathers did. Sluts belong to them. Slut love them. You will love them too!\"");
			}
		}

		override protected function performCombatAction():void
		{
			//VALA SPEAKS!
			valaCombatDialogue();
			outputText("\n\n");
			var actionChoices:MonsterAI = new MonsterAI();
				actionChoices.add(valaSpecial1,25,HPRatio() < .85,0,FATIGUE_NONE,RANGE_SELF);
				actionChoices.add(valaSpecial2, 20, true, 10,FATIGUE_NONE,RANGE_RANGED);
				actionChoices.add(valaMasturbate, 55, true, 10,FATIGUE_NONE,RANGE_SELF);
				actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.dungeons.deepcave.fightValaVictory();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (pcCameWorms){
				outputText("\n\nYour foe doesn't seem put off enough to leave...");
				doNext(game.combat.endLustLoss);
			} else {
				game.dungeons.deepcave.loseToVala();
			}
		}

		public function Vala()
		{
			this.a = "";
			this.short = "Vala";
			this.imageName = "vala";
			this.long = "While the fae girl is whip-thin, her breasts are disproportionately huge. They'd be at least a DD-cup on a normal human, but for her height and body type, they're practically as large as her head. They jiggle at her slow, uneven breathing, tiny drops of milk bubbling at her nipples with every heartbeat.  She seems fixated on mating with you, and won't take no for an answer.";
			this.race = "Faerie";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_SLICK, Vagina.LOOSENESS_GAPING_WIDE);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 25, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,10,0,0,0);
			this.tallness = 4*12;
			this.hips.rating = Hips.RATING_CURVY;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "fair";
			this.hair.color = "purple";
			this.hair.length = 22;
			initStrTouSpeInte(40, 50, 50, 60);
			initLibSensCor(55, 35, 50);
			this.weaponName = "fists";
			this.weaponVerb="caresses";
			this.armorName = "skin";
			this.lustVuln = .5;
			if (game.flags[kFLAGS.TIMES_PC_DEFEATED_VALA] > 0) this.lustVuln += .25;
			if (game.flags[kFLAGS.TIMES_PC_DEFEATED_VALA] > 2) this.lustVuln += .5;
			this.lust = Math.min(80, 30 + game.flags[kFLAGS.TIMES_PC_DEFEATED_VALA] * 10);
			this.bonusHP = 350;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 11;
			this.gems = 1;
			this.additionalXP = 50;
			if (game.flags[kFLAGS.TIMES_PC_DEFEATED_VALA] > 0) this.XP = 5;
			if (game.flags[kFLAGS.TIMES_PC_DEFEATED_VALA] > 2) this.XP = 1;
			this.special1 = special1;
			this.special2 = special2;
			this.special3 = special3;
			this.createPerk(PerkLib.Evade, 0, 0, 0, 0);
			if (flags[kFLAGS.TIMES_PC_DEFEATED_VALA] == 0) this.drop = new WeightedDrop(consumables.NUMBROX);
			else this.drop = NO_DROP;
			this.wings.type = Wings.FAERIE_LARGE;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.DeepCave
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;

	public class Zetaz extends Monster
	{
		public function zetazAI():void {
			//Zetaz taunts.
			zetazTaunt();
			outputText("\n\n");
			//If afflicted by blind or whispered and over 50% lust,
			//burns lust and clears statuses before continuing with
			//turn.
			if (lust > 50 && (hasStatusEffect(StatusEffects.Fear) || hasStatusEffect(StatusEffects.Blind))) {
				removeStatusEffect(StatusEffects.Fear);
				removeStatusEffect(StatusEffects.Blind);
				lust -= 10;
				outputText("Zetaz blinks and shakes his head while stroking himself.  After a second his turgid member loses some of its rigidity, but his gaze has become clear.  He's somehow consumed some of his lust to clear away your magic!");
			}

			//STANDARD COMBAT STATUS AFFECTS HERE
			if (hasStatusEffect(StatusEffects.Stunned)) {
				outputText("Your foe is too dazed from your last hit to strike back!");
				removeStatusEffect(StatusEffects.Stunned);

				return;
			}
			var select:Number=1;
			var rando:Number=1;
			//Exgartuan gets to do stuff!
			if (player.hasStatusEffect(StatusEffects.Exgartuan) && player.statusEffectv2(StatusEffects.Exgartuan) == 0 && rand(3) == 0) {
				game.exgartuan.exgartuanCombatUpdate();
				outputText("\n\n");
			}
			if (hasStatusEffect(StatusEffects.Constricted)) {
				//Enemy struggles -
				outputText("Your prey pushes at your tail, twisting and writhing in an effort to escape from your tail's tight bonds.");
				if (statusEffectv1(StatusEffects.Constricted) <= 0) {
					outputText("  " + capitalA + short + " proves to be too much for your tail to handle, breaking free of your tightly bound coils.");
					removeStatusEffect(StatusEffects.Constricted);
				}
				addStatusValue(StatusEffects.Constricted,1,-1);

				return;
			}
			//STANDARD COMBAT STATUS AFFECTS END HERE
			//-If over 50 lust and below 50% hp
			//--burns 20 lust to restore 20% hp.
			if (lust > 50 && HPRatio() <= .5) {
				outputText("The imp lord shudders from his wounds and the pulsing member that's risen from under his tattered loincloth.  He strokes it and murmurs under his breath for a few moments.  You're so busy watching the spectacle of his masturbation that you nearly miss the sight of his bruises and wounds closing!  Zetaz releases his swollen member, and it deflates slightly.  He's used some kind of black magic to convert some of his lust into health!");
				addHP(0.25 * maxHP());
				lust -= 20;
				player.takeLustDamage(2, true);
			}
			else {
				var attackChoice:Number = rand(3);
				if (attackChoice == 0) {
					//Chucks faux-heat draft ala goblins. -
					outputText("Zetaz grabs a bottle from a drawer and hurls it in your direction!  ");
					if ((player.findPerk(PerkLib.Evade) >= 0 && rand(4) == 0) ||
						(player.findPerk(PerkLib.Flexibility) >= 0 && rand(6) == 0) ||
						(player.spe > 65 && rand(10) == 0) ||
						(player.findPerk(PerkLib.Misdirection) >= 0 && rand(100) < 20 && player.armorName == "red, high-society bodysuit")) {
						outputText("You sidestep it a moment before it shatters on the wall, soaking the tapestries with red fluid!");
					}
					else {
						outputText("You try to avoid it, but the fragile glass shatters against you, coating you in sticky red liquid.  It seeps into your " + player.skin.desc + " and leaves a pleasant, residual tingle in its wake.  Oh no...");
						//[Applies: "Temporary Heat" status]
						if (!player.hasStatusEffect(StatusEffects.TemporaryHeat)) player.createStatusEffect(StatusEffects.TemporaryHeat,0,0,0,0);
					}
				}
				else if (attackChoice == 1) {
					//'Gust' – channels a pidgy's spirit to beat
					//his wings and kick up dust, blinding the PC
					//next turn and dealing light damage. -
					outputText("The imp leaps into the air with a powerful spring, beating his wings hard to suspend himself in the center of his bedchamber.  Dust kicks up into the air from the force of his flight and turns the room into a blinding tornado!  Small objects smack off of you, ");
					//(causing little damage/
					if (player.tou > 60) outputText("causing little damage");
					else {
						var dmg:Number = 1 + rand(6);
						outputText("wounding you slightly ");
						dmg = player.takeDamage(dmg, true);
					}
					outputText(" while the dust gets into your eyes, temporarily blinding you!");
					player.createStatusEffect(StatusEffects.Blind,1,0,0,0);
				}
				//Gigarouse – A stronger version of normal imp's
				//'arouse' spell. - copy normal arouse text and
				//spice it up with extra wetness!
				else {
					gigaArouse();
				}
			}

		}

		public function gigaArouse():void {
			outputText("You see " + a + short + " make familiar arcane gestures at you, but his motions seem a lot more over the top than you'd expect from an imp.\n\n");
			game.dynStats("lus", rand(player.lib/10) +player.cor/10+15);
			if (player.lust100 < 30) outputText("Your nethers pulse with pleasant warmth that brings to mind pleasant sexual memories.  ");
			if (player.lust100 >= 30 && player.lust100 < 60) outputText("Blood rushes to your groin in a rush as your body is hit by a tidal-wave of arousal.  ");
			if (player.lust100 >= 60) outputText("Your mouth begins to drool as you close your eyes and imagine yourself sucking off Zetaz, then riding him, letting him sate his desires in your inviting flesh.  The unnatural visions send pulses of lust through you so strongly that your body shivers.  ");
			if (player.cocks.length > 0) {
				if (player.lust100 >= 60 && player.cocks.length > 0) outputText("You feel " + player.SMultiCockDesc() + " dribble pre-cum, bouncing with each beat of your heart and aching to be touched.  ");
				if (player.lust100 >= 30 && player.lust100 < 60 && player.cocks.length == 1) outputText(player.SMultiCockDesc() + " hardens and twitches, distracting you further.  ");
			}
			if (player.vaginas.length > 0) {
				if (player.lust100 >= 60 && player.vaginas[0].vaginalWetness == Vagina.WETNESS_NORMAL && player.vaginas.length == 1) outputText("Your " + player.vaginaDescript() + " dampens perceptibly, feeling very empty.  ");
				if (player.lust100 >= 60 && player.vaginas[0].vaginalWetness == Vagina.WETNESS_WET && player.vaginas.length > 0) outputText("Your crotch becomes sticky with girl-lust, making it clear to " + a + short + " just how welcome your body finds the spell.  ");
				if (player.lust100 >= 60 && player.vaginas[0].vaginalWetness == Vagina.WETNESS_SLICK && player.vaginas.length == 1) outputText("Your " + player.vaginaDescript() + " becomes sloppy and wet, dribbling with desire to be mounted and fucked.  ");
				if (player.lust100 >= 60 && player.vaginas[0].vaginalWetness == Vagina.WETNESS_DROOLING && player.vaginas.length > 0) outputText("Thick runners of girl-lube stream down the insides of your thighs as your crotch gives into the demonic magics.  You wonder what " + a + short + "'s cock would feel like inside you?  ");
				if (player.lust100 >= 60 && player.vaginas[0].vaginalWetness == Vagina.WETNESS_SLAVERING && player.vaginas.length == 1) outputText("Your " + player.vaginaDescript() + " instantly soaks your groin with the heady proof of your need.  You wonder just how slippery you could " + a + short + "'s dick when it's rammed inside you?  ");
			}
			if (player.lust >= player.maxLust()) doNext(game.combat.endLustLoss)
		}

		public function zetazTaunt():void {
			if (!hasStatusEffect(StatusEffects.round)) {
				createStatusEffect(StatusEffects.round,1,0,0,0);
				outputText("Zetaz asks, \"Do you even realize how badly you fucked up my life, ");
				if (player.humanScore() >= 4) outputText("human");
				else outputText("'human'");
				outputText("?  No, of course not.  That's the kind of attitude I'd expect from one of you!\"");
			}
			else {
				addStatusValue(StatusEffects.round,1,1);
				if (statusEffectv1(StatusEffects.round) == 2) outputText("\"I lost my post!  And when you screwed up the factory?  I barely escaped with my life!  You ruined EVERYTHING!\" screams Zetaz.");
				else if (statusEffectv1(StatusEffects.round) == 3) outputText("Zetaz snarls, \"Do you know how hard it is to hide from Lethice?  DO YOU HAVE ANY IDEA!?  I've had to live in this fetid excuse for a jungle, and just when I found some friends and made it livable, you show up and DESTROY EVERYTHING!\"");
				else if (statusEffectv1(StatusEffects.round) == 4) outputText("Zetaz explains, \"I won't let you go.  I'm going to break you.\"");
				else if (statusEffectv1(StatusEffects.round) == 5) outputText("\"Would it have been that bad to go along with me?  You've seen the factory.  We would've kept you fed, warm, and provided you with limitless pleasure.  You would've tasted heaven and served a greater purpose.  It's not too late.  If you come willingly I can make sure they find a good machine to milk you with,\" offers the imp lord.");
				else if (statusEffectv1(StatusEffects.round) == 6) outputText("\"Why won't you fall?\" questions Zetaz incredulously.");
				else if (statusEffectv1(StatusEffects.round) == 7) outputText("The imp lord suggests, \"If you give up and let me fuck your ass maybe I'll let you go.\"");
				else if (statusEffectv1(StatusEffects.round) == 8) outputText("Zetaz pants, \"Just give up!  I'm nothing like the weakling you met so long ago!  I've been through hell to get here and I'm not giving it up just because you've shown up to destroy my hard work!\"");
				else outputText("He glares at you silently.");
			}
		}

		override public function doAI():void
		{
			zetazAI();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.dungeons.deepcave.defeatZetaz();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (pcCameWorms){
				outputText("\n\nYour foe doesn't seem put off enough to care...");
				doNext(game.combat.endLustLoss);
			} else {
				game.dungeons.deepcave.loseToZetaz();
			}
		}

		public function Zetaz()
		{
			this.a = "";
			this.short = "Zetaz";
			this.imageName = "zetaz";
			this.long = "Zetaz has gone from a pipsqueak to the biggest imp you've seen!  Though he has the familiar red skin, curving pointed horns, and wings you would expect to find on an imp, his feet now end in hooves, and his body is covered with thick layers of muscle.  If the dramatic change in appearance is any indication, he's had to toughen up nearly as much as yourself over the past "+(game.time.days < 60? "weeks":"months") +".  Zetaz still wears the trademark imp loincloth, though it bulges and shifts with his movements in a way that suggest a considerable flaccid size and large, full sack.  His shoulders are wrapped with studded leather and his wrists are covered with metallic bracers.  The imp has clearly invested in at least a little additional protection.  It does not look like he carries a weapon.";
			this.race = "Imp";
			this.createCock(rand(2) + 11,2.5,CockTypesEnum.DEMON);
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			this.hoursSinceCum = 20;
			createBreastRow(0);
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = 4*12+1;
			this.hips.rating = Hips.RATING_BOYISH;
			this.butt.rating = Butt.RATING_TIGHT;
			this.lowerBody.type= LowerBody.KANGAROO;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length = 5;
			initStrTouSpeInte(65, 60, 45, 52);
			initLibSensCor(55, 35, 100);
			this.weaponName = "claws";
			this.weaponVerb="claw-slash";
			this.armorName = "leathery skin";
			this.bonusHP = 350;
			this.lust = 40;
			this.lustVuln = .35;
			this.temperment = TEMPERMENT_LUSTY_GRAPPLES;
			this.level = 12;
			this.gems = rand(55) + 150;
			this.additionalXP = 100;
			this.drop = new WeightedDrop(consumables.BIMBOLQ, 1);
			this.wings.type = Wings.IMP;
			this.createPerk(PerkLib.ImprovedSelfControl, 0, 0, 0, 0);
			checkMonster();
		}

	}

}