code:
package classes.Scenes.Areas.Forest
{
	import classes.*;
	import classes.BodyParts.Butt;
	import classes.BodyParts.Hips;
	import classes.GlobalFlags.kFLAGS;
	import classes.Scenes.Monsters.Goblin;
	import classes.internals.*;

	public class Tamani extends Goblin
	{

		override protected function goblinTeaseAttack():void
		{
			if (flags[kFLAGS.TAMANI_TIMES_HYPNOTISED] > 0) {
				tamaniHypnoTease();
				return;
			}
			super.goblinTeaseAttack();
		}

//New Tease option:
		public function tamaniHypnoTease():void {
			var selector:Number = rand(3);
			//Choose 1 of 3 variations
			if (selector == 0) outputText("Tamani smiles and shifts her leather straps, pulling one into the puffy gash that is her vagina.  She groans out loud, sliding the studded leather band into her outer lips and sawing it along her clit.  Her whole body blushes as she pulls it free, running a fingertip up the now wet strip of leather, \"Mmm, can't you see how much my pussy needs a man inside it?  Be a good husband and fuck Tamani full!  You know you want to.\"\n\n");
			if (selector == 1) outputText("Tamani saunters up to you, sliding her fingers down to each side of her pussy and spreading them.  Your eyes are drawn to her honeyed tunnel, unable to look away she gets closer.  She whispers, \"Your cock knows what it needs.  Just be a good husband and obey your dick, it KNOWS how badly you need mistress's pussy.\"\n\n");
			if (selector == 2) outputText("Tamani turns around and bends down, pressing her hands into the dirt as she kicks her legs apart.  Your stare open-mouthed at her bouncy ass-cheeks and the tantalizingly wet entrance of her slit.  She smirks and offers, \"You've cum so many times inside me, why resist when you can give in and feel that pleasure again today?  Come on husband, don't make Tamani beg...\"\n\n");

			//REACTIONS
			//LOW HYPNO VALUE:
			if (flags[kFLAGS.TAMANI_TIMES_HYPNOTISED] < 5) {
				selector = rand(3);
				if (selector == 0) outputText("You reluctantly pull your stare away from the heavenly entrance between her legs.  There's an urge to walk over to her and plunge yourself inside her over and over, but you dismiss it.");
				if (selector == 1) outputText("You find it hard to pull your gaze from her inviting twat, but you manage.  You shake your head, clearing away thoughts of fertilizing your wife.  Her rhetoric must be getting to you.");
				if (selector == 2) outputText("No matter the case, her actions shifted a fair bit of your blood-flow to your groin.");
			}
			//MEDIUM HYPNO VALUE:
			else if (flags[kFLAGS.TAMANI_TIMES_HYPNOTISED] < 10) {
				selector = rand(2);
				if (selector == 0) {
					outputText("With effort you manage to wrench your eyes away from the inviting folds of Tamani's vagina.  ");
					if (player.totalCocks() > 1) outputText("Each of y");
					else outputText("Y");
					outputText("our " + player.multiCockDescriptLight());
					if (player.lust100 > 80) outputText(" drips pre-cum");
					else if (player.lust100 > 40) outputText(" grows harder");
					else outputText(" hardens");
					outputText(" from the sexual sight, and you feel a compulsion to rush to your wife and take her on the spot.  Obviously she's not really your wife, but after so many fuckings it kind of makes sense to think of her that way.");
					if (player.lust100 < 70) outputText("  Still, you don't want to fuck her right now!");
				}
				else {
					outputText("Struggling, you pull your eyes back into your head and away from Tamani's gorgeous slit.  You shudder, feeling ");
					if (player.totalCocks () > 1) outputText("each of ");
					outputText("your " + player.multiCockDescriptLight());
					if (player.lust100 <= 41) outputText(" thicken perceptibly");
					else if (player.lust100 <= 81) outputText(" twitch eagerly");
					else outputText("drip pre-cum");
					outputText(", responding to the overly sensual goblin's body.  You start to approach her, but stop yourself, realizing you were about to pick up your wife and fuck her on the spot.  You know she's not really your wife, but you have a hard time thinking of her as anything else, save for maybe your mistress.");
					if (player.lust100 < 70) outputText("  Regardless, you're resolute in your desire not to fuck her right now!");
				}
			}
			//HIGH HYPNO VALUE
			else {
				selector = rand(2);
				if (selector == 0) {
					outputText("You barely manage to step yourself from lunging forward to bury your mouth between your mistress's legs.  Hard and trembling between your legs, ");
					if (player.totalCocks() > 1) outputText("each of ");
					outputText("your " + player.multiCockDescriptLight() + " aches with need.  You battle with the compulsion to kneel before your short, stacked mistress and perform your duties as her breeder husband.");
				}
				else {
					outputText("You wrench your gaze from the juicy mound before you with great difficulty.  The desire to submit to your wife and fuck her on the spot rages through your body, melting your resistance into liquid lust and pooling it in your groin.  ");
					if (player.totalCocks() > 1) outputText("Each of y");
					else outputText("Y");
					outputText("our " + player.multiCockDescriptLight() + " pulses and dribbles pre-cum, aching to do its duty and fire load after load into Tamani's perfect pussy.");
				}
			}
			var lustDmg:int = rand(player.lib/5) +3+(flags[kFLAGS.TAMANI_TIMES_HYPNOTISED]);
			player.takeLustDamage(lustDmg, true);
		}

		override public function defeated(hpVictory:Boolean):void
		{
			clearOutput();
			if (hpVictory) {
				outputText("Tamani is defeated!");
			} else {
				outputText("Tamani gives up on defeating you and starts masturbating!");
			}
			game.forest.tamaniScene.tamaniVictoryMenu();
		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI()
				.add(eAttack);
			actionChoices.add(goblinDrugAttack,1,true,0,FATIGUE_NONE,RANGE_RANGED);
			actionChoices.add(goblinTeaseAttack,1,true,0,FATIGUE_NONE,RANGE_TEASE);
			actionChoices.exec();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			clearOutput();
			if (hpVictory){
				if (player.totalCocks() > 0) {
					if (rand(2) == 0) game.forest.tamaniScene.tamaniSexLost();
					else game.forest.tamaniScene.tamaniSexLetHer();
				}else {
					outputText("Tamani sighs as you begin to lose conscious, \"You dummy, why'd you get rid of the fun parts?\"");
					game.combat.cleanupAfterCombat();
				}
			} else {
				if (player.totalCocks() > 0) {
				//hypnoslut loss scene
				if (game.flags[kFLAGS.TAMANI_TIMES_HYPNOTISED] > 19 && rand(2) == 0) {
					game.forest.tamaniScene.getRapedByTamaniYouHypnoSlut();
				} else if (rand(2) == 0) game.forest.tamaniScene.tamaniSexLost();
				else game.forest.tamaniScene.tamaniSexLetHer();
				} else {
					outputText("You give into your lusts and masturbate, but Tamani doesn't seem to care.  She kicks and punches you over and over, screaming, \"You dummy, why'd you get rid of the fun parts?\"");
					game.player.takeDamage(9999);
					game.combat.cleanupAfterCombat();
				}
			}
		}

		public function Tamani()
		{
			super(false);
			this.a = "";
			this.short = "Tamani";
			this.imageName = "tamani";
			this.long = "She keeps her arms folded across her " + game.forest.tamaniScene.tamaniChest() + " and glares at you.  The little thing is only about four feet tall, with pink and black dyed hair cut into a cute little 'do.  The greenish-gray skin of her breasts bulges out around her arms, supported by a few leather straps, amplifying her cleavage.  Her cunt lips are pierced multiple times, inflamed, and slightly parted.  There really isn't any clothing on her to hide them, just more of the ever-present straps wrapping around her thighs.";
			this.race = "Goblin";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 55, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,40,0,0,0);
			this.tallness = 40;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "greenish gray";
			this.hair.color = "pink and black";
			this.hair.length = 16;
			initStrTouSpeInte(32, 43, 55, 62);
			initLibSensCor(65, 65, 50);
			this.weaponName = "fists";
			this.weaponVerb="tiny punch";
			this.armorName = "leather straps";
			this.bonusHP = 40;
			this.lust = 40;
			this.lustVuln = 0.9;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 4;
			this.gems = rand(25) + 5;
			this.drop = new WeightedDrop().add(consumables.GOB_ALE,4)
					.addMany(1,
							consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.PURPDYE,
							consumables.INCUBID,
							consumables.REDUCTO,
							consumables.L_BLUEG,
							null);
			/*this.special1 = goblinDrugAttack;
			this.special2 = goblinTeaseAttack;*/
			checkMonster();
		}

	}

}

license: unknown


