code:
package classes.Scenes.Dungeons.D3
{
	import classes.BreastRowClass;
	import classes.Cock;
	import classes.Monster;
	import classes.VaginaClass;
	import classes.StatusEffects;

	/**
	 * ...
	 * @author Gedan
	 */
	public class Doppleganger 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 doppleganger, " + player.mf("he", "she") + " smiles mockingly, and mirrors your move exactly, lunging forward with " + player.mf("his", "her") + " duplicate " + weaponName + ".");

			// 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 && rand(8) < 6)
			{
				outputText("  At the very last moment, you twist downwards and strike into your opponent’s trunk, drawing a gasp of pain from " + player.mf("him", "her") +" as " + player.mf("he", "she") +" clumsily lashes " + player.mf("his", "her") + " own " + weaponName +" over you. It’s your turn to mirror " + player.mf("him", "her") +", smiling mockingly at " + player.mf("his", "her") +" rabid snarls as " + player.mf("he", "she") +" resets " + player.mf("him", "her") +"self, " + player.mf("his", "her") +" voice bubbling and flickering for a moment as " + player.mf("he", "she") +" 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, " + player.mf("his", "her") +" hands frozen on " + player.mf("his", "her") +" 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 "+ player.mf("he", "she") +" hands falter and stop being able to follow yours as "+ player.mf("he", "she") +" stares at what you’re doing.");

				outputText("\n\n“It’s- it’s been so long,” " + player.mf("he", "she") +" 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 "+ player.mf("he", "she") +" cruelly continues to slide "+ player.mf("his", "her") +" hands over "+ player.mf("his", "her") +" body exaggeratedly.");

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

				game.dynStats("lus", damage + (rand(7) - 3));
			}
			addTalkShit();
		}

		private function addTalkShit():void
		{
			statScreenRefresh();

			if (HP < 1)
			{
				doNext(game.combat.endHpVictory);
				return;
			}

			if (lust >= eMaxLust())
			{
				doNext(game.combat.endLustVictory);
				return;
			}

			if (player.HP < 1)
			{
				doNext(game.combat.endHpLoss);
				return;
			}

			if (player.lust >= player.maxLust())
			{
				doNext(game.combat.endLustLoss);
				return;
			}

			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++;
			combatRoundOver();
		}

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

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean):void
		{
			game.d3.doppleganger.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);
			}

			addTalkShit();
		}

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

		override public function doAI():void
		{
			if (findStatusEffect(StatusEffects.Stunned) >= 0) {
				removeStatusEffect(StatusEffects.Stunned);
				outputText("Your duplicate is too stunned, buying you another round!");
				combatRoundOver();
				return;
			}
			outputText("Your duplicate chuckles in the face of your attacks.");
			addTalkShit();
		}

		public function Doppleganger()
		{
			this.a = "the ";
			this.short = "doppleganger";
			this.long = ""; // Needs to be set to supress validation errors, but is handled by an accessor override.
			this.imageName = "doppleganger";
			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;

			hipRating = player.hipRating;
			if (hipRating < 1) hipRating = 1;
			buttRating = player.buttRating;
			if (buttRating < 1) buttRating = 1;
			lowerBody = player.lowerBody;
			skinDesc = player.skinDesc;
			initStrTouSpeInte(player.str, player.tou, player.spe, player.inte);
			initLibSensCor(player.lib, player.sens, player.cor);
			if (cor < 50) cor = 50;
			faceType = player.faceType;
			skinType = player.skinType;

			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 VaginaClass).vaginalLooseness = player.vaginas[0].vaginalLooseness;
				(this.vaginas[0] as VaginaClass).vaginalWetness = player.vaginas[0].vaginalWetness;
				(this.vaginas[0] as VaginaClass).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 VaginaClass).vaginalLooseness = 2;
				(this.vaginas[0] as VaginaClass).vaginalWetness = 6;
				(this.vaginas[0] as VaginaClass).virgin = false;
			}
			this.breastRows = [];

			for (i = 0; i < player.breastRows.length; i++)
			{
				this.createBreastRow();
				var tbr:BreastRowClass = this.breastRows[i];
				var sbr:BreastRowClass = 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 = "[he]";
			this.pronoun2 = "[him]";
			this.pronoun3 = "[his]";
			this.drop = NO_DROP;

			checkMonster();
		}

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

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

			str += player.mf("His", "Her") + " face is " + player.faceDesc() + ".";

			str += " "  + player.mf("His", "Her") + " " + player.hairDescript() + " is parted by";

			switch(player.earType)
			{
				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 vaugely egg-shaped, furry racoon ears";
					break;
				case EARS_MOUSE:
					str += " a pair of large, dish-shaped mouse ears";
					break;
				default:
					str += " a pair of non-descript ears";
					break;
			}

			str += ". " + player.mf("He", "She") + " keeps exploring the area around " + player.mf("his", "her") +" mouth with " + player.mf("his", "her") +" tongue with a horribly acquisitive, sensual interest.";
			str += " " + player.mf("He", "She") + " moves around on " + player.mf("his", "her") +" " + player.legs() + " with a twitchy jerkiness, " + player.mf("his", "her") + " " + player.hipDescript() + " swinging and tightening.";
			if (player.tailType != 0) str += " " + player.mf("His", "Her") + " tail flicks this way and that.";
			str += " " + player.mf("He", "She") + " wields the exact same " + player.weaponName + " you do, and is dressed in the mirror image of your " + player.armorName +  ". ";
			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.D3
{
	import classes.Scenes.Areas.Swamp.AbstractSpiderMorph;
	import classes.StatusEffects;
	import classes.PerkLib;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CockTypesEnum;

	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.tallness = 12 * 9;
			this.createCock(24,5,CockTypesEnum.DEMON);
			this.createBreastRow(0);
			this.balls = 2;
			this.ballSize = 4;
			this.hoursSinceCum = 9999;
			this.hipRating = HIP_RATING_SLENDER;
			this.buttRating = 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.d3.driderIncubus.beatTheSpooderbutt(hpVictory);
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean):void
		{
			game.d3.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.lust < 65 && this.HP < 33)
			{
				this.gainHpAndLust();
			}
			else if (this.lust >= 65 && this.HP >= 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();
			}
			combatRoundOver();
		}

		private function performPhysicalAttack():void
		{
			var opts:Array = null;
			if (this._combatRound >= 3 && (this._combatRound % 6 == 0 || this._combatRound == 3))
			{
				this.stunningSpear();
			}
			else
			{
				opts = [this.bite,spiderMorphWebAttack,this.kick,this.kick,this.doubleStrike,this.doubleStrike];
				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.findStatusEffect(StatusEffects.TaintedMind) < 0 && !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.eMaxHP() * 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.lust > 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.eMaxHP() * 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 evade:String = player.getEvasionReason();
			if (damage <= 0 || evade == EVASION_SPEED || evade == EVASION_FLEXIBILITY || evade == EVASION_UNHINDERED)
			{
				outputText(" You barely slide out of the way.");
			}
			else if (evade == EVASION_EVADE)
			{
				outputText(" You evade the strike.");
			}
			else if (evade == 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
		{
			var amount:Number = 0;
			var evade:String = player.getEvasionReason();
			if (player.findStatusEffect(StatusEffects.Stunned) >= 0 || player.spe <= 1 && player.findStatusEffect(StatusEffects.Web) >= 2)
			{
				if (player.findStatusEffect(StatusEffects.DriderIncubusVenom) >= 0)
				{
					player.changeStatusValue(StatusEffects.DriderIncubusVenom,1,5);
				}
				else
				{
					player.createStatusEffect(StatusEffects.DriderIncubusVenom,5,0,0,0);
				}
				amount = 30;
				if (player.str - amount < 1)
				{
					amount = player.str - 1;
				}
				player.str = player.str - amount;
				showStatDown("str");
				player.addStatusValue(StatusEffects.DriderIncubusVenom,2,amount);
				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 (evade == EVASION_MISDIRECTION)
					outputText(" You misdirect his venomous strike!");
				else if (evade == EVASION_EVADE)
					outputText(" You evade his venomous strike!");
				else if (evade == EVASION_SPEED || evade == EVASION_FLEXIBILITY || evade == 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.");
					if (player.findStatusEffect(StatusEffects.DriderIncubusVenom) >= 0)
						player.changeStatusValue(StatusEffects.DriderIncubusVenom,1,5);
					else
						player.createStatusEffect(StatusEffects.DriderIncubusVenom,5,0,0,0);
					amount = 30;
					if (player.str - amount < 1)
						amount = player.str - 1;
					player.str = player.str - amount;
					showStatDown("str");
					player.addStatusValue(StatusEffects.DriderIncubusVenom,2,amount);
				}
			}
		}

		private function kick():void
		{
			outputText("While you’re busy with his spear, he nonchalantly snaps a kick in your direction!");
			var evade:String = player.getEvasionReason();
			if (evade == EVASION_MISDIRECTION)
			{
				outputText(" You twist out of the way at the last moment thanks to your misdirection.");
			}
			else if (evade != 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 evade:String = player.getEvasionReason();
			if (evade == EVASION_SPEED || evade == EVASION_FLEXIBILITY || evade == EVASION_UNHINDERED)
			{
				outputText(" You duck in the nick of time.");
			}
			else if (evade == EVASION_MISDIRECTION)
			{
				outputText(" You were already changing direction. You silently thank Raphael for his training.");
			}
			else if (evade == 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.findPerk(PerkLib.Resolute) < 0)
					{
						outputText(" You’re left stunned by the blow! It’ll be a moment before you can regain your wits. ");
						player.createStatusEffect(StatusEffects.Stunned,0,0,0,0);
					}
					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 evade:String = player.getEvasionReason();
			if (damage <= 0 || evade == EVASION_SPEED || evade == EVASION_FLEXIBILITY || evade == EVASION_UNHINDERED)
			{
				outputText(" You barely slide out of the way.");
			}
			else if (evade == EVASION_EVADE)
			{
				outputText(" You evade the strike.");
			}
			else if (evade == 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");
			}
			game.dynStats("lus",player.lib / 10 + player.cor / 10 + 15);
			outputText(". Your body rebels against you under the unholy influence");
			if (player.lust < 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.");
			game.dynStats("lus",15);
		}

		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.findPerk(PerkLib.Resolute) >= 0)
			{
				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.");
				game.dynStats("lus",player.lib / 15 + player.cor / 15 + 15);
				player.createStatusEffect(StatusEffects.Stunned,0,0,0,0);
			}
		}

		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!");
				game.dynStats("lus",25);
				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 (lust <= 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 independantly. 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 spinnaret 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;
			game.dynStats("lus", 7);
		}

		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.");
			doAI();
		}
	}
}

license: unknown