code:
package classes.Scenes.Areas.Desert
{
	import classes.*;
	import classes.BodyParts.Butt;
	import classes.BodyParts.Hips;
	import classes.internals.*;
	import classes.GlobalFlags.*;

	public class SandWitch extends Monster
	{

		override public function defeated(hpVictory:Boolean):void
		{
			if (player.hasStatusEffect(StatusEffects.StoneLust))
			{
				player.removeStatusEffect(StatusEffects.StoneLust);
			}

			if (flags[kFLAGS.SFW_MODE] <= 0){
				game.desert.sandWitchScene.beatSandwitch();
			} else {
				game.combat.finishCombat();
			}
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (pcCameWorms){
				outputText("\n\nThe witch blanches and backs away, leaving you to your fate.");
				game.combat.cleanupAfterCombat();
			} else {
				game.desert.sandWitchScene.sandwitchRape();
			}
		}

		private function lustMagicAttack():void {
			var lustDmg:int = 0;
			outputText("The sand witch points at you, drawing a circle in the air and mouthing strange words.\n\n");
			if (player.hasStatusEffect(StatusEffects.StoneLust)) {
				outputText("The orb inside you grows warm, almost hot, suffusing your body with heat and arousal.  ");
				lustDmg = 8 + int(player.sens) / 10;
			}
			else {
				outputText("You feel the sands shift by your " + player.feet() + ", and look down to see something slip out of the sands and into your clothes!  It feels incredibly smooth and circular as it glides upward along your " + player.leg() + ", its progress unaffected by your frantic effort to dislodge it.  ");
				if (player.vaginas.length > 0) outputText("It glides up your thighs to the entrance of your sex, and its intentions dawn on you!\n\nToo late! You reach to stop it, but it pushes against your lips and slips inside your " + player.vaginaDescript(0) + " in an instant.  You groan in frustration as it begins pulsing and vibrating, sometimes even seeming to change size.");
				else outputText("It glides up your thighs, curving around your buttocks, and its intentions dawn on you.\n\nYou desperately grab for it, but are too late!  It pushes firmly against your rectum and slips inside instantaneously.  You groan in frustration as it begins pulsing and vibrating, sometimes even seeming to change size.");
				player.createStatusEffect(StatusEffects.StoneLust, 0, 0, 0, 0);
				lustDmg = 4 + int(player.sens) / 10;
			}
			player.takeLustDamage(lustDmg, true);
			doNext(game.playerMenu);
		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI()
				.add(eAttack);
			actionChoices.add(lustMagicAttack,1,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
			actionChoices.exec();
		}

		public function SandWitch()
		{
			//trace("SandWitch Constructor!");
			this.a = "the ";
			if (game.silly()){
				this.short = "sand witch";
				this.imageName = "sandwidch";
			} else {
				this.short = "sand witch";
				this.imageName = "sandwitch";
			}
			this.long = "A sand witch appears to be totally human, an oddity in this strange land.  She has dirty blonde hair and a very tanned complexion, choosing to cover most of her body with robes of the same color as the desert sands, making her impossible to spot from afar.";
			this.race = "Human?";
			this.createVagina(false, Vagina.WETNESS_WET, Vagina.LOOSENESS_LOOSE);
			this.createBreastRow(Appearance.breastCupInverse("DD"));
			this.createBreastRow(Appearance.breastCupInverse("DD"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_NORMAL;
			this.tallness = rand(12) + 55;
			this.hips.rating = Hips.RATING_CURVY;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "bronzed";
			this.hair.color = "sandy-blonde";
			this.hair.length = 15;
			initStrTouSpeInte(25, 25, 35, 45);
			initLibSensCor(55, 40, 30);
			this.weaponName = "kick";
			this.weaponVerb="kick";
			this.armorName = "robes";
			this.bonusHP = 20;
			this.lust = 30;
			this.temperment = TEMPERMENT_LUSTY_GRAPPLES;
			this.level = 3;
			this.gems = rand(15) + 5;
			this.drop = new WeightedDrop().addMany(1,
					consumables.TSCROLL,
					consumables.OVIELIX,
					consumables.LACTAID,
					consumables.LABOVA_,
					consumables.W__BOOK,
					consumables.B__BOOK,
					null);
			/*this.special1 = lustMagicAttack;
			this.special2 = special2;
			this.special3 = special3;*/
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Areas.Desert {
	import classes.*;
	import classes.display.SpriteDb;
	import classes.internals.*;

	public class Wanderer extends BaseContent{

		public function Wanderer()
		{
		}

		public function wandererRouter():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	//First meeting...
	if (!player.hasStatusEffect(StatusEffects.MeetWanderer)) {
		wandererFirstMeeting();
		player.createStatusEffect(StatusEffects.MeetWanderer,0,0,0,0);
	}
	//Repeat offense!
	else {
		//Chosen demon ending
		if (player.hasStatusEffect(StatusEffects.WandererDemon)) {
			wandererDemonEpilogue();
			return;
		}
		//Chosen human ending
		if (player.hasStatusEffect(StatusEffects.WandererHuman)) {
			wandererEpilogueHuman();
			return;
		}
		//No choose made repeat meeting
		wandererRepeatMeeting();
	}
}

//Encounter the wanderer for the first time
private function wandererFirstMeeting():void {
	//Each outputtext is a paragraph
	clearOutput();
	outputText("A small plume of dust rises in the distance, betraying the position of something else moving amongst the sandy dunes.   It grows larger as it approaches your position, revealing a bulky distorted shape lurking inside the cloud.  You cautiously approach, preparing to face some new demonic monstrosity.   As the sandy cloud parts, the blurred figure resolves itself into two distinct outlines.\n\n");
	outputText("On the left is a man carrying a heavily loaded wheelbarrow and struggling not to stumble in the sandy desert soil.  Slightly behind and to the right of the man is a shapely woman, her demonic origins plain to anyone who notices the spikes on her head.  As they near the man notices your presence and calls out, \"Ho, traveler!  Fine day isn't it?\"\n\n");
	outputText("The strange pair close the intervening distance, allowing you to make out more of their forms.  As expected, the succubus is quite a beauty, with curvy flesh in all the right places.  The man introduces himself as he struggles with his heavy load.  \"I am Marcus,  former traveler of extraordinary places and seeker of forbidden knowledge!  Though all that was a long time ago; I'm retired, you see.  I've settled down with my new partner, Lucia.\"  Marcus gestures, indicating the bored-looking succubus accompanying him.\n\n");
	outputText("You start to greet them, but nearly faint in shock – Marcus' wheelbarrow isn't full of cargo.  It's the only thing keeping his oversized balls from dragging in the sand!  He smiles at your reaction and winks lewdly, \"Why do you think I have to keep a succubus around?  If I don't empty these puppies every hour or two I damn near explode!\"  Looking thoughtful for a moment, Marcus nods to himself and asks, \"I don't suppose you have a moment to help me with a quandary I've been having?\"");
	menu();
	addButton(0, "Help Him", wandererHelpHim);
	addButton(14, "Leave", wandererLeave);
}
//Leave
private function wandererLeave():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	clearOutput();
	outputText("Marcus looks disappointed and sighs, hefting his wheelbarrow and waddling away.  Lucia bounces after him, looking like the cat that got the cream.  You wonder what all that was about.   What a strange land.");
	doNext(camp.returnToCampUseOneHour);
}
//Repeated encounter if he left
private function wandererRepeatMeeting():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	clearOutput();
	outputText("Marcus waves to you as he crests a nearby dune, yelling a greeting.  \"Hey traveler!  Do you have a moment to help a man with a question of theological and moral imperatives?\"\n\nHis succubus accomplice, Lucia, snorts in disdain.");
	menu();
	addButton(0, "Yes", wandererHelpHim);
	addButton(14, "Leave", wandererLeave);
}
//Volunteer to help
private function wandererHelpHim():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	clearOutput();
	outputText("\"Oh good!\" he exclaims as he begins elaborating.  \"My dear succubus here is growing tired of our arrangement, and she wants me to give up the last of my humanity and become a demon like her.  I'm not really sure I want to lose my soul, but at the same time, I know enough about their kind to know I'd REALLY enjoy being an incubus, if you know what I mean.  Before I make the plunge, I'd like a second opinion – what do you think?\"\n\nHe glances over his shoulder with almost a small measure of fear.");
	menu();
	addButton(0, "Go Demon", wandererGoDemon);
	addButton(1, "Stay Human", wandererStayHuman);
}
//Ask marcus to stay human
private function wandererStayHuman():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	clearOutput();
	outputText("\"You little mortal fuckwit!\" screams Lucia before turning to her human lover, \"Don't listen to the foolish mortal, love; think of the fun we could have together!\"\n\n");
	outputText("Marcus shakes his head sadly, \"" + player.mf("He", "She") + " is right, my soul is immortal and not to be sacrificed so lightly.  Why don't we stick to our original agreement another decade and mull it over then?\"\n\n");
	outputText("Lucia pouts, nearly on the verge of tears, \"Fine!  But don't expect me to be happy about it.\"  She pats his swollen balls roughly, smirking down at him, \"and I'm going to let these swell up nice and tight before I take my next meal!\"  ");
	outputText("Marcus sighs, though you think you spy the hint of a smile on his lips, \"As you wish... thanks for your guidance traveler, and may you find what you seek in this strange land.\"\n\nAs they turn to leave, Lucia scowls at you over her shoulder...");
	dynStats("lib", -1, "lus", 1, "cor", -5);
	player.createStatusEffect(StatusEffects.WandererHuman,0,0,0,0);
	doNext(camp.returnToCampUseOneHour);
}
//Ask marcus to go demon
private function wandererGoDemon():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	clearOutput();
	outputText("Lucia breaks into a mischievous smile as you suggest taking her up on her offer.  She sashays over to you, flesh jiggling enticingly the whole way.  She leans close, sliding a slender finger down the center of your chest.  \"Thank you for this.  Should we meet again, I promise rewards fit to make a whore faint.\"\n\n");
	outputText("Marcus raises an eyebrow at the exchange, but smiles as his demonic lover returns to his side.  Lucia winks again, and huge wings explode from her back.  She grabs Marcus, who bleats in surprise, and lifts off, flying away with her prize to her lair.");
	dynStats("lus", 5, "cor", 1);
	player.createStatusEffect(StatusEffects.WandererDemon,0,0,0,0);
	doNext(camp.returnToCampUseOneHour);
}

//Demonic epilogue v1
private function wandererDemonEpilogue():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	if (player.hasStatusEffect(StatusEffects.WandererDemon)) {
		//First time...
		if (player.statusEffectv1(StatusEffects.WandererDemon) == 0) {
			clearOutput();
			outputText("A winged shadow flashes by.  You look up, but can't find its source in the searing desert sun.   A tap on your shoulder is all the warning you get before a curvy body is pressed against you, stroking and touching you in all the right ways.\n\n");
			outputText("\"I stopped by and I wanted to thank you for this,\" Lucia purrs, balancing a purple crystal along her knuckles.  It sparkles and glitters with a light in the sunlight as she speaks, \"You see, when a human or other mortal creature finally begins to desire corruption and pleasure more than everything else, they can become a demon.  The process leaves behind a single crystal of lethicite – this crystal.  It's a power source beyond anything you can comprehend, and I have you to thank for giving it to me.\"\n\n");
			outputText("Lucia places a small bottle in your hand.  \"So thank you, and have this present.  Perhaps you can create some lethicite for us later... oh, and before I forget, Marcus is loving his new existence.\"\n\n");
			outputText("She steps away and blows a kiss as her wings unfurl.  With a powerful downstroke she scatters sand everywhere, forcing you to throw an arm in front of your eyes.  When the debris settles, she's gone.\n\n");
			dynStats("lus", 5);
			inventory.takeItem(consumables.SDELITE, camp.returnToCampUseOneHour);
			player.statusEffectByType(StatusEffects.WandererDemon).value1 = 1;
		}
		//Second Encounter
		else if (player.statusEffectv1(StatusEffects.WandererDemon) == 1) {
			clearOutput();
			outputText("Lucia zips by overhead, spreading her legs and openly frigging her moist hairless slit and moaning lustily.  After a few moments she creams herself, dripping her juices over the dunes.  She licks her fingers and waves, unclipping an item from her belt and dropping it down towards you.\n\n");
			//Catch it
			if (50 < (player.spe + rand(60))) {
				outputText("You handily catch a small potion vial.  When you look up, she's gone.\n\n");
				inventory.takeItem(consumables.SDELITE, camp.returnToCampUseOneHour);
			}
			//Drop it
			else {
				outputText("You dive for the falling bottle, but miss, and it shatters into the sands, the fluids wicking away nearly instantaneously.");
				doNext(camp.returnToCampUseOneHour);
			}
		}
	}
}
//Human Epilogue 1
private function wandererEpilogueHuman():void {
	spriteSelect(SpriteDb.s_markus_and_lucia);
	if (player.hasStatusEffect(StatusEffects.WandererHuman)) {
		//Human Epilogue 1
		if (player.statusEffectv1(StatusEffects.WandererHuman) == 0) {
			clearOutput();
			outputText("As you journey the desert, you see the twin figures of Marcus and his demonic companion, Lucia, in the distance.   Judging by the frantic bobbing of Lucia's head in Marcus's lap, she's just getting ready for a meal.  Closing the distance, you watch curiously as her throat bulges obscenely to keep up with the huge cum-load.  In time she flops back, a few huge globules of cum exploding onto her form like bursting water-balloons as Marcus' orgasm finishes, leaving her a cum-stained wreck.\n\n");
			if (player.cor < 33) outputText("You duck back behind a dune, blushing furiously.");
			else if (player.cor < 66) outputText("You blush crimson as you swear you see Lucia look right at you and wink.");
			else outputText("You openly leer at the crude display, whistling lewdly at the blissful couple.  Marcus looks up and gives a cocky smile, while Lucia licks her lips and gives you a predatory grin.");
			dynStats("lus", 10);
			//Value 1 is used to track the status of the end state.
			player.statusEffectByType(StatusEffects.WandererHuman).value1 = 1;
			doNext(camp.returnToCampUseOneHour);
		}
		//Human Epilogue 2
		else if (player.statusEffectv1(StatusEffects.WandererHuman) == 1) {
			clearOutput();
			outputText("While exploring the desert, you find a strange bottle half-buried in the sand.  A small note is tied to it:\n\n\"I just knew you'd find this.  Try this a few times and I think you might change your mind about Marcus' situation.\n  -Lovely Lucia\"\n\n");
			inventory.takeItem(consumables.SDELITE, camp.returnToCampUseOneHour);
		}
	}
}
}
}