code:
package classes.Scenes.Areas.Forest
{
	import classes.*;
	import classes.BodyParts.Butt;
	import classes.BodyParts.Hips;
	import classes.GlobalFlags.kFLAGS;
	import classes.Scenes.Monsters.Goblin;
	import classes.internals.*;

	public class TamanisDaughters extends Goblin
	{
		private function midRoundMadness():void {
			var selector:Number = rand(4);
			if (selector == 0) {
				outputText("A slender hand reaches inside your " + player.armorName + " and gives your ");
				if (player.balls > 0) {
					if (rand(2) == 0) outputText(player.multiCockDescriptLight());
					else outputText(player.ballsDescriptLight());
				}
				else outputText(player.multiCockDescriptLight());
				outputText(" a gentle squeeze.  You twist away but your breathing gets a little heavier.\n\n");
			}
			else if (selector == 1) {
				outputText("A girl latches onto your " + player.legs() + " and begins caressing your body lovingly, humming happily.  You quickly shake her loose but the attention makes you blush a little more.\n\n");
			}
			else if (selector == 2) {
				outputText("One of your daughters launches onto your back and presses her hard, pierced nipples against your neck.  She whispers in your ear, \"Twist my nipples dad!\"\n\n");
				outputText("You reach back and throw her off, but her perverted taunts still leave you feeling a little hot under the collar.\n\n");
			}
			else outputText("A daughter lays down in front of you and starts jilling herself on the spot.  It's impossible to not glance down and see her or hear her pleasured moans.  You step away to remove the distraction but it definitely causes some discomfort in your " + player.armorName + ".\n\n");
			var lustDmg:int = 1 + player.lib/15+rand(player.cor/30);
			player.takeLustDamage(lustDmg, true);
		}

		private function tamaniShowsUp():void {
			if (TamainsDaughtersScene.tamaniPresent) {
				if (rand(4) == 0) goblinDrugAttack(); //Tamani already there - chance of potion
			}
			else if (rand(6) == 0) {
				TamainsDaughtersScene.tamaniPresent = true;
				outputText("A high-pitched yet familiar voice calls out, \"So this is where you skanks ran off to---wait a second.  Are you trying to poach Tamani's man!?\"\n\n");
				outputText("You can see Tamani lurking around the rear of the goblin pack, visibly berating her daughters.  On one hand it sounds like she might help you, but knowing goblins, she'll probably forget about her anger and help them subdue you for more cum...\n\n");
				//(+5 mob strength)
				str += 5;
				//(+5 mob toughness)
				tou += 5;
				HP += 10;
				//(-20 mob lust)
				lust -= 20;
				//append combat desc
				long += " Tamani lurks in the back of the crowd, curvier than her brood and watching with a mixture of amusement and irritation.  She runs a hand through her pink and black hair, waiting for an opportunity to get involved...";
			}
		}

		override protected function performCombatAction():void
		{
			//mid-round madness!
			midRoundMadness();
			tamaniShowsUp();
			createStatusEffect(StatusEffects.Attacks, int(flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] / 20), 0, 0, 0); //Tamani's Daughters get multiattacks!
			if (statusEffectv1(StatusEffects.Attacks) > 20) addStatusValue(StatusEffects.Attacks, 1, -(statusEffectv1(StatusEffects.Attacks) - 20));
			var actionChoices:MonsterAI = new MonsterAI()
				.add(eAttack);
			actionChoices.add(goblinTeaseAttack,1,true,0,FATIGUE_NONE,RANGE_TEASE);
			actionChoices.add(goblinDrugAttack,1,true,0,FATIGUE_NONE,RANGE_RANGED);
			actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.forest.tamaniScene.tamaniDaughtersScene.combatWinAgainstDaughters();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (pcCameWorms){
				outputText("\n\nYour foes seem visibly disgusted and leave, telling you to, \"quit being so fucking gross...\"");
				game.combat.cleanupAfterCombat();
			} else {
				game.forest.tamaniScene.tamaniDaughtersScene.loseToDaughters();
			}
		}

		public function TamanisDaughters()
		{
			super(true);
			this.a = "the group of ";
			this.short = "Tamani's daughters";
			this.imageName = "tamanisdaughters";
			this.long = "A large grouping of goblin girls has gathered around you, surrounding you on all sides.  Most have varying shades of green skin, though a few have yellowish or light blue casts to their skin.  All are barely clothed, exposing as much of their flesh as possible in order to excite a potential mate.  Their hairstyles are as varied as their clothing and skin-tones, and the only things they seem to have in common are cute faces and curvy forms.  It looks like they want something from you.";
			this.race = "Goblins";
			this.plural = true;
			this.pronoun1 = "they";
			this.pronoun2 = "them";
			this.pronoun3 = "their";
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_TIGHT);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 40, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,25,0,0,0);
			this.tallness = 40;
			this.hips.rating = Hips.RATING_AMPLE+1;
			this.butt.rating = Butt.RATING_NOTICEABLE+1;
			this.skin.tone = "greenish gray";
			this.hair.color = "pink";
			this.hair.length = 16;
			initStrTouSpeInte(55, 30, 45, 50);
			initLibSensCor(70, 70, 50);
			this.weaponName = "fists";
			this.weaponVerb="tiny punch";
			this.armorName = "leather straps";
			this.bonusHP = 50 + (int(flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] / 2) * 15);
			if (bonusHP > 3350) bonusHP = 3350;
			this.lust = 30;
			this.lustVuln = .65;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 8 + (Math.floor(flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] / 20));
			if (level > 30) level = 30;
			this.gems = rand(15) + 5;
			this.drop = new WeightedDrop().
					add(consumables.GOB_ALE,5).
					addMany(1,consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.PURPDYE);
			/*this.special1 = goblinDrugAttack;
			this.special2 = goblinTeaseAttack;*/
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Areas.Forest
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.internals.*;
	import classes.GlobalFlags.kACHIEVEMENTS;
	import classes.GlobalFlags.kFLAGS;
	import classes.GlobalFlags.kGAMECLASS;

	public class TentacleBeast extends Monster
	{
		override public function react(context:int):Boolean{
			switch (context){
				case CON_PLAYERWAITED:
					if (player.hasStatusEffect(StatusEffects.TentacleBind)) {
					clearOutput();
					if (player.cocks.length > 0) outputText("The creature continues spiraling around your cock, sending shivers up and down your body. You must escape or this creature will overwhelm you!");
					else if (player.hasVagina()) outputText("The creature continues sucking your clit and now has latched two more suckers on your nipples, amplifying your growing lust. You must escape or you will become a mere toy to this thing!");
					else outputText("The creature continues probing at your asshole and has now latched " + num2Text(player.totalNipples()) + " more suckers onto your nipples, amplifying your growing lust.  You must escape or you will become a mere toy to this thing!");
					player.takeLustDamage(8 + player.sens / 10, true);
					tookAction = true;
					return false;
				}
			}
			return true;
		}

		override public function struggle():void{
			if (player.hasStatusEffect(StatusEffects.TentacleBind)){
				clearOutput();
				outputText("You struggle with all of your might to free yourself from the tentacles before the creature can fulfill whatever unholy desire it has for you.\n");
				//33% chance to break free + up to 50% chance for strength
				if (rand(3) == 0 || rand(80) < player.str / 2) {
					outputText("As the creature attempts to adjust your position in its grip, you free one of your " + player.legs() + " and hit the beast in its beak, causing it to let out an inhuman cry and drop you to the ground smartly.\n\n");
					player.removeStatusEffect(StatusEffects.TentacleBind);
					createStatusEffect(StatusEffects.TentacleCoolDown, 3, 0, 0, 0);
				}
				//Fail to break free
				else {
					outputText("Despite trying to escape, the creature only tightens its grip, making it difficult to breathe.\n\n");
					game.combat.takeDamage(5);
					if (player.cocks.length > 0)
						outputText("The creature continues spiraling around your cock, sending shivers up and down your body. You must escape or this creature will overwhelm you!");
					else if (player.hasVagina())
						outputText("The creature continues sucking your clit and now has latched two more suckers on your nipples, amplifying your growing lust. You must escape or you will become a mere toy to this thing!");
					else outputText("The creature continues probing at your asshole and has now latched " + num2Text(player.totalNipples()) + " more suckers onto your nipples, amplifying your growing lust.  You must escape or you will become a mere toy to this thing!");
					player.takeLustDamage(3 + player.sens / 10 + player.lib / 20, true);
					tookAction = true;
				}
			}
		}

		private function tentaclePhysicalAttack():void {
			outputText("The shambling horror throws its tentacles at you with a murderous force.\n");
			var temp:int = player.reduceDamage(str + weaponAttack,this);
			if (temp < 0) temp = 0;
			//Miss
			if (temp == 0 || combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).dodge != null) {
				outputText("However, you quickly evade the clumsy efforts of the abomination to strike you.");
			}
			//Hit
			else {
				outputText("The tentacles crash upon your body mercilessly. ");
				player.takeDamage(temp, true);
			}

		}
		private function tentacleEntwine():void {
			outputText("The beast lunges its tentacles at you from all directions in an attempt to immobilize you.\n");
			//Not Trapped yet
			if (!player.hasStatusEffect(StatusEffects.TentacleBind)) {
				//Success
				if (combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).dodge != null) {
					outputText("In an impressive display of gymnastics, you dodge, duck, dip, dive, and roll away from the shower of grab-happy arms trying to hold you. Your instincts tell you that this was a GOOD thing.\n");
				}
				//Fail
				else {
					outputText("While you attempt to avoid the onslaught of pseudopods, one catches you around your " + player.foot() + " and drags you to the ground. You attempt to reach for it to pull it off only to have all of the other tentacles grab you in various places and immobilize you in the air. You are trapped and helpless!!!\n\n");
					//Male/Herm Version:
					if (player.hasCock()) outputText("The creature, having immobilized you, coils a long tendril about your penis. You shudder as the creature begins stroking your cock like a maid at a dairy farm in an attempt to provoke a response from you. Unable to resist, your " + player.cockDescript(0) + " easily becomes erect, signaling to the creature that you are responsive to harsher stimulation.\n");
					//Female Version:
					else if (player.hasVagina()) outputText("The creature quickly positions a long tentacle with a single sucker over your clitoris. You feel the power of the suction on you, and your body quickly heats up.  Your clit engorges, prompting the beast to latch the sucker onto your " + player.clitDescript() + ".");
					//Genderless
					else outputText("The creature quickly positions a long tentacle against your " + player.assholeDescript() + ". It circles your pucker with slow, delicate strokes that bring unexpected warmth to your body.");
					var lustDmg:int = 8+player.sens/20;
					player.takeLustDamage(lustDmg, true);
					player.createStatusEffect(StatusEffects.TentacleBind,0,0,0,0);
				}
			}

		}

		override protected function performCombatAction():void{
			var actionChoices:MonsterAI = new MonsterAI()
				.add(tentaclePhysicalAttack,2,true,0,FATIGUE_NONE,RANGE_RANGED);
			actionChoices.add(tentacleEntwine,1,!hasStatusEffect(StatusEffects.TentacleCoolDown),15,FATIGUE_PHYSICAL,RANGE_RANGED);
			actionChoices.exec();
		}

        override public function shouldMove(newPos:int,forceAction:Boolean = false):Boolean {
			return false;
			//Given the tentacle beast's abilities, never moving and making all attacks ranged seemed like the best option. Previously it preferred ranged because its normal attack is ranged, but the bind is melee so that crippled it. Making the normal attack also melee would have left it way too weak against players taking distance.
			//The ideal solution would be writing new attacks of course, but ain't nobody got time for that.
		}

		override public function defeated(hpVictory:Boolean):void
		{
			clearOutput();
			if (hpVictory) {
				outputText("The creature lets out an ear-piercing screech as it collapses upon itself. Its green coloring quickly fades to brown as the life drains from it, leaving you victorious.");
				game.awardAchievement("Tentacle Beast Slayer", kACHIEVEMENTS.GENERAL_TENTACLE_BEAST_SLAYER);
				flags[kFLAGS.TENTACLE_BEASTS_KILLED]++;
			} else {
				outputText("The tentacle beast's mass begins quivering and sighing, the tentacles wrapping around each other and feverishly caressing each other.  It seems the beast has given up on fighting.");
			}
			if (hasStatusEffect(StatusEffects.PhyllaFight)) {
				removeStatusEffect(StatusEffects.PhyllaFight);
				game.desert.antsScene.phyllaTentacleDefeat();
			}
			else {
				if (!hpVictory && player.gender > 0 && flags[kFLAGS.SFW_MODE] <= 0) {
					outputText("  Perhaps you could use it to sate yourself?");
					game.output.doYesNo(game.forest.tentacleBeastScene.tentacleVictoryRape,game.combat.cleanupAfterCombat);
				} else {
					game.combat.cleanupAfterCombat();
				}
			}
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (hpVictory) {
				outputText("Overcome by your wounds, you turn to make a last desperate attempt to run...\n\n");
				if (hasStatusEffect(StatusEffects.PhyllaFight)) {
					removeStatusEffect(StatusEffects.PhyllaFight);
					outputText("...and make it into the nearby tunnel.  ");
					game.desert.antsScene.phyllaTentaclePCLoss();
				} else
					game.forest.tentacleBeastScene.tentacleLossRape();
			} else {
				outputText("You give up on fighting, too aroused to resist any longer.  Shrugging, you walk into the writhing mass...\n\n");
				if (hasStatusEffect(StatusEffects.PhyllaFight)) {
					removeStatusEffect(StatusEffects.PhyllaFight);
					outputText("...but an insistent voice rouses you from your stupor.  You manage to run into a nearby tunnel.  ");
					game.desert.antsScene.phyllaTentaclePCLoss();
				} else
					doNext(game.forest.tentacleBeastScene.tentacleLossRape);
			}
		}

		public function TentacleBeast()
		{
			//trace("TentacleBeast Constructor!");
			this.a = "the ";
			this.short = "tentacle beast";
			this.imageName = "tentaclebeast";
			this.long = "You see the massive, shambling form of the tentacle beast before you.  Appearing as a large shrub, it shifts its bulbous mass and reveals a collection of thorny tendrils and cephalopodic limbs.";
			this.race = "Abomination";
			// this.plural = false;
			this.createCock(40,1.5);
			this.createCock(60,1.5);
			this.createCock(50,1.5);
			this.createCock(20,1.5);
			this.balls = 0;
			this.ballSize = 0;
			this.cumMultiplier = 3;
			// this.hoursSinceCum = 0;
			this.pronoun1 = "it";
			this.pronoun2 = "it";
			this.pronoun3 = "its";
			this.createBreastRow(0,0);
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_SLIME_DROOLING;
			this.tallness = rand(9) + 70;
			this.hips.rating = Hips.RATING_BOYISH;
			this.butt.rating = Butt.RATING_BUTTLESS;
			this.skin.tone = "green";
			this.skin.type = Skin.PLAIN;
			this.skin.desc = "bark";
			this.hair.color = "green";
			this.hair.length = 1;
			initStrTouSpeInte(58, 25, 35, 45);
			initLibSensCor(90, 20, 100);
			this.weaponName = "whip-tendril";
			this.weaponVerb="thorny tendril";
			this.weaponAttack = 1;
			this.armorName = "rubbery skin";
			this.armorDef = 1;
			this.bonusHP = 250;
			this.lust = 10;
			this.lustVuln = 0.8;
			this.fireRes = 1.2;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 6;
			this.gems = rand(15) +5;
			this.drop = new WeightedDrop(consumables.P_SEED, 1)
				.add(null, 2);
			/*this.special1 = tentaclePhysicalAttack;
			this.special2 = tentacleEntwine;
			this.special3 = tentaclePhysicalAttack;*/
			this.tail.type = Tail.DEMONIC;
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Areas.Forest {
	import classes.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.Items.Consumables.MinotaurBlood;
import classes.Items.Weapon;
import classes.Items.WeaponLib;
import classes.Scenes.Areas.Bog.AnneMarie;
	import classes.Scenes.Areas.Bog.Batgirl;
import classes.Scenes.Areas.Desert.CumWitch;
import classes.Scenes.Areas.Desert.NagaSentinel;
	import classes.Scenes.Areas.GlacialRift.Amarok;
	import classes.Scenes.Areas.GlacialRift.FrostGiant;
	import classes.Scenes.Areas.GlacialRift.Valkyrie;
	import classes.Scenes.Areas.GlacialRift.Yeti;
	import classes.Scenes.Areas.Mountain.Minotaur;
	import classes.Scenes.Areas.Swamp.CorruptedDrider;
	import classes.Scenes.Areas.Swamp.FemaleSpiderMorph;
	import classes.Scenes.Areas.Swamp.MaleSpiderMorph;
import classes.Scenes.Areas.VolcanicCrag.Hellmouth;
import classes.Scenes.Camp.ImpGang;
	import classes.Scenes.Dungeons.DeepCave.ImpHorde;
import classes.Scenes.Dungeons.DesertCave.SandWitchMob;
import classes.Scenes.Dungeons.HelDungeon.HarpyQueen;
import classes.Scenes.Dungeons.HelDungeon.PhoenixPlatoon;
	import classes.Scenes.Dungeons.LethicesKeep.DriderIncubus;
	import classes.Scenes.Dungeons.Manor.BoneCourt;
	import classes.Scenes.Dungeons.WizardTower.ArchInquisitorVilkus;
	import classes.Scenes.Areas.VolcanicCrag.VolcanicGolem;
import classes.Scenes.Monsters.EmptySpace;
import classes.Scenes.Monsters.GoblinSharpshooter;
import classes.Scenes.Monsters.Mammon;
import classes.StatusEffects.Combat.Immobilized;
import classes.StatusEffects.TestTimedStatus;
	import classes.internals.ButtonData;
import classes.internals.SerializationUtils;
import classes.internals.Utils;

import flash.crypto.generateRandomBytes;

import mx.utils.LinkedList;
import mx.utils.LinkedListNode;

//import classes.Scenes.Dungeons.LethicesKeep
	import classes.Scenes.Dungeons.HelDungeon.PhoenixCommander;
	import classes.Scenes.Dungeons.HelDungeon.PhoenixGrenadier;
	import classes.Scenes.Dungeons.HelDungeon.PhoenixPyro;
	import classes.Scenes.Dungeons.HelDungeon.PhoenixSapper;
	import classes.Scenes.Dungeons.Manor.BoneCourtier;
	import classes.Scenes.Dungeons.Manor.BoneGeneral;
	import classes.Scenes.Dungeons.Manor.BoneJester;
	import classes.Scenes.Dungeons.Manor.NamelessHorror;
	import classes.Scenes.Dungeons.Manor.Necromancer;
	import classes.Scenes.Dungeons.Manor.SkeletonHorde;
	import classes.Scenes.Dungeons.WizardTower.ArchitectJeremiah;
	import classes.Scenes.Dungeons.WizardTower.AspectOfLaurentius;
	import classes.Scenes.Dungeons.WizardTower.ImpStatue;
	import classes.Scenes.Dungeons.WizardTower.IncubusStatue;
	import classes.Scenes.Dungeons.WizardTower.SentinelOfApostasy;
	import classes.Scenes.Dungeons.WizardTower.SentinelOfBlasphemy;
	import classes.Scenes.Dungeons.WizardTower.SentinelOfHeresy;
	import classes.Scenes.Dungeons.WizardTower.SuccubusStatue;
	import classes.Scenes.Monsters.GoblinAssassin;
	import classes.Scenes.Monsters.GoblinElder;
	import classes.Scenes.Monsters.GoblinShaman;
	import classes.Scenes.Monsters.GoblinWarrior;
	import classes.Scenes.Monsters.Imp;
	import classes.Scenes.Monsters.ImpLord;
	import classes.Scenes.Monsters.ImpOverlord;
	import classes.Scenes.Monsters.ImpWarlord;
	import classes.Scenes.NPCs.Amily;
	import classes.Scenes.NPCs.Hel;
	import classes.Scenes.NPCs.Kiha;
	import classes.Scenes.Quests.UrtaQuest.MinotaurLord;
	import flash.utils.describeType;
	import flash.net.FileReference;

public class TestStuff extends BaseContent {

	public function TestStuff()
	{
	}

	public var puzzleLayout:Array = new Array(81);
	public var mirrorLayout:Array = new Array(81);
	public var playerLoc:int = 41;
	public var mirrorLoc:int = 41;

	public function start():void{
		clearOutput();
		playerLoc = 41;
	    mirrorLoc = 41;
		outputText(puzzleLayout.length + "\n\n");
		puzzleLayout =
	   [0,0,0,0,0,0,0,0,0,
		0,1,1,0,1,0,1,0,0,
		0,1,0,0,0,0,1,0,0,
		0,1,1,0,1,0,1,1,1,
		0,0,1,1,0,0,0,0,0,
		0,1,1,1,1,1,0,0,0,
		0,0,0,1,0,0,0,1,0,
		0,1,1,0,0,0,1,0,0,
		0,0,0,0,1,1,0,0,0]
		mirrorLayout =
	   [1,1,0,0,2,1,0,0,0,
		1,0,0,1,0,1,1,1,0,
		0,0,1,1,1,0,0,0,0,
		0,0,0,0,1,0,0,1,0,
		0,1,0,1,0,1,0,0,0,
		0,0,1,0,0,0,0,1,0,
		0,0,0,0,0,1,0,1,0,
		0,1,1,1,1,1,0,1,0,
		0,0,0,0,1,0,0,0,0]
		puzzleLayout[playerLoc] = 3;
		mirrorLayout[mirrorLoc] = 3;
		redraw();
	}

    public function generate2DArray(length:int,height:int):Array{
        var map:Array = [];
        for(var i:int = 0;i<height;i++){
            map.push([]);
            for(var j:int = 0;j<length;j++){
                map[i].push(1);
            }
        }
        return map;
    }

    public function generateRandomMaze(height:int,width:int):Array{
        var map:Array = generate2DArray(height,width);

        var frontiers:Array = new Array();

        var x:int = rand(height);
        var y:int = rand(width);
        frontiers.push([x,y,x,y]);

        while (!(frontiers.length == 0)){
            var f:Array = frontiers.splice(rand(frontiers.length))[0];
            x = f[2];
            y = f[3];
            if ( map[x][y] == 1 )
            {
                map[f[0]][f[1]] = 0;
                map[x][y] = 0;
                if ( x >= 2 && map[x-2][y] == 1)
                    frontiers.push([x-1,y,x-2,y]);
                if ( y >= 2 && map[x][y-2] == 1)
                    frontiers.push([x,y-1,x,y-2]);
                if ( x < width-2 && map[x+2][y] == 1 )
                    frontiers.push([x+1,y,x+2,y]);
                if ( y < height-2 && map[x][y+2] == 1 )
                    frontiers.push([x,y+1,x,y+2]);
            }
        }
        var finalMap:Array = squash2DArray(map);
        outputText(finalMap + "");
		doNext(camp.returnToCampUseTwoHours);
		return finalMap;
    }

    public function squash2DArray(array:Array):Array{
        var map:Array = [];
        for(var i:int = 0;i<array.length;i++){
            for(var j:int = 0;j<array.length;j++){
                map.push(array[i][j]);
            }
        }
        return map;
    }

	public function redraw():void{
		clearOutput();
		if (mirrorLoc == 4){
			outputText("YOU'RE WINNER\n\n");
			doNext(camp.returnToCampUseOneHour);
		}
		outputText("");
		var draw:String = "";
		for (var i:int = 0; i < 9; i++){
			for (var j:int = 0; j < 9; j++){
				if (puzzleLayout[j + i*9] == 0){
					draw += "[ ]";
					if (j < 8 && (puzzleLayout[j + i*9 + 1] == 0 || puzzleLayout[j + i*9 + 1] == 3)) draw += "-";
					else draw += " ";
				}
				if (puzzleLayout[j + i*9] == 1) draw += "    ";
				if (puzzleLayout[j + i*9] == 3){
					draw += "[P]";
					if (j < 8 && (puzzleLayout[j + i*9 + 1] == 0 || puzzleLayout[j + i*9 + 1] == 3)) draw += "-";
					else draw += " ";

				}
			}
			draw += "\n";
			for (var k:int = 0; k < 9; k++){
				if ((puzzleLayout[k + i*9] == 0 && puzzleLayout[k + i*9 + 9] == 0) ||
				    (puzzleLayout[k + i*9] == 3 && puzzleLayout[k + i*9 + 9] == 0) ||
					(puzzleLayout[k + i*9] == 0 && puzzleLayout[k + i*9 + 9] == 3)) draw += " |  ";
				else draw += "    ";
			}
			draw += "\n";

		}
		/*
		for (var i:int = 0; i < puzzleLayout.length; i++){
			if (puzzleLayout[i] == 0)draw += "[ ]";
			if (puzzleLayout[i] == 1) draw += "   ";
			if (puzzleLayout[i] == 3) draw += "[P]";
			if (puzzleLayout[i] == 4)
			if((i+1) % 9 == 0) draw += "\n";
		}
		*/
		draw += "\n\n";
		for (var i:int = 0; i < mirrorLayout.length; i++){
			if (mirrorLayout[i] == 0) draw += "[ ]";
			if (mirrorLayout[i] == 1) draw += "   ";
			if (mirrorLayout[i] == 2) draw += "[X]";
			if (mirrorLayout[i] == 3) draw += "[P]";
			if((i+1) % 9 == 0) draw += "\n";
		}
		rawOutputText(draw);
		outputText("");
		menu();
		outputText(inventory.itemStorageDirectGet().length + " ");
		addButton(0, "TestFight", testFuncWhatev).hint("It begins again.");
		addButton(1, "Give me XP", addXP).hint("I need xp!");
		addButton(2, "Kill KnockedBack", removeKnockedBack).hint("Use this to fix the \"infinitely knocked back\" bug.");
		addButton(3, "Count Food Items", countFood).hint("Test stuff!");
		addButton(5, "Give me shiny stuff", shinyStuff).hint("Get a rifle and some cool armor.");
		addButton(4, "Kill New Spells", killSpells).hint("Kill Leech and TK Blast so you can get them again.");
		addButton(7, "Test new dungeon", testDungeon).hint("Test the new dungeon.");
		addButton(8,"Mapgen",game.dungeons.randomDungeon.generateRandomDungeon);
		if(flags[kFLAGS.SAVE_FIXED] != 1)addButton(2, "Fix my save", fixSave).hint("Make this save compatible with Revamp, in case you want to switch back and forth the future.");
		if (puzzleLayout[playerLoc - 9] != 1 && !(playerLoc - 8 <= 0)){
			addButton(6, "North", move,0).hint("hurr");
		}
		if (puzzleLayout[playerLoc + 9] != 1 && !(playerLoc + 9 >= 81)){
			addButton(11, "South", move,1).hint("hurr");
		}
		if (puzzleLayout[playerLoc - 1] != 1 && playerLoc% 9 != 0 && playerLoc != 0){
			addButton(10, "West", move,2).hint("hurr");
		}
		if (puzzleLayout[playerLoc + 1] != 1 && (playerLoc + 1)% 9 != 0 ){
			addButton(12, "East", move,3).hint("hurr");
		}
		addButton(14, "Git out", camp.returnToCampUseOneHour).hint("The fuck is this aanyway.");
		return;
	}

	public function testDungeon():void{
		game.dungeons.wizardTower.enterTower();
		/*game.inDungeon = true;
		game.dungeonLoc = 80;
		menu();
		var newmapLayout:Array =
	   [1,1,0,1,1,1,1,1, //7
		1,1,2,1,1,1,1,1, //15
		1,1,0,1,1,1,1,1, //23
		1,0,0,0,1,1,1,1, //31
		1,0,1,0,1,1,1,1, //39
		1,0,0,0,1,1,1,1, //47
		1,1,0,1,1,1,1,1, //55
		1,1,0,1,1,1,1,1] //63
		game.dungeons.startAlternative(58,newmapLayout);
		game.dungeons.setDungeonButtons();
		game.dungeons.wizardTower.runFunc();*/
	}

	public function shinyStuff():void{
		clearOutput();
		/*var randWeapon:* = Utils.clone(player.weapon);
		//(randWeapon as Weapon).attack = 1234;
        (randWeapon as Weapon).description = player.weapon._description + "\n\nThis weapon has been boosted yo";
        (randWeapon as Weapon).id = player.weapon.id + " extra ";
        (randWeapon as Weapon).attack += 6;
		inventory.takeItem(randWeapon,camp.returnToCampUseOneHour);
		/*inventory.takeItem(weapons.FINALARG, camp.returnToCampUseOneHour);
		inventory.takeItem(armors.YORHARM, camp.returnToCampUseOneHour)*/
		//inventory.takeItem(weapons.CTSWRD, camp.returnToCampUseOneHour);
		//inventory.takeItem(weapons.LRAVENG, camp.returnToCampUseOneHour);
		//player.createStatusEffect(StatusEffects.KnowsSoulburst, 0, 0, 0, 0);
		//player.addStatusEffect(new TestTimedStatus(24));
		/*var serializeTest:* = JSON.stringify(player.armor.bonusStats.statArray);
		outputText(serializeTest);
        var searchIndex:String = player.weapon.id + "extra";
        if(WeaponLib.BOOSTED_WEAPONS[searchIndex] != null){
            var weap:* = WeaponLib.BOOSTED_WEAPONS[searchIndex];
            inventory.takeItem(weap,camp.returnToCampUseOneHour);
        }*/
		var newWeapon:* = Utils.clone(player.weapon);
        var prevDesc:String = player.weapon._description;
        (newWeapon as Weapon)._description = prevDesc;
        (newWeapon as Weapon).bonusStats = new BonusDerivedStats();
		(newWeapon as Weapon).longName = "L";
        (newWeapon as Weapon).shortName = "New weap";
        (newWeapon as Weapon).name = "New weap";
		(newWeapon as Weapon).boostsSpellCost(0.8);
		(newWeapon as Weapon).boostsSpellMod(80);
        (newWeapon as Weapon).boostsAccuracy(10);
        (newWeapon as Weapon).boostsDodge(20);
        (newWeapon as Weapon).isAltered = true;
		inventory.takeItem(newWeapon,camp.returnToCampUseOneHour);

	}

	public function killSpells():void{
			player.removeStatusEffect(StatusEffects.KnowsLeech);
			player.removeStatusEffect(StatusEffects.KnowsTKBlast);
			doNext(camp.returnToCampUseOneHour);
	}

	public function countFood():void{
		clearOutput();
		outputText("" + inventory.countTotalFoodItems());
		doNext(redraw);
	}

	public function testFuncWhatev():void{
		clearOutput();
		startCombat(new GoblinSharpshooter());
		//startCombatMultiple(new Mammon(), new EmptySpace(), new EmptySpace(), new EmptySpace(),null,null,null,null);
	}

	public function removeKnockedBack():void{
		clearOutput();
		if (!player.hasStatusEffect(StatusEffects.KnockedBack)) outputText("Your character doesn't have that status effect.");
		while (player.hasStatusEffect(StatusEffects.KnockedBack)){
			outputText("Found instance of KnockedBack.\n");
			player.removeStatusEffect(StatusEffects.KnockedBack);
		}
		doNext(camp.returnToCampUseOneHour);
	}
	public function fixSave():void{
		clearOutput();
		//shift our flags up 300 spaces
		for (var i:int = 2337; i < 2378; i++){
			outputText("Flag " + i + " with value " + flags[i] + " being shifted.\n");
			flags[i + 300] = flags[i];
		}
		//fine tune
		outputText("MinoMutual number being fixed\n\n");
		flags[kFLAGS.TIMES_MINO_MUTUAL] = flags[kFLAGS.UNKNOWN_FLAG_NUMBER_02667];
		flags[kFLAGS.UNKNOWN_FLAG_NUMBER_02667] = 0;
		outputText("Bimbo Miniskirt Toggle being fixed\n\n");
		flags[kFLAGS.BIMBO_MINISKIRT_PROGRESS_DISABLED] = flags[kFLAGS.UNKNOWN_FLAG_NUMBER_02670];
		flags[kFLAGS.UNKNOWN_FLAG_NUMBER_02670] = 0;
		outputText("Amarok Losses being fixed\n\n");
		flags[kFLAGS.AMAROK_LOSSES] = flags[kFLAGS.SAVE_FIXED];
		outputText("Save marked as fixed\n\n");
		flags[kFLAGS.SAVE_FIXED] = 1;
		outputText(flags[kFLAGS.SAVE_FIXED] + "");
		//clean it up
		for (var i:int = 2340; i < 2378; i++){
			flags[i] = 0;
		}
		doNext(playerMenu);
	}

	public function addXP():void{
		player.XP += 2000;
		player.createPerk(PerkLib.Revelation);
		doNext(start);
	}
	public function move(direction:int):void{
		puzzleLayout[playerLoc] = 0;
		if (direction == 0){
			if (mirrorLayout[mirrorLoc - 9] != 1 && !(mirrorLoc - 8 < 0)){
				mirrorLayout[mirrorLoc] = 0;
				mirrorLoc -= 9;
				mirrorLayout[mirrorLoc] = 3;
			}
			playerLoc -= 9;
		}
		if (direction == 1){
			if (mirrorLayout[mirrorLoc + 9] != 1  && !(mirrorLoc + 9 >= 81)){
				mirrorLayout[mirrorLoc] = 0;
				mirrorLoc += 9;
				mirrorLayout[mirrorLoc] = 3;
			}
			playerLoc += 9;
		}
		if (direction == 2){
			if (mirrorLayout[mirrorLoc - 1] != 1 && mirrorLoc% 9 != 0 && mirrorLoc != 0){
				mirrorLayout[mirrorLoc] = 0;
				mirrorLoc -= 1;
				mirrorLayout[mirrorLoc] = 3;
			}
			playerLoc -= 1;
		}
		if (direction == 3){
			if (mirrorLayout[mirrorLoc + 1] != 1 && (mirrorLoc + 1)% 9 != 0){
				mirrorLayout[mirrorLoc] = 0;
				mirrorLoc += 1;
				mirrorLayout[mirrorLoc] = 3;
			}
			playerLoc += 1;
		}
	puzzleLayout[playerLoc] = 3;
	redraw();
	}

}
}


code:
package classes.Scenes.Areas.Forest
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.internals.*;

	public class Yamata extends BaseKitsune {

		public function Yamata() {
			init();
		}

		private function init():void {
			this.a = "";
			this.short = "Yamata";
			this.imageName = "yamata";
			this.long = "Yamata stands before you, grinning psychotically as her nine fox tails flare out behind her. Her jet black hair twists and writhes in the air, forming eight serpentine heads that snap at anything within reach. A pair of demonic horns curves up in front of her ears, and she is wielding a cursed black sword that resembles an oversized billhook bathed in demonic power. Just looking at her for too long causes strange thoughts to enter your mind, urging you to submit to her and become her loyal masochistic pet. You’ll have to keep your wits about you, or you might start enjoying the pain!";
			this.race = "Kitsune";
			this.createVagina(false, Vagina.WETNESS_WET, Vagina.LOOSENESS_LOOSE);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 8000, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_NORMAL;
			this.ass.analWetness = Ass.WETNESS_MOIST;
			this.createStatusEffect(StatusEffects.BonusACapacity,200,0,0,0);
			this.tallness = 69;
			this.hips.rating = Hips.RATING_AMPLE;
			this.butt.rating = Butt.RATING_AVERAGE+1;
			this.skin.tone = "light tan";			//might need to change to russet
			this.hair.color = "black";
			this.hair.length = 22;
			initStrTouSpeInte(60, 70, 90, 100);
			initLibSensCor(60, 65, 100);
			this.weaponName = "Muramasa";
			this.weaponVerb = "slash"
			this.armorName = "tight chest wrap and baggy pants";
			this.armorDef = 16;
			this.bonusHP = 2400;
			this.lust = 25;
			this.bonusLust = 150;
			this.lustVuln = 0.35;
			this.temperment = TEMPERMENT_LUSTY_GRAPPLES;
			this.level = 30;
			this.gems = rand(20) + 30;
			this.drop = new WeightedDrop(consumables.MYSTJWL, 1);
			this.tail.type = Tail.FOX;
			this.tail.venom = 9;
            this.createPerk(PerkLib.EnlightenedNinetails);
            this.createPerk(PerkLib.SpellcastingAffinity,25);
			checkMonster();
		}

		//Corrupted Yamata Attacks
		private function yamataBasic():void {
			var x:int = rand(4);
			var damage:int;
			if (x==0)
			{
				outputText("Rushing toward you, Yamata drops down low, then leaps up into a wide swing. You flinch as you see the tip of her blade glide across your skin, but she dances away at the last second, leaving behind an angry red wound that hurts like hell, but is far from life-threatening. “Oh yeah, scream for me baby!” The realization that she’s toying with you is practically infuriating!  ");
				damage = int(str/2) + rand(15);
			} else if (x == 1) {
				outputText("You back away as Yamata goes into the offensive, doing your best to dodge her attacks. The tip of her blade grazes you a few times, and the shallow wounds they leave behind hurt far worse than they really should. She raises the blade to her lips and gently licks it, grinning vindictively at you. You’re certain now that Yamata is just trying to inflict as much pain as possible before finishing you off.  ");
				damage = int(str/2) + rand(35);
			} else if (x == 2) {
				outputText("Yamata digs her heels into the ground, taunting you with a crude gesture. Her serpentine hair suddenly lashes forward, morphing before your eyes into countless blades! Thankfully, she seems to purposely avoid anything vital, but the grazing cuts they leave behind hurt terribly. “Ahahahaha! Doesn’t it just make you HARD?!”  ");
				damage = int(str) - rand(25);
				player.takeLustDamage(7);
				flags[kFLAGS.YAMATA_MASOCHIST]++;
			} else {
				outputText("With a quick whipping motion, Yamata’s serpentine hair lashes toward you, splitting into thousands of thin strands that whip against your flesh. Pain lances through your body wherever they touch, but the intense tingling sends blood boiling to your loins involuntarily.  ");
				damage = int(str/2) + rand(50);
				player.takeLustDamage(12);
				flags[kFLAGS.YAMATA_MASOCHIST]++;
			}
			player.takeDamage(damage, true);
			yamataSadomasochistApply(damage);
			player.bleed(this);
		}

		private function yamataDarkFoxfire():void {
			outputText("Yamata moves her fingers through the air in a circle, conjuring up a corrupted purple flame. She twists her upper body into a batter’s stance and strikes it with the flat of her blade, making the fireball rocket toward you like a missile, bursting on impact! The flames burn intensely as they engulf you, but the more it burns, the more you start to LIKE it.  ");
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			player.takeDamage(int(str/2) + rand(15), true);
			//if masochist, take more damage
			(player.hasPerk(PerkLib.Masochist) ?  player.takeLustDamage(15 + player.sens/10) : player.takeLustDamage((10 + player.sens/10)*2));
			flags[kFLAGS.YAMATA_MASOCHIST]++;
		}

		private function yamataNightmare():void {
			outputText("You can hear a whispering voice clouding the edges of your mind, and begin to shrink back as darkness begins to close in on you. As the all-consuming blackness fills your field of vision, you are beset on all sides by unimaginable horrors too terrifying to describe! You feel yourself falling deeper and deeper into a void of despair, but somehow you know that you could end all the suffering if you would only submit yourself to Yamata...  ");
			//Resist: - successfully resisting deals small health & lust damage to Yamata
			var resist:int = 0;
			resist = (player.inte < 80 ? Math.round(player.inte/70*25) : 25);
			if (player.findPerk(PerkLib.Whispered) >= 0)
				resist += 30;
			else
				outputText("Some small part of you knows this can’t be real, but you’re too terrified to act right now! ");
			if (player.isReligious() && player.isPureEnough(20))
				resist += 15 - player.corAdjustedDown();
			if (rand(100) < resist) {
				outputText("\n\nSummoning up every last ounce of courage you have, you push back the illusions with your mind! Yamata reels a bit, clutching her forehead in pain, but only grins at you. “That all you got, hero?”");
				if (player.hasStatusEffect(StatusEffects.Fear))
					player.removeStatusEffect(StatusEffects.Fear);
			} else {
				outputText("You know that none of this could be real, but you are too terrified to act this round!");
				if (player.hasStatusEffect(StatusEffects.Fear))
					player.addCombatBuff("spe", -12);
				else {
					player.createStatusEffect(StatusEffects.Fear, 0, 0, 0, 0);
					player.addCombatBuff("spe", -18);
				}
			}
		}

		private function yamataLustAttack():void {
			outputText("Before your eyes, Yamata dives to the ground, her hair lengthening and wrapping around her lower body in a slick serpentine shape. Like black lightning she rears up, spiralling around you like a crazed serpent. As she winds her way around your body, she drags her nails along your flesh, running her tongue over the fresh scratches as she snaps away from you. You shudder a little, equal parts disturbed and aroused.\n\n"
			+"The eight serpents that make up Yamata’s hair suddenly slam into you, latching onto you with their fangs and lifting you into the air. As you squirm in their grip, one of them dives into your [armor], and with a look of horror you feel it "
			+(player.hasCock()? "engulfing your [cock] whole, sinking fangs into the base and filling your groin with corrupted fire!"+(player.hasVagina()?" Another of her snakes impale your [vagina], filling your womb with corrupted fire!":""):"impaling your [vagina], filling your womb with corrupted fire!")
			+"\n\nShe roughly tosses you to the ground, smirking as you struggle to your feet, lust burning in your loins.  ");

			var lustDmg:int = 15 + player.sens / 3 + player.lib/5;
			player.takeLustDamage(lustDmg, true);
			if (player.hasCock()) player.dynStats("cor", 1);
			if (player.hasVagina()) player.dynStats("cor", 1);
			player.takeDamage(15+rand(26), true);
			yamataSadomasochistApply(lustDmg+5);
			flags[kFLAGS.YAMATA_MASOCHIST]++;
		}

		private function yamataIllusionLust():void {
			var lustDmg:int = 10 + player.sens / 5;
			outputText("Yamata splits herself into a series of illusions that quickly surround you! You try to find the real one but you're too slow! A fireball comes from the side, blasting you with broiling corrupted flames!  ");
			player.takeDamage(int(str/2) + rand(15), true);
			if (player.hasStatusEffect(StatusEffects.Fear))
				switch (rand(3)) {
					case 0:
						outputText("\n\nYou attack Yamata, but her figure was just an illusion! She appears behind you and her hair lengthens rapidly, one of the snake-hair serpents lashes out and bites into your ankle, injecting a burst of corrupted flames directly into you!");
						lustDmg += 4;
						player.dynStats("cor", 1);
						flags[kFLAGS.YAMATA_MASOCHIST]++;
						break;
					case 1:
						outputText("\n\n“This is my realm... and in my realm... you get to feel good...” her strange words entice you as you widen your eyes, you try to hit her but you always seem to miss. A mischievous grin comes from her figure as you feel something rubbing your crotch, is one of her tails! Oh damn, it feels so good!  ");
						player.takeLustDamage(lustDmg);
						break;
					case 2:
						outputText("\n\nYamata turns around, brushing her tails to the side to expose her ample hindquarters, showing off her juicy-looking cheeks. Her display sends blood rushing to your groin, making you lick your lips eagerly.\n\n"
						+"Yamata pauses for a moment, placing a hand on her taut abs and sliding her fingers downward slowly, gazing deep into your eyes. Her tails fan out around her, curling around her limbs seductively, and she gives you a flirtatious leer as she watches your body tremble with desire.  ");
						player.takeLustDamage(lustDmg*2);
						break;
				}
			outputText("\n\nYamata takes a moment to stretch out her limber body, thrusting out her bound chest as she stretches her arms toward the sky. She twirls around, head slightly askew, and then bows forward to give you a good angle at her cleavage, packed tightly into her chest wrap, all the while with a sickly grin on her face.\n\n"
			+"“Why don't you just surrender already? We can have so much fun in my torture devices, it will feel so good! We might even have some fun on the side if you scream prettily enough, hehehe.” Yamata whispers sultrily, running a hand along her tails and making them fan out around her seductively.\n\n");
			if (flags[kFLAGS.YAMATA_MASOCHIST]>60) {
				outputText("You find yourself giving it a moments thought before pulling yourself beck to the present. What is she doing to you?!  ");
				lustDmg += 5;
			}
			if (flags[kFLAGS.YAMATA_MASOCHIST]>80) {
				outputText(" Though come to think of it, her proposition might not be so bad...  ");
				lustDmg += 3;
				flags[kFLAGS.YAMATA_MASOCHIST]++;
			}
			player.takeLustDamage(lustDmg, true);
		}

		private function yamataEntwine():void {
			outputText("Yamata’s hair whips toward you with a blinding speed, each of the snakes sinking its fangs into a different part of you and lifting you into the air. “You’re MINE!” she yells, bringing you in close as her hair begins to constrict around you. You can feel the bite wounds begin to tingle, and look in horror as you see that each of the snakes is injecting her corrupted purple flames directly into your body! If you can’t escape soon, you’ll be reduced to a gibbering masochistic heap in no time!\n\n"
			+"You are bound by Yamata’s snake-like hair. The only thing you can do is try to struggle free!\n\n"
			+"As the venomous flames course through your system, you start to become more and more turned on by the thought of being abused and degraded...  ");
			player.dynStats("cor", 2);
			player.addCombatBuff('str',-10);
			player.addCombatBuff('spe',-10);
			var damage:int = 40+25/(rand(3)+1);
			player.takeLustDamage(rand(6) + 10, true);
			player.takeDamage(damage, true);
			yamataSadomasochistApply(damage);
			player.createStatusEffect(StatusEffects.YamataEntwine, 0, 0, 0, 0);
		}

        override public function struggle():void {
			clearOutput();
			outputText("You struggle against Yamata’s grip with every ounce of strength you can muster, desperately trying to free yourself.\n\n");
			var brokeFree:Boolean;
			if ((rand(player.str) > (this.str / 4)*3) || rand(5)==0) {
				brokeFree = true;
			}

			if (brokeFree) {
				entwineEscape();
			} else {
				outputText("You thrash about fruitlessly, your struggles only getting you even more entangled in her serpentine hair. Yamata cackles evilly, reaching out to drag her nails across your chest, crooning about all the myriad torments she’ll subject you to when you’re her loyal slave. Still fighting against her");
				if (player.str < 90)
					outputText(" immense");
				else
					outputText(" impressive");
				outputText(" strength, in an attempt to free yourself from her corrupting embrace, without success.");
				var damage:int = 25 + rand(15);
				player.takeDamage(damage, true);
				yamataSadomasochistApply(damage);
				player.takeLustDamage(rand(6) + 10, true);
				player.dynStats("cor", 1);
			}
			tookAction = true;
		}

		private function entwineEscape():void {
			outputText("You lash out with reserves of strength you didn’t know you had, tearing yourself away from her with a few stray hairs clinging to your body still as you tumble away. As you move back into a defensive stance, Yamata looks incredulously at the frayed clump of hair where you broke free from her, then shouts, “You fucking did it now! I’m gonna carve you to ribbons!” In spite of her threats, her hair seems to repair itself, easily growing back into its monstrous snake form.\n\n");
			player.removeStatusEffect(StatusEffects.YamataEntwine);
			outputText("You feel relief as Yamata's serpents finally release their hold, though you can still feel their corruption pulsing in your veins.\n\n");
		}

        override public function react(context:int):Boolean {
            switch(context){
                case CON_PLAYERWAITED:
                    if (player.hasStatusEffect(StatusEffects.YamataEntwine)){
                        entwineWait();
                        return false;
                    }
            }
            return true;
        }

		public function entwineWait():void {
			clearOutput();
			outputText("You don't see the point of struggling against such a powerful foe, letting Yamata have her fun. The snakes entangling you continue to pump their foul fires into you and it is turning you on just watching them do so! The pain becomes more pleasurable the longer you are subjected to it!");
			player.dynStats("cor", 1);
			flags[kFLAGS.YAMATA_MASOCHIST] += 2;
		}

		private function foxfireCannon1():void {
			outputText("Yamata’s hair snakes begin to fan themselves out, curling toward you with their jaws unhinged and open wide. They seem to be drawing in energy as bright balls of purple flame begin to build up in each of their mouths. It looks like Yamata is charging up for something big!");
			this.createStatusEffect(StatusEffects.YamataCannon, 0, 0, 0, 0);
		}

		private function foxfireCannon2():void {
			var totaldmg:int = 0;
			if (flags[kFLAGS.IN_COMBAT_USE_PLAYER_WAITED_FLAG] == 1) {
				outputText("The air is suddenly filled with missiles of corrupted flame as each of the eight snake heads launches its own projectile at you! Thankfully you were prepared for it, and easily dip, duck, and dive through all of the flaming missiles, emerging unscathed.");
			} else {
				var hits:int = rand(9);
				outputText("The air is suddenly filled with missiles of corrupted flame as each of the eight snake heads launches its own projectile at you! You do your best to block or dodge them all, but your previous actions this round have put you at a slight disadvantage.\n\n");
				if(hits == 0) {
					outputText("You somehow manage to emerge unscathed, but the effort of avoiding or deflecting them all has put a strain on your muscles!");
					player.changeFatigue(10);
				} else {
					outputText(hits + (hits>1?" fireballs rocket":" fireball rockets")+" into you with deadly force! As the corrupted flames wash over you, you start to enjoy the pain, gripping yourself in masochistic pleasure!  ");
					for(var i:int = 0; i < hits; i++) {
						var x:int = rand(10)+5;
						player.dynStats("cor", 1);
						game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
						player.takeDamage(x*2, true);
						player.takeLustDamage(x/2, true);
						totaldmg += x*2;
					}
				}
			}
			if (totaldmg > 0) yamataSadomasochistApply(totaldmg);
			this.removeStatusEffect(StatusEffects.YamataCannon);
		}

		private function yamataMiss():void {
			outputText("You neatly dodge Yamata’s wild attack, backing up and holding up your [weapon] defensively. “Haha! I love it when my prey has some fight in them!”");
		}

		private function yamataSadomasochistApply(dmg:int):void {
			outputText("\n\nYamata delights in the pain being caused...  ");
			this.takeLustDamage(int(dmg/2), true);
			this.dynStats("str", dmg/25, "spe", -dmg/30);
		}

		//<Masochism Aura> Passive ability
		//Due to her heavily-corrupted state, Yamata emits an aura that subtly influences anyone who fights against her to become a masochist, causing their lust to rise every time they are hurt. This effect is compounded even more if the PC is already a masochist.

		//<Frenzy> Passive ability
		//Yamata’s Lust has a direct effect on her combat effectiveness. As her Lust rises, she receives a %increase to her Strength while incurring a %penalty to her Speed, representing an increase in her recklessness and lack of self-control.

		override protected function handleFear():Boolean {
			removeStatusEffect(StatusEffects.Fear);
			outputText("Yamata shudders in delight for a moment, then looks your way with a clear head.  \"I love that! You should do it more often!\"\n");
			return true;
		}

		override protected function handleBlind():Boolean {
			outputText("“Your fancy tricks wont work on me Champion, I see right through them.” Your blinding attack simply fades away before her magic.")
			return true;
		}

		override protected function performCombatAction():void {
			//basic attack has 2x chance unless arcane archer active
            var actionChoices:MonsterAI = new MonsterAI()
                    .add(eAttack, 1,true,0,FATIGUE_NONE,FATIGUE_PHYSICAL);
            actionChoices.add(yamataBasic,2,true,0,FATIGUE_NONE,RANGE_MELEE);
            actionChoices.add(yamataDarkFoxfire,1,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(yamataNightmare,1,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(yamataIllusionLust,1,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(yamataLustAttack,1,true,0,FATIGUE_NONE,RANGE_TEASE);
            actionChoices.add(kitsuneSealAttack,1,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(foxfireCannon2,100,hasStatusEffect(StatusEffects.YamataCannon),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(foxfireCannon1,0.25,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(yamataEntwine,0.3,!hasStatusEffect(StatusEffects.YamataEntwine),0,FATIGUE_NONE,RANGE_RANGED);
            actionChoices.add(yamataMiss,1,combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).success,0,FATIGUE_NONE,RANGE_OMNI);
            actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void {
			game.forest.aikoScene.yamataLoses();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void {
			game.forest.aikoScene.yamataWins();
		}
	}
}


code:
/* Created by Kitteh6660. Glacial Rift is a new endgame area with level 18-22 encounters, guaranteed to help you grind to level 33
 * Currently a Work in Progress
 * Please see this project. (This is not mine) http://forum.fenoxo.com/thread-10719.html */
/* TODO */
package classes.Scenes.Areas {
	import classes.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.Scenes.API.Encounter;
	import classes.Scenes.API.Encounters;
 	import classes.Scenes.API.IExplorable;
	import classes.Scenes.Areas.GlacialRift.*;
	import classes.Scenes.NPCs.GooArmor;
	import classes.display.SpriteDb;
	import classes.internals.*;

	use namespace kGAMECLASS;

 	public class GlacialRift extends BaseContent implements IExplorable {
		public var valkyrieScene:ValkyrieScene = new ValkyrieScene();
		public var yetiScene:YetiScene = new YetiScene();
		public var giantScene:FrostGiantScene = new FrostGiantScene();
		public var amarokScene:AmarokScene = new AmarokScene();
		public var riftCabinScene:RiftCabinScene = new RiftCabinScene();

		public function GlacialRift() {}

		public function isDiscovered():Boolean { return flags[kFLAGS.DISCOVERED_GLACIAL_RIFT] > 0; }
		public function discover():void {
			flags[kFLAGS.DISCOVERED_GLACIAL_RIFT] = 1;
			outputText(images.showImage("area-glacialrift"));
			outputText("You walk for some time, roaming the hard-packed and pink-tinged earth of the demon-realm of Mareth. As you progress, a cool breeze suddenly brushes your cheek, steadily increasing in intensity and power until your clothes are whipping around your body in a frenzy. Every gust of wind seems to steal away part of your strength, the cool breeze having transformed into a veritable arctic gale. You wrap your arms around yourself tightly, shivering fiercely despite yourself as the hard pink dirt slowly turns to white; soon you’re crunching through actual snow, thick enough to make you stumble with every other step. You come to a stop suddenly as the ground before you gives way to a grand ocean, many parts of it frozen in great crystal islands larger than any city.\n\n");
			outputText("You've discovered the Glacial Rift!");
			doNext(camp.returnToCampUseTwoHours);
		}

	private var _explorationEncounter:Encounter = null;
	public function get explorationEncounter():Encounter {
		return _explorationEncounter ||= Encounters.group(game.commonEncounters, {
			name: "aprilfools",
			when: function ():Boolean {
				return isAprilFools() && flags[kFLAGS.DLC_APRIL_FOOLS] == 0;
			},
			chance: Encounters.ALWAYS,
			call: riftAprilFools
		}, {
			name: "valkyrie",
			chance: 1,
			call: valkyrieEncounter
		}, {
			name: "yeti",
			chance: 1,
			call: yetiEncounter
		}, {
			name: "amarok",
			chance: 1,
			call: amarokEncounter
		}, {
			name: "frostgiant",
			chance: 1,
			call: frostGiantEncounter
		}, {
			name: "valeria",
			when: function ():Boolean {
				return flags[kFLAGS.VALARIA_AT_CAMP] == 0
					&& player.armor != armors.GOOARMR
					&& (flags[kFLAGS.HARPY_QUEEN_EXECUTED] != 0
					|| flags[kFLAGS.HEL_REDUCED_ENCOUNTER_RATE] > 0)
			},
			call: valeriaAtRift
		}, {
			chance: 0.3,
			call: Encounters.group("loot", {
				call: lootIcicle
			}, {
				call: lootGodmead
			})
		}, {
			chance: 0.1,
			name: "ornatechest",
			when: function ():Boolean {
				return !player.hasKeyItem("Camp - Ornate Chest");
			},
			call: findChest
		}, {
			name: "anzu",
			when: function ():Boolean {
				return flags[kFLAGS.ANZU_PALACE_UNLOCKED] < 1;
			},
			call: game.dungeons.palace.anzuScene.initialPalaceEncounter
		}, {
			name: "riftcabin",
			call: riftCabinScene
		}, {
			name: "walk",
			call: walk
		});
	}
 		public function explore():void {
			clearOutput();
			player.location = "glacialrift";
			flags[kFLAGS.DISCOVERED_GLACIAL_RIFT]++;
			doNext(playerMenu);
			explorationEncounter.execEncounter();
		}

		private function walk():void {
			clearOutput();
			outputText(images.showImage("area-glacialrift"));
			outputText("You spend an hour trudging through the bleak and bitingly cold glaciers but you don’t find anything interesting.");
			dynStats("tou", -.5, "lus", -.5);
			doNext(camp.returnToCampUseOneHour);
		}

		public function findChest():void {
			outputText(images.showImage("item-chest"));
			var gemsFound:int = 400 + rand(400);
            outputText("While trudging forth through the seemingly infinite-stretching white, you notice something of interest after a gust of wind kicks up a now noticeable bump of snow." +
					"\n\nAs you get closer to the object, you make it out to be a ornately decorated chest halfway buried in the snow and underlying layer. After hacking away at the permanently" +
					" frozen soil, you free the chest and shatter the ice on the hinges to open it. Inside of it you find several pouches filled with gems, a nice "+ String(gemsFound) +" in total.");
            outputText("\n\nDeciding that besides the gems, the chest can also be of use, ");
			if(player.str < 50){
                outputText("you begin dragging the chest through the tiring snow—with more effort than your pride would admit—back to your camp.");
				player.changeFatigue(80);
				doNext(camp.returnToCampUseEightHours);
			} else if(player.str > 50 && player.str < 80){
				outputText("you begin the trek home with some effort and the chest in tow.");
                player.changeFatigue(40);
                doNext(camp.returnToCampUseFourHours);
			}else{
				outputText("you begin to haul the chest home with little effort.");
                player.changeFatigue(20);
                doNext(camp.returnToCampUseTwoHours);
			}
			player.createKeyItem("Camp - Ornate Chest", 0, 0, 0, 0);
			player.gems += gemsFound;
			statScreenRefresh();
			outputText("\n\nYou now have " + num2Text(inventory.itemStorageDirectGet().length) + " storage item slots at camp.");
		}

		private function lootGodmead():void {
			clearOutput();
			outputText(images.showImage("item-gMead"));
			outputText("As you make your way across the icy wastes, you notice a small corked ivory horn half-buried under the snow, filled with a thick sweet-looking liquor. You stop and dig it up, sniffing curiously at the liquid. The scent reminds you of the honey secreted by the bee-girls of Mareth, though with hints of alcohol and... something else. You place the horn of mead in your bag and continue on your way. ");
			inventory.takeItem(consumables.GODMEAD, camp.returnToCampUseOneHour);
		}
		private function lootIcicle():void {
			clearOutput();
			outputText(images.showImage("item-icicle"));
			outputText("As you cross one of the floating ice sheets that make up the bulk of the rift, your eyes are drawn to a bright glint amidst the white backdrop.  As you eagerly approach the gleam, you discover a single tiny spire of ice jutting from the surrounding snow.  You pluck it gently from the ground, give it a quick glance over and, satisfied that it won’t try and kill you, drop it in your bag. ");
			inventory.takeItem(consumables.ICICLE_, camp.returnToCampUseOneHour);
		}
		//Find Valeria! She can be found there if you rejected her offer initially at Tower of the Phoenix or didn't find her. She can never be Lost Forever
		private function valeriaAtRift():void {
			clearOutput();
			spriteSelect(SpriteDb.s_valeria);
			flags[kFLAGS.VALERIA_FOUND_IN_GLACIAL_RIFT] = 1;
			outputText(images.showImage("monster-gooarmor"));
			outputText("As you make your way across the Rift's icy extremities, you hear a metallic CLANK CLANK approaching through the snow flurries. You turn in time to see a suit of plated mail charging toward you, its helm and limbs filled with bright blue goo. It skids to a stop a few yards away, a greatsword forming from the goo of its hand. A beautiful, feminine face appears beneath the armor’s visor grinning at you. You suddenly recognize her face!\n\n");
			outputText("\"This is my territory!\" she shouts, bringing her two-handed sword to bare. \"You’ll give me your fluids, or I’ll take them.\"");
			addButton(0, "Fight", fightValeria);
			addButton(1, "Submit", game.valeria.pcWinsValeriaSparDefeat, true);
		}

		private function frostGiantEncounter():void {
			clearOutput();
			outputText(images.showImage("area-glacialrift"));
			outputText("You wander the frozen landscape of the Rift, frozen rocks, frosted hills and forested mountains your only landmarks. As you cross the peak of a rather large, lightly forested hill, you come face to gigantic face with a Frost Giant! He belches fiercely at you and you tumble back down the hill. He mostly steps over it as you come to your senses. You quickly draw your " + player.weaponName + " and withdraw from the hill to prepare for battle.\n\n");
			startCombat(new FrostGiant());
		}
		private function yetiEncounter():void {
			clearOutput();
			outputText(images.showImage("encounter-yeti"));
			outputText("You grow tired trudging through the hard-packed snow under you, shielding your face with an arm as the wind lashes against you, slowing your progress. The whistle of the wind rings in your ears, only broken with the dull crunch of snow compacting underfoot. You can’t help but regret wandering into this storm and wish for shelter and warmth. Your body freezes at the sound of a loud crack, and turning your head to see the source of the noise, you notice too late that your lower body is sinking in the snow floor. You flail your limbs as your body is swept under by the moving snow, and you feel yourself sliding down some sort of shaft: it’s too dark to see where you are going. With a thump, you come to a stop.\n\n");
			if (flags[kFLAGS.MET_YETI_FIRST_TIME] <= 0) {
				outputText("Quickly wiping the snow off your body, you take in your surroundings. There are torches overhead that provide light and a small amount of warmth, making the ice cavern almost beautiful to be in, the light reflecting and shimmering off the polished ice walls, ceiling, and large icicles. There are a number of holes like the one you must have came out of, like a network of chutes that all lead to your location. You are surprised to find something under you, a large pile of white furs broke your fall. Though you are unnerved to find a large collection of bones lining the sides of the ice cavern, all white like snow, cleaned to a shine. Taking all this in, it’s obvious you are in someone’s or something’s residence. ");
				if (silly()) outputText("You notice the bodies of a number of strange, bipedal horse-like creatures, all covered in thick white fur hanging from the nearby wall; laying beneath one is a strange metallic cylinder, not unlike a sword hilt, that gives off a strange, soft heat. ");
				outputText("You brush off the snow and get to your feet, turning your head as you notice a passageway.\n\n");
				flags[kFLAGS.MET_YETI_FIRST_TIME] = 1
			}
			else outputText("Taking in the familiar surroundings, you realize you must have fallen through one of those chutes again. You begin to wonder if they are for the Yeti’s use, or if they are meant to bring in unsuspecting travelers. A meal delivery service set up with their limited ice magic? You shake off the snow on you and get to your feet. Looking to the passage, sure enough shadows dance along the walls as the thumps reach your ears.\n\n");
			outputText("Hearing a thunderous roar, you ready yourself for a fight");
			if (player.weaponName != "fists") outputText(", holding your " + player.weaponName + " at the ready");
			outputText(". A massive hulking creature barrels around the corner and sets its gaze on you, its clawed hands and feet launching its body over the iced caverns with ease as you stare the beast down. The white blur of an ice yeti attacks you!");
			startCombat(new Yeti());
		}
		private function valkyrieEncounter():void {
			clearOutput();
			outputText(images.showImage("encounter-valkyrie"));
			outputText("Making your way across the hard-packed ice of the Rift, you’re surprised to see the thick gray clouds part overhead.  You see a beautiful woman descend from on high, her snow-white wings flapping powerfully behind her back.  Armed with a long spear and shield, and clad in a bronze cuirass and a winged helm, she looks every bit the part of a mighty warrior.\n\n");
			outputText("She touches down gently a few feet before you, her shield and spear raised.  \"You seem a worthy sort to test my skills against, wanderer.  Prepare yourself!\" she shouts, bearing down on you.  She doesn’t look like she’s going to back down -- you ready your " + player.weaponName + " for a fight!");
			startCombat(new Valkyrie());
		}
		private function amarokEncounter():void {
			spriteSelect(SpriteDb.s_amarok);
			clearOutput();
			outputText(images.showImage("encounter-amarok"));
			outputText("As your feet carry you through the barren tundra, you can't shake the feeling of being watched. Your paranoia gets the better of you, and you come to a stop to listen for anything nearby. You hear nothing. You turn around just to be sure, and see nothing. You laugh at your silliness and continue walking, now with a hand on your " + player.weaponName + ". As though on cue, you hear a snarl from behind you. You whip around and strike with your " + player.weaponName + ", barely keeping an enormous wolf from tackling you. Between its black fur and golden eyes, you aren't quite sure how you managed to miss it. It hardly matters, though-- the wolf, most definitely an Amarok, has already recovered and is preparing another attack. It's time for a fight!");
			startCombat(new Amarok());
		}

		private function riftAprilFools():void {
			outputText(images.showImage("event-dlc"));
			game.aprilFools.DLCPrompt("Extreme Zones DLC", "Get the Extreme Zones DLC to be able to visit Glacial Rift and Volcanic Crag and discover the realms within!", "$4.99");
		}

		private function fightValeria():void {
			clearOutput();
			outputText("You ready your " + player.weaponName + " for a fight!");
			startCombat(new GooArmor());
		}
	}
}


code:
// By Foxwells
// Amarok, a big ass wolf from Inuit mythology. Idek. Glacial Rift is depressingly empty
// Since it's a big ass god wolf, it's pretty hard to beat
// Herm, since there's no set gender for it in its mythology
// Comes with a unique bad end if you lose to it too many times, kinda like the Phoenix

package classes.Scenes.Areas.GlacialRift
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.BodyParts.Hips;
	import classes.lists.Age;
	import classes.internals.*;

	public class Amarok extends Monster
	{

		protected function amarokClaw():void {
			//Blind
			if(hasStatusEffect(StatusEffects.Blind)) {
				outputText("The Amarok lunges for you, attempting to slash you with one of its paws, but misses completely due to its blindness.");
				return;
			}
			//Dodge that shit yo
			if (!combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed) {
				outputText("The Amarok throws itself at you, attempting to slash you with its claws. Luckily, you manage to move out of the way.");
				return;
			}
			else {
				//Damage roll
				outputText("The Amarok throws itself at you and rakes one of its hefty paws across you. Its claws slice you open and draw blood.");
				var damage:int = ((str + 50) + rand(100));
				damage = player.reduceDamage(damage,this);
				player.takeDamage(damage, true);
			}
		}
		protected function amarokTail():void {
			//AMAROK used TAIL SLAP!
			outputText("The Amarok rushes up to you and immediately turns heel, attempting to crash its tail into you. ");
			//Evasioning
			if (!combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed) {
				outputText("You move out of the way before it can hit.");
			}
			else {
				//Damageeee + stun! Reference to the legend of it slapping a kid with its tail, except minus the bone breaking.
				outputText("The hit sends you stumbling back");
				if (player.stun(0,33))
				{
					outputText(", stunning you");
				}
				outputText(".");
				var damage:int = ((str + 100) + rand(75));
				damage = player.reduceDamage(damage,this);
				player.takeDamage(damage, true);
			}
		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI()
				.add(eAttack,1,true,0,FATIGUE_NONE,RANGE_MELEE);
			actionChoices.add(amarokClaw, 6,true,0,FATIGUE_NONE,RANGE_MELEE);
			actionChoices.add(amarokTail, 4, true, 15,FATIGUE_PHYSICAL,RANGE_MELEE);
			actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.glacialRift.amarokScene.winAgainstAmarok();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if(pcCameWorms){
				outputText("\n\nThe Amarok looks down at the worms you came, sniffs them, then snarls and walks away. It must consider you to be tainted meat.");
				doNext(game.combat.endLustLoss);
			} else {
				if (lust >= 33){
					if (player.age == Age.AGE_CHILD){
						if (player.gender == 1 || player.gender == 3) game.glacialRift.amarokScene.amarokLustDefeatMaleHermChild();
						if (player.gender == 2) game.glacialRift.amarokScene.amarokLustDefeatFemaleChild();
						if (player.gender == 0) game.glacialRift.amarokScene.amarokChowTime();
					}else{
						if (player.gender == 1 || player.gender == 3) game.glacialRift.amarokScene.amarokLustDefeatMaleAdult();
						else if (player.gender == 2) game.glacialRift.amarokScene.amarokLustDefeatFemaleAdult();
						else game.glacialRift.amarokScene.amarokChowTime();
					}
				}else game.glacialRift.amarokScene.amarokChowTime();

			}
		}

		public function Amarok()
		{
			this.a = "the ";
			this.short = "Amarok";
			this.imageName = "amarok";
			this.long = "You are fighting an Amarok, a massive wolf that seems set on hunting you. The buffeting snow does nothing to hide its thick, black fur, and hardly manages to even ruffle it. It has golden, hungry eyes that watch your every move and sharp teeth capable of crushing bones. It looms over you in both height and width, with well-defined muscles, long legs, and bulky paws with deadly claws only adding to its intimidating stature. Even its tail looks capable of knocking you down. It's the most normal animal-like creature you've seen here yet, a normal wolf despite its size, but is no less terrifying. You get the feeling this won't be an easy fight, especially considering it's not about to let you run away.";
			this.plural = false;
			this.createCock(8, 1.5, CockTypesEnum.WOLF);
			this.balls = 2;
			this.ballSize = 2;
			this.pronoun1 = "it";
			this.pronoun2 = "it";
			this.pronoun3 = "its";
			createBreastRow(2,1);
			createBreastRow(2,1);
			createBreastRow(2,1);
			createBreastRow(2,1);
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.tallness = 8*12;
			this.hips.rating = Hips.RATING_AVERAGE;
			this.butt.rating = Butt.RATING_AVERAGE;
			this.lowerBody.type= LowerBody.WOLF;
			this.arms.type = Arms.WOLF;
			this.skin.tone = "black";
			this.skin.setType(Skin.FUR);
			this.hair.color = "black";
			this.hair.length = 3;
			this.face.type = Face.WOLF;
			this.ears.type = Ears.WOLF;
			this.eyes.type = Eyes.WOLF;
			initStrTouSpeInte(90,110,75,85);
			initLibSensCor(0,10,10);
			this.weaponName = "teeth";
			this.weaponVerb = "bite";
			this.weaponAttack = 20;
			this.armorName = "thick fur";
			this.armorDef = 15;
			this.bonusHP = 400;
			this.lust = 5 + rand(33);
			this.lustVuln = 0.4;
			this.temperment = TEMPERMENT_AVOID_GRAPPLES;
			this.level = 22;
			this.gems = 40 + rand(25);
			this.drop = new WeightedDrop(consumables.WOLF_PP, 1);
			/*this.special1 = amarokClaw;
			this.special2 = amarokTail;*/
			this.tail.type = Tail.WOLF;
			if (!player.canFly()) {
				this.createStatusEffect(StatusEffects.GenericRunDisabled, 0, 0, 0, 0);
				//"Watching your movements" alluded to this. Its lore is stalking and hunting people, so I imagine you can't get away.
				//Otherwise I'd suggest doing a hellhound knock-off of the scent tracking, which makes it harder to run.
			}
			checkMonster();
		}

	}

}