code:
package classes.Scenes.Dungeons.HelDungeon
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;
	public class AbstractPhoenix extends Monster
	{
		public var ordered:Boolean = false;
		public var friendlyDanger:Boolean = false;
		public var shieldWall:Boolean = false;

		public function AbstractPhoenix()
		{
		}

	}

}

license: unknown


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

	public class Brigid extends Monster
	{

		//Attack One: Hot Poker, Right Up Your Ass!
		private function brigidPoke():void {
			outputText("Brigid stalks forward with confidence, her shield absorbing your defensive blows until she's right on top of you. She bats your [weapon] aside and thrashes you with her hot poker, scalding your [skin] and sending you reeling. ");
			//(Effect: Heavy Damage)
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			var damage:Number = player.reduceDamage(str + weaponAttack,this);
			if (damage < 30) damage = 30;
			damage = player.takeDamage(damage, true);

		}

		//Attack Two: SHIELD BOP! OOM BOP!
		private function brigidBop():void {
			outputText("The harpy feints at you with her poker; you dodge the blow, but you leave yourself vulnerable as she spins around and slams her heavy shield into you, knocking you off balance. ");
			//(Effect: Stagger/Stun)
			var damage:Number = 5;
			damage = player.takeDamage(damage, true);
			if (!player.stun(0,100)) outputText("  Of course, your resolute posture prevents her from accomplishing much.");

		}

		//Attack Three: Harpy Ass Grind GO!
		private function BrigidAssGrind():void {
			outputText("Brigid grins as she approaches you.  She handily deflects a few defensive blows and grabs you by the shoulders.  She forces you onto your knees and before you can blink, has turned around and smashed your face into her ass!  \"<i>Mmm, you like that, don'tcha?</i>\" she growls, grinding her huge, soft ass across your face, giving you an up-close and personal feel of her egg-laying hips.");
			player.takeLustDamage(30, true);

		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI();
			if (player.hasStatusEffect(StatusEffects.Stunned)) {
				player.removeStatusEffect(StatusEffects.Stunned);
				actionChoices.add(BrigidAssGrind, 0.25, true, 5, FATIGUE_NONE,RANGE_TEASE);
				actionChoices.add(brigidPoke, 0.75,true,0,FATIGUE_NONE,RANGE_MELEE);
				actionChoices.exec();
				return;
			}
			actionChoices.add(BrigidAssGrind, 0.25, true, 5, FATIGUE_PHYSICAL,RANGE_TEASE);
			actionChoices.add(brigidBop, 0.33,true,10,FATIGUE_PHYSICAL,RANGE_MELEE);
			actionChoices.add(brigidPoke, 0.42,true,0,FATIGUE_NONE,RANGE_MELEE);
			actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.brigidScene.pcDefeatsBrigid();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			game.brigidScene.pcDefeatedByBrigid();
		}

		public function Brigid()
		{
			this.a = "";
			this.short = "Brigid the Jailer";
			this.imageName = "brigid";
			this.long = "Brigid is a monster of a harpy, standing a foot taller than any other you've seen. She's covered in piercings, and her pink-dyed hair is shaved down to a long mohawk. She's nude, save for the hot poker in her right hand and the shield in her left, which jingles with every step she takes thanks to the cell keys beneath it.";
			this.race = "Harpy";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			if (LowerBody.HARPY > 0) {
				this.createStatusEffect(StatusEffects.BonusVCapacity, LowerBody.HARPY, 0, 0, 0);
			}
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length = 15;
			initStrTouSpeInte(90, 60, 120, 40);
			initLibSensCor(40, 45, 50);
			this.weaponName = "poker";
			this.weaponVerb="burning stab";
			this.weaponAttack = 30;
			this.armorName = "armor";
			this.armorDef = 20;
			this.bonusHP = 1000;
			this.lust = 20;
			this.lustVuln = .25;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 19;
			this.gems = rand(25) +140;
			this.additionalXP = 50;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.tail.type = Tail.DEMONIC;
			this.horns.type = Horns.DEMON;
			this.horns.value = 2;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


code:
/**
 * Created by aimozg on 03.01.14.
 */
package classes.Scenes.Dungeons.HelDungeon
{
	import classes.*;
	import classes.GlobalFlags.kFLAGS;

	public class BrigidScene extends BaseContent
	{
		public function BrigidScene()
		{
		}

		//Brigid the Jailer -- PC Victorious
		public function pcDefeatsBrigid():void {
			clearOutput();
			outputText("The harpy jailer collapses, ");
			if (monster.lust >= monster.maxLust()) outputText("too turned on");
			else outputText("too badly beaten");
			outputText(" to continue the fight.  You quickly snatch the keys from inside her shield, and hook them onto your own belt.");
			//(New Key Item: Harpy Key A)
			player.createKeyItem("Harpy Key A",0,0,0,0);
			combat.cleanupAfterCombat();
			flags[kFLAGS.HEL_BRIGID_DEFEATED] = 1;
		}

		//Brigid the Jailer -- PC Defeated
		public function pcDefeatedByBrigid():void {
			clearOutput();
			if (flags[kFLAGS.HEL_HARPY_QUEEN_DEFEATED] == 0) {
				outputText("\"Tsk tsk tsk,\" the harpy jailer croons, looming over you as you slump to the ground. \"You shouldn't have messed with me, bitch!\" she snaps, giving you a rough kick to the side. \"Now, let's see what Mother has to say about this...\"");
				//(Go to \"Harpy Breeding Slut\" Bad End)
				doNext(game.dungeons.heltower.harpyQueenBeatsUpPCBadEnd);
			}
			else {
				outputText("\"That's it?!\" Brigid screams, as you collapse in front of her.  \"A weak little piece of trash like you took out our queen?\"");

				outputText("\n\n\"[name]!\" calls a voice from behind you.  Hel bounds down the stairs, summoned by the sound of the fight; when she spies your defeated form, she draws her sword and throws herself at the harpy jailer, completely clearing the ground in her rage.  The scene that plays out next passes through your dazed mind agonizingly, like a nightmare.");
				outputText("\n\nAs Hel launches herself over your body, weapon raised over her head, Brigid turns and raises a taloned foot.  It catches the salamander right in the stomach, bending her double, and the scimitar flies out of her hands to skitter across the stone floor.  You can see the light leave Hel's eyes as she coughs violently, and a small fan of blood and flame is ejected from her mouth.  The man on the table winces as Brigid lowers your partner to the ground.");
				outputText("\n\n\"Completely PATHETIC!\" rants the dyke jailer.  \"Neither of you is anything more than garbage!\"  She turns to her torture rack, holding it steady with one foot as she searches for and discards items from it.");

				outputText("\n\n\"Where the fu- AHA!\" she cries in triumph, tossing a dangerous-looking knife aside and claiming something from behind it.  Turning again, Brigid advances on you and Hel with a smouldering smile, carrying two small vials of thick, white liquid.  \"Garbage you may be, but even garbage can be recycled.\"");

				outputText("\n\nAn alarm blares in your mind and you reach out sluggishly to try and grab her slim ankle, but she kicks you in the head and your vision goes mazy.  The last thing you make out before slipping into unconsciousness is the harpy standing over Hel, pinning her fiery tail under a shield held down with one claw as she forces the contents of a vial down the salamander's gullet...");

				doNext(brigitPostQueenDeathBadEndII);
			}
		}

		//--Next--
		private function brigitPostQueenDeathBadEndII():void {
			clearOutput();
			//[(if M, U, or visibly pregnant F/H)
			if (player.gender <= 1 || player.pregnancyIncubation > 0) {
				outputText("A soft, ticklish feeling against your [chest] is the first thing to bring you back to reality.  Your eyes open slowly, revealing a confusing blur of orange.  \"[name],\" murmurs a familiar voice from the unfocused smear, \"you're all right... thank god.\"  As your head clears, the picture slowly resolves into the tear-streaked face of Kiri, the little harpy from before; she smiles as you recognize her, and wraps her arms around your neck.  You try to hold her back, but find you cannot move your hands - looking at them, you notice your wrists secured to the table you're lying on with metal clasps!");
				outputText("\n\n\"S-sorry,\" Kiri whispers, \"Brigid won, remember...\"  The results of the last fight return to you in a flash, explaining your current predicament.  Testing your whole body, you find all your limbs similarly bound to the stone table.");

				outputText("\n\n\"The others?\" you ask, blearily.");

				outputText("\n\nThe harpy girl atop you frowns unhappily, and darts her eyes to the left.  Turning your head to follow her glance, you see the captured salamander from before and, mounted atop his swollen prick, Hel!  Her face is covered by an iron mask, but the tits are the same familiar, jiggling orbs and you can't imagine there are any other female salamanders here... or rather, formerly female.  You revise your guess hurriedly as the captive grunts and thrusts into her, forcing her hips up and allowing the small cock now growing from her crotch to bob freely!  A drop of pre-cum glides down it, and Hel shivers; the skin on her new dick looks chafed and raw, flushed red where it's not spotted with orange scales.");

				outputText("\n\n\"She's been first pick of the remaining women,\" Kiri mumbles, gesturing toward several satisfied harpy and phoenix matrons dozing along the walls.  \"They've spend equal time fighting over and fucking her, poor sis-\"");

				outputText("\n\nA sharp crack sounds and Kiri's eyes widen as her chest jerks forward; Brigid stands behind her, holding a leather crop.  \"You're here to fuck, not talk!\" the torturer screams, shaking the whip at you.  \"I don't care if it's salamanders, phoenixes, or just half-breed harpies, but you are going to help make me a new army to replace the one you wiped out!\"  Kiri grimaces at the brutal woman, but begins shifting her hips against you, sending a wave of pleasure to the base of your spine.");

				//[(if F or U)
				if (!player.hasCock()) {
					outputText("\n\nYour eyes widen in shock at the sensation, and Kiri flinches at your expression.  \"What,\" Brigid asks, glowering at you, \"did you think we'd let you go after what you did, just because we couldn't breed you?");
					if (player.pregnancyIncubation > 0) outputText("  Once this disgusting thing you're carrying falls out of you, we'll use you more traditionally, but...\"  She pauses to press uncomfortably on your pregnant belly, then resumes speaking.  \"I have no intention of letting you sit idle for however long that takes.");
					outputText("  For now, I've given you the most obvious modification - I can think of something else later.\"");
					outputText("\n\nShe squeezes Kiri's ass firmly with one hand, and lifts the girl partway out of your lap.  A smooth, hot sensation separates from your crotch and glides along nerves you hadn't noticed until now as Kiri's pussy slides upward, partially revealing the erect, " + player.skin.tone + " flesh of a brand new cock!  Brigid gloats at your confusion, laughing her delight to the roof of the chamber, then shoves Kiri's ass downward again, spearing her pussy on your new flesh and making the girl wince and grit her teeth.");
					player.createCock();
				}
				outputText("\n\nThe jailer slaps the small half-breed on the butt, sending a pleasing tremor through your cock, then withdraws to a stool in the corner.  \"Fuck... or I'll make you fuck,\" she declares ominously, casting her riding crop aside and beckoning another harpy over.  She picks up a worn journal as the other woman sits on her leg, then begins turning the pages with a thumb as she plays with the harpy's pussy.  \"Watch them for me, sweet,\" Brigid says, kissing the woman on the neck.  \"Make sure they do their jobs while I'm studying mom's notes.\"  Her lover shivers and nods nervously, fixing her eyes on you.");

				outputText("\n\nKiri strokes your prick with her body vigorously, pushing you toward your limit and keeping up appearances even as she whispers to you.  \"Please, [name]... just endure it for now.  I'll think of a way to get you out of here, I promise.\"  She shifts her hips downward, engulfing your shaft again, and rolls her head passionately as her cheeks flush.  \"I-it may be a while, though,\" she says, kissing your chest.  \"I - ah! I'm not very much by myself, so... the only thing I can do is make lots of loyal, strong daughters with your seed... s-someday there'll be enough to make a break for it!  J-just hold on and... and... fertilize me!  Fertilize me, [name]!\"");

				outputText("\n\nThe harpy's eyes roll back in her head as she moans and sinks down one last time in orgasm, sucking at your cock with her vagina; your throbbing prick obeys, ejaculating a load of semen into the open-mouthed bird-girl.  \"Ohh god,\" Kiri gasps, \"YES!  Cover my eggs in your sticky cum!  Fill me up!\"");
				if (player.cockTotal() > 1 || player.cumQ() > 1000) outputText("  " + player.SMultiCockDesc() + " holds forth for a while, until Kiri's ass, pussy, and tailfeathers are soaked with oozing, white cum.");
				outputText("  Next to you, the salamander on the other table climaxes as well, dumping a load into Hel that sizzles when it leaks onto his fiery, iron-bound tail.  Your former lover squirms and shivers as the scalding-hot load fills her cunt, and her own prick twitches weakly, depositing a small string of bubbling jism on the stone table.");

				outputText("\n\n\"Oh dad... Hel... I'm sorry,\" Kiri whimpers, unable to pull her eyes away from them as your cock dribbles the last of your seed into her.  The bound man's single eye widens as he hears the name of his partner, and his face deforms with rage as a roar pours out of him with enough volume to shake the room.  Kiri buries her face in your [chest] and shudders as the prisoner bellows his frustration; Hel simply looks left and right, confused and anxious as the echoing roar dies off; Brigid pushes her toy pussy away and rises from her stool.");

				outputText("\n\n\"Not bad, old man,\" the jailer quips.  \"I didn't think you had that much life left in you.  Maybe I'll keep you with this woman for a while!\"  The salamander's eye hardens, but he says nothing; Brigid looks from him to you and Kiri, but you both assume expressions of studied incomprehension.  \"... Whatever.  You bitches get up; you've had your turns and I've got a lot more cunts to pack full.\"  She begins pulling Hel's chains free of the iron ring at the end of the table.");

				outputText("\n\nKiri frowns unhappily as she slips your cock from her pussy, then kisses you.  \"Remember, [name]... just hold on!  And... save some of your seed for me!\"  She lingers for a while, looking in your eyes affectionately, but Brigid grabs her by the hair and, swearing filthily, pulls her away.  A sadistic-looking phoenix takes her place, straddling you and slipping your sore prick into her cunt... the last thing you manage to do before your head is filled with the agony and ecstasy of having your raw shaft ridden again right after orgasm is to wonder exactly how long salamander-harpy half-breeds gestate...");
				//[GAME THE FUCK OVER, SON; WHERE IS MY MONEY?]
				game.gameOver();
				if (flags[kFLAGS.HARDCORE_MODE] <= 0) addButton(1, "Retry", game.dungeons.heltower.retryDungeonFromBadEndPrompt);
			}
			//(else if not visibly pregnant F or H)
			else {
				//hymen check]
				player.cuntChange(15,false,false,false);
				outputText("The heat in your [vagina] is the first thing to stir you.  Your eyes open painfully, fluttering with each soft pulse of your head; it feels like an imp was set loose inside, covering your brain with thick jizz, but eventually you manage to focus and look down.  What greets you is the sight of ");
				if (player.hasCock()) outputText(player.sMultiCockDesc() + " bobbing up and down, drooling pre-cum, as ");
				outputText("your red, sore pussy is pounded viciously by a thick cock dotted with scales.  Below it dangles a pair of swollen balls, bouncing as the shaft is thrust into you; with an inkling of understanding, you look back to confirm your suspicion.  Sure enough, you're mounted atop the table-bound salamander from before, who grunts as he pushes into you.  The hot cock, hotter than your body, slides in with a sizzle, and some of your juices roll down the shaft, only to evaporate when they hit the salamander's flaming, iron-bound tail.  Your own limbs are chained to the table via a massive iron ring and Brigid stands in front of you, watching you expectantly; behind her are arranged a score of assorted harpies and surviving phoenixes in various stages of coitus.");

				outputText("\n\nIt takes you a while to realize that the gasps you're hearing aren't all coming from you and the rabble; you turn your head to the table next to you, upon which is strapped Hel.  The woman is restrained much the same way as your salamander, except her legs are spread wide open, displaying her pussy for all to see, and an additional iron mask completely covers her face.  Atop Hel sits Kiri, the little orange-feathered harpy from before, grinding her feathery pelvis into Hel's.  \"S-sorry dad; [name],\" Kiri says, wincing as she notices your stare.  \"Just... try to... t-to hold on!\"  She reclines and pulls away from Hel, and for the first time you can see what she's grinding on; a small, orange-scaled dick is jutting from Hel's crotch!  Kiri moans as she stirs her pussy with it, throwing her hips upward to reveal that she, too, sports a brand-new, oozing penis.");

				outputText("\n\n\"Talk less, fuck more!\" howls Brigid, striking Kiri across the shoulders.  \"Our queen is gone, and the burden falls on us to repopulate our ranks!  Be glad I consider you worthy enough to use your seed, little half-breed!  Whether it's salamanders, phoenixes, or weak fodder like you, you WILL reproduce!\"");

				outputText("\n\nAs Brigid turns away, Kiri scowls and leans forward again, pressing her modest breasts against her lover's and whispering something to the masked Hel, who nods and begins thrusting vigorously.  The sight returns your attention to the cock in your own [vagina], and your head rolls back as the salamander under you fucks faster, drawing closer to orgasm.  His thick, rough prick scrapes your walls angrily, the little lubrication you can generate overtaxed as it tries to cope with his sweltering body heat and the blistering pace of the sex.");

				outputText("\n\nA muffled cry comes from the table beside you, as Hel achieves climax and buries her new dick as deeply into Kiri as she can.  As her body convulses, you can see her pussy squeezing out strings of white seed to drool between her legs - likely Kiri's, as the little harpy blushes when she notices the oozing mess over her shoulder.  The room is filled with the smell of semen as the goo hits Hel's tail and begins to bubble, and Kiri lets out a cry as well, falling backward onto her outstretched hands as her hips shake; a little squirt of cum lances from her cock, to land on Hel's tits.  \"F-fuck yeah, fertilize me!  Paint my eggs with your sperm!\" Kiri shouts in ecstasy, proving that she's still a harpy after all.");

				outputText("\n\nThe dick in you twitches and a flood of painful warmth in your own womb tenses your body; you slide partway off of the shaft in agony, and you can see the man's wrists straining against his bonds, trying to break free so he can pull you back down.  He roars in frustration as you expose more than half of his cock to the air trying to get away from the intensely hot seed, but there's not enough slack in your bonds, and he finishes inside you, leaving your [face] tear-stained and pinched.  Brigid takes your chin in her hands.");

				outputText("\n\n\"Aww, didn't come yet?  Too bad.  There's only one use for a trash " + player.race + " like you, anyway,\" your jailer coos sweetly, caressing your [skin].  \"You're going to make me more salamanders, so... better luck next time!\"  She unfastens your chains from the loop on the table, violently dragging you clear and covering your [butt] in the scalding seed pouring out of you.  \"I don't care what you bitches do with this one,\" Brigid says, yanking you toward the ongoing harpy orgy, \"just don't ruin her.  That breeding stock on the table won't last much longer once we start to make up for the soldiers we lost, and we might be able to get a replacement out of her womb.  And don't fucking bother me, I need to go over mom's notes and figure out how she was making the phoenixes!\"");

				outputText("\n\nWith a shove from the pink-haired jailer, you're tumbled into a pair of lovers; the phoenix stops groping the harpy's tits to wrap her arm around you and pull you to the floor, and no sooner are you laid down than the harpy's stretched, semen-stuffed pussy is atop your mouth, grinding into your face and drooling warm phoenix seed down your throat");
				if (player.hasCock()) outputText(" as the phoenix's cunt slides onto your [cock smallest]");
				outputText(".  Brigid makes her way up the stairs, leaving you and the others at the mercy of the assorted horde.  The harpy rides your mouth greedily, knocking your head into the hard stone floor, and the last thing you can see around her feathery thighs before you slip into unconsciousness again is Kiri being pulled roughly from her resting place atop Hel by a mean-looking, wide-hipped harpy matron who takes her place, sitting sideways and drawing her talons sadistically across Hel's vulnerable chest to smear Kiri's seed around...");
				//[GAME OVER, MOTHERFUCKER]
				game.gameOver();
				if (flags[kFLAGS.HARDCORE_MODE] <= 0) addButton(1, "Retry", game.dungeons.heltower.retryDungeonFromBadEndPrompt);
			}
		}

	}
}


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

	public class HarpyMob extends Monster
	{
		public function harpyHordeAI():void {
			var actionChoices:MonsterAI = new MonsterAI();
			actionChoices.add(harpyHordeLustAttack, 0.25,true,0,0,RANGE_OMNI);
			actionChoices.add(harpyHordeGangBangAttack, 0.25,true,0,0,RANGE_OMNI);
			actionChoices.add(harpyHordeClawFlurry, 0.5,true,0,0,RANGE_OMNI);
			actionChoices.exec();
		}

		override public function react(context:int):Boolean{
			switch(context){
				case CON_PLAYERWAITED:
					if (player.hasStatusEffect(StatusEffects.HarpyBind)) {
						clearOutput();
						outputText("The brood continues to hammer away at your defenseless self. ");
						var temp:Number = 80 + rand(40);
						temp = game.combat.takeDamage(temp, true);
						tookAction = true;
						return false;
					}
					break;
			}
			return true;
		}

		//ATTACK ONE: Claw Flurry
		public function harpyHordeClawFlurry():void {
			outputText("The harpies lunge at you, a veritable storm of talons and claws raining down around you.  You stumble back, trying desperately to deflect some of the attacks, but there are simply too many to block them all!  Only a single harpy in the brood seems to be holding back...\n");
			//(Effect: Multiple light attacks)
			createStatusEffect(StatusEffects.Attacks,3+rand(3),0,0,0);
			eAttack();

		}

		//ATTACK TWO: Gangbang
		public function harpyHordeGangBangAttack():void {
			outputText("Suddenly, a pair of harpies grabs you from behind, holding your arms to keep you from fighting back! Taking advantage of your open state, the other harpies leap at you, hammering your chest with punches and kicks - only one hangs back from the gang assault.\n\n");
			player.createStatusEffect(StatusEffects.HarpyBind,0,0,0,0);
			//(PC must struggle:
			harpyHordeGangBangStruggle(false);
		}

		public function harpyHordeGangBangStruggle(clearDisp:Boolean = true):void {
			if (clearDisp) clearOutput();
			//Failure:
			//If fail:
			if (rand(10) > 0 && player.str/5 + rand(20) < 23) {
				var damage:Number = 80 + rand(40);
				outputText("You struggle in the harpies' grasp, but can't quite get free.  The brood continues to hammer away at your defenseless self. ");
				damage = player.takeDamage(damage, true);
			}
			//Success:
			else {
				player.removeStatusEffect(StatusEffects.HarpyBind);
				outputText("With a mighty roar, you throw off the harpies grabbing you and return to the fight!");
			}
			tookAction = true;
		}

		//ATTACK THREE: LUSTY HARPIES!
		public function harpyHordeLustAttack():void {
			var lustDmg:int = 10;
			outputText("The harpies back off for a moment, giving you room to breathe - only to begin a mini strip-tease, pulling off bits of clothing to reveal their massive asses and hips or bearing their small, perky tits.  They caress themselves and each other, moaning lewdly.  Distracted by the burlesque, you don't notice a lipstick-wearing harpy approach you until it's too late!  She plants a kiss right on your lips, ");
			if (player.findPerk(PerkLib.LuststickAdapted) >= 0) outputText("doing relatively little thanks to your adaptation");
			else {
				outputText("sending shivers of lust up your spine");
				lustDmg += 5;
				if (player.hasCock()) lustDmg += 15;
			}
			outputText(".");
			player.takeLustDamage(lustDmg, true);

		}

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

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

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

		public function HarpyMob()
		{
			this.a = "the ";
			this.short = "harpy horde";
			this.imageName = "harpymob";
			this.long = "You are surrounded by a wing of particularly large and muscular harpies, perhaps a dozen of them in total.  All of them are clad in simple brown shifts that give them good camouflage in the mountains, and are using their talon-like claws as weapons against you. While not a great threat to a champion of your ability individually, a whole brood of them together is... something else entirely.";
			this.race = "Harpies";
			this.plural = true;
			this.pronoun1 = "they";
			this.pronoun2 = "them";
			this.pronoun3 = "their";
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_GAPING_WIDE);
			createBreastRow(Appearance.breastCupInverse("B"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_SLIME_DROOLING;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_CURVY+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type= LowerBody.HARPY;
			this.skin.tone = "red";
			this.skin.type = Skin.PLAIN;
			this.skin.desc = "feathers";
			this.hair.color = "black";
			this.hair.length = 15;
			initStrTouSpeInte(50, 50, 120, 40);
			initLibSensCor(60, 45, 50);
			this.weaponName = "claw";
			this.weaponVerb="claw";
			this.weaponAttack = 10;
			this.armorName = "armor";
			this.armorDef = 20;
			this.bonusHP = 1000;
			this.lust = 20;
			this.lustVuln = .2;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 18;
			this.gems = rand(25) +140;
			this.additionalXP = 50;
			this.tail.type = Tail.HARPY;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


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

	public class HarpyQueen extends Monster
	{
		public function harpyQueenAI():void {
			var actionChoices:MonsterAI = new MonsterAI()
				.add(eldritchRopes, 40,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
			actionChoices.add(lustSpikeAttack, 20, true, 10, FATIGUE_MAGICAL,RANGE_RANGED);
			actionChoices.add(windSlamAttack, 50, true, 10, FATIGUE_MAGICAL,RANGE_RANGED);
			actionChoices.exec();
		}

		override public function react(context:int):Boolean{
			switch (context){
				case CON_PLAYERWAITED:
					if (hasStatusEffect(StatusEffects.QueenBind)) {
						ropeStruggles(true);
						tookAction = true;
						return false;
					}
			}
			return true;
		}

		//ATTACK ONE: ELDRITCH ROPES
		public function eldritchRopes():void {
			outputText("The Harpy Queen flicks her left wrist at you. Before you can blink, ropes of white-hot magic hurtle toward you. You manage to duck and dodge a few of them, but a pair still grab your wrists, pulling painfully at your arms.");
			//(Effect: Grab + Physical Damage)
			var damage:int = 25 + rand(10);
			damage = player.takeDamage(damage, true);
			createStatusEffect(StatusEffects.QueenBind,0,0,0,0);

		}

		public function ropeStruggles(wait:Boolean = false):void {
			clearOutput();
			//Struggle Fail:
			if (rand(10) > 0 && player.str/5 + rand(20) < 23 || wait) {
				outputText("You give a mighty try, but cannot pull free of the magic ropes!  The Harpy Queen laughs uproariously, pulling at your arms harder.");
				if (player.findPerk(PerkLib.Juggernaut) < 0 && armorPerk != "Heavy") {var damage:int = 25 + rand(10);
				damage = player.takeDamage(damage, true);
				}
			}
			else {
				outputText("With supreme effort, you pull free of the magic ropes, causing the queen to tumble to her hands and knees.");
				removeStatusEffect(StatusEffects.QueenBind);
			}
			tookAction = true;
		}

		//ATTACK TWO: LUST SPIKE
		public function lustSpikeAttack():void {
			outputText("The Harpy Queen draws a strange arcane circle in the air, lines of magic remaining wherever the tip of her staff goes.  You try to rush her, but the circle seems to have created some kind of barrier around her.  You can only try to force it open - but too late!  A great pink bolt shoots out of the circle, slamming into your chest.  You suddenly feel light-headed and so very, very horny...");
			//(Effect: Heavy Lust Damage)
			player.takeLustDamage(40, true);

		}

		//ATTACK THREE: Wind Slam!
		public function windSlamAttack():void {
			outputText("The queen swings her arm at you and, despite being a few feet away, you feel a kinetic wall slam into you, and you go flying - right into the harpy brood!  You feel claws, teeth and talons dig into you, but you're saved by a familiar pair of scaled arms.  \"<i>Get back in there!</i>\" Helia shouts, throwing you back into the battle!");
			//(Effect; Heavy Damage)
			var damage:Number = 100 + rand(50);
			damage = player.takeDamage(damage, true);

		}

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

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

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

		public function HarpyQueen()
		{
			this.a = "the ";
			this.short = "Harpy Queen";
			this.imageName = "harpyqueen";
			this.long = "You face the Harpy Queen, a broodmother of epic proportions - literally.  Her hips are amazingly wide, thrice her own width at the least, and the rest of her body is lushly voluptuous, with plush, soft thighs and a tremendous butt.  Her wide wings beat occasionally, sending ripples through her jiggly body.  She wields a towering whitewood staff in one hand, using the other to cast eldritch spells.";
			this.race = "Harpy";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type= LowerBody.HARPY;
			this.skin.tone = "red";
			this.skin.type = Skin.PLAIN;
			this.skin.desc = "feathers";
			this.hair.color = "black";
			this.hair.length = 15;
			initStrTouSpeInte(70, 60, 120, 40);
			initLibSensCor(40, 45, 50);
			this.weaponName = "eldritch staff";
			this.weaponVerb="thwack";
			this.weaponAttack = 20;
			this.armorName = "armor";
			this.armorDef = 20;
			this.bonusHP = 1000;
			this.lust = 20;
			this.lustVuln = .15;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 20;
			this.gems = rand(25) +160;
			this.additionalXP = 50;
			this.tail.type = Tail.HARPY;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.drop = NO_DROP;
			this.createPerk(PerkLib.ImprovedSelfControl, 0, 0, 0, 0);
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.HelDungeon
{
	import classes.*;
	import classes.Scenes.Areas.HighMountains.Phoenix;
	import classes.BodyParts.*;
	import classes.internals.*;
	public class PhoenixCommander extends AbstractPhoenix
	{

		public function protectMe():void{
			outputText("The Phoenix Commander hits her shield with her spear. [say: Defense formation! Protect your commander!]\nThe other soldiers in the platoon move in, forming a defensive shield wall on their leader!");
			armorDef = 70;
			shieldWall = true;
		}

		public function inspire():void{
			changeFatigue(15,2);
			outputText("The Phoenix Commander roars, prompting the other members to roar in return! [say: For the glory of our Queen, soldiers! Give this worm what [he] deserves; a good old bleeding and the tip of a spear!]\nThe remaining soldiers seem to be boosted by the Commander's words!");
			for (var i:int = 0; i < game.monsterArray.length; i++){
				if (game.monsterArray[i].HP > 0){
					if (game.monsterArray[i].hasStatusEffect(StatusEffects.Stunned) && rand(2) == 0) game.monsterArray[i].removeStatusEffect(StatusEffects.Stunned);
					if (game.monsterArray[i].hasStatusEffect(StatusEffects.Fear) && rand(2) == 0) game.monsterArray[i].removeStatusEffect(StatusEffects.Fear);
					if (game.monsterArray[i].hasStatusEffect(StatusEffects.Whispered) && rand(2) == 0) game.monsterArray[i].removeStatusEffect(StatusEffects.Whispered);
					game.monsterArray[i].fatigue -= 15;
					if(game.monsterArray[i].fatigue < 0) game.monsterArray[i].fatigue = 0;
					game.monsterArray[i].HP += game.monsterArray[i].maxHP() * 0.15;
					if (game.monsterArray[i].HP > game.monsterArray[i].maxHP()) game.monsterArray[i].HP = game.monsterArray[i].maxHP();
				}
			}

		}

		public function order():void{
			for (var i:int = 0; i < game.monsterArray.length; i++){
				if (game.monsterArray[i] is PhoenixGrenadier && game.monsterArray[i].HP > 0 && game.monsterArray[i].fatigue <= 85 && player.lust/player.maxLust() > 0.5 && rand(2) == 1){
					outputText("The Phoenix Commander raises her spear arm, screaming. [say: Grenadier! Get that target nice and lusty, on the double!]");
					(game.monsterArray[i] as AbstractPhoenix).ordered = true;
					return;
				}
				if (game.monsterArray[i] is PhoenixPyro && game.monsterArray[i].HP > 0 && game.monsterArray[i].fatigue <= 85 && player.HP / player.maxHP() < 0.4 && rand(2) == 1){
					outputText("The Phoenix Commander raises her spear arm, screaming. [say: Pyro! I want that tango scorched right now!]");
					(game.monsterArray[i] as AbstractPhoenix).ordered = true;
					return;
				}
				if (game.monsterArray[i] is PhoenixSapper && game.monsterArray[i].HP > 0 && game.monsterArray[i].fatigue <= 85 && friendlyDanger && rand(2) == 1){
					outputText("The Phoenix Commander raises her spear arm, screaming. [say: Sapper! Give us an advantage!]");
					(game.monsterArray[i] as AbstractPhoenix).ordered = true;
					friendlyDanger = false;
					return;
				}
			}
		}

		public function goingSolo():Boolean{
			for each(var monster:Monster in game.monsterArray){
				if(monster != this && monster.HP > 0){
					return false;
				}
			}
			return true;
		}
		public function phoenixPlatoonAI():void {
			if (game.monsterArray.length > 1) order();
			if (HPRatio() < 0.4 && !shieldWall){
				protectMe();
				return;
			}
			if (game.monsterArray.length > 1 && rand(3) == 1 && hasFatigue(15,2) && !goingSolo()){
				inspire();
				return;
			}
			outputText("\n");
			eAttack();
		}

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

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

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

		public function PhoenixCommander()
		{
			this.a = "the ";
			this.short = "Phoenix Commander";
			this.imageName = "phoenixmob";
			this.long = "You are faced with a platoon of heavy infantry, all armed to the teeth and protected by chain vests and shields. They look like a cross between salamander and harpy, humanoid save for crimson wings, scaled feet, and long fiery tails. They stand in a tight-knit shield wall, each phoenix protecting herself and the warrior next to her with their tower-shield. Their scimitars cut great swaths through the room as they slowly advance upon you.";
			this.plural = false;
			this.pronoun1 = "she";
			this.pronoun2 = "her";
			this.pronoun3 = "her";
			this.createCock();
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type = LowerBody.LIZARD;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length= 15;
			initStrTouSpeInte(70, 60, 120, 80);
			initLibSensCor(40, 45, 50);
			this.weaponName = "spears";
			this.weaponVerb="stab";
			this.weaponAttack = 20;
			this.canBlock = true;
			this.shieldBlock = 20;
			this.shieldName = "heater shield";
			this.armorName = "armor";
			this.armorDef = 50;
			this.bonusHP = 450;
			this.lust = 20;
			this.lustVuln = .15;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 20;
			this.gems = rand(25) +160;
			this.additionalXP = 50;
			this.horns.type = Horns.DRACONIC_X2;
			this.horns.value = 2;
			this.tail.type = Tail.HARPY;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.HelDungeon
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;
	public class PhoenixGrenadier extends AbstractPhoenix
	{
		//ATTACK THREE: LUSTBANG GRENADE
		public function phoenixPlatoonLustbang():void {
			outputText("\"<i>LUSTBANG OUT!</i>\" one of the rear-most phoenixes shouts, causing all the other warriors to duck down behind their shields.  Oh, shit!  A large glass sphere rolls out from the shield wall, and immediately explodes in a great pink cloud.  You cough and wave your arms, but by the time the cloud has dissipated, you feel lightheaded and lusty, barely able to resist the urge to throw yourself at the phoenixes and beg for their cocks and cunts.");
			//(Effect: Large lust increase)
			player.takeLustDamage(23);

		}

		public function phoenixPlatoonAI():void {
			if (game.monsterArray.length > 1){
				for (var i:int = 0; i < game.monsterArray.length; i++){
					if (game.monsterArray[i] is PhoenixCommander){
						if (game.monsterArray[i].HP > 0){
							if (HP / maxHP() < 0.5){
								if (game.monsterArray[i].hasStatusEffect(StatusEffects.Stunned) || game.monsterArray[i].hasStatusEffect(StatusEffects.Fear)){
									outputText("Without her leader's orders, the Phoenix Grenadier doesn't know what to do!");
									return;
								}
								(game.monsterArray[i] as AbstractPhoenix).friendlyDanger = true;
								break;
							}
						}else{
							if (rand(4) == 0){
								outputText("Without her leader, the Phoenix Grenadier doesn't know what to do!");
								return;
							}

						}

					}
				}
			}
			var actionChoices:MonsterAI = new MonsterAI()
				.add(phoenixPlatoonLustbang, 1,ordered,15,FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.add(eAttack, 3, !ordered,0,FATIGUE_NONE,RANGE_MELEE);
			actionChoices.add(phoenixPlatoonLustbang, 1, !ordered, 15, FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.exec();
			ordered = false;
		}

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

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

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

		public function PhoenixGrenadier()
		{
			this.a = "the ";
			this.short = "Phoenix Grenadier";
			this.imageName = "phoenixmob";
			this.long = "You are faced with a platoon of heavy infantry, all armed to the teeth and protected by chain vests and shields. They look like a cross between salamander and harpy, humanoid save for crimson wings, scaled feet, and long fiery tails. They stand in a tight-knit shield wall, each phoenix protecting herself and the warrior next to her with their tower-shield. Their scimitars cut great swaths through the room as they slowly advance upon you.";
			this.plural = false;
			this.pronoun1 = "she";
			this.pronoun2 = "her";
			this.pronoun3 = "her";
			this.createCock();
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type = LowerBody.LIZARD;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length= 15;
			initStrTouSpeInte(60, 60, 120, 40);
			initLibSensCor(40, 45, 50);
			this.weaponName = "spears";
			this.weaponVerb="stab";
			this.armorName = "armor";
			this.armorDef = 30;
			this.bonusHP = 100;
			this.lust = 20;
			this.lustVuln = .30;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 20;
			this.gems = rand(25) +160;
			this.additionalXP = 50;
			this.horns.type = Horns.DRACONIC_X2;
			this.horns.value = 2;
			this.tail.type = Tail.HARPY;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


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

	public class PhoenixPlatoon extends Monster
	{
		//ATTACK ONE: SPARTAN RUSH
		public function phoenixPlatoonRush():void {
			outputText("You fall back under a hail of scimitar attacks.  The sheer number of phoenixes attacking is bad enough, but their attacks are perfectly coordinated, leaving virtually no room for escape or maneuver without getting hit!\n");
			//(Effect: Multiple medium-damage attacks)
			//(Effect: Multiple light attacks)
			createStatusEffect(StatusEffects.Attacks,2+rand(3),0,0,0);
			eAttack();

		}

		//ATTACK TWO: FIRE BREATH
		public function phoenixPlatoonFireBreath():void {
			outputText("Suddenly, the shield wall parts, revealing a single member of the platoon, a particularly muscular girl with a raging erection.  Before you can consider what's going on, she rears back and huffs at you.  To your horror, a great gout of fire erupts from her mouth, rolling towards you.  You dive, but are still caught partially in the inferno.");
			//(Effect: One heavy-damage attack)
			var damage:Number = 100 + rand(50);
			damage = player.takeDamage(damage, true);

		}
		//ATTACK THREE: LUSTBANG GRENADE
		public function phoenixPlatoonLustbang():void {
			outputText("\"<i>LUSTBANG OUT!</i>\" one of the rear-most phoenixes shouts, causing all the other warriors to duck down behind their shields.  Oh, shit!  A large glass sphere rolls out from the shield wall, and immediately explodes in a great pink cloud.  You cough and wave your arms, but by the time the cloud has dissipated, you feel lightheaded and lusty, barely able to resist the urge to throw yourself at the phoenixes and beg for their cocks and cunts.");
			//(Effect: Large lust increase)
			player.takeLustDamage(40, true);

		}

		public function phoenixPlatoonAI():void {
			if (!hasStatusEffect(StatusEffects.Platoon)) {
				phoenixPlatoonRush();
				createStatusEffect(StatusEffects.Platoon,0,0,0,0);
			}
			else if (statusEffectv1(StatusEffects.Platoon) == 0) {
				phoenixPlatoonFireBreath();
				addStatusValue(StatusEffects.Platoon,1,1);
			}
			else {
				phoenixPlatoonLustbang()
				removeStatusEffect(StatusEffects.Platoon);
			}
		}

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

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

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

		public function PhoenixPlatoon()
		{
			this.a = "the ";
			this.short = "phoenix platoon";
			this.imageName = "phoenixmob";
			this.long = "You are faced with a platoon of heavy infantry, all armed to the teeth and protected by chain vests and shields. They look like a cross between salamander and harpy, humanoid save for crimson wings, scaled feet, and long fiery tails. They stand in a tight-knit shield wall, each phoenix protecting herself and the warrior next to her with their tower-shield. Their spears cut great swaths through the room as they slowly advance upon you.";
			this.plural = true;
			this.pronoun1 = "they";
			this.pronoun2 = "them";
			this.pronoun3 = "their";
			this.createCock();
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type= LowerBody.LIZARD;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length = 15;
			initStrTouSpeInte(60, 60, 120, 40);
			initLibSensCor(40, 45, 50);
			this.weaponName = "spears";
			this.weaponVerb="stab";
			this.weaponAttack = 20;
			this.armorName = "armor";
			this.armorDef = 50;
			this.bonusHP = 400;
			this.lust = 20;
			this.lustVuln = .15;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 20;
			this.gems = rand(25) +160;
			this.additionalXP = 50;
			this.horns.type = Horns.DRACONIC_X2;
			this.horns.value = 2;
			this.tail.type = Tail.HARPY;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.HelDungeon
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;
	public class PhoenixPyro extends AbstractPhoenix
	{

		public function phoenixPlatoonAI():void {
			if (game.monsterArray.length > 1){
				for (var i:int = 0; i < game.monsterArray.length; i++){
					if (game.monsterArray[i] is PhoenixCommander){
						if (game.monsterArray[i].HP > 0){
							if (HP / maxHP() < 0.5){
								if (game.monsterArray[i].hasStatusEffect(StatusEffects.Stunned) || game.monsterArray[i].hasStatusEffect(StatusEffects.Fear)){
									outputText("Without her leader's orders, the Phoenix Pyro doesn't know what to do!");
									return;
								}
								(game.monsterArray[i] as AbstractPhoenix).friendlyDanger = true;
								break;
							}
						}else{
							if (rand(4) == 0){
								outputText("Without her leader, the Phoenix Pyro doesn't know what to do!");
								return;
							}

						}

					}
				}
			}
			var actionChoices:MonsterAI = new MonsterAI()
				.add(phoenixPlatoonFireBreath, 1,ordered,15,FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.add(eAttack, 3, !ordered,0,FATIGUE_NONE,RANGE_MELEE);
			actionChoices.add(phoenixPlatoonFireBreath, 1, !ordered, 15, FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.exec();
			ordered = false;
		}

		//ATTACK TWO: FIRE BREATH
		public function phoenixPlatoonFireBreath():void {
			outputText("Suddenly, the shield wall parts, revealing a single member of the platoon, a particularly muscular girl with a raging erection.  Before you can consider what's going on, she rears back and huffs at you.  To your horror, a great gout of fire erupts from her mouth, rolling towards you.  You dive, but are still caught partially in the inferno.");
			//(Effect: One heavy-damage attack)
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			var damage:Number = 60 + rand(50);
			if (player.shield == game.shields.DRGNSHL && rand(2) == 0) outputText("\nYou manage to raise your dragon shell shield in time, and it absorbs the gout of fire with remarkable ease.");
			else damage = player.takeDamage(damage, true);
		}

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

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

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

		public function PhoenixPyro()
		{
			this.a = "the ";
			this.short = "Phoenix Pyro";
			this.imageName = "phoenixmob";
			this.long = "You are faced with a platoon of heavy infantry, all armed to the teeth and protected by chain vests and shields. They look like a cross between salamander and harpy, humanoid save for crimson wings, scaled feet, and long fiery tails. They stand in a tight-knit shield wall, each phoenix protecting herself and the warrior next to her with their tower-shield. Their scimitars cut great swaths through the room as they slowly advance upon you.";
			this.plural = false;
			this.pronoun1 = "she";
			this.pronoun2 = "her";
			this.pronoun3 = "her";
			this.createCock();
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type = LowerBody.LIZARD;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length= 15;
			initStrTouSpeInte(70, 60, 120, 40);
			initLibSensCor(40, 45, 50);
			this.weaponName = "spears";
			this.weaponVerb="stab";
			this.weaponAttack = 40;
			this.armorName = "armor";
			this.armorDef = 50;
			this.bonusHP = 200;
			this.lust = 20;
			this.lustVuln = .15;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 20;
			this.gems = rand(25) +160;
			this.additionalXP = 50;
			this.horns.type = Horns.DRACONIC_X2;
			this.horns.value = 2;
			this.tail.type = Tail.HARPY;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.HelDungeon
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;
	public class PhoenixSapper extends AbstractPhoenix
	{

		public function phoenixPlatoonAI():void {
			if (game.monsterArray.length > 1){
				for (var i:int = 0; i < game.monsterArray.length; i++){
					if (game.monsterArray[i] is PhoenixCommander){
						if (game.monsterArray[i].HP > 0){
							if (HP / maxHP() < 0.5){
								if (game.monsterArray[i].hasStatusEffect(StatusEffects.Stunned) || game.monsterArray[i].hasStatusEffect(StatusEffects.Fear)){
									outputText("Without her leader's orders, the Phoenix Sapper doesn't know what to do!");
									return;
								}
								(game.monsterArray[i] as AbstractPhoenix).friendlyDanger = true;
								break;
							}
						}else{
							if (rand(4) == 0){
								outputText("Without her leader, the Phoenix Sapper doesn't know what to do!");
								return;
							}

						}

					}
				}
			}
			var actionChoices:MonsterAI = new MonsterAI()
				.add(flashBang, 1, ordered && !player.hasStatusEffect(StatusEffects.Blind), 15, FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.add(armorRend,1, ordered, 15, FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.add(eAttack, 3, !ordered,0,FATIGUE_NONE,RANGE_RANGED);
			actionChoices.add(flashBang, 1, !ordered && !player.hasStatusEffect(StatusEffects.Blind), 15, FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.add(armorRend, 1, !ordered, 15, FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.exec();
			ordered = false;
		}

		public function armorRend():void{
			fatigue += 15;
			outputText("The Phoenix Sapper dashes out of formation and lunges forward with a spear attack!");
			var playerReaction:Object = combatAvoidDamage({doFatigue:true});
			if (playerReaction.dodge != null) outputText(" You manage to dash out of the way of her attack.");
			if (playerReaction.block) outputText(" You manage to raise your shield and block her lunge.");
			if (playerReaction.parry) outputText(" You quickly swipe your [weapon] and deflect the tip of her spear.");
			if (playerReaction.failed){
				outputText("\nThe spear sinks into your [armor], opening a painful wound!");
				var damage:Number = player.reduceDamage(rand(25) + str + weaponAttack,this);
				player.takeDamage(damage, true);
				outputText(" You feel woozy and fragile as she retrieves her spear; the tip was poisoned!");
				if (player.hasStatusEffect(StatusEffects.ArmorRent)) player.addStatusValue(StatusEffects.ArmorRent, 1, 5);
				else player.createStatusEffect(StatusEffects.ArmorRent, 5, 0, 0, 0);
			}
		}

		public function flashBang():void{
			fatigue += 15;
			outputText("The Phoenix Sapper throws a small black sphere towards you. You jump out of the way in desperation, but all it does is harmlessly roll on the floor. Just when you let your guard down, the Sapper spits a small fireball at the sphere. [say: Flashbang, take cover!] ");
			if (rand(3) != 0){
				outputText("\nYou fail to cover your face in time as the sphere detonates with an unbelievably bright flash. You're <b>Blinded!</b>");
				player.createStatusEffect(StatusEffects.Blind, 2 + rand(3), 0, 0, 0);
			}else{
				outputText("\nYou cover yourself and turn away from the sphere as it detonates. You're a bit dazed from the bright blast, but otherwise, unharmed.");
			}
		}

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

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

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

		public function PhoenixSapper()
		{
			this.a = "the ";
			this.short = "Phoenix Sapper";
			this.imageName = "phoenixmob";
			this.long = "You are faced with a platoon of heavy infantry, all armed to the teeth and protected by chain vests and shields. They look like a cross between salamander and harpy, humanoid save for crimson wings, scaled feet, and long fiery tails. They stand in a tight-knit shield wall, each phoenix protecting herself and the warrior next to her with their tower-shield. Their scimitars cut great swaths through the room as they slowly advance upon you.";
			this.plural = false;
			this.pronoun1 = "she";
			this.pronoun2 = "her";
			this.pronoun3 = "her";
			this.createCock();
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			this.createVagina(false, Vagina.WETNESS_SLAVERING, Vagina.LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = rand(8) + 70;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.lowerBody.type = LowerBody.LIZARD;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length= 15;
			initStrTouSpeInte(60, 60, 100, 40);
			initLibSensCor(40, 45, 50);
			this.weaponName = "spears";
			this.weaponVerb="stab";
			this.weaponAttack = 20;
			this.armorName = "armor";
			this.armorDef = 25;
			this.bonusHP = 200;
			this.lust = 20;
			this.lustVuln = .15;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 20;
			this.gems = rand(25) +160;
			this.additionalXP = 50;
			this.horns.type = Horns.DRACONIC_X2;
			this.horns.value = 2;
			this.tail.type = Tail.HARPY;
			this.wings.type = Wings.FEATHERED_LARGE;
			this.drop = NO_DROP;
			this.fatigue = 0;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Dungeons.LethicesKeep
{
	import classes.BodyParts.*;
	import classes.BreastRow;
	import classes.Cock;
	import classes.Monster;
	import classes.Vagina;
	import classes.StatusEffects;
	import classes.*;

	/**
	 * ...
	 * @author Gedan
	 */
	public class Doppelganger extends Monster
	{
		private var _roundCount:int = 0;

		public function mirrorAttack(damage:Number):void
		{
			this.createStatusEffect(StatusEffects.MirroredAttack, 0, 0, 0, 0);

			outputText("As you swing your [weapon] at the doppelganger, [he] smiles mockingly, and mirrors your move exactly, lunging forward with [his] duplicate [weapon].");

			// Cribbing from combat mechanics - if the number we got here is <= 0, it was deflected, blocked or otherwise missed.
			// We'll use this as our primary failure to hit, and then mix in a bit of random.
			// tl;dr this avoids a bunch of weapon effects and perks, but given the specific means of attack, I think it actually makes sense overall. (Basically having to pull back from what you would normally do mid-attack to successfully land any kind of hit).
			if (damage > 0 && player.inte > rand(140))
			{
				outputText("  At the very last moment, you twist downwards and strike into your opponent’s trunk, drawing a gasp of pain from [him] as [he] clumsily lashes [his] own [weapon] over you. It’s your turn to mirror [him], smiling mockingly at [his] rabid snarls as [he] resets [him]self, [his] voice bubbling and flickering for a moment as [he] tries to maintain control. (" + damage + ")");
				this.HP -= damage;
			}
			else
			{
				outputText("  Your");
				if (player.weaponName == "fists") outputText(" [weapon]");
				else outputText(" [weapon]s");
				outputText(" meet with a bone-jarring impact, and you are sent staggering backwards by a force exactly equal to your own.");

				outputText("\n\n“Try again, [name],” the doppelganger sneers, derisively miming your falter. “C’mon. Really test yourself.”");
			}
			addTalkShit();
		}

		public function mirrorTease(damage:Number, successful:Boolean):void
		{
			clearOutput();
			outputText("You move your hands seductively over your body, and - you stop. The doppelganger stops too, staring at you with wicked coyness, [his] hands frozen on [his] form exactly where yours are. Glaring back, you begin your slow, lustful motions again, as your reflection does the exact same thing. It’s a lust off!");

			if (damage > 0 && successful)
			{
				outputText("\n\nYou determinedly display and twist your carnality to what you know are its best advantages, ignoring what the doppelganger is doing- you’re extremely familiar with it, after all. After a few slow seconds crawl past a blush settles upon your reflection’s face, and [his] hands falter and stop being able to follow yours as [he] stares at what you’re doing.");

				outputText("\n\n“It’s- it’s been so long,” [he] groans, managing to break away to stare into your smirking, smouldering eyes with lust-filled rage. “But I’ll have that, I’ll have everything soon enough!”");

				this.applyTease(damage);
			}
			else
			{
				outputText("You keep moving and displaying your body as best you can, but an overwhelming amount of self-awareness creeps in as your doppelganger mockingly copies you. Is that really what you look like when you do this? It looks so cheap, so clumsy, so desperate. As a blush climbs onto your face you feel a vague sense of vertigo as control of the situation shifts- you copy the doppelganger as [he] cruelly continues to slide [his] hands over [his] body exaggeratedly.");

				outputText("\n\n“What’s the matter, [name]?” [he] breathes, staring lustfully into your eyes as [he] sinks both hands into [his] crotch and bends forward, forcing you close to [his] face. “Never tried it in front of a mirror? You were missing out on the nasty little tramp you are.”");

				player.takeLustDamage(damage + (rand(7) - 3), true);
			}
			addTalkShit();
		}

		private function addTalkShit():void
		{
			switch (_roundCount)
			{
				case 0:
					outputText("\n\n“You feel it, don’t you?” The doppelganger whispers, crooking your mouth into a vicious grin. “The transfer. The mirror is a vacuum without a being inside it; it reaches out for someone to complete it. Your being, to be exact. Mine wants to be free a lot more than yours. Ten years more, to be exact.”");
					outputText("\n\n[He] goes on in a dull croon as [he] continues to circle you, moving with the odd, syncopated jerks of a creature in a body that has only existed for a couple of minutes. “Just let it happen, [name]. You can’t beat me. I am you, only with the knowledge and powers of a demon. Accept your fate.”");
					outputText("\n\nA weird fluttering feeling runs up your arm, and with a cold chill you look down to see it shimmer slightly, as if you were looking at it through running water.");
					outputText("\n\nYou need to finish this as fast as you can.");
					break

				case 1:
					outputText("\n\n“Do you know, I can’t even remember what gender I was before I got stuck in that mirror?” the doppelganger says, as [he] slides a hand between your thighs’ mirror counterparts thoughtfully. “I loved changing all the time. Being stuck as one gender seemed so boring when the tools to shift from one shape to the next were always there. That’s why this was my punishment. Forced to change all the time, at the unthinking behest of whoever happened to look into this cursed thing. You have to give Lethice credit, she’s not just cruel, she’s got imagination too. It’s a hell of a combination. I’d hate to see what she had in store for you.”");
					break;

				case 2:
					outputText("\n\n“This, though... this I like, [name].” [He] closes [his] eyes and");
					if (player.hasCock()) outputText(" strokes [his] [cock]");
					else if (player.hasVagina()) outputText(" slides two fingers into [his] [vagina] and gently frigs [himself]");
					else outputText(" slips a hand ");
					outputText(" underneath [his] " + this.armorName +". The sheer bizarreness of seeing yourself masturbate gives you pause; again the unreality intensifies, and you feel yourself shimmer uncertainly. “Once I’m out of here, I’m going to hang onto this. Revel in not changing my form for once, as a tribute to the kind soul who gave me it!”");
					outputText("\n\nIt’s getting harder to ignore the way your body shimmers and bleeds contrast at the edges, whilst your reflection only becomes more and more sharply defined.");
					outputText("\n\nThis is something, you realize with a growing horror, which is really going to happen if you don’t stop it.");
					break;

				case 3:
					outputText("\n\n“Your memories flow to me [name], as you fade like a memory. I can taste them...” You struggle to stay focused, try and force your body and mind not to blur like a fingerprint on a windowpane as the doppelganger sighs beatifically.");
					outputText("\n\n“Not bad, not bad. You led quite an interesting life for an Ingnam peasant, didn’t you? Got around. Not enough sex, though. Nowhere near enough sex. Don’t worry- I’ll correct that mistake, in due course.”");
					break;

				case 4:
					outputText("\n\n“Did you really think you could defeat Lethice, peasant?” the doppelganger roars. [He] moves and speaks with confidence now, [his] old twitchiness gone, revelling and growing into [his] new form.");
					outputText("\n\nYou don’t dare open your mouth to hear what pale imitation of that voice comes out. “Oh, by grit, crook and luck you’ve gotten this far, but defeat the demon queen? You, who still cling onto your craven, simple soul and thus know nothing of demonhood, of its powers, of its sacrifices? I am doing you and the world a favor here, [name]-that-was, because I am not just taking this fine body but also the mantel it so clumsily carried. With my knowledge and your brute physicality, I will have my revenge on Lethice, and the world will be free of her and her cruelty!” [He] screams with laughter. The ringing insanity of it sounds increasingly muffled to you, as if it were coming through a pane of glass.");
					outputText("\n\nYou have time and strength for one last gambit...");
					break;

				case 5:
					outputText("\n\nThe shimmering intensifies for a moment as something... shifts....");

					game.dynStats("lus+", 1000);

					break;

				default:
					outputText("\n\n“How did you even survive?” the doppelganger looks in confusion. “Regardless, I'm still taking your body.”");
					break;
			}

			_roundCount++;
			tookAction = true;
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.lethicesKeep.doppelganger.punchYourselfInTheBalls();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			game.lethicesKeep.doppelganger.inSovietCoCSelfFucksYou();
		}

		public function handleSpellResistance(spell:String):void
		{
			outputText("The mirror demon barely even flinches as your fierce, puissant fire washes over [him].");

			outputText("\n\n“Picked up a few things since you’ve been here, then?” [he] yawns. Flickers of flame cling to [his] fingers, its radiance sputtering and burning away, replaced by a livid black color. “Serf magic. Easy to pick up, easy to use, difficult to impress with. Let me show you how it’s really done!” [He] thrusts [his] hands out and hurls a pitiless black fireball straight at you, a negative replica of the one you just shot at [him].");

			if (spell == "fireball")
			{
				player.takeDamage(player.level * 10 + 45 + rand(10), true);
			}
			else if (spell == "whitefire")
			{
				player.takeDamage(10 + (player.inte / 3 + rand(player.inte / 2)), true);
			}
			else if (spell == "blackfire")
			{
				player.takeDamage(30 + (player.inte / 3 + rand(player.inte / 2)), true); //REST IN FUCK
			}
			addTalkShit();
		}

		public function handlePlayerWait():void
		{
			outputText("Your doppelganger similarly opts to take a momentary break from the ebb and flow of combat.");
			addTalkShit();
		}

		override public function doAI():void
		{
			if (hasStatusEffect(StatusEffects.Stunned)) {
				removeStatusEffect(StatusEffects.Stunned);
				outputText("Your duplicate is too stunned, buying you another round!");

				return;
			}
			outputText("Your duplicate chuckles in the face of your attacks.");
			addTalkShit();
		}

		override public function react(context:int):Boolean{
			switch(context){
				case CON_WHENATTACKED:
					if (!hasStatusEffect(StatusEffects.Stunned))
					{
						if (game.combat.damage > 0) game.combat.damage = game.combat.doDamage(game.combat.damage, false);

						mirrorAttack(game.combat.damage);
						return false;
						// Stunning the doppelganger should now "buy" you another round.
					}
					break;
				case CON_PLAYERWAITED:
					clearOutput();
					outputText("You decide not to take any action this round.\n\n");
					handlePlayerWait();
					return false;
			}
			return true;
		}

		public function Doppelganger()
		{
			this.a = "the ";
			this.short = "doppelganger";
			this.long = ""; // Needs to be set to supress validation errors, but is handled by an accessor override.
			this.race = "Demon";
			this.imageName = "doppelganger";
			this.plural = false;

			this.tallness = player.tallness;

			if (player.balls > 0)
			{
				this.balls = player.balls;
				this.ballSize = player.ballSize;
			}
			else
			{
				this.balls = 0;
				this.ballSize = 0;
			}

			this.hoursSinceCum = player.hoursSinceCum;

			hips.rating = player.hips.rating;
			if (hips.rating < 1) hips.rating = 1;
			butt.rating = player.butt.rating;
			if (butt.rating < 1) butt.rating = 1;
			lowerBody.type = player.lowerBody.type;
			skin.desc = player.skin.desc;
			initStrTouSpeInte(player.str, player.tou, player.spe, player.inte);
			initLibSensCor(player.lib, player.sens, player.cor);
			if (cor < 50) cor = 50;
			face.type = player.face.type;
			skin.type = player.skin.type;
			skin.desc = player.skin.desc;

			this.bonusHP = 250;

			this.weaponName = player.weaponName;
			this.weaponAttack = player.weaponAttack;
			this.weaponVerb = player.weaponVerb;

			this.armorDef = player.armorDef;
			this.armorName = player.armorName;

			this.level = player.level;

			this.ass.analLooseness = player.ass.analLooseness;
			this.ass.analWetness = player.ass.analWetness;

			if (player.cocks.length > 0)
			{
				for (var i:int = 0; i < player.cocks.length; i++)
				{
					this.createCock((player.cocks[i] as Cock).cockLength, (player.cocks[i] as Cock).cockThickness, (player.cocks[i] as Cock).cockType);
				}
			}

			if (player.vaginas.length > 0)
			{
				this.createVagina();
				(this.vaginas[0] as Vagina).vaginalLooseness = player.vaginas[0].vaginalLooseness;
				(this.vaginas[0] as Vagina).vaginalWetness = player.vaginas[0].vaginalWetness;
				(this.vaginas[0] as Vagina).virgin = player.vaginas[0].virgin;
			}
			//Genderless get forced to have a cunny
			if (player.vaginas.length == 0 && player.cocks.length == 0)
			{
				this.createVagina();
				(this.vaginas[0] as Vagina).vaginalLooseness = 2;
				(this.vaginas[0] as Vagina).vaginalWetness = 6;
				(this.vaginas[0] as Vagina).virgin = false;
			}
			this.breastRows = new Vector.<BreastRow>();

			for (i = 0; i < player.breastRows.length; i++)
			{
				this.createBreastRow();
				var tbr:BreastRow = this.breastRows[i];
				var sbr:BreastRow = player.breastRows[i];

				tbr.breastRating = sbr.breastRating;
				tbr.breasts = sbr.breasts;
				tbr.fuckable = sbr.fuckable;
				tbr.lactationMultiplier = sbr.lactationMultiplier;
				tbr.milkFullness = sbr.milkFullness;
				tbr.nipplesPerBreast = sbr.nipplesPerBreast;
			}
			this.pronoun1 = player.mf("he", "she");
			this.pronoun2 = player.mf("him", "her");
			this.pronoun3 = player.mf("his", "her");
			this.drop = NO_DROP;

			checkMonster();
		}

		override public function get long():String
		{
			var str:String = "";

			str += "You are fighting the doppelganger. [He] is a ";
			str += String(Math.floor(player.tallness / 12) + " foot " + player.tallness % 12 + " inch tall ");
			str += "[race], with [bodytype]. ";

			str += "[His] face is [facelong].";

			str += " [His] [hair] is parted by";

			switch(player.horns.type)
			{
				case Ears.HORSE:
					str += " a pair of horse-like ears";
					break;
				case Ears.FERRET:
					str += " a small pair of rounded ferret ears";
					break;
				case Ears.DOG:
					str += " a pair of dog ears";
					break;
				case Ears.COW:
					str += " a pair of round, floppy cow ears";
					break;
				case Ears.ELFIN:
					str += " a large pair of pointy ears";
					break;
				case Ears.CAT:
					str += " a pair of cute, fuzzy cat ears";
					break;
				case Ears.LIZARD:
				case Ears.DRAGON:
					str += " a pair of rounded protrusions with small holes";
					break;
				case Ears.BUNNY:
					str += " a pair of floppy rabbit ears";
					break;
				case Ears.FOX:
					str += " a pair of large, adept fox ears";
					break;
				case Ears.RACCOON:
					str += " a pair of vaguely egg-shaped, furry raccoon ears";
					break;
				case Ears.MOUSE:
					str += " a pair of large, dish-shaped mouse ears";
					break;
				case Ears.PIG:
					str += " a pair of pig ears";
					break;
				default:
					str += " a pair of nondescript ears";
					break;
			}

			str += ". [He] keeps exploring the area around [his] mouth with [his] tongue with a horribly acquisitive, sensual interest.";
			str += " [He] moves around on [his] [legs] with a twitchy jerkiness, [his] [hips] swinging and tightening.";
			if (player.tail.type != 0) str += " [His] tail flicks this way and that.";
			str += " [He] wields the exact same [weapon] you do, and is dressed in the mirror image of your [armor].";
			if (player.biggestTitSize() >= 2) str += " It’s difficult not to notice the way the mirror image of your " + player.breastDescript(player.biggestTitRow()) + " ebbs and heaves within it.";

			return str;
		}

	}

}


code:
package classes.Scenes.Dungeons.LethicesKeep
{
	import classes.Scenes.Areas.Swamp.AbstractSpiderMorph;
	import classes.StatusEffects;
	import classes.PerkLib;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CockTypesEnum;
	import classes.BodyParts.Butt;
	import classes.BodyParts.Hips;

	public class DriderIncubus extends AbstractSpiderMorph
	{

		private var _goblinFree:Boolean = false;

		private var _combatRound:int = 0;

		private var _hpGains:int = 0;

		private var _seenResolute:Boolean = false;

		private var _goblinWebChain:Boolean = false;

		private var _goblinOiled:Boolean = false;

		public function DriderIncubus()
		{
			super();
			this.a = "the ";
			this.short = "drider incubus";
			this.long = "The drider incubus is a marvel of demonic perversions applied to inhuman flesh. His glittering dark skin is like a solid sheet of coal. Twisted obsidian horns spiral from his forehead like a pair of misshapen spears. Even his eyes are an eerie marvel, no longer windows to the soul, only pits of endless hunger. His evil visage pales in comparison to the monstrous form below his waist - that of a gigantic spider. Eight clattering legs skitter across the floor with his every move. A bulbous abdomen hangs behind them, covered with twitching spinnerets so full of silk that half-formed blobs of it dangle behind him.\n\nHanging from an impeccably made harness is a goblin, the only splash of color on the soulless abomination before you. She’s positioned against the larger male’s abdomen so that her bare crotch is impaled upon his turgid, writhing demon-dick, and by the looks of her frantic squirming, is doing her best to escape. Perhaps you could free her?";
			this.race = "Demon";
			this.tallness = 12 * 9;
			this.createCock(24,5,CockTypesEnum.DEMON);
			this.createBreastRow(0);
			this.balls = 2;
			this.ballSize = 4;
			this.hoursSinceCum = 9999;
			this.hips.rating = Hips.RATING_SLENDER;
			this.butt.rating = Butt.RATING_TIGHT;
			initStrTouSpeInte(65,80,90,70);
			initLibSensCor(66,40,100);
			this.weaponName = "spear";
			this.weaponAttack = 19;
			this.weaponVerb = "lunge";
			this.armorName = "chitin";
			this.armorDef = 40;
			this.bonusHP = 500;
			this.gems = 75 + rand(50);
			this.level = 22;
			this.additionalXP = 200;
			this.lustVuln = 0.45;
			this.drop = NO_DROP;
			this.checkMonster();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.lethicesKeep.driderIncubus.beatTheSpooderbutt(hpVictory);
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			game.lethicesKeep.driderIncubus.spooderbuttGetsANewCockSleeve(hpVictory,pcCameWorms);
		}

		public function get goblinFree():Boolean
		{
			return this._goblinFree;
		}

		public function set goblinFree(v:Boolean):void
		{
			if (v != this._goblinFree)
			{
				this.long = "The drider incubus is a marvel of demonic perversions applied to inhuman flesh. His glittering dark skin is like a solid sheet of coal. Twisted obsidian horns spiral from his forehead like a pair of misshapen spears. Even his eyes are an eerie marvel, no longer windows to the soul, only pits of endless hunger. His evil visage pales in comparison to the monstrous form below his waist - that of a gigantic spider. Eight clattering legs skitter across the floor with his every move. A bulbous abdomen hangs behind them, covered with twitching spinnerets so full of silk that half-formed blobs of it dangle behind him.";
				if (!v)
				{
					this.long = this.long + "Hanging from an impeccably made harness is a goblin, the only splash of color on the soulless abomination before you. She’s positioned against the larger male’s abdomen so that her bare crotch is impaled upon his turgid, writhing demon-dick, and by the looks of her frantic squirming, is doing her best to escape. Perhaps you could free her?";
				}
				else
				{
					this.long = this.long + "The goblin you freed heedlessly chases her demonic master around the room, doing everything she can to bring his rod off. She seems barely conscious of the ongoing conflict; it’s a wonder the drider hasn’t stepped on her yet.";
				}
			}
		}

		override protected function performCombatAction():void
		{
			this._combatRound++;
			if (this.lust100 < 65 && this.hp100 < 33)
			{
				this.gainHpAndLust();
			}
			else if (this.lust100 >= 65 && this.hp100 >= 33)
			{
				this.dropHpAndLust();
			}
			if (rand(100) > lust + 10)
			{
				this.spearStrike();
				outputText("\n\n");
				this.performPhysicalAttack();
			}
			else
			{
				this.performLustAttack();
			}
			if (this._goblinFree)
			{
				outputText("\n\n");
				this.goblinAI();
			}

		}

		private function performPhysicalAttack():void
		{
			var opts:Array = null;
			if (this._combatRound >= 3 && (this._combatRound % 6 == 0 || this._combatRound == 3))
			{
				this.stunningSpear();
			}
			else
			{
				opts = [spiderMorphWebAttack, this.kick, this.kick, this.doubleStrike, this.doubleStrike];
				if (this.fatigue100 < 100) opts.push(this.bite);
				opts[rand(opts.length)]();
			}
		}

		private function performLustAttack():void
		{
			var opts:Array = null;
			if (this._combatRound >= 3 && (this._combatRound % 6 == 0 || this._combatRound == 3))
			{
				this.constrictingThoughts();
			}
			else
			{
				opts = [this.arouseSpell,this.arouseSpell];
				if (!player.hasStatusEffect(StatusEffects.TaintedMind) && !this._seenResolute)
				{
					opts.push(this.taintedMind);
				}
				if (!this._seenResolute)
				{
					opts.push(this.purpleHaze);
				}
				opts[rand(opts.length)]();
			}
		}

		private function goblinAI():void
		{
			var opts:Array = [this.goblinHandjob,this.goblinTongueGrapple,this.bootyTwerking,this.webNipplechain];
			if (!this._goblinOiled)
			{
				opts.push(this.babyOilMeUp);
			}
			opts[rand(opts.length)]();
		}

		private function gainHpAndLust():void
		{
			this.addHP(this.maxHP() * 0.1);
			this.lust += 8;
			if (this._hpGains == 0)
			{
				outputText("“You won’t defeat me so easily!”");
			}
			else if (this._hpGains == 1)
			{
				outputText("“I can keep this up longer than you, mortal!”");
			}
			else if (this._hpGains == 2)
			{
				outputText("“So stubborn! Lethice take you!”");
			}
			else
			{
				outputText("“Why won’t you give in?!”");
			}
			this._hpGains++;
			outputText(" The demon gestures wildly, drawing a rune across his own chest. It flares, blood red and pulsing. Your foe’s wounds slowly edge close, fueled by magic. When the luminous symbol fades, the drider pants, his black skin flushing purple in places.");
			if (this.lust100 > 65)
			{
				if (this._goblinFree)
				{
					outputText(" His dick is rigid and bouncing, so hard it looks like it could go off at any moment.");
				}
				else
				{
					outputText(" His balls are tensing underneath the goblin, and he keeps moaning under his breath.");
				}
				outputText(" You doubt he can keep drawing on his lust to heal himself without pushing himself over the edge!");
			}
			outputText("\n\n");
		}

		private function dropHpAndLust():void
		{
			this.HP   = this.HP - this.maxHP() * 0.08;
			this.lust = this.lust - 10;
			outputText("The demon snarls and draws his spear back, placing it blade down against his arm. Grinning malevolently, he slides the razor-sharp edge along his skin, leaving a trail of glittering ruby on his wounded flesh. “Pain brings clarity of mind - something you couldn’t understand.” He grins wider, mastering his baser emotions. “Let me teach you.”\n\n");
		}

		private function spearStrike():void
		{
			outputText("The drider rears back, lancing out with his spear.");
			var damage:Number = ((str + weaponAttack) * 0.4) * (1 + (player.newGamePlusMod() * 0.3));
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (damage <= 0 || result.dodge == EVASION_SPEED || result.dodge == EVASION_FLEXIBILITY || result.dodge == EVASION_UNHINDERED)
			{
				outputText(" You barely slide out of the way.");
			}
			else if (result.dodge == EVASION_EVADE)
			{
				outputText(" You evade the strike.");
			}
			else if (result.dodge == EVASION_MISDIRECTION)
			{
				outputText(" Using your skills at misdirection, you avoid the strike.");
			}
			else
			{
				outputText(" The weapon bites deep. ");
				player.takeDamage(damage, true);
			}
		}

		private function bite():void
		{
			this.fatigue += 20;
			var amount:Number = 0;
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (player.hasStatusEffect(StatusEffects.Stunned) || player.spe <= 1 && player.statusEffectv1(StatusEffects.Web) >= 2)
			{
				player.createOrFindStatusEffect(StatusEffects.DriderIncubusVenom);
				outputText("Taking his time, the arachnid demon bares his fangs, easily biting deeply into you. His tongue slides sensually around the wounds as he pumps you full of venom, tasting your fear and desperation. You wince while the venom robs you of your strength.");
				if (player.str <= 25)
				{
					outputText(" It’s getting harder just to remain upright.");
				}
				else if (player.str <= 1)
				{
					outputText(" You don’t think you can stand any longer, let alone resist.");
				}
				outputText("\n\nWhen he pulls out, he’s smiling and a little flushed. “");
				if (player.str > 25)
				{
					outputText("That should do.");
				}
				else
				{
					outputText("Soon you won’t have the strength to resist.");
				}
				outputText("”");
			}
			else
			{
				outputText("Twisting over, the arachnid demon bares his fangs, attempting to bite you!");
				if (result.dodge == EVASION_MISDIRECTION)
					outputText(" You misdirect his venomous strike!");
				else if (result.dodge == EVASION_EVADE)
					outputText(" You evade his venomous strike!");
				else if (result.dodge == EVASION_SPEED || result.dodge == EVASION_FLEXIBILITY || result.dodge == EVASION_UNHINDERED)
					outputText(" You avoid his venomous strike!");
				else {
					outputText(" Those needle-like canines punch into you, delivering their venomous payload! You already feel weaker, your muscles not responding as effectively.");
					outputText("“I do love watching you struggle.” He flashes a crooked smile.");
					player.createOrFindStatusEffect(StatusEffects.DriderIncubusVenom);
				}
			}
		}

		private function kick():void
		{
			outputText("While you’re busy with his spear, he nonchalantly snaps a kick in your direction!");
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (result.dodge == EVASION_MISDIRECTION)
			{
				outputText(" You twist out of the way at the last moment thanks to your misdirection.");
			}
			else if (result.dodge != null)
			{
				outputText(" You twist out of the way at the last moment, evading with ease.");
			}
			else
			{
				var damage:Number = (str + weaponAttack + 25 - rand(player.tou)) * (1 + (player.newGamePlusMod() * 0.3));
				if (damage > 0)
				{
					outputText(" You go flying back into a pair of oiled-up slavegirls. They gasp in surprise as you tear your way back to the fight. Too late, they attempt to caress you, barely touching your [leg] before you’re back in the fight. ");
					damage = player.takeDamage(damage, true);
				}
				else
				{
					outputText(" You successfully manage to block the kick!");
				}
			}
		}

		private function stunningSpear():void
		{
			outputText("Twirling his weapon until it appears a blurred disc, the drider pivots, bringing the haft around at your head!");
			var damage:Number = 0;
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (result.dodge == EVASION_SPEED || result.dodge == EVASION_FLEXIBILITY || result.dodge == EVASION_UNHINDERED)
			{
				outputText(" You duck in the nick of time.");
			}
			else if (result.dodge == EVASION_MISDIRECTION)
			{
				outputText(" You were already changing direction. You silently thank Raphael for his training.");
			}
			else if (result.dodge == EVASION_EVADE)
			{
				outputText(" You lean in the direction of the swing, letting gravity pull you down and away from the stunning blow.");
			}
			else
			{
				damage = (str + weaponAttack - 25 - rand(player.tou)) * (1 + (player.newGamePlusMod() * 0.3));
				if (damage > 0)
				{

					outputText(" You don’t feel the impact, but you do hear the crack of wood striking");
					outputText(" bone");
					outputText(".");
					if (player.stun(0,100))
					{
						outputText(" You’re left stunned by the blow! It’ll be a moment before you can regain your wits. ");
					}
					damage = player.takeDamage(damage, true);
				}
				outputText(" You hear the crack of wood striking");
				outputText(" bone");
				outputText(", but you manage to deflect most of the force!");
			}
		}

		private function doubleStrike():void
		{
			outputText("He skitters forward and presses his attack, stabbing out with his spear once more.");
			var damage:Number = str + weaponAttack + 10 - rand(player.tou);
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (damage <= 0 || result.dodge == EVASION_SPEED || result.dodge == EVASION_FLEXIBILITY || result.dodge == EVASION_UNHINDERED)
			{
				outputText(" You barely slide out of the way.");
			}
			else if (result.dodge == EVASION_EVADE)
			{
				outputText(" You evade the strike.");
			}
			else if (result.dodge == EVASION_MISDIRECTION)
			{
				outputText(" Using your skills at misdirection, you avoid the strike.");
			}
			else
			{
				outputText(" The weapon bites deep. ");
				player.takeDamage(damage, true);
			}
		}

		private function arouseSpell():void
		{
			outputText("The demonic drider mutters incomprehensible words that tickle at the back of your mind. Profane syllable mounts profane syllable until his mouth seems buried under the weight of the cacophony of corruption. His filth builds to a crescendo, and with a confident, arrogant gaze, he directs it at you.");
			outputText("\n\nAn invisible force falls upon you, infusing the most sensitive places of your body with desire, bringing your [nipples] to life with need");
			if (player.cocks.length > 0 || player.vaginas.length > 0)
			{
				outputText(", making your");
				if (player.cocks.length > 0)
					outputText(" [cocks]");
				else
					outputText(" [vagina]");
				outputText(" ache to be touched");
			}
			player.takeLustDamage(player.lib / 10 + player.cor / 10 + 15, true);
			outputText(". Your body rebels against you under the unholy influence");
			if (player.lust100 < 100)
				outputText(", but the effect is fleeting, thankfully. You try to ignore the residual tingles. You can’t afford to lose this close to your goal!");
			else
				outputText(".");
		}

		private function taintedMind():void
		{
			outputText("“You fight well, for a mortal... but can you fight like a demon?” He claps his hands together, bathing the immediate area in a wave of energy. Some of the nearby slaves cry out in alarm, then settle into giggling, cooing messes. You don’t seem any worse for the wear in its wake, though something feels wrong about holding your [weapon].");
			if (player.cor <= 33)
				outputText(" What did he mean about fighting like a demon?");
			player.createStatusEffect(StatusEffects.TaintedMind,4,0,0,0);
		}

		public function taintedMindAttackAttempt():void
		{
			outputText("You ready an attack, but find your hands groping your own body instead. Somehow the demon’s magic has made it impossible to strike at him, crossing wires that weren’t meant to be crossed. Frowning, you look down at your more aroused form, determined not to fall for this a second time.");
			player.takeLustDamage(15, true);
		}

		private function constrictingThoughts():void
		{
			outputText("“Try this on for size!” the corrupted arachnid shouts, waving his hand in your direction.");
			outputText("\n\nDisjointed, erotic thoughts claw at your mind’s defenses, worming their way in through what cracks they find, plunging sensuous fantasies of every shape and size in place of your own imaginings.");
			if (!player.stun(0,100))
			{
				this._seenResolute = true;
				outputText(" You marshal your mental discipline and discard the errant thoughts.");
			}
			else
			{
				outputText(" The intensity overwhelms your ability to act, arousing and stunning you.");
				player.takeLustDamage(player.lib / 15 + player.cor / 15 + 15, true);
			}
		}

		private function purpleHaze():void
		{
			outputText("“Try this on for size!” The drider gestures in your direction, gathering his will into a palpable force. It presses on your mind like a coiled snake, crushing down on you from all sides.");
			if (player.findPerk(PerkLib.Resolute) >= 0 || rand(3) >= 0)
			{
				if (player.findPerk(PerkLib.Resolute) >= 0)
				{
					this._seenResolute = true;
				}
				outputText(" You flex your considerable will and feel the concentrated mental filth slough off. Whatever his attack was, it failed!");
			}
			else
			{
				outputText(" You concentrate to try and throw it off, but he overwhelms your mental defenses. Clouds of swirling pink filled with unsubtle erotic silhouettes fill your vision, effectively blinding you!");
				player.takeLustDamage(25, true);
				player.createStatusEffect(StatusEffects.PurpleHaze,2 + rand(2),0,0,0);
				player.createStatusEffect(StatusEffects.Blind,player.statusEffectv1(StatusEffects.PurpleHaze),0,0,0);
			}
		}

		private function goblinHandjob():void
		{
			outputText("Somehow, the goblin manages to get both her mitts on the drider’s ever erect member. A gleeful expression occupies her face as she begins pumping, worshipfully tugging on her master’s rod again and again, her mouth open excitedly as if he could bust a nut at any moment.");
			outputText("\n\nUnfortunately for her, the demonic arachnid’s motions carry him away from her greedy fingers. He slips out of her grip with a wet pop, and she can do naught but pout and chase after him once more.");
		}

		private function goblinTongueGrapple():void
		{
			outputText("The determined goblin love-slave opens wide, launching a tongue that must be at least three feet long toward her master’s member with pinpoint accuracy. It makes contact with a wet ‘snap’ and wraps round the oozing, demonic length before either you or the drider can react. His motions slow from the attention, and he nearly stumbles, giving the goblin time to close to the distance, mummifying his member under layers of hot pink pleasure.");
			lust += 5;
			if (lust100 <= 100)
			{
				outputText("\n\nThe drider skitters back, the motion dropping the goblin to her knees. Her tongue stretches taut a long moment, then slips from his shaft, snapping back into her mouth hard enough to make her recoil. Both parties look disappointed with the outcome, none moreso than the goblin. Fortunately for her, she’ll get another chance - the drider is focusing on you once more.");
			}
			else
			{
				outputText("\n\nThe drider attempts to skitter back, but his legs are shaking to hard for proper movement. He looks longingly at his love slave, forgetting you for the moment.");
			}
		}

		private function bootyTwerking():void
		{
			outputText("The goblin gives up on her futile chase for the moment. Instead of trying to lay her hands on her treasured scepter, she spins around, raising her cushy-looking ass into the air. She twists and gyrates, making her voluminous asscheeks bounce independently. Sometimes they audibly clap together. A few assembled demonic slaves applaud her performance, and the drider can’t help but spare her a few hungry glances.");
			lust += 5;
		}

		private function webNipplechain():void
		{
			outputText("Every time she makes a grab for the demonic drider’s tool, he skitters aside, the ebb and flow of your fight keeping her from her objective. In a huff, she grabs hold of a hanging strand of web and affixes the sticky end to one of her nipples. Then, she gives the source spinneret a squeeze, but not before pressing her other jiggling tit against it.");
			if (this._goblinWebChain == false)
			{
				outputText("\n\nShe comes away with an organic nipple chain, one that has her moaning with need as she shakes her diminutive body for her master’s pleasure. He tries his best to ignore her, even a demon can’t ignore a pair of white-plastered tits shaking a few feet away.");
				this._goblinWebChain = true;
			}
			else
			{
				outputText("\n\nThe goblin slave-girl shimmies and shakes once more, her arms pressing in on her tits from both sides to make the jiggling, web-painted mounds dance. Her eyes smoulder with desire, and her wanton smile promises nothing but hours of unending lewdness to her master. He does a double-take at the sight of it.");
			}
			lust += 5;
		}

		public function get goblinOiled():Boolean
		{
			return this._goblinOiled;
		}

		private function babyOilMeUp():void
		{
			outputText("Darting into the crowd, the goblin comes back with a bottle of unusual shape and design. She pops the cork and upends it across her petite but all-too-stacked form, smearing it across her more-than-ample tits with one hand, making them shine in the flickering candlelight. Her eyes are bright and mischievous while she spreads it over the rest of her form, leaving the whole of her body slick and ready for love.");
			outputText("\n\nShe dances and spins to the side, cooing, “Don’t you want me anymore, baby? Look how ready I am” Her nipples are taut and stiff, and the junction between her thighs absolutely drenched. Neither you nor your foe can keep from sparing lusty glances her way.");
			lust += 7;
			player.takeLustDamage(7, true);
		}

		public function freeGoblin():void
		{
			clearOutput();
			this._goblinFree = true;
			outputText("You lunge in low, hooking your hands beneath the writhing greenskin’s armpits and pulling. Webs snap like gauze between her weight and the mighty tug you strain them with. Her eyes bulge open in horror. She screams as you pull her free, revealing an inhumanly soaked rod and one seriously puffy set of labia. The poor thing won’t be able to walk without squishing them against each other.");
			outputText("\n\nYou’re forced to drop her as the enraged drider prepares his counterattack. She lands on her feet, surprisingly enough.");
			outputText("\n\n“Oh, forgive me master! I’ll still get you off - I promise!” The green slut wiggles away from you, trying to get at her master’s loins.");
			outputText("\n\nWell... maybe she didn’t want free after all. At least she’ll make for a good distraction.");
		}

		override public function react(context:int):Boolean{
			switch(context){
				case CON_BEFOREATTACKED:
				if (player.hasStatusEffect(StatusEffects.TaintedMind) && !game.combat.isWieldingRangedWeapon()) {
					taintedMindAttackAttempt();
					return false;
				}
			}
			return true;
		}

		/*override public function beforeAttacked():Boolean{
			if (player.hasStatusEffect(StatusEffects.TaintedMind) && !game.combat.isWieldingRangedWeapon()) {
				taintedMindAttackAttempt();
				return false;
			}
			return true;
		}*/

	}
}