license: unknown


code:
/* Created by aimozg on 06.01.14 */
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.FnHelpers;
	import classes.Scenes.API.IExplorable;
import classes.Scenes.Areas.Forest.*;
import classes.Scenes.Exploration;
import classes.Scenes.PregnancyProgression;
	import classes.internals.GuiOutput;
use namespace kGAMECLASS;

	public class Forest extends BaseContent implements IExplorable {
		public var akbalScene:AkbalScene = new AkbalScene();
		public var beeGirlScene:BeeGirlScene;
		public var corruptedGlade:CorruptedGlade = new CorruptedGlade();
		public var essrayle:Essrayle = new Essrayle();
		public var faerie:Faerie = new Faerie();
		public var kitsuneScene:KitsuneScene = new KitsuneScene();
		public var tamaniScene:TamaniScene = new TamaniScene();
		public var tentacleBeastScene:TentacleBeastScene;
		public var erlkingScene:ErlKingScene = new ErlKingScene();
		public var dullahanScene:DullahanScene = new DullahanScene();
		public var dryadScene:DryadScene = new DryadScene();
		public var aikoScene:AikoScene = new AikoScene();
		public var testStuff:TestStuff = new TestStuff();
		public var aliceScene:AliceScene = new AliceScene();
		public function Forest(pregnancyProgression:PregnancyProgression, output:GuiOutput) {
			this.beeGirlScene = new BeeGirlScene(pregnancyProgression, output);
			this.tentacleBeastScene = new TentacleBeastScene(pregnancyProgression, output);
		}

		public function isDiscovered():Boolean { return flags[kFLAGS.TIMES_EXPLORED_FOREST] > 0; }
		public function discover():void {
			clearOutput();
			outputText(images.showImage("area-forest"));
			outputText("You walk for quite some time, roaming the hard-packed and pink-tinged earth of the demon-realm.  Rust-red rocks speckle the wasteland, as barren and lifeless as anywhere else you've been.  A cool breeze suddenly brushes against your face, as if gracing you with its presence.  You turn towards it and are confronted by the lush foliage of a very old looking forest.  You smile as the plants look fairly familiar and non-threatening.  Unbidden, you remember your decision to test the properties of this place, and think of your campsite as you walk forward.  Reality seems to shift and blur, making you dizzy, but after a few minutes you're back, and sure you'll be able to return to the forest with similar speed.\n\nYou have discovered the Forest!");
			flags[kFLAGS.TIMES_EXPLORED]++;
			flags[kFLAGS.TIMES_EXPLORED_FOREST]++;
			doNext(camp.returnToCampUseOneHour);
		}
		//==============EVENTS GO HERE!==============
		private var _forestEncounter:Encounter = null;
		public function get forestEncounter():Encounter { //late init because it references game
			const fn:FnHelpers = Encounters.fn;
			if (_forestEncounter == null) _forestEncounter =
					Encounters.group(game.commonEncounters.withImpGob, {
						call: tamaniScene,
						chance: 0.15
					}, game.jojoScene.jojoForest, {
						call: essrayle.forestEncounter,
						chance: 0.10
					}, corruptedGlade, {
						call: camp.cabinProgress.forestEncounter,
						chance: 0.5
					}, {
						name: "deepwoods",
						call: game.deepWoods.discover,
						when: function ():Boolean {
							return (flags[kFLAGS.TIMES_EXPLORED_FOREST] >= 20) && !player.hasStatusEffect(StatusEffects.ExploredDeepwoods);
						},
						chance: Encounters.ALWAYS
					}, {
						name: "beegirl",
						call: beeGirlScene.beeEncounter,
						chance: 0.50
					}, {
						name: "tentabeast",
						call: tentacleBeastEncounterFn,
						when: fn.ifLevelMin(2)
					}, /*{
						name: "mimic",
						call: game.mimicScene.mimicTentacleStart,
						when: fn.ifLevelMin(3),
						chance: 0.50
					}, {
						name: "succubus",
						call: game.succubusScene.encounterSuccubus,
						when: fn.ifLevelMin(3),
						chance: 0.50
					},*/ {
						name: "marble",
						call: marbleVsImp,
						when: function ():Boolean {
							return flags[kFLAGS.TIMES_EXPLORED_FOREST] > 0 &&
								!player.hasStatusEffect(StatusEffects.MarbleRapeAttempted)
								&& !player.hasStatusEffect(StatusEffects.NoMoreMarble)
								&& player.hasStatusEffect(StatusEffects.Marble)
								&& flags[kFLAGS.MARBLE_WARNING] == 0;
						},
						chance: 0.10
					}, {
                        name: "goblinSharpshooter",
                        call: game.goblinSharpshooterScene.meetGoblinSharpshooter,
                        when: game.goblinSharpshooterScene.encounterWhen,
                        chance: game.goblinSharpshooterScene.encounterChance
                    }, {
						name: "trip",
						call: tripOnARoot
					}, {
						name: "chitin",
						call: findChitin,
						chance: 0.05
					}, {
						name: "healpill",
						call: findHPill,
						chance: 0.10
					}, {
						name: "truffle",
						call: findTruffle,
						chance: 0.35
					}, {
						name: "bigjunk",
						call: game.commonEncounters.bigJunkForestScene,
						chance: game.commonEncounters.bigJunkChance
					}, {
						name: "walk",
						call: forestWalkFn
					});
			return _forestEncounter;
		}
		//Oh noes, tentacles!
		public function tentacleBeastEncounterFn():void {
			clearOutput();
			if (player.hasKeyItem("Dangerous Plants") && player.inte / 2 > rand(50)) { //tentacle avoidance chance due to dangerous plants
//				trace("TENTACLE'S AVOIDED DUE TO BOOK!");
				outputText(images.showImage("item-dPlants"));
				outputText("Using the knowledge contained in your 'Dangerous Plants' book, you determine a tentacle beast's lair is nearby, do you continue?  If not you could return to camp.\n\n");
				menu();
				addButton(0, "Continue", tentacleBeastScene.encounter);
				addButton(4, "Leave", camp.returnToCampUseOneHour);
			}
			else tentacleBeastScene.encounter();
		}

		public function tripOnARoot():void {
			outputText(images.showImage("area-forest"));
			outputText("You trip on an exposed root, scraping yourself somewhat, but otherwise the hour is uneventful.");
			player.takeDamage(10);
			doNext(camp.returnToCampUseOneHour);
		}
		public function findTruffle():void {
			outputText(images.showImage("item-pigTruffle"));
			outputText("You spot something unusual. Taking a closer look, it's definitely a truffle of some sort. ");
			inventory.takeItem(consumables.PIGTRUF, camp.returnToCampUseOneHour);
		}
		public function findHPill():void {
			outputText(images.showImage("item-hPill"));
			outputText("You find a pill stamped with the letter 'H' discarded on the ground. ");
			inventory.takeItem(consumables.H_PILL, camp.returnToCampUseOneHour);
		}
		public function findChitin():void {
			outputText(images.showImage("item-bChitin"));
			outputText("You find a large piece of insectile carapace obscured in the ferns to your left. It's mostly black with a thin border of bright yellow along the outer edge. There's still a fair portion of yellow fuzz clinging to the chitinous shard. ");
			if (player.statusEffectv2(StatusEffects.MetRathazul) == 0) outputText("It feels strong and flexible - maybe someone can make something of it. ");
			inventory.takeItem(useables.B_CHITN, camp.returnToCampUseOneHour);
		}

		public function forestWalkFn():void {
			outputText(images.showImage("area-forest"));
			if (player.cor < 80) {
				outputText("You enjoy a peaceful walk in the woods, it gives you time to think.");
				dynStats("tou", .5, "int", 1);
			}
			else {
				outputText("As you wander in the forest, you keep ");
				if (player.gender == 1) outputText("stroking your half-erect " + player.multiCockDescriptLight() + " as you daydream about fucking all kinds of women, from weeping tight virgins to lustful succubi with gaping, drooling fuck-holes.");
				if (player.gender == 2) outputText("idly toying with your " + player.vaginaDescript(0) + " as you daydream about getting fucked by all kinds of monstrous cocks, from minotaurs' thick, smelly dongs to demons' towering, bumpy pleasure-rods.");
				if (player.gender == 3) outputText("stroking alternatively your " + player.multiCockDescriptLight() + " and your " + player.vaginaDescript(0) + " as you daydream about fucking all kinds of women, from weeping tight virgins to lustful succubi with gaping, drooling fuck-holes, before, or while, getting fucked by various monstrous cocks, from minotaurs' thick, smelly dongs to demons' towering, bumpy pleasure-rods.");
				if (player.gender == 0) outputText("daydreaming about sex-demons with huge sexual attributes, and how you could please them.");
				outputText("");
				dynStats("tou", .5, "lib", .25, "lus", player.lib / 5);
			}
			doNext(camp.returnToCampUseOneHour);
		}

		public function marbleVsImp():void {
			clearOutput();
			outputText(images.showImage("monster-marble"));
			outputText("While you're moving through the trees, you suddenly hear yelling ahead, followed by a crash and a scream as an imp comes flying at high speed through the foliage and impacts a nearby tree.  The small demon slowly slides down the tree before landing at the base, still.  A moment later, a familiar-looking cow-girl steps through the bushes brandishing a huge two-handed hammer with an angry look on her face.");
			outputText("[pg]She goes up to the imp, and kicks it once.  Satisfied that the creature isn't moving, she turns around to face you and gives you a smile.  \"Sorry about that, but I prefer to take care of these buggers quickly.  If they get the chance to call on their friends, they can actually become a nuisance.\"  She disappears back into the foliage briefly before reappearing holding two large pile of logs under her arms, with a fire axe and her hammer strapped to her back.  \"I'm gathering firewood for the farm, as you can see; what brings you to the forest, sweetie?\"  You inform her that you're just exploring.");
			outputText("[pg]She gives a wistful sigh. \"I haven't really explored much since getting to the farm.  Between the jobs Whitney gives me, keeping in practice with my hammer, milking to make sure I don't get too full, cooking, and beauty sleep, I don't get a lot of free time to do much else.\"  She sighs again.  \"Well, I need to get this back, so I'll see you later!\"");
			doNext(camp.returnToCampUseOneHour);
		}
		public function explore():void {
			clearOutput();
			player.location = "forest";
			//Increment forest exploration counter
			flags[kFLAGS.TIMES_EXPLORED_FOREST]++;
			forestEncounter.execEncounter();
		}
	}
}


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

	public class Aiko extends BaseKitsune {
		private var castIllusion:int = 0;

		public function Aiko() {
			init();
		}

		/**
		 * Constructor code extracted into function to make use of the JIT compiler.
		 * Code in the constructor is always interpreted.
		 */
		private function init():void {
			this.a = "";
			this.short = "Aiko";
			this.imageName = "aiko";
			if (this.isPure())
				this.long = "Aiko stands before you, a little over 5’4 tall. She has a head of short silver-blond hair that ends above her shoulders, parted by two large, furry fox ears. "+(flags[kFLAGS.AIKO_BOSS_COMPLETE] > 0 ? "Eight":"Seven")+" luxurious fox tails sway behind her, the silky fur shimmering as they move. She wears a set of revealing blue and white robes, neatly pressed and hung off her features with care, her D-cup breasts bound by a cloth chest wrap that is just a little too tight. She sports a number of red “tattoos” adorning her face and body; the most prominent of which are the spiral-shaped patterns on her palms and buttocks, and a stylized lotus flower on her lower back.  She wields a longbow almost as tall as she is that she can summon and dismiss with a snap of her fingers, and stares you down with a determined fire in her glittering blue eyes.";
			else
				this.long = "Aiko stands before you, a little over 5’4 tall. She has a head of short, unkempt silver-blond hair that ends above her shoulders, parted by two large, furry fox ears. "+(flags[kFLAGS.AIKO_BOSS_COMPLETE] > 0 ? "Eight":"Seven")+" fox tails sway behind her, their fur shaggy and matted down. She wears a set of ragged, bloodied robes that show a lot of skin, her D-cup breasts haphazardly bound by a set of bandages in dire need of changing, and you can smell sex and violence on her even from here. She sports a number of red “tattoos” adorning her face and body; the most prominent of which are the spiral-shaped patterns on her palms and buttocks, and a stylized lotus flower on her lower back. She is wielding an over-sized bill-hook hatchet that she can summon and dismiss with a snap of her fingers, and stares you down with a maniacal fire in her crazed blue eyes."
			this.race = "Kitsune";
			this.createVagina(false, Vagina.WETNESS_NORMAL, Vagina.LOOSENESS_TIGHT);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 200, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_VIRGIN;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,40,0,0,0);
			this.tallness = 64;
			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 = "silver-blonde";
			this.hair.length = 10;
			initStrTouSpeInte(25, 30, 90, 100);
			initLibSensCor(40, 65, game.flags[kFLAGS.AIKO_CORRUPTION]);
			this.weaponName = (!this.isPure() ? "bill-hook hatchet" : "longbow");
			this.weaponVerb = (!this.isPure() ? "slash" : "shoot");
			this.armorName = (!this.isPure() ? "ragged, bloodied robes" : "revealing blue and white robes");
			this.armorDef = 16;
			this.bonusHP = 350;
			this.lust = 25;
			this.lustVuln = 0.4;
			this.temperment = (!this.isPure() ? TEMPERMENT_LOVE_GRAPPLES : TEMPERMENT_LUSTY_GRAPPLES);
			if (flags[kFLAGS.AIKO_BOSS_COMPLETE] > 0) {
				this.level = 28;
				this.tail.venom = 8;
			} else {
				this.level = 18;
				this.tail.venom = 7;
			}
			this.gems = rand(10) + 30;
			this.drop = new WeightedDrop(consumables.FOXJEWL, 1);
			this.tail.type = Tail.FOX;
			this.ears.type = Ears.FOX;
            this.createPerk(PerkLib.SpellcastingAffinity,25);
			checkMonster();
		}

		private function aikoBasic():void {
			var damage:int = int(str) + rand(15);
			outputText("Aiko nocks an arrow and lets it fly");
			var customOutput:Array = [
			"[BLIND], and it disappears into the woods.",
			"[SPEED], and it disappears into the woods.",
			"[EVADE], and it disappears into the woods.",
			"[MISDIRECTION], and it disappears into the woods.",
			"[FLEXIBILITY], and it disappears into the woods.",
			"[UNHANDLED], and it disappears into the woods.",
			"[BLOCK], and you manage to raise your shield in time to deflect it!"];
			//20% chance for double hit without block or evade chance
			if (rand(5) == 0) {
				outputText(", swiftly following it with another!  ");
				player.takeDamage(damage - rand(10), true);
				player.takeDamage(damage - rand(9), true);
				player.addCombatBuff("spe", -4);
				player.bleed(this);
			}
			//Determine if evaded
			else if (!playerAvoidDamage({doDodge:true, doParry:false, doBlock:true, doFatigue:false}, customOutput)){
				if (player.armorDef > 4 && rand(3)==0) {
					outputText("! You shrink away from the impending impact, but it strikes at an angle, glancing off your [armor] and tumbling into the woods.  ");
					player.takeDamage(int(damage)-(player.armorDef*2), true);
				}else{
					outputText(" with deadly precision! It protrudes from your body painfully, making it somewhat difficult to move around.  ");
					player.takeDamage(damage, true);
					player.addCombatBuff("spe", -4);
					player.bleed(this);
				}
			}
		}

		private function aikoFoxfire():void {
			outputText("Aiko moves her fingers through the air in a circle, conjuring up a pale blue flame. As she thrusts her palm forward, it rockets toward you like a missile, bursting on impact! The flames burn intensely as they engulf you, at the same time filling your body with a crippling pleasure that makes your skin flush red.  ");
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			var damage:int = 2*(str + rand(30));
			damage = player.takeDamage(damage, true);
			//player.takeLustDamage(15 + player.sens / 5
			player.takeLustDamage(15 + player.sens / 5, true);
		}

		private function aikoFireArrow():void {
			outputText("Aiko nocks an arrow on her bow and lines up a shot, biting the end of her tongue as she focuses. As she lets it fly, the arrowhead sparks and then bursts into flame!");
			if (!playerAvoidDamage({doDodge:true, doParry:false, doBlock:false, doFatigue:false})){
				outputText(" The flaming obsidian tip pierces through your [armor] like a hot knife through butter, sinking into your flesh and forcing a pained cry from your throat.  ");
				game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
				player.takeDamage((this.hasStatusEffect(StatusEffects.AikoArcaneArcher)?2*(str + rand(40)):str + rand(40))+30, true);
				player.addCombatBuff("spe", -5);
			}
		}

		private function aikoIllusion():void {
			if (castIllusion < 1) {
				outputText("Aiko whispers an incantation in a strange language, and reality seems to be twisting and warping around her. This is going to make it much harder to hit her![pg]");
				castIllusion += 2;
			} else {
				outputText("Aiko whispers her incantation again, and your already distorted perception of your surroundings is compounded. Coupled with sudden shifts in gravity, her illusory magic has you stumbling around drunkenly, struggling to keep Aiko in your sights. It’s going to be nearly impossible to hit her like this![pg]");
				castIllusion += 2;
			}
			if (player.hasStatusEffect(StatusEffects.Illusion))
				player.addCombatBuff("spe", -3);
			resistIllusion();
		}

		private function resistIllusion():void {
			//Resist: - successfully resisting deals small health & lust damage to Aiko
			var resist:int = calculateAttackResist();
			if (rand(100) < resist) {
				outputText("As the world around you begins to twist, you push back the influence of her illusions with your mind! She lets out a small cry of pain, clutching her forehead, and curses audibly as she realizes that you resisted her magic.[pg]");
				if (player.hasStatusEffect(StatusEffects.Illusion)) {
					player.removeStatusEffect(StatusEffects.Illusion);
					addCombatBuff("spe", -3);
				}
			} else {
				if (player.hasStatusEffect(StatusEffects.Illusion)) {
					player.addCombatBuff("spe", -1);
				} else {
					player.createStatusEffect(StatusEffects.Illusion, 0, 0, 0, 0);
					player.addCombatBuff("spe", -7);
				}
			}
		}

		//Corrupted Aiko Attacks
		private function aikoCorruptBasic():void {
			outputText("[say: Hack! Slash! Maim! Kill! Isn’t it the fucking greatest?!] Aiko yells with a psychotic laugh as she strikes out at you with reckless abandon. [pg][say: Lacerate! Eviscerate! Mutilate!] Aiko chants with each reckless swing. [say: Ever notice how all the best words end in -ate?!][pg][say: You know I’d bleed for you!] she yells, grinning crazily as she hacks at you with her billhook. [say: Now you’ll do the SAME!] ");
			var customOutput:Array = [
			"[BLIND][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as using your superior combat skills you dodge her ferocious attacks. ",
			"[SPEED][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as using your superior combat skills you dodge her ferocious attacks.",
			"[EVADE][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as using your skills at evading attacks, you anticipate and sidestep her ferocious attacks.",
			"[MISDIRECTION][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as using Raphael's teachings, you anticipate and sidestep her ferocious attacks.",
			"[FLEXIBILITY][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as with your incredible flexibility, you squeeze out of the way of her ferocious attacks.",
			"[UNHANDLED][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as using your superior combat skills you dodge her ferocious attacks.",
			"[PARRY][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as you parry her blows with your [weapon].",
			"[BLOCK][pg][say: Just hold still, I promise to make it hurt good!] Aiko yells as you block her ferocious attacks with your [shield]."];
			if (!playerAvoidDamage({doDodge:true, doParry:true, doBlock:true, doFatigue:false})){
				var damage:int = int(str) + rand(15);
				player.takeDamage(damage, true);
				player.addCombatBuff("spe", -4);
				player.bleed(this);
			}
		}

		private function aikoDarkFoxfire():void {
			outputText("Aiko moves her fingers through the air in a circle, conjuring up a corrupt purple flame. She twists her upper body into a batter’s stance and strikes it at you ferociously, 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 / 5) : player.takeLustDamage((10 + player.sens / 5)*2));
		}

		private function aikoTerrorize():void {
			outputText("Aiko pauses and mutters an incantation, snapping her fingers in your direction. The edges of your vision blacken, and you suddenly find yourself beset on all sides by countless indescribable otherworldly horrors! Though your eyes cannot see them, your mind can somehow sense the eldritch abominations crowding in around you, threatening to engulf your very essence... ");
			//Resist: - successfully resisting deals small health & lust damage to Aiko
			var resist:int = 0;
			if (player.inte < (50+player.level)) resist = Math.round(player.inte/55*30);
			else resist = 25;
			if (player.findPerk(PerkLib.Whispered) >= 0) resist += 35;
			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("[pg]Aiko murmurs her incantation, but as the darkness begins to close in on you, you push back the influence of her illusions with your mind! She lets out a yelp of pain, clutching her forehead, but then grins madly. [say: Think you’re pretty clever, huh?]");
				if (player.hasStatusEffect(StatusEffects.Fear))
					player.removeStatusEffect(StatusEffects.Fear);
			} else {
				if (player.hasStatusEffect(StatusEffects.Fear))
					player.addCombatBuff("spe", -4);
				else {
					player.createStatusEffect(StatusEffects.Fear, 0, 0, 0, 0);
					player.addCombatBuff("spe", -10);
				}
			}

		}

		private function aikoTomahawk():void {
			if (combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).success) {
				outputText("Aiko draws back and heaves her weapon at you with all her force! Thankfully, the shot goes wide, and the blade winds up lodged in a tree trunk instead of your chest. [say: Don’t you fucking play hard to get with ME!] she yells furiously, snapping her fingers and summoning the weapon back to her hands, still stomping the ground in anger.");
			} else {
				outputText("Aiko draws back and heaves her weapon at you with all her force! The wicked-looking blade scythes through the air, staggering you with the force of the hit! She laughs sadistically at your pained struggles to dislodge it, and with a snap of her fingers, it disappears in a puff of smoke, reappearing in her hand again.  ");
				player.takeDamage(int(str) + rand(15), true);
			}
		}

		private function aikoTease():void {
			var temp:int = rand(4);
			switch (temp) {
				case 0:
					outputText("Aiko turns around, brushing her tails to the side to expose her ample hindquarters, showing off the spiral-shaped tattoos on her juicy-looking cheeks and a lotus-flower tramp stamp. Her display sends blood rushing to your groin, making you lick your lips eagerly.  ");
					break;
				case 1:
					outputText("Aiko pauses for a moment, placing a hand on her taut abs and sliding her fingers downward slowly, coyly 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.  ");
					break;
				case 2:
					outputText("Aiko takes a moment to stretch out her limber body, thrusting out her chest as she stretches her arms toward the sky. She spins girlishly, giving you a come-hither glare, and then bows forward to give you a good angle at her cleavage, packed tightly into her too-small chest wrap.  ");
					break;
				case 3:
					outputText("[say: You know, we don’t have to fight... Wouldn’t you rather come pet my super fluffy tails?] Aiko teases, running a hand along her tails and making them fan out around her seductively. You find yourself nodding before you can even think to stop yourself — yes, you <i>DO</i> want the fluffy tails!  ");
					break;
			}

			var lustDmg:int = 8 + int(player.sens / 5);
			player.takeLustDamage(lustDmg);
		}

		private function aikoIllusionLust():void {
			var x:int = rand(6);
			var lustDmg:int = 11 + int(player.sens / 5);
			if (player.hasStatusEffect(StatusEffects.Illusion)) {
				outputText("A series of Aiko's illusions surround you! You try to find the real one but you're too slow! An arrow comes from the side, impaling you!  ");
				player.takeDamage(int(str/2) + rand(15), true);
				switch (x) {
					case 0:
						outputText("[pg]You attack Aiko, but her figure was just an illusion! She appears behind you and rapidly shoots an arrow, she got you! But.... what has she done?! You feel a tingling sensation in your groin, the arrow was poisoned with some kind of lust-inducing venom!  ");
						if (!player.hasStatusEffect(StatusEffects.lustvenom))
							player.createStatusEffect(StatusEffects.lustvenom, 0, 0, 0, 0);
						break;
					case 1:
						outputText("[pg][say: 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);
						if (player.hasStatusEffect(StatusEffects.Illusion)) {
							player.addCombatBuff("spe", -3);
						} else {
							player.createStatusEffect(StatusEffects.Illusion, 0, 0, 0, 0);
							player.addCombatBuff("spe", -7);
							castIllusion += 2;
						}
						break;
				}
			}
			else if (x==3) {
				outputText("Aiko turns around, brushing her tails to the side to expose her ample hindquarters, showing off the spiral-shaped tattoos on her juicy-looking cheeks and a lotus-flower tramp stamp. Her display sends blood rushing to your groin, making you lick your lips eagerly.[pg]"
				+"Aiko pauses for a moment, placing a hand on her taut abs and sliding her fingers downward slowly, coyly 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);
			}
			else if (x==4) {
				outputText("Aiko devilishly looks at you, you find yourself surrounded by many Aikos! [say: Would you like a reverse gangbang, big boy?] all of the Aikos seductively grab one bound breast and lower their pants, the tattoos on their pubic mounds drawing your attention to their most private parts.[pg]"
				+"In your distraction you don't notice the illusion Aiko has cast over you!  ");
				player.takeLustDamage(lustDmg*2);
				if (player.hasStatusEffect(StatusEffects.Illusion)) {
					player.addCombatBuff("spe", -3);
				} else {
					player.createStatusEffect(StatusEffects.Illusion, 0, 0, 0, 0);
					player.addCombatBuff("spe", -7);
				}
			} else {
				outputText("Aiko takes a moment to stretch out her limber body, thrusting out her chest as she stretches her arms toward the sky. She spins girlishly, giving you a come-hither glare, and then bows forward to give you a good angle at her cleavage, packed tightly into her too-small chest wrap."
				+"[pg][say: You know, we don’t have to fight... Wouldn’t you rather come pet my super fluffy tails?] Aiko teases, running a hand along her tails and making them fan out around her seductively. You find yourself nodding before you can even think to stop yourself—yes, you DO want the fluffy tails!  ");
			}
			player.takeLustDamage(lustDmg);
		}

		private function arcaneArcherActivate():void {
			outputText("[say: I'll show you my training as a guardian... can you stand my magic and my bow? Let's find out.] she says. You almost take her words as a joke, but you can clearly see her determination, and she has the power to back up her demeanor![pg]You see her body enveloped by a golden aura, and sparks of yellow-white arc out from her from time to time, she looks a little frightening![pg]");

			this.createStatusEffect(StatusEffects.AikoArcaneArcher, 0, 0, 0, 0);
			this.addCombatBuff("str", 10);
			this.addCombatBuff("spe", 10);
		}

		private function splinterLightningArrow():void {
			outputText("Aiko summons her magic inside her bow and shoots to you a lighting arrow that splits into a multitude of dangerous sparks! They are too many and have too irregular movements, you can't dodge them! You are hit![pg]"
			+"You fall to the ground, your legs giving in once the initial shock lets up.  ");
			player.addCombatBuff('str',-10);
			player.addCombatBuff('spe',-10);
			player.takeDamage(45+25/(rand(3)+1), true);

			if (!player.hasStatusEffect(StatusEffects.AikoLightningArrow))
				player.createStatusEffect(StatusEffects.AikoLightningArrow, 4, 0, 0, 0);
			else
				player.addStatusValue(StatusEffects.AikoLightningArrow, 1, 3);
		}

		private function lightArrowCage():void {
			outputText("Aiko groans with effort with her mouth closed and summons an incredible amount of arrows made of pure light! There are so many of 'em, you grit your teeth as you see you are completely surrounded by a cage of arrows ready to get you!\nThey all strike at once, converging on you at the center!  ");

			if (player.isCorruptEnough(40)) {
				outputText("[pg]Due to your high corruption, the light sears your skin and burns incredibly.  ");
				player.takeDamage(2*(80 + player.cor), true);
			} else {
				player.takeDamage(1.2*(80 + player.cor), true);
			}

			this.removeStatusEffect(StatusEffects.AikoArcaneArcher);
		}

		private function iceArrow():void {
			outputText("Aiko rapidly shoots a flurry of arrow in an arc motion before her, they are made of pure ice, they leave a big trail of ice behind them, and as such are twice as dangerous![pg]");

			if (game.combat.combatAvoidDamage({doDodge:true,doBlock:false,doParry:false}).success) {
				outputText("You narrowly avoid the barrage of arrows and watch as the last one whizzes past and embeds itself with a great thunk in a tree on the opposite end of the clearing, instantly freezing half the tree.");
			} else {
				outputText("You are hit by one of the frozen arrows, frost rapidly spreading over the skin surrounding the arrow [if (player.armor != ArmorLib.NOTHING)and chilling your armor]  ");
				player.addCombatBuff("spe", -15);
				player.takeDamage(str*2 + rand(40), true);
			}
		}

		private function arrowRain():void {
			var arrows:int = rand(4)+2;
			outputText("Aiko nocks a series of arrows made of pure light and shoots them into the air! The hailstorm of bolts come crashing down, impaling you "+arrows+" times! The arrows luckily are purely magical and vanish soon after.\n");
			for (var i:int = 0; i < arrows; i++) {
				player.takeDamage((str + rand(15)), true);
				outputText(" ");
			}
		}

		private function arrowBarrage():void {
			var arrows:int = rand(3)+3;
			outputText("Aiko lets loose a barrage of arrows and they strike you with the speed of a machine gun! You barely have the time to react, damn, she's fast! ");
			for (var i:int = 0; i < arrows; i++) {
                if (game.combat.combatAvoidDamage({doDodge:true,doBlock:false,doParry:false}).failed) {
                    player.takeDamage((str + rand(10)), true);
                    outputText(" ");
                    player.addCombatBuff("spe", -2);
                    player.bleed(this);
                }
			}

		}

		private function hyperAttack1():void {
			outputText("You notice Aiko is not attacking and seems to be preparing for something big! She bows her head over her bow, muttering an incantation below her breath, completely ignoring you for the moment.");
			this.createStatusEffect(StatusEffects.AikoHyper, 0, 0, 0, 0);
		}

		private function hyperAttack2():void {
			outputText("You see Aiko gathering up an enormous amount of energy, she pulls back on the string of her bow, and as her golden aura extends outward, her tattoos begin to glow in an eerie light. She's up to something really dangerous as she aims at you. You can hear a faint whisper as she slowly draws the bow to it's absolute limit, [say: With an arrow the focus of my heart, I cast away all mundane thoughts, and with this shaft of light in my hands...] An arrow of the purest light you have ever seen materializes, nocked and ready to loose! [pg]");

			if (flags[kFLAGS.IN_COMBAT_USE_PLAYER_WAITED_FLAG] == 1) {
				outputText("[say: I'll punish every demon in this world!] As she finishes her incantation, she releases the string of her arrow and unleashes an immense beam of golden white light directly at you! It was a wise choice to stand back to see what was going on! You narrowly manage to dodge the attack by rolling away as you see the forest behind you completely obliterated. Aiko stands speechless before you, she clearly did not expected you to dodge her attack.");
			} else {
				outputText("[say: I'll punish every demon in this world!] As she finishes her incantation, she releases the string of her arrow and unleashes an immense beam of golden white light directly at you! Oh shit! You barely have the time to widen your eyes as you get blasted away by the enormous mass of energy who seems to obliterate you as you come crashing down to the floor, all of your body smoking.  ");
				player.addCombatBuff("spe", -20);
				player.addCombatBuff("str", -15);
				if (player.isPureEnough(20))
					player.takeDamage(250, true);
				else
					player.takeDamage(350, true);
				if (player.HP > 0)
					outputText("You barely manage to survive the blast, and find Aiko standing gaping at you.[pg][say: How did you... No way that is possible!][pg]" + (player.isPureEnough(20) ? "[say: Unless you truly are pure of heart, that should have obliterated you!]" : ""));
			}

			this.removeStatusEffect(StatusEffects.AikoArcaneArcher);
			this.removeStatusEffect(StatusEffects.AikoHyper);
		}

		private function kitsuneSealPhysical():void {
			sealTypes = [SEAL_ATTACK, SEAL_TEASE, SEAL_ITEMS, SEAL_MOVEMENT, SEAL_PHYSICAL];
			kitsuneSealAttack();
		}
		private function kitsuneSealMagic():void {
			sealTypes = [SEAL_SPELLS, SEAL_MOVEMENT, SEAL_MAGICAL];
			kitsuneSealAttack();
		}

		override protected function handleFear():Boolean {
			if (!isPure()) {
				removeStatusEffect(StatusEffects.Fear);
				outputText("Aiko shudders in delight for a moment, then looks your way with a clear head.  [say: I love that! You should do it more often!]\n");
				return true;
			} else if (rand(3)==0) {
				removeStatusEffect(StatusEffects.Fear);
				outputText("Aiko shudders for a moment, then looks your way with a clear head and a frown.  [say: I sure am glad for my training now... That was really scary!]\n");
				return true;
			} else {
				return false;
			}
		}

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

		public function isPure():Boolean {
            return game.flags[kFLAGS.AIKO_CORRUPTION] < 50 || game.flags[kFLAGS.AIKO_CORRUPTION_ACTIVE]==0;
		}

		override protected function performCombatAction():void {
			castIllusion--;
            if (player.hasStatusEffect(StatusEffects.lustvenom)) {
                player.takeLustDamage(5 + player.sens / 5);
                outputText("  You feel slightly more flushed from the poisoned arrow.[pg]");
            }
            if (player.hasStatusEffect(StatusEffects.Illusion))
                resistIllusion();
            if (this.hasStatusEffect(StatusEffects.AikoHyper)) {
                hyperAttack2();
				return;
			}

            if (rand(12) == 0) {
                if (!this.hasStatusEffect(StatusEffects.AikoArcaneArcher)) {
                    arcaneArcherActivate();
                    return;
                }
            }
            var actionChoices:MonsterAI = new MonsterAI()
                    .add(eAttack, 1,true,0,FATIGUE_NONE,FATIGUE_PHYSICAL);
            actionChoices.add(splinterLightningArrow,1,hasStatusEffect(StatusEffects.AikoArcaneArcher),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(lightArrowCage,1,hasStatusEffect(StatusEffects.AikoArcaneArcher) && isPure(),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(iceArrow,1,hasStatusEffect(StatusEffects.AikoArcaneArcher),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(arrowRain,1,hasStatusEffect(StatusEffects.AikoArcaneArcher),10,FATIGUE_PHYSICAL,RANGE_RANGED);
            actionChoices.add(arrowBarrage,1,hasStatusEffect(StatusEffects.AikoArcaneArcher),10,FATIGUE_PHYSICAL,RANGE_RANGED);
            actionChoices.add(kitsuneSealPhysical,1,hasStatusEffect(StatusEffects.AikoArcaneArcher),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(kitsuneSealMagic,1,player.hasStatusEffect(StatusEffects.Illusion) && isPure(),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(aikoBasic,1,isPure(),0,FATIGUE_NONE,RANGE_RANGED);
            actionChoices.add(aikoCorruptBasic,1,!isPure(),0,FATIGUE_NONE,RANGE_RANGED);
            actionChoices.add(aikoDarkFoxfire,1,!isPure(),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(aikoTerrorize,1,!isPure(),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(aikoTomahawk,1,!isPure(),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(aikoIllusionLust,1,player.hasStatusEffect(StatusEffects.Illusion) && !isPure(),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.add(aikoTease,1,!isPure(),10,FATIGUE_MAGICAL,RANGE_TEASE);
            actionChoices.add(hyperAttack1,0.1,hasStatusEffect(StatusEffects.AikoArcaneArcher),10,FATIGUE_MAGICAL,RANGE_RANGED);
            actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void {
			if (player.hasStatusEffect(StatusEffects.Spar)) {
				game.forest.aikoScene.sparWithAikoWin();
			} else if (player.hasStatusEffect(StatusEffects.DomFight)) {
				game.forest.aikoScene.pcWinsDomFight();
			} else {
				game.forest.aikoScene.aikoLosesIntro();
			}
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void {
			if (player.hasStatusEffect(StatusEffects.Spar)) {
				game.forest.aikoScene.sparWithAikoLose(this.lust100);
			} else if (player.hasStatusEffect(StatusEffects.DomFight)) {
				game.forest.aikoScene.pcLosesDomFight();
			} else {
				game.forest.aikoScene.aikoWinsIntro();
			}
		}

	}
}


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

	public class Akbal extends Monster
	{
		private var fierceAkbal:Boolean = flags[kFLAGS.AKBAL_QUEST_STATUS] > 0;

		override public function eAttack():void
		{
			var damage:Number = 0;
			//Blind dodge change
			if (hasStatusEffect(StatusEffects.Blind)) {
				outputText("Akbal seems to have no problem guiding his attacks towards you, despite his blindness.\n");
			}
			var combatContainer:Object = {doDodge:true, doParry:true, doBlock:true, doFatigue:true};
			if (playerAvoidDamage(combatContainer)) return;
			//*Normal Attack A -
			if (rand(2) == 0) {
				//(medium HP damage)
				damage = player.reduceDamage(str + weaponAttack,this,fierceAkbal ? 20 : 0);
				if (damage <= 0) {
					outputText("Akbal lunges forwards but with your toughness");
					if (player.armorDef > 0)
						outputText(" and " + player.armorName + ", he fails to deal any damage.");
					else
						outputText(" he fails to deal any damage.");
				}
				else {
					outputText("Akbal rushes at you, his claws like lightning as they leave four red-hot lines of pain across your stomach.");
					player.takeDamage(damage, true);
				}
			} else { //*Normal Attack B
				//(high HP damage)
				damage = player.reduceDamage(str + 25 + weaponAttack,this,fierceAkbal ? 20 : 0);
				if (damage == 0) {
					outputText("Akbal lunges forwards but between your toughness ");
					if (player.armorDef > 0)
						outputText("and " + player.armorName + ", he fails to deal any damage.");
				}
				else {
					outputText("Akbal snarls as he flies towards you, snapping his ivory teeth on your arm. You scream out in pain as you throw him off.");
					player.takeDamage(damage, true);
				}
			}

		}

		override public function defeated(hpVictory:Boolean):void
		{
			if (fierceAkbal) {
				switch (flags[kFLAGS.AKBAL_DAY_DONE]) {
					case 0:
						game.combat.cleanupAfterCombat(game.forest.akbalScene.akbalEventGoblinWin);
						break;
					case 1:
						game.combat.cleanupAfterCombat(game.forest.akbalScene.akbalEventAliceWin);
						break;
					case 2:
						game.combat.cleanupAfterCombat(game.forest.akbalScene.akbalEventKitsuneWin);
						break;
					default:
						outputText("ERROR: Invalid Akbal event flag");
						game.combat.cleanupAfterCombat();
				}
			}
			else game.forest.akbalScene.akbalDefeated(hpVictory);
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (fierceAkbal) {
				switch (flags[kFLAGS.AKBAL_DAY_DONE]) {
					case 0:
						game.forest.akbalScene.akbalEventGoblinLose();
						break;
					case 1:
						game.forest.akbalScene.akbalEventAliceLose();
						break;
					case 2:
						game.forest.akbalScene.akbalEventKitsuneLose();
						break;
					default:
						outputText("ERROR: Invalid Akbal event flag");
						game.combat.cleanupAfterCombat();
				}
			}
			else {
				game.forest.akbalScene.akbalWon(hpVictory,pcCameWorms);
				game.combat.cleanupAfterCombat();
			}
		}

		override public function handleCombatLossText(inDungeon:Boolean, gemsLost:int):int {
			if (fierceAkbal) {
				outputText("[pg]You make your way back to your camp...");
				return 1;
			}
			else return super.handleCombatLossText(false, gemsLost);
		}

		public function akbalLustAttack():void
		{
			//*Lust Attack -
			if (!(player.hasStatusEffect(StatusEffects.Whispered) || player.hasStatusEffect(StatusEffects.TrueWhispered)))
			{
				if (fierceAkbal) outputText("You begin to hear whispering in your head, and Akbal's ethereal voice cuts through your mind. [say: You are in my way, submit now or I will make it very painful for you when I finish what I'm doing.]");
				else outputText("You hear whispering in your head. Akbal begins speaking to you as he circles you, telling all the ways he'll dominate you once he beats the fight out of you.");
				//(Lust increase)
				var lustDmg:int = 7 + (100 - player.inte) / 10;
				if (fierceAkbal) lustDmg *= 2;
				player.takeLustDamage(lustDmg, true);
				player.createStatusEffect(fierceAkbal ? StatusEffects.TrueWhispered : StatusEffects.Whispered,0,0,0,0);
			}
			//Continuous Lust Attack -
			else
			{
				if (fierceAkbal) {
					outputText("The whispering in your head grows, many voices of undetermined sex telling you all the things the demon wishes to do to you.\nYou feel a vague sensation of his barbed feline cock scraping across your insides with rough and callous abandon.");
					if (player.hasPerk(PerkLib.Masochist)) outputText(" Your masochistic side is more than a little turned on by the aggressive fantasy.");
				}
				else outputText("The whispering in your head grows, many voices of undetermined sex telling you all the things the demon wishes to do to you. You can only blush.");
				//(Lust increase)
				var lustDmg:int = 12 + (100 - player.inte) / 10;
				if (fierceAkbal) lustDmg *= 2;
				player.takeLustDamage(lustDmg, true);
				player.createOrFindStatusEffect(StatusEffects.Whispered);
			}

		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI()
				.add(eAttack,1,true,0,FATIGUE_NONE,RANGE_MELEE);
			actionChoices.add(akbalSpecial,1,true,10,FATIGUE_MAGICAL,RANGE_RANGED);
			actionChoices.add(akbalLustAttack,1,true,10,FATIGUE_MAGICAL,RANGE_OMNI);
			actionChoices.add(akbalHeal,1,fierceAkbal ? HPRatio() < 0.6 : true,0,FATIGUE_NONE,RANGE_SELF);
			actionChoices.exec();
		}

		public function akbalSpecial():void
		{
			//*Special Attack A -
			if (rand(2) == 0 && player.spe > 20)
			{
				outputText("Akbal's eyes fill with light, and a strange sense of fear begins to paralyze your limbs.");
				//(Speed decrease)
				var ase:AkbalSpeedDebuff = player.createOrFindStatusEffect(StatusEffects.AkbalSpeed) as AkbalSpeedDebuff;
				ase.increase();
				if (fierceAkbal) ase.increase();
			}
			//*Special Attack B -
			else
			{
				outputText("Akbal releases an ear-splitting roar, hurling a torrent of emerald green flames towards you.\n");
				//(high HP damage)
				//Determine if dodged!
				var speedChoices:Array =  ["You narrowly avoid Akbal's fire!", "You dodge Akbal's fire with superior quickness!", "You deftly avoid Akbal's fire-breath."];
				var customOutput:Array = [
					"[SPEED]" + randomChoice(speedChoices),
					"[EVADE]Using your skills at evading attacks, you anticipate and sidestep Akbal's fire-breath.",
					"[MISDIRECTION]Using Raphael's teachings, you anticipate and sidestep Akbal's fire-breath.",
					"[FLEXIBILITY]Using your cat-like agility, you contort your body to avoid Akbal's fire-breath.",
					"[UNHANDLED]You manage to dodge Akbal's fire breath."];
				if (!playerAvoidDamage({doDodge:true, doParry:false, doBlock:false}, customOutput)) {
					outputText("You are burned badly by the flames!");
					game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
					player.takeDamage(fierceAkbal ? 80 + rand(20) : 40, true);
				}
				else if (fierceAkbal) {
					//dodge penalty
					outputText("\nThe ground he scorched remains consumed in flames! You've got a bit less room to maneuver now.");
					if (player.hasStatusEffect(StatusEffects.AkbalFlameDebuff)) player.addStatusValue(StatusEffects.AkbalFlameDebuff,1,1);
					else player.createStatusEffect(StatusEffects.AkbalFlameDebuff, 1, 0, 0, 0);
				}
			}
		}

		//*Support ability -
		public function akbalHeal():void
		{
			if (HPRatio() >= 1)
				outputText("Akbal licks himself, ignoring you for now.");
			else
				outputText("Akbal licks one of his wounds, and you scowl as the injury quickly heals itself.");
			addHP(maxHP() * 0.12);
			if (!fierceAkbal) lust += 10;

		}

		public function Akbal()
		{
			//trace("Akbal Constructor!");
			this.a = "";
			this.short = "Akbal";
			this.imageName = "akbal";
			if (fierceAkbal) {
				this.long = "Tensed and poised, the tan black-spotted jaguar seems a hair-trigger away from a ferocious strike at any moment. His emerald eyes burn with determination and zeal. This beast is not going to take it easy; this is not just another day fruitlessly fighting off the many critters that wander clueless into his domain, this is his mission. He doesn't need to say a word with his telepathy to make this clear.";
				initStrTouSpeInte(65, 63, 65, 85);
				initLibSensCor(30, 30, 100);
				this.weaponAttack = 20;
				this.armorDef = 14;
				this.bonusHP = 200;
				this.lust = 20;
				this.lustVuln = 0.7;
				this.level = 15;
				this.gems = rand(15)+25;
				this.additionalXP = 250;
				this.createPerk(PerkLib.ExtraDodge, 10, 0, 0, 0);
			}
			else {
				this.long = "Akbal, 'God of the Terrestrial Fire', circles around you. His sleek yet muscular body is covered in tan fur, with dark spots that seem to dance around as you look upon them.  His mouth holds two ivory incisors that glint in the sparse sunlight as his lips tremble to the sound of an unending growl.  Each paw conceals lethal claws capable of shredding men and demons to ribbons.  His large and sickeningly alluring bright green eyes promise unbearable agony as you look upon them.";
				initStrTouSpeInte(55, 53, 50, 75);
				initLibSensCor(50, 50, 100);
				this.weaponAttack = 5;
				this.armorDef = 5;
				this.bonusHP = 20;
				this.lust = 30;
				this.lustVuln = 0.8;
				this.level = 6;
				this.gems = 15;
				this.additionalXP = 150;
			}
			this.race = "Demon";
			// this.plural = false;
			this.createCock(15,2.5,CockTypesEnum.CAT);
			this.balls = 2;
			this.ballSize = 4;
			this.cumMultiplier = 6;
			this.hoursSinceCum = 400;
			createBreastRow();
			createBreastRow();
			createBreastRow();
			createBreastRow();
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_NORMAL;
			this.tallness = 4*12;
			this.hips.rating = Hips.RATING_SLENDER;
			this.butt.rating = Butt.RATING_TIGHT;
			this.skin.tone = "spotted";
			this.skin.setType(Skin.FUR);
			//this.hair.color = "tan";
			//this.hair.length = 0;
			this.weaponName = "claws";
			this.weaponVerb="claw-slash";
			this.armorName = "shimmering pelt";
			this.temperment = TEMPERMENT_LUSTY_GRAPPLES;
			this.createPerk(PerkLib.BlindImmune, 0, 0, 0, 0);
			this.drop = new WeightedDrop().
					add(consumables.INCUBID,4).
					add(consumables.W_FRUIT,3).
					add(consumables.AKBALSL,2).
					add(weapons.PIPE,1);
			/*this.special1 = akbalLustAttack;
			this.special2 = akbalSpecial;
			this.special3 = akbalHeal;*/
			this.tail.type = Tail.CAT;
			checkMonster();
		}

	}

}


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

	public class AkbalUnsealed extends Monster {

		public var rageMod:Number = (1 + 0.05 * flags[kFLAGS.AKBAL_FUCKERY]) * (1 + 0.3 * player.newGamePlusMod());
		public var playerActions:Object = {melee:0, ranged:0, magic:0, dodge:0, gotStunned:0, attemptStunned:0};
		public var cooldowns:Object = {psiAssault:0, terraFire:0, swoop:0}
		override public function chanceToHit(defender:Creature = null):Number {
			var toHit:Number = 95;
			toHit -= flags[kFLAGS.AKBAL_FUCKERY] * 2;
			return toHit;
		}

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

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

		override protected function performCombatAction():void {
			//Decrement cooldowns
			for (var ability:String in cooldowns) {
				if (cooldowns[ability] > 0) cooldowns[ability]--;
			}
			//Default attack logic
			var shouldPunch:Boolean = true;
			var weightPunch:Number = 1;
			var shouldClaw:Boolean = true;
			var weightClaw:Number = 1;
			var shouldFireBreath:Boolean = true;
			var weightFireBreath:Number = 1;
			var shouldTerraFire:Boolean = cooldowns.terraFire <= 0 && !(hasStatusEffect(StatusEffects.AkbalFireUsed) && player.canFly());
			var weightTerraFire:Number = 1;
			var shouldPsiAssault:Boolean = cooldowns.psiAssault <= 0;
			var weightPsiAssault:Number = 1;
			var shouldFlyUp:Boolean = false;
			var weightFlyUp:Number = 1000;
			var shouldSwoop:Boolean = cooldowns.swoop <= 0 && isFlying;
			var weightSwoop:Number = 1;
			var shouldHeal:Boolean = !hasStatusEffect(StatusEffects.AkbalHealUsed) && (HPRatio() < 0.5 || lust100 > 70);
			var weightHeal:Number = 1000;

			if (flags[kFLAGS.AKBAL_FUCKERY] >= 8) {
				//Full rage - no special AI, just uses default attack logic for mostly-random attacks
			}
			else if (flags[kFLAGS.AKBAL_FUCKERY] >= 5) { //Medium rage - choose attacks a little more intelligently
				if (playerActions.gotStunned == 0) weightPunch = Math.max(0, 1 - playerActions.attemptStunned / 3);
				weightFireBreath = playerActions.dodge;
				weightPsiAssault = player.hasStatusEffect(StatusEffects.TrueWhispered) ? 1 : 2;
				shouldFlyUp = !isFlying && hasStatusEffect(StatusEffects.AkbalHealUsed) && HPRatio() < 0.3;
				shouldHeal = !hasStatusEffect(StatusEffects.AkbalHealUsed) && (HPRatio() < 0.4 || lust100 > 70);
			}
			else { //Low rage - fight intelligently
				//Set choices in certain situations
				if (!hasStatusEffect(StatusEffects.AkbalFireUsed) && hasFatigue(20, FATIGUE_MAGICAL)) {
					terraFire();
					return;
				}
				if (!player.hasStatusEffect(StatusEffects.TrueWhispered) && hasFatigue(10, FATIGUE_MAGICAL) && cooldowns.psiAssault <= 0) {
					psiAssault();
					return;
				}
				if (playerActions.dodge >= 4 && hasFatigue(10, FATIGUE_MAGICAL)) {
					fireBreath();
					return;
				}
				if (playerActions.gotStunned == 0) {
					weightPunch = Math.max(0, 1 - playerActions.attemptStunned / 3);
					weightPsiAssault = Math.max(0.2, player.lust100 / 25 - 0.7); //Arbitrary numbers, chosen so 30% lust gives 0.5 weight and 70% gives ~2
				}
				weightFireBreath = playerActions.dodge;
				shouldFlyUp = !isFlying && hasStatusEffect(StatusEffects.AkbalHealUsed) && HPRatio() < 0.4;
				shouldHeal = !hasStatusEffect(StatusEffects.AkbalHealUsed) && (HPRatio() < 0.3 || lust100 > 70);
				if (shouldSwoop) {
					weightPunch = 0.1;
					weightClaw = 0.1;
				}
			}
			var actionChoices:MonsterAI = new MonsterAI();
			actionChoices.add(punch, weightPunch, shouldPunch, 0, FATIGUE_NONE, RANGE_MELEE);
			actionChoices.add(claw, weightClaw, shouldClaw, 0, FATIGUE_NONE, RANGE_MELEE);
			actionChoices.add(terraFire, weightTerraFire, shouldTerraFire, 20, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(fireBreath, weightFireBreath, shouldFireBreath, 10, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(psiAssault, weightPsiAssault, shouldPsiAssault, 10, FATIGUE_MAGICAL, RANGE_OMNI);
			actionChoices.add(superHeal, weightHeal, shouldHeal, 0, FATIGUE_NONE, RANGE_SELF);
			actionChoices.add(flyUp, weightFlyUp, shouldFlyUp, 10, FATIGUE_PHYSICAL, RANGE_SELF);
			actionChoices.add(swoop, weightSwoop, shouldSwoop, 15, FATIGUE_PHYSICAL, RANGE_MELEE_FLYING);
			actionChoices.exec();
		}

        override public function shouldMove(newPos:int,forceAction:Boolean = false):Boolean {
			if (flags[kFLAGS.AKBAL_FUCKERY] >= 5) { //Medium+ rage - no special logic
				return super.shouldMove(newPos,forceAction);
			}
 			else { //Low rage - move intelligently based on the PC's fighting methods
				if (isFlying) return false;
				var totalAttacks:int = playerActions.melee + playerActions.ranged + playerActions.magic;
				if (newPos == DISTANCE_DISTANT && (playerActions.melee >= totalAttacks / 3 || (playerActions.melee >= totalAttacks / 4 && player.weapon.getAttackRange() != RANGE_RANGED))) return true;
				if (newPos == DISTANCE_MELEE && player.canFly() && playerActions.gotStunned > 0 && player.damagePercent(false, false, false, true) > 80) return true;
				return false;
			}
       }

		override public function handleDamaged(damage:Number,apply:Boolean = true):Number{
			if (game.combat.damageType == game.combat.DAMAGE_PHYSICAL_MELEE || game.combat.damageType == game.combat.DAMAGE_MAGICAL_MELEE) playerActions.melee++;
			if (game.combat.damageType == game.combat.DAMAGE_PHYSICAL_RANGED || game.combat.damageType == game.combat.DAMAGE_MAGICAL_RANGED) playerActions.ranged++;
			if (game.combat.damageType == game.combat.DAMAGE_MAGICAL_MELEE || game.combat.damageType == game.combat.DAMAGE_MAGICAL_RANGED) playerActions.magic++;
			return damage;
		}

		override public function eAttack():void {
			if (rand(2) == 0) punch();
			else claw();
		}

		public function punch():void {
			var damage:Number = (str/2 + inte/2 + weaponAttack) * rageMod;
			var armorPen:Number = 50;
			var combatContainer:Object = {doDodge:true, doParry:true, doBlock:true, doFatigue:true};
			outputText("The Greater Demon's hand clenches into a fist, whipping green flames out as he charges forward to strike you!\n");
			if (playerAvoidDamage(combatContainer)) {
				playerActions.dodge++;
				return;
			}
			else outputText("His knuckles slam into you at a stunning force, knocking you back. ");
			playerActions.attemptStunned += 0.2;
			if (player.stun(1,20)) playerActions.gotStunned++;
			damage = player.reduceDamage(damage, this, armorPen);
			player.takeDamage(damage, true);
		}

		public function claw():void {
			var damage:Number = (str + weaponAttack) * rageMod;
			var armorPen:Number = 0;
			this.weaponName = "claws";
			this.weaponVerb = "claw";
			var combatContainer:Object = {doDodge:true, doParry:true, doBlock:true, doFatigue:true};
			outputText("Akbal's claw-like nails shine green as he leaps forward for a swipe.\n");
			if (playerAvoidDamage(combatContainer)) {
				playerActions.dodge++;
				return;
			}
			outputText("The claws rip into you before you have any chance to react. ");
			if (rand(2) == 0) player.bleed(this, 1+rand(4), 1+rand(2));
			damage = player.reduceDamage(damage, this, armorPen);
			player.takeDamage(damage, true);
		}

		public function terraFire():void {
			var damage:Number = player.reduceDamage((inte + 50) * rageMod, this, 80); //Base damage
			var doStun:Boolean = true;
			cooldowns.terraFire = 2;
			if (!hasStatusEffect(StatusEffects.AkbalFireUsed)) {
				createStatusEffect(StatusEffects.AkbalFireUsed,0,0,0,0);
				damage *= 1.5; //Higher damage the first time
				outputText("[say: Tell me, [name], do you know the meaning of 'terrestrial'?] Akbal steps forward, hands palm-forward with his fingers pointing at the ground. [say: It means... of the EARTH!] he shouts with a booming voice as streams of emerald light dart across the ground to you. There's no time to react before the ground shatters beneath you, knocking you down as green flames erupt all over. ");
				if (player.canFly()) { //Reduced damage and avoid stun
					damage *= 0.25;
					doStun = false;
					outputText("You leap as fast as you can, taking to the skies to escape the inferno. You land some distance off, wary that you may be safer staying off the ground for this fight. ");
				}
				else outputText("The inferno scalds your flesh, dealing frightening damage before you can stumble away. ");
			}
			else {
				outputText("Akbal plants his feet on the ground, sending jolts of emerald light through the earth. ");
				if (playerAvoidDamage({doDodge:true, doParry:false, doBlock:false})) {
					damage *= 0.25;
					doStun = false;
					outputText("You dash as fast as you possibly can to escape the seismic chaos that follows. ");
					playerActions.dodge++;
				}
				else {
					outputText("An instant later, the ground beneath your feet shatters and topples you into the rising flames! ");
				}
			}
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			player.takeDamage(damage, true);
			if (doStun) {
				playerActions.attemptStunned++;
				if (player.stun(1,100)) playerActions.gotStunned++;
			}
		}

		public function fireBreath():void {
			var damage:Number = player.reduceDamage((inte + rand(inte/2)) * rageMod, this, 100);
			outputText("Letting out a deep and ferocious roar, Akbal releases torrents of emerald fire from his throat.\n");
			var speedChoices:Array =  ["You narrowly avoid Akbal's fire!", "You dodge Akbal's fire with superior quickness!", "You deftly avoid Akbal's fire-breath."];
			var customOutput:Array = [
				"[SPEED]" + randomChoice(speedChoices),
				"[EVADE]Using your skills at evading attacks, you anticipate and sidestep Akbal's fire-breath.",
				"[MISDIRECTION]Using Raphael's teachings, you anticipate and sidestep Akbal's fire-breath.",
				"[FLEXIBILITY]Using your cat-like agility, you contort your body to avoid Akbal's fire-breath.",
				"[UNHANDLED]You manage to dodge Akbal's fire breath."];
			if (!playerAvoidDamage({doDodge:true, doParry:false, doBlock:false}, customOutput)) {
				outputText("Your flesh blisters and cracks as you're consumed by the flames.");
				game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
				player.takeDamage(damage, true);
			}
			outputText("\nThe ground he scorched remains consumed in flames! You have less room to maneuver now.");
			if (player.hasStatusEffect(StatusEffects.AkbalFlameDebuff)) player.addStatusValue(StatusEffects.AkbalFlameDebuff,1,1);
			else player.createStatusEffect(StatusEffects.AkbalFlameDebuff, 1, 0, 0, 0);
			playerActions.dodge = 0;
		}

		public function psiAssault():void {
			var damage:Number = (inte/10 + rand(inte/10) - player.inte/10) * (1 + player.lib100 / 200);
			cooldowns.psiAssault = 3;
			damage *= (rageMod + 1) / 2; //Lust gets half the rage boost
			outputText("Akbal holds back a moment and time seems to slow down as his eyes shut. They open once more and all you see are his emerald irises shimmering in a black void. Shrill screams echo through your head and Akbal's soothing voice somehow comes out clear.");
			outputText("\n[say: Bow to your God.]");
			outputText("\nYour chest feels heavy and breathing gets harder.");
			if (player.hasStatusEffect(StatusEffects.TrueWhispered)) player.createStatusEffect(StatusEffects.Whispered,0,0,0,0);
			else player.createStatusEffect(StatusEffects.TrueWhispered,0,1,0,0);
			player.takeLustDamage(damage, true);
		}

		public function superHeal():void {
			outputText("The Greater Demon takes a few steps back, feeling the damage adding up. He glares in fury at you.");
			outputText("[say: I am the God of the Terrestrial Fire. I was among the first to ascend. You will not stand in my way!]");
			outputText("Akbal's flesh shimmers as if you're looking at a mirage; soon his wounds fade away without a trace, and a burst of green flames cleanses and purifies his body, returning him to peak condition.");
			HP = maxHP();
			lust = 0;
			fatigue = 0;
			for each (var badStatus:StatusEffectType in StatusEffects.monsterNegativeEffects) {
				if (indexOfStatusEffect(badStatus) != -1) removeStatusEffect(badStatus);
			}
			rageMod += 0.3;
			createStatusEffect(StatusEffects.AkbalHealUsed,0,0,0,0);
		}

		public function swoop():void {
			var damage:Number = player.reduceDamage((str + spe + weaponAttack) * rageMod, this, 70);
			cooldowns.swoop = 2;
			outputText("Akbal propels himself toward you with a powerful beat of his wings. You ready yourself to dodge, ");
			if (player.hasStatusEffect(StatusEffects.TrueWhispered)) outputText("but the throbbing of your head locks you in place! The demon's hefty form slams into you, sending you back to the ground." + (game.silly() ? " Akbal holds himself up in the sky as he looks down on you. [say: You were not prepared!]" : ""));
			else if (combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed) {
				outputText("and manage to narrowly avoid his strike as he passes.");
				playerActions.dodge++;
				return;
			}
			outputText("only to find his fist square in your chest before you can react. You hurdle to the ground in pain.");
			playerActions.attemptStunned += 0.5;
			if (player.stun(1,50)) playerActions.gotStunned++;
			if (rand(2) == 0) player.bleed(this, 1+rand(4), 1+rand(2));
		}

		public function flyUp():void {
			outputText("Akbal frowns as his wounds continue to build, and he suddenly leaps into the air, held aloft with his powerful wings.");
			outputText("/nHe keeps a cautious distance as he glares down at you, his eyes burning with rage.");
			rageMod += 0.3;
			fly();
			createStatusEffect(StatusEffects.PermaFlyStatus,0,0,0,0);
		}

		public function AkbalUnsealed() {
			this.a = "";
			this.short = "Akbal";
			this.long = "Akbal stands nearly 8 feet tall, staring " + (player.tallness < 94 ? "down " : "") + "at you with those familiar emerald eyes. His flesh is a deep and dark red, with well-defined muscles. His wings extend out several feet, impressively tall and wide just as he himself is. His face is haughty and self-assured, cleanly shaved, and topped with several feet of silky-smooth black hair and two long demonic horns. He fancies himself a god, and certainly looks like the type who would think such a thing. His arms are tattooed with emerald-glowing horizontal lines, relative to a resting angle, three on each arm. His fingers are all tipped with dark, off-white, claw-like nails. Snaking out behind him is a thick and pointed demonic tail. His only clothing is an animal-hide loin cloth, perhaps a stylistic choice from Fera.";
			this.imageName = "akbalUnsealed";
			this.race = "Demon";
			this.createCock(15,2.5,CockTypesEnum.DEMON);
			this.balls = 2;
			this.ballSize = 4;
			this.tallness = 95;
			this.createBreastRow();
			this.hips.rating = Hips.RATING_SLENDER;
			this.butt.rating = Butt.RATING_TIGHT;
			this.skin.tone = "dark red";
			this.hair.color = "black";
			this.hair.length = 36;
			this.wings.type = Wings.DRACONIC_LARGE;
			initStrTouSpeInte(120, 120, 150, 150);
			initLibSensCor(50, 50, 100);
			this.weaponName = "fist";
			this.weaponVerb = "punch";
			this.weaponAttack = 30;
			this.armorName = "demonic skin";
			this.armorDef = 30;
			this.bonusHP = 1500;
			this.bonusLust = 100;
			this.lustVuln = 0.2;
			this.level = 30;
			this.gems = Math.round((500 + rand(100)) * (1 + 0.15 * flags[kFLAGS.AKBAL_FUCKERY]));
			this.additionalXP = 1000 * (1 + 0.1 * flags[kFLAGS.AKBAL_FUCKERY]);
			this.createPerk(PerkLib.BlindImmune, 0, 0, 0, 0);
			this.createPerk(PerkLib.Resolute, 0, 0, 0, 0);
			this.createPerk(PerkLib.SpeedyRecovery,0,0,0,0);
			this.createPerk(PerkLib.Frustration,0,0,0,0);
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}


code:
//Written by Satan
//Implementation started on 13/4/18

package classes.Scenes.Areas.Forest
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.BodyParts.Butt;
	import classes.GlobalFlags.kFLAGS;
	import classes.internals.*;
	import classes.StatusEffects.Combat.WebDebuff;
	import classes.Player;
	import classes.Scenes.Combat.CombatAttackData;

	public class Alice extends Monster
	{
		//Illusion
		//Only cast at range, gives chance to negate covering distance + lower speed
		//resisted with intelligence
		//status effect and application methodology lifted wholesale from AbstractSpiderMorph (all it does is lower your speed)
		private function aliceIllusion():void
		{
			outputText("The Alice attempts to maintain a distance while seeming to mutter something under her breath.\n\n");
			//copying Kitsune resist methodology
			var resist:int = 0;
			if (player.inte < 30) resist = Math.round(player.inte);
			else resist = 30;
			if (player.findPerk(PerkLib.Whispered) >= 0) resist += 20;
			if ((player.isReligious()) && player.isPureEnough(20)) resist += 20 - player.corAdjustedDown();
			if (rand(100) > resist) { //get hit
				//need to also put in a distancing technique
				var web:WebDebuff = player.statusEffectByType(StatusEffects.Web) as WebDebuff;
				if (web == null) {
					if (player.weapon == weapons.BLUNDER|| player.weapon == weapons.FLINTLK)
						outputText("You fire a shot, hoping to interrupt her, ");
					else
						outputText("You charge forward with your " + player.weaponName + " to catch her, ");
					outputText("yet she seems to move so much faster suddenly. Or perhaps you're slower?\n");
					web = new WebDebuff();
					player.addStatusEffect(web);
				}
				else {
					outputText("The Alice seems to gain even more speed than before!"); // writecheck
				}
				web.increase();
			}
			else { //resist
				outputText("You feel momentarily like you're moving through jelly, but you wince your eyes and resist whatever illusory spell she's chanted.");
			}

		}

		//Arousal Magic, slightly weaker than Kitsune Arouse
		private function aliceArouse():void
		{
			outputText("With a series of arcane gestures, her hands begin to glow faintly. Your knees quiver as a warmth builds in your nethers.");
			var lustDmg:int = 15 + player.sens / 10;
			player.takeLustDamage(lustDmg, true);
			if (!hasStatusEffect(StatusEffects.LustAura)) createStatusEffect(StatusEffects.LustAura, 0, 0, 0, 0);
		}

		//Tease Texts:
		//should option 2 be the run away?
		private function aliceTeases():void
		{
			var select:int = rand(3);
			if (select == 0) outputText("The Alice shyly looks away and she pulls the skirt of her dress up, revealing her tights-clothed thighs and white panties.");
			else if (select == 1) outputText("The Alice tosses her hands up onto her head in fear, shouting [say: P-please don't hurt me! I'm only a little girl, b-but I swear I can make you feel good if you won't hurt me.] She stares up at you with puppy-eyes.");
			else if (select == 2) outputText("As the Alice dashes away from you, her tail flicks upwards, showing her cute little panties.");
			else outputText("Seeming to trip, the Alice falls over while trying to keep away from you. She lands flat on her face, with her perfect heart-shaped butt up and directed right at you. The appealing scene distracts you from taking advantage of the blunder.");
			var lustDmg:int = 5 + player.sens / 10;
			player.takeLustDamage(lustDmg, true);
		}

		//action AI engine, should have two states, distance far and distance melee
		//needs implementation of double state
		override protected function performCombatAction():void
		{
			var distanced:Boolean = (distance == CombatAttackData.DISTANCE_DISTANT);

			var actionChoices:MonsterAI = new MonsterAI()
				.add(aliceIllusion, distanced?3:1, true, 10, FATIGUE_MAGICAL,RANGE_RANGED);
			actionChoices.add(aliceTeases, 2, true, 0, FATIGUE_NONE, RANGE_TEASE);
			actionChoices.add(aliceArouse, hasStatusEffect(StatusEffects.LustAura)?2:4, true, 10, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(eAttack, 0.5, true, 0, FATIGUE_NONE, RANGE_MELEE); // rare physical attack
			actionChoices.exec();
		}

		//Start taking distance earlier
		override public function initiativeValue():int {
			return super.initiativeValue() * 3;
		}

		override public function get onPcRunAttempt():Function {
			if (_onPcRunAttempt == null) return function ():void {
				clearOutput();
				outputText("The Alice doesn't even try to stop you from running, and you can see a relieved look on her face when you look back after gaining some distance.");
				game.combat.doRunAway();
			}
			else return _onPcRunAttempt;
		};

		//HP Victory win scene
		override public function defeated(hpVictory:Boolean):void
		{
			game.forest.aliceScene.aliceWin();
		}

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

		public function Alice(hairColor:String, skinTone:String, eyeColor:String, panties:String = "white")
		{
			this.a = "the ";
			this.short = "Alice";
			this.long = "This physically immature succubus has a gentle face with " + ({
				"blue": "blue",
				"green": "green",
				"hazel": "hazel",
				"brown": "brown"
				}[eyeColor]) + " eyes and " + ({
					"blonde": "long flaxen",
					"black": "long, pure black",
					"red": "slightly curly red",
					"auburn": "wavy copper",
					"brown": "plain brown",
					"bronze": "long bronze colored"
					}[hairColor]) +
				" hair. Her skin is " + ({
					"milky-white": "milky-white",
					"fair": "fair",
					"olive": "a warm olive tone",
					"dark": "dark",
					"ebony": "the color of fine ebony",
					"mahogany": "a rich mahogany tone",
					"russet": "russet-brown"
					}[skinTone]) + " and her figure is petite yet adorably soft. The top of her forehead is adorned with two short horns, only visible now that you've shaken her influence from you. She wears a rather classy dress complete with a white blouse, navy-dark and red plaid skirt, and a red bow around her shirt's collar. Her legs are covered by white stockings" + ({
					"white": " complete with panties of the same color",
					"striped": ", the stripes on her panties showing through the sheer material",
					"black": " that contrast sharply with the lacy black panties showing through from beneath them"
					}[panties]) + ". Her feet are covered by flat mary-jane shoes. Behind her are two small bat-like wings and a spaded tail.";
			this.race = "Demon";
			this.createVagina(false, Vagina.WETNESS_SLICK, Vagina.LOOSENESS_NORMAL);
			createBreastRow(Appearance.breastCupInverse("A"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_NORMAL;
			this.tallness = 50;
			this.hips.rating = Hips.RATING_BOYISH;
			this.butt.rating = Butt.RATING_TIGHT;
			this.skin.tone = skinTone;
			this.hair.color = hairColor;
			this.hair.length = 22;
			initStrTouSpeInte(20, 20, 45, 50);
			initLibSensCor(60, 65, 100);
			this.weaponName = "fists";
			this.weaponVerb="punch";
			this.armorName = "skin";
			this.bonusHP = 80;
			this.lust = 20;
			this.lustVuln = 0.9;
			this.temperment = TEMPERMENT_LUSTY_GRAPPLES;
			this.level = 6;
			this.gems = rand(8) + 8;
			this.drop = new WeightedDrop().add(consumables.LOLIPOP, 2).add(consumables.SDELITE, 3).add(null, 5);
			this.tail.type = Tail.DEMONIC;
			checkMonster();
		}
	}
}


code:
package classes.Scenes.Areas.Forest
{
	import classes.Monster;
	import classes.PerkLib;
	import classes.StatusEffects;

	/**
	 * This class contains code and text that are shared between Aiko and Yamata.
	 */
	public class BaseKitsune extends Monster
	{
		protected static const PHYSICAL_SKILL:String = "physical";
		protected static const MAGICAL_SKILL:String = "magical";

		protected static const SEAL_ATTACK:int = 0;
		protected static const SEAL_TEASE:int = 1;
		protected static const SEAL_SPELLS:int = 2;
		protected static const SEAL_ITEMS:int = 3;
		protected static const SEAL_MOVEMENT:int = 4;
		protected static const SEAL_PHYSICAL:int = 5;
		protected static const SEAL_MAGICAL:int = 6;

		//The seals this kitsune can use
		protected var sealTypes:Array = [SEAL_ATTACK, SEAL_TEASE, SEAL_SPELLS, SEAL_ITEMS, SEAL_MOVEMENT, SEAL_PHYSICAL, SEAL_MAGICAL];

		public function BaseKitsune() {
			super();
		}

		/**
		 * Calculate the resist value for attacks. This is based on INT and modified by certain perks.
		 * @return the calculated resist value
		 */
		protected function calculateAttackResist():int {
			var resist:int = 0;
			resist += Math.min(player.inte/2, 40);
			if (player.hasPerk(PerkLib.Whispered)) resist += 20;
			if (player.isReligious() && player.isPureEnough(20)) resist += 20 - player.corAdjustedDown();
			if (player.hasPerk(PerkLib.EnlightenedNinetails) || player.hasPerk(PerkLib.CorruptedNinetails)) resist += 30;
			return resist;
		}

		/**
		 * Seal the player's attacks, rendering them unable to attack until it wears off.
		 */
		protected function sealPlayerAttack():void {
			outputText("[Themonster] playfully darts around you, grinning coyly.  [Monster.pronoun1] somehow slips in under your reach, and before you can react, draws a small circle on your chest with [monster.pronoun3] fingertip.  As you move to strike again, the flaming runic symbol [monster.pronoun1] left on you glows brightly, and your movements are halted mid-swing.");
			outputText("[pg][say: Naughty naughty, you should be careful with that.]");
			outputText("[pg]Despite your best efforts, every time you attempt to attack [monster.pronoun2], your muscles recoil involuntarily and prevent you from going through with it.  The kitsune's spell has sealed your attack!  You'll have to wait for it to wear off before you can use your basic attacks.");
			player.createStatusEffect(StatusEffects.Sealed, 4, 0, 0, 0);
		}

		/**
		 * Seal the players physical special attacks. Prints text and creates the matching status effect.
		 */
		protected function sealPlayerPhysicalSpecialSkills():void {
			sealPlayerSpecial(PHYSICAL_SKILL);
		}

		/**
		 * Seal the players magical special attacks. Prints text and creates the matching status effect.
		 */
		protected function sealPlayerMagicSpecialSkills():void {
			sealPlayerSpecial(MAGICAL_SKILL);
		}

		/**
		 * Seals the players special skill. Prints the matching text and applies a status effect.
		 * @param	skillType the type of skill to seal (physical, magical)
		 * @throws ArgumentError if the selected skill is invalid
		 */
		private function sealPlayerSpecial(skillType:String):void {
			outputText("You jump with surprise as the kitsune appears in front of you, grinning coyly.  As [monster.pronoun1] draws a small circle on your forehead with [monster.pronoun3] fingertip, you find that you suddenly can't remember how to use any of your " + skillType + " skills!");
			outputText("[pg][say: Oh no darling, I'm the one with all the tricks here.]");
			outputText("[pg]The kitsune's spell has sealed your " + skillType + " skills!  You won't be able to use any of them until the spell wears off.");
			if (skillType === PHYSICAL_SKILL) player.createStatusEffect(StatusEffects.Sealed, 4, 5, 0, 0);
			else if (skillType === MAGICAL_SKILL) player.createStatusEffect(StatusEffects.Sealed, 4, 6, 0, 0);
		}

		/**
		 * Seals the players ability to use the tease skill.
		 */
		protected function sealPlayerTease():void {
			outputText("You are taken by surprise when the kitsune appears in front of you out of nowhere, trailing a fingertip down your chest.  [Monster.pronoun1] draws a small circle, leaving behind a glowing, sparking rune made of flames.  You suddenly find that all your knowledge of seduction and titillation escapes you.  The kitsune's spell has sealed your ability to tease!  Seems you won't be getting anyone hot and bothered until it wears off.");
			player.createStatusEffect(StatusEffects.Sealed, 4, 1, 0, 0);
		}

		/**
		 * Seals the players ability to use items during combat.
		 */
		protected function sealPlayerItems():void {
			outputText("[say: Tsk tsk, using items?  That's cheating!] the kitsune says as [monster.pronoun1] appears right in front of you, taking you off guard.  [Monster.pronoun3] finger traces a small circle on your [inv], leaving behind a glowing rune made of crackling flames.  No matter how hard you try, you can't seem to pry it open.  The kitsune's spell has sealed your [inv]!  Looks like you won't be using any items until the spell wears off.");
			player.createStatusEffect(StatusEffects.Sealed, 4, 3, 0, 0);
		}

		/**
		 * Seals the players spells, preventing them from using magic.
		 */
		protected function sealPlayerSpells():void {
			outputText("[say: Oh silly, trying to beat me at my own game are you?]  the kitsune says with a smirk, surprising you as [monster.pronoun1] appears right in front of you.  [Monster.pronoun1] traces a small circle around your mouth, and you find yourself stricken mute!  You try to remember the arcane gestures to cast your spell and find that you've forgotten them too.  The kitsune's spell has sealed your magic!  You won't be able to cast any spells until it wears off.");
			player.createStatusEffect(StatusEffects.Sealed, 4, 2, 0, 0);
		}

		/**
		 * The player resists the seal attempt.
		 */
		protected function resistSeal():void {
			outputText("[pg]Upon your touch, the seal dissipates, and you are free of the kitsune's magic!  [Monster.pronoun1] pouts in disappointment, looking thoroughly irritated, but quickly resumes [monster.pronoun3] coy trickster facade.");
			player.removeStatusEffect(StatusEffects.Sealed);
		}

		/**
		 * Seal the players movements, preventing them from escaping.
		 */
		protected function sealPlayerMovement():void {
			outputText("[say: Tsk tsk, leaving so soon?] the kitsune says, popping up in front of you suddenly as you attempt to make your escape.  Before you can react, [monster.pronoun1] draws a small circle on your chest with [monster.pronoun3] fingertip, leaving behind a glowing rune made of crackling blue flames.  You try to run the other way, but your [legs] won't budge![pg][say: Sorry baby, you'll just have to stay and play~.] [monster.pronoun1] says in a singsong tone, appearing in front of you again.  The kitsune's spell prevents your escape!  You'll have to tough it out until the spell wears off.");
			player.createStatusEffect(StatusEffects.Sealed, 4, 4, 0, 0);
		}

		/**
		 * Cancels and disables whatever command the player uses this round. Lasts 3 rounds, cannot seal more than one command at a time.
		 * PCs with "Religious" background and < 20 corruption have up to 20% resistance to sealing at 0 corruption, losing 1% per corruption.
		 */
		protected function kitsuneSealAttack(type:int = -1):void {
			var resist:int = calculateAttackResist();
			var select:int = (type >= 0 ? type : randomChoice(sealTypes));

			switch (select) {
				case SEAL_ATTACK:
					sealPlayerAttack();
					break;
				case SEAL_TEASE:
					sealPlayerTease();
					break;
				case SEAL_SPELLS:
					sealPlayerSpells();
					break;
				case SEAL_ITEMS:
					sealPlayerItems();
					break;
				case SEAL_MOVEMENT:
					sealPlayerMovement();
					break;
				case SEAL_PHYSICAL:
					sealPlayerPhysicalSpecialSkills();
					break;
				case SEAL_MAGICAL:
					sealPlayerMagicSpecialSkills();
					break;
			}
			if (resist >= rand(100)) resistSeal();
		}
	}
}