code:
/**
 * TellyProgrammed by Koraeli on 2018.12.17
 *
 * I apologise for nothing.
 */
package classes.Scenes.Places.Bazaar {
	import classes.*;
	import classes.GlobalFlags.*;
	import classes.StatusEffects.*;
	import classes.saves.*;
	import classes.display.ImageDb;
	import classes.BodyParts.Tail;

	public class Telly extends BazaarAbstractContent implements SelfSaving {

		public function Telly() { SelfSaver.register(this); }

		/*tellyWords in need of a use:
			tellyPort
			tellyVangelism
			tellyCommute
			tellyDildonics
			TellyNovella
			tellyPhone
			tellyThon
			saTellyLite
			inTellyGence (and variations)
			floaTelly
			moderaTelly
			(im)poliTelly
			delicaTelly
			resoluTelly
			definiTelly
			digiTelly
			ultimaTelly
			immorTelly
			bruTelly
			immediaTelly
			storyTellyEr
			casTellyLan
			consTellyAtion
			reTellyAtion
			obstinaTelly
			tellySman
			tellyBan
			tellyOn
			approximaTelly
			(un)fortunaTelly
			illiteraTelly
			hospiTelly
			recTelly
			menTally
			anecdoTelly
			faTelly(Ty)
			toTelly
			elemenTelly
			tellyMud
			oreinTelly
			skeleTelly
			baTellyOn
			iTellyAn
			horizonTelly
			accidenTelly
			monumenTelly
			capiTellySm
			fundamenTelly
			detrimenTelly
			experimenTelly
			tellyEsin
			caTellyOgue
			dirTelly
			ferTellyTy
			uTellyTy
		*/

		//Store tellyVariables
		private var tellyMetry:Object = {
			tellyGenesis: false, //met Telly
			tellyOphile: 0, //Telly Chats
			tellyTubby: "purple", //Facepaint color
			tellyGraph: "butterfly", //Facepaint type
			tellyCardiogram: 0, //Tracks what Telly is doing in the shop
			tellyTimer: 0, //Time of last random rolls
			tellyGram: 0, //Number of times chatted per visit
			tellyCommand: 0, //Tracks if Telly is disabled for the day (by setting it to the current day)
			tellyPlasmed: false, //Tracks if you've bought candy
			vesTelly: 0, //Tracks if you've hugged Telly this hour
			tasTelly: 0, //Tracks this stupid fucking peach
			experimenTelly: 0 //Tracks Drake's Heart stuff
		};

		public function get tellyGenesis():Boolean { return tellyMetry.tellyGenesis; }
		public function set tellyGenesis(tellySet:Boolean):void { tellyMetry.tellyGenesis = tellySet; }
		public function get tellyOphile():int { return tellyMetry.tellyOphile; }
		public function set tellyOphile(tellySet:int):void { tellyMetry.tellyOphile = tellySet; }
		public function get tellyTimer():Number { return tellyMetry.tellyTimer; }
		public function set tellyTimer(tellySet:Number):void { tellyMetry.tellyTimer = tellySet; }
		public function get tellyCardiogram():int { return tellyMetry.tellyCardiogram; }
		public function set tellyCardiogram(tellySet:int):void { tellyMetry.tellyCardiogram = tellySet; }
		public function set tellyTubby(tellySet:String):void { tellyMetry.tellyTubby = tellySet; }
		public function set tellyGraph(tellySet:String):void { tellyMetry.tellyGraph = tellySet; }
		public function get tellyScope():String { return tellyMetry.tellyTubby + " " + tellyMetry.tellyGraph; }
		public function get tellyGram():int { return tellyMetry.tellyGram; }
		public function set tellyGram(tellySet:int):void { tellyMetry.tellyGram = tellySet; }
		public function get tellyCommand():int { return tellyMetry.tellyCommand; }
		public function set tellyCommand(tellySet:int):void { tellyMetry.tellyCommand = tellySet; }
		public function get tellyPlasmed():Boolean { return tellyMetry.tellyPlasmed; }
		public function set tellyPlasmed(tellySet:Boolean):void { tellyMetry.tellyPlasmed = tellySet; }
		public function get vesTelly():int { return tellyMetry.vesTelly; }
		public function set vesTelly(tellySet:int):void { tellyMetry.vesTelly = tellySet; }
		public function get tasTelly():int { return tellyMetry.tasTelly; }
		public function set tasTelly(tellySet:int):void { tellyMetry.tasTelly = tellySet; }
		public function get experimenTelly():int { return tellyMetry.experimenTelly; }
		public function set experimenTelly(tellySet:int):void { tellyMetry.experimenTelly = tellySet; }

		public const TELLYPATH:int = 4; //Bazaar button index

		private var tellyCommerce:Array; //Can't populate it yet because CoC hasn't been initialised.

		//Facepaint colors
		public const tellyTubbies:Array = ["red", "blue", "pink", "purple", "yellow", "magenta", "green"];
		//Facepaint types
		public const tellyGraphs:Array = ["butterfly", "heart", "star", "flower", "cluster of hearts", "shooting star", "winged-heart", "snowflake"];
		//Toys & Treats

		public const TELLYPROCESSING:int = 0; //Item or function
		public const TELLYNYM:int = 1; //Button name
		public const TELLYPAYMENT:int = 2; //Price
		public const TELLYPROMPT:int = 3; //Item buy text
		public const TELLYPHOTOS:Array = ["butterfly", "flower", "heart", "star", "skull"];

		public const TELLYCOM1:int  =  1 << 1; //Telly chats
		public const TELLYCOM2:int  =  1 << 2;
		public const TELLYCOM3:int  =  1 << 3;
		public const TELLYCOM4:int  =  1 << 4;
		public const TELLYCOM5:int  =  1 << 5;
		public const TELLYCOM6:int  =  1 << 6;
		public const TELLYCOML:int  =  1 << 7; //Asked about selling Liddellium
		public const TELLYCOMB:int  =  1 << 8; //Gave bear
		public const TELLYCOM7:int  =  1 << 9; //Chat expansion!
		public const TELLYCOM8:int  = 1 << 10;
		public const TELLYCOM9:int  = 1 << 11;
		public const TELLYCOM10:int = 1 << 12;
		public const TELLYCOM11:int = 1 << 13;
		public const TELLYCOM12:int = 1 << 14;
		public const TELLYCOM13:int = 1 << 15;
		public const TELLYCOM14:int = 1 << 16;
		public const TELLYCOM15:int = 1 << 17;
		public const TELLYCOM16:int = 1 << 18;
		public const TELLYCOM17:int = 1 << 19;
		public const TELLYCOM18:int = 1 << 20;
		public const TELLYCOM19:int = 1 << 21;
		public const TELLYCOM20:int = 1 << 22;
		public const TELLYCOM21:int = 1 << 23;
		public const TELLYCOM22:int = 1 << 24;
		public const TELLYCOMK:int  = 1 << 25; //Kitsuned fluffy tail
		public const TELLYCOMP:int  = 1 << 26; //Gave peach
		public const TELLYCOMA:int  = 1 << 27; //Gave abyssal shard
		public const TELLYCOMH:int  = 1 << 28; //Unlocked hugging
		public const TELLYCOMD:int  = 1 << 29; //Gave Drake's Heart

		//Roll random facepaint
		public function tellyGenic():void {
			if (!tellyGenesis) {
				tellyTubby = "purple";
				tellyGraph = "butterfly";
			}
			else if (time.days > tellyTimer) {
				tellyTubby = randomChoice(tellyTubbies);
				tellyGraph = randomChoice(tellyGraphs);
			}
			if ((time.days + time.hours/24) > tellyTimer) tellyCardiogram = rand(3);
			tellyTimer = time.days + time.hours/24;
		}

		//Visibility and entry from the bazaar
		public function tellyPresence(makeButton:Boolean = false):void {
			//Business hours
			var tellyBusiness:Boolean = time.hours >= 6 && time.hours < 18;
			if (makeButton) {
				addButton(TELLYPATH, "TT&T", tellyMarket).hint("A small wagon covered in bright decorations.");
				if (!tellyBusiness) {
					if (tellyGenesis) button(TELLYPATH).disable("Telly's wagon doesn't appear to be around at the moment.\n(Hours of operation: 6am to 6pm)")
					else button(TELLYPATH).hide();
				}
				if (tellyCommand == time.days) {
					if (tellyGenesis) button(TELLYPATH).disable("Telly isn't available right now.");
					else button(TELLYPATH).hide();
				}
			}
			else if (tellyBusiness) outputText("[pg]Another of the wagons bears a sign indicating it as \"Telly's Toys & Treats!\" The wagon itself is notably smaller than the others, painted pink with clusters of yellow stars near the corners. Although lacquered and painted well enough, there's a hint of amateur renovation to it.");
		}

		//Enter shop
		public function tellyMarket(tellyStasis:Boolean = false):void {
			clearOutput();
			imageSelect(null);
			tellyGenic();
			var tellyOlogy:int = time.hours % 3;
			if (!tellyGenesis) { //First meeting
				tellyGenesis = true;
				outputText("The inside of Telly's Toys & Treats is just as colorful as its outside. On the right side there are two windows overlooking a number of boxes and drawers presumably containing excess stock or personal items, while the left side has an array of shelves being lit by the aforementioned windows. The lowest shelves hold jars of many colorful candies; the higher shelves have toys and stuffed animals, all labeled and priced. Behind the doodle-covered counter sits a small blonde girl with hazel eyes and a purple butterfly painted on her cheek, seeming to be stitching something together. You're about to question what such an innocent-looking child is doing in this place before you notice small horns poking through her hair. " + (flags[kFLAGS.CODEX_ENTRY_ALICE] ? "An Alice?" : "A demon?"));
				outputText("[pg]The girl glances up from her work and notices you, her eyes lighting up instantly. [say: A customer! Finally!] She hops up from her seat excitedly and moves around the counter to meet you. Her dress appears to consist entirely of frills and lace as far as you're able to discern, and she seems to stand just under four feet. She reaches out and grabs hold of your hand, shaking it before you have a chance to react. [say: Welcome to Telly's Toys & Treats! I'm Telly, I sell toys and treats!]");
				outputText("[pg]You retract your hand quickly, no less wary of demons when they look so innocent. Telly giggles and tells you, [say: I'm not going to hurt you, [mister]. I may be an Alice, but I'm quite happy with my life as a merchant! And let me tell you: hurting you would probably make my life here a lot more complicated; even if the guards didn't care, the other shopkeeps sure would! So you're safe with me, cross my heart!] She stands proudly, putting a hand to her chest. As much as trusting a demon sounds like a bad idea, she does make a good point. Hurting you wouldn't do much for her if she's just trying to make a living.");
				unlockCodexEntry(kFLAGS.CODEX_ENTRY_ALICE);
				outputText("[pg]The girl returns to her counter to continue stitching together what looks like a stuffed wolf. [say: So, would you like to buy something?]");
			}
			else {
				if (time.days > experimenTelly && experimenTelly != 0) {
					outputText("As you [walk] into Telly's shop, the little demoness jumps to her feet. [say: [Mister]!] she exclaims, rushing to greet you.");
					outputText("[pg]You return her greeting, and she begins to shiver with excitement. [say: [Mister], I made something for you!] Telly sprints behind her counter, retrieving something. In moments, she carries back a pastry roll. She offers it enthusiastically, eager to see your reaction. The dough is arranged in such a way that it bulges out with various wavy ruffles, appearing almost like a rose. It's covered in a layer of tan frosting. Unable to deny her, you take a bite.");
					outputText("[pg]Immediately you are hit with the taste of cinnamon, vanilla, and butterscotch. It's sweet and savory, with that lingering hint of butter and sugar, and somehow fills you with vitality. Telly, incapable of waiting for your assessment, begins to explain the treat. [say: Flowers wilt, and I knew there was something special I could do with a Drake's Heart, so I made a butterscotch sauce!]");
					outputText("[pg]Her thin, purple tail swings back and forth with a level of unbridled joy that only a child could muster. The pastry is delicious, you cannot deny that, if perhaps too sweet for some. You thank Telly for the present.");
					outputText("[pg][say: I'm happy to share the fruits from such an exotic gift,] she says. [say: Would you like anything else while you're here, [mister]?]");
					if (player.hasStatusEffect(StatusEffects.DragonBreathCooldown)) player.removeStatusEffect(StatusEffects.DragonBreathCooldown);
					player.changeFatigue( -player.fatigue);
					player.refillHunger(20);
					experimenTelly = 0;
				} else {
					outputText("The inside of Telly's Toys & Treats is just as colorful as its outside. On the right side there are two windows overlooking a number of boxes and drawers presumably containing excess stock or personal items, while the left side has an array of shelves being lit by the aforementioned windows. The lowest shelves hold jars of many colorful candies; the higher shelves have toys and stuffed animals, all labeled and priced. ");
					if (tasTelly == time.days * 100 + time.hours) outputText("Telly sits happily behind her counter, still munching on the peach you gave her.");
					else if (experimenTelly == time.days) outputText("Telly sits behind her counter, happily humming away with her new Drake's Heart on display beside her.");
					else switch (tellyCardiogram) {
						case 0:
							outputText("Behind the doodle-covered counter sits Telly, the perky blonde Alice.");
							break;
						case 1:
							outputText("Sitting on a bed a short distance behind the counter is Telly, fiercely cuddling one of her stuffed toys with all her might.");
							break;
						case 2:
							outputText("Playfully drawing more hearts onto her counter is Telly.");
							break;
					}
					if (!tellyStasis) {
						outputText(" She glances up at you and smiles. [say: Welcome back to Telly's Toys & Treats! I'm Telly, I sell toys and treats! What are you interested in today, [mister]?]");
						tellyGram = 0; //Resets chats
					}
				}
			}
			if (tellyStasis) tellyShopping();
			else tellyCopy();
		}

		//Build main menu
		public function tellyCopy():void {
			menu();
			addButton(0, "Buy", tellyShopping);
			addButton(1, "Appearance", tellyVision);
			addButton(2, "Talk", tellySurvey).hint("She seems friendly, how about a chat?");
			addButton(14, "Leave", bazaar.enterTheBazaarAndMenu);
		}

		//Build buy menu
		public function tellyShopping():void {
			tellyCommerce = [
				[consumables.LOLIPOP, "Lolipop", 300, "You check out a jar of hard candy-topped sticks labeled [say: Lolipops!] with a warning sign attached under the label. Telly chimes in to explain with almost musical cadence, [say: They're bright and sweet, like me! Take too many and you'll look like me too![if (ischild)  Or, actually, might not make much difference in your case.] 300 gems if you're still interested.]"],
				[consumables.NUMBROX, "NumbRox", 60, "You check out a shelf lined with packets of tiny candy pieces. [say: Those are Numb Rocks,] Telly explains, [say: they taste like sparkles! 60 gems for a pack.]"],
				[tellyPlasm, "Candies", 3, ""],
				[tellyBear, "TeddyBear", 50, ""],
				[useables.RBRBALL, "R. Ball", 10, "You examine a plastic jar, finding numerous purple balls in it. Telly chimes in, [say: Those are bouncy balls, [mister]!] She hops back and forth as she explains, [say: You throw them and they bounce off!] Playful, though a bit dangerous perhaps. [say: 10 gems each!]"],
				[tellyPhoto, "FacePaint", 5]
			];

			if ((tellyOphile & TELLYCOMH) != 0) tellyCommerce.push([viTellyTy, "Hug", 1, "Another hug would brighten your day. Of course, you'll pay her 20 gems for the service."]);

			menu();
			addButton(14, "Back", tellyCopy);
			for (var tellyGuidance:int = 0; tellyGuidance < tellyCommerce.length; tellyGuidance++) tellyLens(tellyCommerce[tellyGuidance]);
		}

		//Make shop button
		public function tellyLens(tellyAnalysis:Array):void {
			var tellyNym:String = tellyAnalysis[TELLYNYM];
			var tellyPayment:int = tellyAnalysis[TELLYPAYMENT];
			var tellyConverter:* = tellyAnalysis[TELLYPROCESSING];
			var tellyProcessing:Function = (tellyConverter is Function) ? tellyConverter : curry(tellySales, tellyAnalysis);
			addNextButton(tellyNym, tellyProcessing).hint((tellyConverter is Function) ? tellyAnalysis[TELLYPROMPT] : "").disableIf(player.gems < tellyPayment, tellyPayment > 1 ? "You need "+tellyPayment+" gems." : "You don't have anything to pay her.");
		}

		//Buy item
		public function tellySales(tellyAnalysis:Array):void {
			var tellyPrompter:String = tellyAnalysis[TELLYPROMPT];
			clearOutput();
			outputText(tellyPrompter + "[pg]");
			doYesNo(curry(tellyKinesis, tellyAnalysis), curry(tellyMarket, true));
		}

		//Confirm buy
		public function tellyKinesis(tellyAnalysis:Array):void {
			var tellyChoice:ItemType = tellyAnalysis[TELLYPROCESSING];
			var tellyPayment:int = tellyAnalysis[TELLYPAYMENT];
			player.gems -= tellyPayment;
			statScreenRefresh();
			inventory.takeItem(tellyChoice, curry(tellyMarket, true), curry(tellyDrama, tellyAnalysis))
		}

		//No room in inventory
		public function tellyDrama(tellyAnalysis:Array):void {
			var tellyPayment:int = tellyAnalysis[TELLYPAYMENT];
			player.gems += tellyPayment;
			statScreenRefresh();
			outputText("[pg]Telly returns your gems. [say: You can always come back when you have more room!]");
			doNext(curry(tellyMarket, true));
		}

		//Candy
		public function tellyPlasm():void {
			clearOutput();
			outputText("One of the largest jars contains many different small candies. Telly excitedly speaks up to explain, [say: Those are a bunch of my home-made candies, made from my own recipe! You can buy one for just 3 gems!]");
			doYesNo(tellyPlasmic, curry(tellyMarket, true));
		}
		public function tellyPlasmic():void {
			clearOutput();
			player.gems -= 3;
			statScreenRefresh();
			outputText("You toss a few gems to Telly and retrieve a candy from the jar, popping in your mouth. The burst of sweetness with a hint of fruit is a nice treat that puts you in a good mood. Telly beams at your approval, delighted that you like her candy.");
			player.refillHunger(1);
			tellyPlasmed = true;
			doNext(curry(tellyMarket, true));
		}

		//Face paint
		public function tellyPhoto():void {
			clearOutput();
			outputText("Remarking on the shopkeep's tendency to paint various shapes and symbols on her cheek, you wonder if she might be willing to paint one on your face too.");
			outputText("[pg]Telly jumps at the suggestion, grabbing her face-paint materials with astounding speed. [say: Absolutely, [mister]! I can paint all sorts of cute stuff, how's 5 gems sound? They're cheap paints, and it washes off easily!]");
			menu();
			for (var tellyGuidance:int = 0; tellyGuidance < TELLYPHOTOS.length; tellyGuidance++) addNextButton(capitalizeFirstLetter(TELLYPHOTOS[tellyGuidance]), tellyAlgia, tellyGuidance);
			addButton(14, "Nevermind", tellyDramatic);
		}
		public function tellyAlgia(tellyGuidance:int):void {
			player.gems -= 5;
			statScreenRefresh();
			clearOutput();
			outputText("You hand the girl her 5 gems and tell her exactly what you'd like. She ushers you to sit and immediately sets to work.");
			if (player.isFurry()) outputText("[pg][say: It's a little weird painting on fur, but I'll do my best!] ");
			else if (player.hasGooSkin()) outputText("[pg][say: U-uh, let's seee,] she says, making experimental strokes with her brush. [say: Oh! It works! I wasn't sure if the paint would work on something so gooey!] ");
			outputText("[pg]Telly chimes happily as she begins her art, [say: Fear not for you are in my care, and everyone knows Telly cares a lot about her customers!] ");
			outputText("[pg]Gleeful humming accompanies her every motion as she follows the broader strokes with a small flat utensil to clean the edges of the shape. As Telly decorates your cheek, she idly chatters about her love for art. Any attempt you make to respond, however, is met with a warning not to move your mouth too much while she paints.");
			outputText("[pg]Telly finishes and quickly grabs a mirror to show you her work. [say: See! I made sure to do my best for a great customer like you! I hope you like it.] You tilt you head a bit, enjoying the "+TELLYPHOTOS[tellyGuidance]+". [say: Remember, though, it's a pretty cheap pasty paint, it'll come off pretty easily. You're welcome to ask for another any time you'd like. It's one of Telly's treats!]");
			var tellyCall:StatusEffect = player.createOrFindStatusEffect(StatusEffects.TellyVised);
			tellyCall.value1 = tellyGuidance;
			(tellyCall as TellyVisedStatus).setDuration(12);
			doNext(tellyMarket);
		}
		public function tellyDramatic():void {
			clearOutput();
			outputText("Rethinking it, you decide you don't want any gunk on your face, despite the popularity of that pastime.");
			outputText("[pg]The little demon sets her paints aside with a whining [say: Awww] before returning to her seat behind the counter.");
			doNext(tellyMarket);
		}

		//Bear
		public function tellyBear():void {
			clearOutput();
			outputText("You check out a large pile of stuffed bears. [say: Those are authentic Telly-bears, [mister]!] Telly calls from the counter. [say: I've hugged each and every one, charging them full of love to help warm the heart of anyone needing to snuggle!] She punctuates her advertising by pressing her pinkies into her cheeks and smiling widely. [say: 50 gems if you're interested!]");
			menu();
			addNextButton("Yes", tellyKinesis, [useables.TELBEAR, "TeddyBear", 50]).disableIf(player.gems < 50, "You need 50 gems.");;
			addNextButton("No", tellyMarket, true);
			addNextButton("Hug Telly", tellyBears).hint("Skip the middle" + (silly() ? "bear" : "man"));
		}
		public function tellyBears(tellyCall:Boolean = true, tellyGuidance:int = 0):void { //Satan made me do it
			if (tellyCall) {
				clearOutput();
				outputText("Seems like a waste to just buy the bear when you could have Telly charge you with her hugs directly. That'd be much more efficient.");
				outputText("[pg]Telly giggles. [say: Extra warm Telly-hug available just for you, [mister]! Come let Telly charge you up!] she exclaims while holding her arms out.");
				outputText("[pg]Following suit, you [walk] over and embrace the demon-girl tightly, " + (player.tallness > 53 ? "lifting her off the floor as you do, and " : "") + "finding all your woes and worries of the world melting away. Telly's body is soft and warm, and you feel her over-joyed nature as she grips you as hard as possible. All the while her tail wags back and forth like an excited puppy's.");
				outputText("[pg]Upon release, Telly's bright smile lights up her entire face. [say: I hope this charges you up for the whole day, [mister].] Her hands rest together at her waist, her hazel eyes rolling their gaze away. [say: But for charging yourself up while at home or on the move, these stuffed bears will give you a boost any time!]");
				player.dynStats("cor", .5);
				player.changeFatigue(-20);
				vesTelly = time.days * 100 + time.hours;
				menu();
				addNextButton("Buy", tellyBears, false, 0).hint("You'll gladly make a purchase now!").disableIf(player.gems < 50, "You need 50 gems.");
				addNextButton("Donate", tellyBears, false, 1).hint("She earned the bear's worth already.").disableIf(player.gems == 0, "You have no gems to spare.");
				addNextButton("No Thanks", tellyBears, false, 2).hint(player.gems < 20 ? "You didn't come in expecting to give her money regardless" : "You'll browse more instead");
			} else
				switch(tellyGuidance) {
					case 0:
						clearOutput();
						outputText("After experiencing the cuddly effects of Telly, you are certain of the value in buying those bears! You pay the 50 gem free without hesitation.");
						outputText("[pg][say: Thank you very much for shopping at Telly's Toys & Treats!] says the skillful little merchant.");
						player.gems -= 50;
						tellyOphile |= TELLYCOMH;
						inventory.takeItem(useables.TELBEAR, curry(tellyMarket, true), curry(tellyDrama, [useables.TELBEAR, "TeddyBear", 50]));
						break;
					case 1:
						clearOutput();
						outputText("There will be no need for that, you believe quite confidently that a direct hug is easily worth as much as the bear, and you give her " + (player.gems < 51 ? "every gem you've got" : "the full 50 gem payment") + ".");
						outputText("[pg]Telly shivers with glee for a moment, taking the money. [say: Thank you very much for shopping at Telly's Toys & Treats! I'll be happy to give you as many love-filled Telly-hugs as you want!]");
						outputText("[pg]She follows up her declaration by suddenly embracing you again in a much briefer and more spontaneous hug.");
						player.gems -= player.gems >= 50 ? 50 : player.gems;
						tellyOphile |= TELLYCOMH;
						doNext(tellyMarket);
						break;
					case 2:
						clearOutput();
						outputText("As it stands, you'd rather not take a bear right now" + (game.cabin.bedBears >= 10 ? ", your teddy fort is already at max capacity back home" : "") + ". Nevertheless, the hug was nice, and you appreciate her for it.");
						outputText("[pg]Telly's mood dims ever so slightly. [say: I understand. I hope you see value in any of the other products and services I offer!]");
						doNext(tellyMarket);
						break;
				}
		}

		//Hug
		public function viTellyTy():void {
			clearOutput();
			outputText("Suffice to say, you need more cuddling Telly in your life. ");
			outputText(vesTelly == time.days * 100 + time.hours ? "[say: But [mister], I just hugged you!] she replies.[pg]Clearly she isn't charging enough, then, as you find this to be too much value to pass up. " : "[pg]");
			outputText("Making haste, you relinquish " + (player.gems < 20 ? "what meager funds you have" : "20 gems") + ", and embrace the demoness without delay.");
			outputText("[pg]Laughing, Telly returns the embrace in full, and rubs her face against you for further cuddly-emphasis. [say: Thank you for your patronage.]");
			outputText("[pg]Soon after, you release the childish merchant, feeling very energized by the exchange.");
			player.dynStats("cor", .5);
			player.changeFatigue(-20);
			player.gems -= player.gems >= 20 ? 20 : player.gems;
			vesTelly = time.days * 100 + time.hours;
			doNext(tellyMarket);
		}

		//Appearance
		public function tellyVision():void {
			clearOutput();
			outputText("Telly is a small, child-like demon, standing around "+Measurements.briefHeight(46)+" tall. She is petite with light skin and long blonde hair ending a few inches above her waist. Telly's face has the same childish flare as the rest of her, with a round shape and pinchable cheeks. Her hazel eyes glimmer with excitement at the drop of a hat, and today she has painted a [tellyvisual] on her cheek, further adding to her innocent style. Her usual, and current, attire consists of a lightly colored lace dress with ruffled layers of frills on the skirt.");
			doNext(tellyMarket);
		}

		//Talk
		public function tellySurvey():void {
			menu();
			addButton(0, "Chat", tellyCommunication).hint("Whatever comes to mind.");
			addButton(1, "Merchanting", tellyMotor);
			addButton(2, "Bazaar", tellyOperation);
			addButton(3, "Customers", tellyRgy);
			if (player.hasItem(consumables.LIDDELL) && flags[kFLAGS.LIDDELLIUM_FLAG] >= 0) addButton(4, "StrangePotion", tellyStic);
			else if ((tellyOphile & TELLYCOML) == 0 && flags[kFLAGS.LIDDELLIUM_FLAG] < 0) addButton(4, "Liddellium", tellyOtic);

			if (affectionaTelly(false)) addNextButton("Gift", affectionaTelly).hint("You have something Telly might like. Give it to her?");

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

		public function tellyMotor():void {
			clearOutput();
			outputText("How--or perhaps, why--did Telly get into merchanting? Civilization is in ruins across the world, yet here she is trying to make a profit selling stuffed toys and candy.");
			outputText("[pg][say: The world is dangerous, but that just makes it that much more important to have things that exist just to make you smile!] Telly punctuates her point by pressing her fingers up against her cheek in an exaggerated grin.");
			outputText("[pg]So how did she get started? Though not as large or lavish as some other wagons, it'd still be expensive and hard to make one like this. Her stock takes supplies and preparation, too, which is expensive. Where did all the investment capital come from?");
			outputText("[pg]Telly blinks at you, blankly smiling for a moment. [say: That's quite a serious discussion, [mister]! The wagon is actually a cargo wagon I found stripped bare on one of the old roads. Since it's not meant to be lived in, it's smaller than the others. I made the lacquer myself and originally used a crude red dye I also made myself. The color faded after just a week of sunlight exposure, making it look pinkish. I like it a lot more that way! Polishing it up to look a bit nicer was after I started making money and could buy better paint.] The demoness regales you with her history with a grand amount of joy in her eyes, evidently thrilled to have someone interested in knowing what she did to get here. What of all the products, though? Candy, stuffed animals, and even her personal things for that matter?");
			outputText("[pg]Pulling up ruined old toys and fabric, Telly gladly obliges your curiosity. [say: I mostly worked with sewing up ones people either threw out or wanted to pay to have fixed. I still take in old toys I find, but now I also buy materials from some other settlements. If I'm not at the Bazaar, I've either camped out somewhere safe or gone out to buy supplies from somewhere like the kanga settlement" + (flags[kFLAGS.SHEILA_DEMON] != 1 ? "--but they don't let me inside. I have to offer money up front and make a deal by proxy of the guards" : "") + ".]");
			outputText("[pg]Telly really worked hard to get here. Still, an Alice is an Alice, and it doesn't seem like most people give her much of a break.");
			tellySurvey();
		}

		public function tellyOperation():void {
			clearOutput();
			outputText("How's life at the Bazaar? They seem accepting of demons here, though you aren't too familiar with the business side of things.");
			outputText("[pg][say: Money talks!] Telly declares. [say: Although... being an Alice isn't the same as being a demon. They turn their subordinates into Alices as a punishment,] she adds in, seeming more sheepish as she explains this, [say: as in, for being really really really bad. It doesn't matter how or why I'm like this, they confidently assume I'm nothing but trouble.]");
			outputText("[pg]Telly turns her gaze to the window beside you. [say: As long as I'm making money -- which is easier in a place lots of people frequent -- they put up with me.] Shifting out of the rather somber tone, her smile brightens to its usual disposition again. [say: And when they get to know me, a lot of them are actually nice people!]");
			tellySurvey();
		}

		public function tellyRgy():void {
			clearOutput();
			outputText("In any industry, customers can be really bad at times. How does Telly put up with that kind of thing?");
			outputText("[pg][say: Everyone has a bad day every once in a while, so Telly is here with toys and treats!] The Alice merchant turns side to side, playfully spinning her dress back and forth in a mini-jig. She's certainly made for sales pitching. [say: Of course, sometimes a bad day takes a little more than a smile to brighten, but we Alices are known to hone our charisma.] A wink follows, suspiciously making you feel at ease.");
			tellySurvey();
		}

		public function tellyStic():void {
			clearOutput();
			outputText("Despite her general demeanor, Telly [i: is] a demon; she may well have an idea what the potion you found is for. You retrieve the strange phial from your [inv], asking if she can make heads or tails of it.");
			outputText("[pg]Gazing at it in your hands, Telly looks up with an answer already. [say: That's liddellium, that's how they make more Tellies!]");
			outputText("[pg]Oh, that was quick and to the point. This potion turns demons into Alices, you surmise from that.");
			flags[kFLAGS.LIDDELLIUM_FLAG] = -1;
			tellySurvey();
		}

		public function tellyOtic():void {
			clearOutput();
			outputText("Would Telly be able to sell you bottles of Liddellium? She's a demon and a merchant, after all.");
			outputText("[pg]Telly shakes her head. [say: Nope! I'm Telly, and I sell toys and treats; liddellium is [b: no toy] and certainly no treat!]");
			outputText("[pg]It can't be all bad, just look how well Telly turned out!");
			outputText("[pg]The shopkeep, though maintaining her jovial demeanor, lets out a light sigh. [say: Thank you, [mister], but on a more serious note, other Alices aren't Telly! It's a bad experience for most, not all butterflies and gumdrops; also, I don't think I could even afford--financially--to have any in stock anyway.]");
			tellyOphile |= TELLYCOML;
			tellySurvey();
		}

		//Chats
		public function tellyCommunication():void {
			clearOutput();
			tellyGram += 1;
			var tellyGuidance:Array = []
			if ((tellyOphile & TELLYCOM1) == 0) tellyGuidance.push(1);
			if ((tellyOphile & TELLYCOM2) == 0) tellyGuidance.push(2);
			if ((tellyOphile & TELLYCOM3) == 0) tellyGuidance.push(3);
			if ((tellyOphile & TELLYCOM4) == 0) tellyGuidance.push(4);
			if ((tellyOphile & TELLYCOM5) == 0) tellyGuidance.push(5);
			if ((tellyOphile & TELLYCOM6) == 0 && game.telAdre.isDiscovered()) tellyGuidance.push(6);
			if ((tellyOphile & TELLYCOM7) == 0) tellyGuidance.push(7);
			if ((tellyOphile & TELLYCOM8) == 0 && flags[kFLAGS.LIDDELLIUM_FLAG] > 0 && player.isChild()) tellyGuidance.push(8);
			if ((tellyOphile & TELLYCOM9) == 0 && game.akky.isOwned()) tellyGuidance.push(9);
			if ((tellyOphile & TELLYCOM10) == 0 && tellyGram > 2) tellyGuidance.push(10);
			if ((tellyOphile & TELLYCOM11) == 0) tellyGuidance.push(11);
			if ((tellyOphile & TELLYCOM12) == 0 && flags[kFLAGS.MET_KITSUNES] > 0) tellyGuidance.push(12);
			if ((tellyOphile & TELLYCOM13) == 0 && flags[kFLAGS.ALICE_CHATS] && flags[kFLAGS.UNDERAGE_ENABLED] >= 0) tellyGuidance.push(13);
			if ((tellyOphile & TELLYCOM14) == 0) tellyGuidance.push(14);
			if ((tellyOphile & TELLYCOM15) == 0) tellyGuidance.push(15);
			if ((tellyOphile & TELLYCOM16) == 0) tellyGuidance.push(16);
			if ((tellyOphile & TELLYCOM17) == 0) tellyGuidance.push(17);
			if ((tellyOphile & TELLYCOM18) == 0 && player.hasKeyItem("Hentai Comic")) tellyGuidance.push(18);
			if ((tellyOphile & TELLYCOM19) == 0) tellyGuidance.push(19);
			if ((tellyOphile & TELLYCOM20) == 0 && tellyPlasmed) tellyGuidance.push(20);
			if ((tellyOphile & TELLYCOM21) == 0) tellyGuidance.push(21);
			if ((tellyOphile & TELLYCOM22) == 0 && tellyGram > 21) tellyGuidance.push(22);
			if (tellyGuidance.length == 0) {
				tellyGuidance = [1, 2, 3, 4, 5, 7, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21]; //If seen all chats, any can be repeated
				if (game.telAdre.isDiscovered()) tellyGuidance.push(6);
				if (flags[kFLAGS.LIDDELLIUM_FLAG] > 0 && player.isChild()) tellyGuidance.push(8);
				if (game.akky.isOwned()) tellyGuidance.push(9);
				if (tellyGram > 2) tellyGuidance.push(10);
				if (flags[kFLAGS.MET_KITSUNES] > 0) tellyGuidance.push(12);
				if (flags[kFLAGS.ALICE_CHATS] && flags[kFLAGS.UNDERAGE_ENABLED] >= 0) tellyGuidance.push(13);
				if (player.hasKeyItem("Hentai Comic")) tellyGuidance.push(18);
				if (tellyPlasmed) tellyGuidance.push(20);
				if (tellyGram > 21) tellyGuidance.push(22);
			}
			switch (randomChoice(tellyGuidance)) {
				case 1:
					tellyOphile |= TELLYCOM1;
					outputText("What's Telly's favorite color?");
					outputText("[pg][say: [b: Black], darker than night, washed in the shadowy ink of my soul,] she replies, wide-eyed. You can almost see the smile held back in her eyes before she caves in. [say: Ha! I love that question, nobody ever asks! I love... pink. No--purple! Fuchsia!] Telly brings her hand to her chin and scrunches her brow, dwelling on the subject. [say: Blue isn't appreciated enough! Red is really passionate though!]");
					outputText("[pg]The demon twirls in dramatic fashion, falling onto the bed pushed against the back of the wagon behind her. [say: All colors need their time to shiiiiiine.] She trails off.");
					outputText("[pg]Telly gets back up, reciprocating the question. [say: What's yours?]");
					break;
				case 2:
					tellyOphile |= TELLYCOM2;
					outputText("Telly leans forward with her chin resting on her hands, tail flicking playfully as she speaks of her random anecdotes.");
					outputText("[pg][say: Oh!] exclaims the shopkeep, her tail straightening out as physical emphasis, [say: the other day, I had stopped on a path through a forest, and I saw a [b: fox!]] Telly's hands ball up into fists as she tries to hold a grip on her own excitement. [say: His fur was super soft, and he was really friendly!]");
					outputText("[pg]Foxes tend to avoid people. Does Telly have some magical affinity with wildlife?");
					outputText("[pg]Telly gives you an eye-squishing, tooth-baring grin. [say: I love animals! All you need to do is be gentle and friendly, and they'll return the favor. Do you have a favorite animal, [mister]?]");
					break;
				case 3:
					tellyOphile |= TELLYCOM3;
					outputText("As you talk through some general topics, your eyes scan the doodle-covered counter Telly sits at. While some doodles are quite rough and silly, others are surprisingly detailed. As a whole, her art tends to be cutesy. You ask a bit about it.");
					outputText("[pg][say: One day, I didn't have much money to spare and couldn't just go buy more materials to make more products. I had to sell what I already had first.] Telly's hand moves across a winding vine drawn over part of the counter, rubbing her finger along some of the intricate patterns sprouting off it. [say: I got bored and started scribbling.]");
					outputText("[pg]The demoness tilts her head and reminisces. [say: I meant to keep the counter professional, like a proper merchant, but then I realized I liked it! It keeps me busy whenever I'm just waiting, and it helps make my shop more 'me'!] She looks up with a prideful expression.");
					break;
				case 4:
					tellyOphile |= TELLYCOM4;
					outputText("Telly's got quite the sense of fashion, relative to other people in this world. Does she make those clothes herself, like she does with some of the stuffed toys?");
					outputText("[pg][say: I get some of my clothes the same way other Alices do.] Telly stares happily at you as she says this, seemingly as if that answer was sufficient.");
					break;
				case 5:
					tellyOphile |= TELLYCOM5;
					outputText("Perhaps as expected, the conversation steers to sweets. Telly has quite a penchant for candies, unable to settle on any one favorite.");
					outputText("[pg]Telly expounds on her top picks. [say: The best flavors are bitter, salty, and savory. Chocolate, salted caramel, and butterscotch respectively!] She holds her face and drools while fantasizing of the treats.");
					break;
				case 6:
					tellyOphile |= TELLYCOM6;
					outputText("It's too bad Telly is a demon; there'd be quite the potential for business in the city. Unfamiliar with what you're referring to, Telly asks you to specify what city, to which you elaborate on Tel'Adre and its current situation.");
					outputText("[pg]After absorbing all the exposition you've given her, Telly seems nonplussed by her lack of access. [say: Tel'Adre sounds exactly like the sort of city I expect to chew me out with taxes.]");
					outputText("[pg]Spoken like a true merchant.");
					break;
				case 7:
					tellyOphile |= TELLYCOM7;
					outputText("Are there any other Alices that Telly knows, you wonder?");
					outputText("[pg][say: Of course, I know several!] she replies. [say: They're usually pretty happy to be around an Alice that has a home--Telly gives them hope!]");
					break;
				case 8:
					tellyOphile |= TELLYCOM8;
					outputText("[say: You're my favorite Alice, [mister]!] chimes the demoness, out of the blue.");
					break;
				case 9:
					tellyOphile |= TELLYCOM9;
					outputText("[say: Do you have any pets?] she asks while flicking her spaded tail excitedly.");
					outputText("[pg]As it happens, you do, and you tell her all about [akky]. The cuddly and short-furred little housecat is a very friendly companion to have around.");
					outputText("[pg][say: He sounds adorable, [mister]! I love cats too, and I can never hold back from feeding strays in the off case I find them!]");
					break;
				case 10:
					tellyOphile |= TELLYCOM10;
					outputText("Telly smiles brightly. [say: I like talking to you, [mister].]");
					break;
				case 11:
					tellyOphile |= TELLYCOM11;
					outputText("As the merchant details the many dyes suited for coloring lacquer, you ponder how she came to learn so many crafts.");
					outputText("[pg]Telly, happy to elucidate, explains, [say: Where I grew up, it was normal for parents to teach their children how to perform their skills.]");
					outputText("[pg]In that case, Telly's parents worked with lacquer?");
					outputText("[pg]The little demon nods. [say: It's really cheap and easy to make, and just about any house would be better off with it. It helps insulate, support, and decorate!]");
					break;
				case 12:
					tellyOphile |= TELLYCOM12;
					outputText("There are many strange creatures in this land, quite unlike the kind you knew of back in Ingnam, and the kitsunes are among the more magically-adept that you've seen. You can't seem to get anywhere near one before their illusions start bearing down on your psyche.");
					outputText("[pg]In a concerned tone, Telly remarks, [say: Be careful of those fox-girls, [mister].] She glances around warily, leaning in closer to whisper, [say: I hear they even kidnap Alices to make them play dress-up for hours on end!]");
					outputText("[pg]Truly a horrifying fate.");
					break;
				case 13:
					tellyOphile |= TELLYCOM13;
					outputText("Being an Alice, she must have a hard time feeding. How is she able to run a shop so enthusiastically? Who is she feeding on?");
					outputText("[pg][say: The only thing I have to feed on are sugary treats and smiles!] she says with a grin.");
					break;
				case 14:
					tellyOphile |= TELLYCOM14;
					outputText("[say: As a matter of fact, yes.] states the little girl. To what, you've no idea.");
					outputText("[pg]She lets out a chuckle. [say: I keep hoping one of these days I'll say it just before someone's about to ask if I'm psychic.]");
					break;
				case 15:
					tellyOphile |= TELLYCOM15;
					outputText("The two of you dive into the subject of the weather. While simple small-talk where you're from, it's evidently a hotly debated subject in some circles.");
					break;
				case 16:
					tellyOphile |= TELLYCOM16;
					outputText("So, how's Telly doing today?");
					outputText("[pg][say: I smiled as soon as I woke up, and I plan to smile all day long,] Telly says with jovial cheer. [say: It would make my smile even brighter if you smile a lot today too, [mister].]");
					break;
				case 17:
					tellyOphile |= TELLYCOM17;
					outputText("Magic is a fairly broad subject, and demons tend to have a grasp of some of it. How much does Telly know?");
					outputText("[pg][say: I know lots of basic things, mostly of body and mind effects,] she explains. A bit vague, that doesn't narrow much down. She hums a little as she rethinks her answer. [say: I know a lot of black magic, some white magic, and a lot of illusion spells.]");
					if (!player.hasSpells()) {
						outputText("[pg]Black and white, she says? You didn't think demons could use white magic.");
						outputText("[pg][say: Huh? Oh, black magic is just bodily manipulation, while white is more like material stuff,] she clarifies, struggling to articulate it better. [say: Not exactly, I guess, but it's close. White is more immaterial entirely, but is really good utility with material things.] Telly groans while scratching her head. [say: I'm not a good teacher, I'm sorry, [mister].]");
						outputText("[pg]It wasn't too bad of an explanation. It may not be comprehensive, but you think you got the gist of it.");
					}
					break;
				case 18:
					tellyOphile |= TELLYCOM18;
					outputText("The shopkeep notices the edge of your hentai comic peaking from your pack. [say: Oh! You read comics?] she asks. [say: What kind is it? Can I see?]");
					outputText("[pg]She's a demon, sure, but somehow you aren't sure she is into the kind of comic you happen to have.");
					menu();
					addNextButton("Share", function():* {
						outputText("[pg]Sating the little girl's curiosity, you retrieve the comic and toss it her way. With expert agility, Telly catches and opens the book, feasting her eyes on the pages.");
						outputText("[pg]A blush spread throughout her face. [say: O-oh, it's <b>this</b> kind of comic.]");
						outputText("[pg]The demoness quickly hands it back, looking very embarrassed about the ordeal.");
						tellySurvey();
					}).hint("Either way, she's still a demon at the Bazaar. Can't be much of a shock.");
					addNextButton("Explain", function():* {
						outputText("[pg]Trying to quell her excitement, you explain it's a rather adult comic.");
						outputText("[pg]Telly places her hands on her hips and put on a face of mock indignation. [say: I am older than I look!]");
						outputText("[pg]What you mean to say is that it's a raunchy book of pornographic drawings.");
						outputText("[pg][say: Oh!] she says, surprised. [say: I'm sorry, I didn't mean to invade your privacy!]");
						outputText("[pg]No harm done.");
						tellySurvey();
					}).hint("Spare her maybe-possibly-not-virgin eyes.");
					return;
					break;
				case 19:
					tellyOphile |= TELLYCOM19;
					outputText("The conversation wanders into your mission, as so many conversations are wont to do. As you go over the outline of your quest to eliminate Lethice and dismantle the demonic horde, you wonder if Telly is bothered by it.");
					outputText("[pg][say: Not at all, [mister], you seem like a nice person.] Telly smiles at you, putting her thoughts simply. [say: You'll only hurt the bad demons.]");
					outputText("[pg]Her optimistic outlook is refreshing. Seeing as she is so kind-hearted, might she have any insider knowledge about the demons that could aid your quest?");
					outputText("[pg][say: I'm sorry, I'm no soldier or big deal demon,] she explains, raising her hands in claw shapes to illustrate her ferocity as a 'big bad demon'.");
					break;
				case 20:
					tellyOphile |= TELLYCOM20;
					outputText("You ponder how the little demoness makes her candies, as they're quite delightful.");
					outputText("[pg][say: Experimenting is a lot of fun, but sugar, water, honey, and fruit juice are the major ingredients,] she says. She seems happy to give the rough overview of the process, expounding further, [say: I boil it and try out different kinds of fruit or whatever else I feel like adding. It's really easy, and exciting to find out what you can come up with!]");
					break;
				case 21:
					tellyOphile |= TELLYCOM21;
					outputText("Demon shopkeepers aren't too common in your experience, but there are some out there. The talks between you two gradually drift into that subject, and Telly brings up the Bazaar's resident seamstress, Greta.");
					outputText("[pg][say: She's a big, pink succubus,] Telly explains. [say: I'm glad she found a passion to pursue besides all the sex.]");
					outputText("[pg]Needless to say, you're curious how the two of them get along, given they both know how to sew and knit. To this line of questioning, Telly's expression wavers.");
					outputText("[pg][say: Greta really hates Alices,] she admits. [say: But she doesn't <b>do</b> anything to me, it's not that bad. Most demons expect us to be the worst, debatably lesser to imps.]");
					break;
				case 22:
					tellyOphile |= TELLYCOM22;
					outputText("Telly breaks into a fit of giggling. [say: You're really chatty, [mister]!]");
					break;
			}
			tellySurvey();
		}

		//Gifts
		public function affectionaTelly(tellyCall:Boolean = true):Boolean {
			var tellyGuidance:Boolean = false;
			if (tellyCall) menu();
			if (player.hasItem(useables.TELBEAR) && (tellyOphile & TELLYCOMB) == 0) tellyCall ? addNextButton("Gift Bear", compassionaTelly).hint("A cuddly toy for a cuddly Telly.") : tellyGuidance = true;
			if (player.hasItem(consumables.KITGIFT) && (tellyOphile & TELLYCOMK) == 0 && game.forest.kitsuneScene.saveContent.hadVision) tellyCall ? addNextButton("Kit. Gift", tellyDoscope).hint("Who doesn't love opening gifts?") : tellyGuidance = true;
			if (player.hasItem(consumables.PURPEAC) && (tellyOphile & TELLYCOMP) == 0) tellyCall ? addNextButton("Peach", sweeTelly).hint("Telly loves sweets.") : tellyGuidance = true;
			if (player.hasItem(useables.A_SHARD) && (tellyOphile & TELLYCOMA) == 0 && silly()) tellyCall ? addNextButton("A.Shard", tellyStial).hint("You found a most peculiar artifact in that damnable manor, yet the beauty of this crystal compels you to gift it to the little girl.") : tellyGuidance = true;
			if (player.hasItem(consumables.DRAKHRT) && (tellyOphile & TELLYCOMD) == 0) tellyCall ? addNextButton("Flower", delicaTelly).hint("The Drake's Heart makes for an exotic and beautiful gift.") : tellyGuidance = true;
			addButton(14, "Back", tellySurvey);
			return tellyGuidance;
		}

		public function compassionaTelly():void {
			clearOutput();
			if (silly()) imageSelect(ImageDb.i_telly, 488, 354);
			outputText("These bears make nice gifts, don't they? Telly certainly deserves one, you feel. You present the gift to her, receiving a head-tilting look of obliviousness.");
			outputText("[pg][say: Is something wrong with your bear, [mister]? Telly is happy to offer repair services!]");
			outputText("[pg]There's nothing wrong, you intend to give it to her as a gift. Telly bring her arms in close and smiles. [say: You paid for that, though! I encourage gifting it to someone special!]");
			outputText("[pg]Who says you're not doing that now?");
			outputText("[pg]Telly blushes and looks down from your eyes. With a bright grin, she looks back up. [say: Don't forget to give Mister Bear a good-bye hug!]");
			menu();
			addButton(0, "Hug", compassionaTellyHug);
			addButton(1, "MakeHerTake", compassionaTellyForce);
		}
		public function compassionaTellyHug():void {
			clearOutput();
			tellyOphile |= TELLYCOMB;
			outputText("Going along with her request, you grip the teddy-bear tightly to your [chest] and show off your smile to let her know you passed plenty of affection into it. Content with the effort put in, you hand it off to Telly who immediately cuddles it just as tightly.");
			outputText("[pg][say: Thank you, [mister].]");
			player.consumeItem(useables.TELBEAR);
			doNext(tellyMarket);
		}
		public function compassionaTellyForce():void {
			clearOutput();
			tellyOphile |= TELLYCOMB;
			outputText("Gods damn this bitch, just take the damn thing.");
			outputText("[pg]Telly giggles incessantly at your aggressive gift-giving. [say: Thank you, [mister]. I'll be sure Mister Bear gets lots of love on your behalf.]");
			player.consumeItem(useables.TELBEAR);
			doNext(tellyMarket);
		}

		//Kitsune Gift
		public function tellyDoscope():void {
			clearOutput();
			outputText("You present the demoness a gift: one square package wrapped in white paper, tied with a thin string.");
			outputText("[pg]Telly's eyes light up with excitement. [say: Thank you, [mister]! I love gifts!] she exclaims, swiftly undoing the binding to unfold the paper covering. The little girl takes a breath, savoring the moment as she hovers her hands over the top. [say: Wait!] she yells, moving to the room behind the counter for something.");
			outputText("[pg]Telly returns with a small drum. [say: Drum-roll, please!]");
			tellyOphile |= TELLYCOMK;
			player.destroyItems(consumables.KITGIFT, 1);
			menu();
			addNextButton("Okay", tellyDoscopes, true).hint("You'll gladly play along.");
			addNextButton("Just Open", tellyDoscopes, false).hint("Get on with it!");
		}

		public function tellyDoscopes(tellyGuidance:Boolean):void {
			clearOutput();
			if (tellyGuidance) {
				outputText("You would be remiss to not join in her playful nature--why else would you even visit? With as much flare as one might expect from you, you pull the little instrument close and begin tapping it in a perfectly suspense-building rhythm.");
				outputText("[pg][say: Perfect!] yells the joyed little shopkeeper.");
			} else {
				outputText("Failing to contain a sigh, you deny the request and tell her to open the gift already.");
				outputText("[pg][say: But [mister], exciting reveals always need a drum-roll!] she pouts. Undeterred, the shopkeep sets the drum next to her and gives it a few practice-taps with her tail. She focuses for some time, mentally preparing for the act, until soon her tail unleashes an amazing flurry of taps. It sounds like she can manage the drum-roll on her own.");
			}
			outputText("[pg]Telly's hands rest on the lid of the box, her excitement obvious in her expression as the speedy tune of the drum builds. As the beat reaches its peak, Telly lifts the top off and over her head, her eyes trained on the contents within. Following closely behind its former barrier, a gust of blue smoke blows into the demon's face.");
			outputText("[pg]Disoriented from the blast, the little girl winces and stumbles back. [say: Ah!] is all she says. Telly rubs her face, soon gazing back at you after realizing she's fine. While showing an accusing but playful look on her face, she asks, [say: Did you prank me, [mister]?]");
			outputText("[pg]If you're to be totally honest, you weren't really sure what was in it, although you had some guesses. At the very least, it wasn't going to be too dangerous. " + (player.cor > 66 || player.lib > 66 ? "The baser side of you hoped it would be a kitsune aphrodisiac." : ""));
			outputText("[pg]Before you manage to produce an adequate response, Telly puts her hands to her hips and declares, [say: Well to make up for that prank, you better fluff my tail!]");
			outputText("[pg]Excuse you?");
			menu();
			addNextButton("Fluff", tellyDoscopic, true).hint("Touch Telly tail!");
			addNextButton("What?", tellyDoscopic, false).hint("Her tail is slim and demonic, you can't fluff that.");
		}

		public function tellyDoscopic(tellyGuidance:Boolean):void {
			clearOutput();
			if (tellyGuidance) {
				outputText("While a rather novel request from her, you will do your best. ");
				outputText("[pg]The demoness gestures to the seat behind the counter, suggesting you sit. ");
				if (player.isTaur()) {
					outputText("Being the non-biped that you are, that wouldn't work the way her addled mind seems to think. These legs are not just fluffy tails, Telly! ");
					outputText("[pg][say: Oh,] she says. [say: Then Telly shall bring the tail to you!]");
					outputText("[pg]With a hop and skip, Telly " + (player.tallness > 64 ? "leaps onto the counter" : "wanders over") + " and turns to present her playfully-wagging tail.");
				} else outputText("As instructed, you sit down on chair, followed quickly by Telly sitting on your lap. Her tail flicks back and forth, waving the spade with childish energy. The demon leans back, pressing her little purple wings against your body.");
				outputText("[pg][say: Fluff away!] she commands. While it's a mildly awkward position, you make haste to get a grip on the recklessly swinging whip that extends from a fold in her dress's waist. To your surprise, and concern, she jolts in place. [say: Don't be rough, [mister]! Fluffing tails is a delicate matter!]");
				outputText("[pg]Maintaining a level of care and a gentle touch, you grasp the purple tail. It feels much the same as " + (player.tail.type == Tail.DEMONIC ? "your own" : "leather") + ", and is certainly nothing fluffy. Doing the only thing this world trains you for, you set about massaging the long, fleshy appendage. Telly, delighted, leans further back and purrs blissfully. The silky-soft strands of blonde hair rubbing against your arms as she rocks back and forth give a soothing sensation, and you note the vague scent of cherries.");
				outputText("[pg][say: Excellent work, [Mister] Kitsune! You have done our village proud, having truly mastered the art of fluffing tails!] cheers the girl. She leans forward and walks a few steps before turning back around. [say: There is only one fluffening left before you can be officially certified as the fluffer!] She tosses her arms aside, gesturing for a hug.");
				outputText("[pg]You hug the sweet little kitsune, imparting all of your fluff into her. In turn, Telly embraces you with every ounce of might she has.");
				outputText("[pg][say: You're the best fluffer I have ever had the joy of training! Represent our village far and wide, and show them what a true kitsune can do!]");
				outputText("[pg]Telly ushers you out, practically pushing you through the exit of her wagon. The door shuts behind you, and you are left to your thoughts.");
				doNext(camp.returnToCampUseOneHour);
			} else {
				outputText("There is nothing to fluff on that tail! Her tail is like a leather whip with a spaded tip, there must be something wrong with her.");
				outputText("[pg]Appalled, the demoness refutes your claim. [say: Telly's Tails & Tufts have only the fluffiest of fluffs! And I'm Telly, I have tufts on my tails!]");
				outputText("[pg]Even with those damn mind kitsunes, she uses alliteration. Shaking your head at this nonsense, you insist that the shopkeeper has been cursed and that she does not in fact have any fluffy tails. She doesn't even have multiple tails at all.");
				outputText("[pg]In a huff, Telly stomps her foot and begins pushing you toward the exit. [say: I will not stand to let you insult my tails in my kitsune village!] She stops once you're at the door, gesturing you out. [say: Don't come back again until you've collected 50 fluffy tails!]");
				outputText("[pg]With that, the Alice merchant closes the wagon. Damn mind kitsunes.");
				tellyCommand = time.days;
				doNext(bazaar.enterTheBazaarAndMenu);
			}
		}

		//Peach gift
		public function sweeTelly():void {
			clearOutput();
			outputText("Knowing Telly's love of sweets, she may love this peach. Furthermore, it's from such a distant and unique place that you'd bet she's never tried it.");
			outputText("[pg]Marveling at the red-striped fruit, she thanks you, and immediately takes a bite. [say: It's so sweet!] she exclaims, savoring the fruity flavor in her cheek. [say: It reminds me a lot of whisker fruit, but a bit less overpowering. It's really refreshing.]");
			outputText("[pg]The shopkeeper continues making various delighted sounded while munching the fruit. [say: Thank you very much for bringing me one of these, [mister].]");
			player.destroyItems(consumables.PURPEAC, 1);
			tellyOphile |= TELLYCOMP;
			tasTelly = time.days * 100 + time.hours;
			doNext(tellyMarket);
		}

		//Abyssal shard gift
		public function tellyStial():void {
			clearOutput();
			outputText("After that trek among the dead and damned, you recovered an artifact of unfathomable beauty; to look into the glistening form of this gem is to gaze at all the stars above in the palm of your hands. What could never fit within your vision now rests within your grasp, and no object compares to its majesty. To whom could such beauty be given? Why, to none other than the one whose eyes share that same twinkling of stars and splendor.");
			outputText("[pg]Telly takes the black gem, marveling at the cosmic vista within. [say: It's gorgeous, [mister]!] she shouts, awe-struck. She rotates and examines it thoroughly, her eyes reflecting the endless expanse.");
			outputText("[pg]You, too, feel a sense of awe and wonder as you peer into that starry abyss, and soon find yourself approaching and embracing Telly. Although your actions are without warning, her focus remains fixated on the gift, completely consumed by its beauty. Within her eyes, the stars move and swirl, flying through the void. All you see is the expanse, the entire world fading.");
			tellyOphile |= TELLYCOMA;
			player.destroyItems(useables.A_SHARD, 1);
			doNext(function():*{ //We're working with non-renewable resources here
				clearOutput();
				outputText("Telly blinks. [say: Where'd it go?] she asks, looking at her empty hands. She looks forward, noticing that you're holding her. [say: [Mister]?]");
				outputText("[pg]Your wits returning to you, you let go of the merchant. On instinct you might start trying to explain yourself, but the two of you stand silently as it comes to light just where you are. In all directions, stardust and twinkling lights sparkle in a backdrop of utter nothingness. You peer around, finding any sense of physical orientation difficult to maintain. It's as if you're moving, yet your limbs remain still.");
				outputText("[pg]Light itself bends and contorts in place. Shadowy tendrils invade your peripheral vision, and migraines push your mind to the limits of what you can take. You wince and struggle against the pain, soon opening your eyes to see a new entity of inconceivable shape and structure.");
				outputText("[pg]The nameless abomination flicks its tongue from a flesh-stalk, tasting your presence. The damnable horror screeches, filling your soul itself with the anguish of a billion fallen mortals. You see nothing but The End.");
				doNext(curry(tellyStially, 0, []));
			});
		}
		public function tellyStially(tellyGuidance:int, tellyCall:Array):void {
			clearOutput();
			switch(tellyGuidance) {
				case 0:
					outputText("[say: Would you like some tea?] Telly asks. The demon holds up a tea-pot and cup, innocently smiling at the eldritch <i>thing</i> that encompasses the reality before you. In all the mind-bending turmoil, you could hardly remember she was here. [say: It's made from a leaf native to where I'm from, but with a special spice that gives it a hint of cherry and almonds!]");
					outputText("[pg]The horror pauses, contemplating, then elects to take a seat by a table, with Telly following suit. The demoness looks to you. [say: Come on, [mister], join us!]");
					outputText("[pg]With another glance around, you ascertain that there is quite literally nothing else you could do besides join or float aimlessly, so you wander over and take a seat beside the two of them.");
					break;
				case 1:
					outputText("You sip the tea. It tastes warm, soothing, and vaguely of cherry and almonds.");
					break;
				case 2:
					outputText("You ask the entity a few questions to get to know it better. In polite response, the shambling mass screeches in every language in existence. Blood begins to drip from your [ears].");
					outputText("[pg][say: Wow, I never knew any of that!] exclaims Telly, tail flicking happily. [say: You seem like a really worldy person,] she says, delighted by the creature's stories.");
					break;
				case 3:
					outputText("As you've nothing to ground you in reality at the moment, you turn to the most concrete act that might be able to anchor you. Might this entity be interested in sexual intercourse with you and Telly?");
					outputText("[pg]Appalled at your manners, the eldritch beast throws its tea in your face. You spiral off into the cosmos, gaining speed with every moment, exponentially accelerating. Everything blurs and twists, and you soon find yourself in bed.");
					if (!(flags[kFLAGS.MANOR_PROGRESS] & 1024)) flags[kFLAGS.MANOR_PROGRESS] += 1024;
					doNext(function():* {
						cheatTime(21 - time.hours);
						playerMenu();
					});
					return;
					break;
			}
			tellyCall.push(tellyGuidance);
			menu();
			addNextButton("Drink", tellyStially, 1, tellyCall).hint("Enjoy some tea.").disableIf(tellyCall.indexOf(1) >= 0);
			addNextButton("Question", tellyStially, 2, tellyCall).hint("Get to know the shambling mass.").disableIf(tellyCall.indexOf(2) >= 0);
			addNextButton("Sex", tellyStially, 3, tellyCall).hint("Suggest a three-way between the little merchant, the unfathomable ancient, and yourself.");
		}

		//Drake's Heart gift
		public function delicaTelly():void {
			clearOutput();
			outputText("You present the Drake's Heart to Telly, making it clear that you wanted to give her something nice.");
			outputText("[pg]Telly gasps, her hazel eyes dilating as she takes the flower in her hands. [say: It's beautiful, [mister]!] The shopkeep pauses to bury her nose in it and sniff. [say: It smells so sweet and fragrant, like vanilla and roses!]");
			outputText("[pg]The twinkle in her eyes and the open-mouthed smile across her face speak volumes about her appreciation, giving you a sense of satisfaction in a gift well-chosen.");
			outputText("[pg][say: It's such an exotic flower, thank you very much,] she says, moving forward to embrace you in a hug.");
			player.consumeItem(consumables.DRAKHRT);
			tellyOphile |= TELLYCOMD;
			experimenTelly = time.days;
			player.dynStats("cor", .5);
			player.changeFatigue(-20);
			doNext(tellyMarket);
		}

		//tellySaver interface
		public function get saveName():String { return "telly"; }
		public function get saveVersion():int { return 1; }
		public function reset():void {
			tellyMetry = {tellyGenesis:false, tellyOphile:0, tellyTubby:"purple", tellyGraph:"butterfly", tellyCardiogram:0, tellyTimer:0, tellyText:false, tellyGram:0, tellyCommand:0, tellyPlasmed:false, vesTelly:0, tasTelly:0, experimenTelly:0};
		}
		public function onAscend(reset:Boolean):void {
			tellyMetry = {tellyGenesis:false, tellyOphile:0, tellyTubby:"purple", tellyGraph:"butterfly", tellyCardiogram:0, tellyTimer:0, tellyText:false, tellyGram:0, tellyCommand:0, tellyPlasmed:false, vesTelly:0, tasTelly:0, experimenTelly:0};
		}
		public function saveToObject():Object { return tellyMetry; }
		public function loadFromObject(o:Object, ignoreErrors:Boolean):void {}
		public function load(version:int, saveObject:Object):void {
			for (var tellyGuidance:String in tellyMetry)
				if (saveObject.hasOwnProperty(tellyGuidance)) tellyMetry[tellyGuidance] = saveObject[tellyGuidance];
		}
	}
}

license: unknown


code:
/**
 * Created by aimozg on 06.01.14.
 */
package classes.Scenes.Places
{
	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.Areas.Lake.*;
	import classes.Scenes.Places.Boat.*;

	public class Boat extends AbstractLakeContent
	{
		public var sharkGirlScene:SharkGirlScene = new SharkGirlScene();
		public var marae:MaraeScene = new MaraeScene();

	public function Boat() {
	}

	public function isDiscovered():Boolean {
		return player.hasStatusEffect(StatusEffects.BoatDiscovery);
	}

		public function discoverBoat():void {
			clearOutput();
			player.createStatusEffect(StatusEffects.BoatDiscovery,0,0,0,0);
			outputText("As you journey around the lake, The air is fresh, and the grass is cool and soft under your feet. Soft waves lap against the muddy sand of the lake-shore, as if radiating outward from the lake.   You pass around a few bushes carefully, being wary of hidden 'surprises', and come upon a small dock.  The dock is crafted from old growth trees lashed together with some crude rope.  Judging by the appearance of the rope, it is very old and has not been seen to in quite some time.  Tied to the dock is a small rowboat, only about seven feet long and three feet wide. The boat seems to be in much better condition than the dock--it actually looks rather new. You're confident it'll allow you to make trips onto the lake.\n\n");
			outputText("<b>(\"Boat\" added to Places menu.)</b>");
			doNext(camp.returnToCampUseOneHour);
		}

	private var _explorationEncounter:Encounter = null;
	public function get explorationEncounter():Encounter {
		return _explorationEncounter ||= Encounters.group(game.commonEncounters, {
			name  : "izmakids",
			chance: 0.1,
			when  : function ():Boolean {
				return flags[kFLAGS.IZMA_KIDS_IN_WILD] > 0 && game.izmaScene.izmaFollower();
			},
			call  : game.izmaScene.findLostIzmaKids
		}, marae.encounterObject, {
			name: "nothing",
			call: nothingSpecial
		}, {
			name: "sharkgirl",
			call: curry(sharkGirlScene.sharkGirlEncounter, 1)
		}, {
			name  : "zealot",
			chance: 0.5,
			mods  : [FnHelpers.FN.ifLevelMin(2)],
			when  : function():Boolean {
				return flags[kFLAGS.FACTORY_SHUTDOWN] > 0;
			},
			call  : lake.fetishZealotScene.zealotBoat
		}, {
			name: "anemone",
			call: game.anemoneScene.mortalAnemoneeeeee
		}, {
			name : "lightrailavenger",
			call : findLightRailAvenger,
			when : function():Boolean { return flags[kFLAGS.GRABBED_LIGHT_RAIL_AVENGER] != 1 && silly() },
			chance : 0.05
		});
	}

	public function boatExplore():void {
			// XXX: This is supposed to be displayed for all encounters except Fetish Zealot. I guess new system doesn't allow this without putting it to every other encounter. Or removing clearOutput() from them.
			clearOutput();
			player.location = "boat";
			player.addStatusValue(StatusEffects.BoatDiscovery, 1, 1);
			outputText("You reach the dock without any incident and board the small rowboat.  The water is calm and placid, perfect for rowing.  ");
			if (flags[kFLAGS.FACTORY_SHUTDOWN] == 2) {
				outputText("The water appears somewhat muddy and has a faint pungent odor.  ");
				if (player.inte > 40) outputText("You realize what it smells like--sex.  ");
			}
			outputText("You set out, wondering if you'll find any strange islands or creatures in the lake.\n\n");

			explorationEncounter.execEncounter();
		}

		public function findLightRailAvenger():void{
			outputText("You're near the center of the lake. Your arms are burning with exhaustion, and it's becoming evident that there's nothing interesting to be found here.");
			outputText("\n\nSuddenly, a glint at the bottom of the lake catches your eyes.");
			outputText("\nYou move in to investigate. It is a rather curious thing; the clouds have congregated in a way that the only ray of sunshine is beaming down onto the submerged metallic object. Its reflection is fierce, almost as bright as the sun itself.");
			outputText("\nYou decide to dive down and see what it is.");
			outputText("\n\nThe object is hidden pretty deep underwater, but, for some reason, you don't feel shortness of breath. You've been underwater for several dozen seconds now, but you're absolutely fine. Staring at the reflection gives you breath and energizes you.");
			outputText("\nYou finally reach the object, and it's a sword, and a sheath nearby! It is stabbed deep on a rock, but you manage to pull it off with remarkable ease.You head back to the surface to better analyze your prize.");
			doNext(findLightRailAvenger2);
		}

		public function findLightRailAvenger2():void{
			clearOutput();
			outputText("You surface and climb on your boat. You then look at the sword.");
			outputText("\nIt's a Katana, with a matching wood sheath. The metal on the blade is marvelous, and the metal was forged in a way that resulted in a wavy pattern resembling a dragon throughout its length. The sheath is black, with exquisite red and gold drawings of dragons, and a red ribbon at its tip.");
			outputText("\n\nYou thumb at the sword's edge to check its sharpness, and, to your surprise, it is absolutely dull. You attempt to cut anything nearby, from wood to cloth to a strand of hair, but nothing works. What a lousy sword! Well, it may sell as decoration.");
			menu();
			addButton(0, "Take Sword", takeSword).hint("Take the worthless sword.");
			addButton(1, "Leave", camp.returnToCampUseOneHour).hint("Leave the worthless sword in the lake.");
		}

		public function takeSword():void{
			clearOutput();
			outputText("Well, it would make for a pretty decent decoration for your camp. You take the sword, a bit disappointed with the result of your exploration.");
			flags[kFLAGS.GRABBED_LIGHT_RAIL_AVENGER] = 1;
			inventory.takeItem(weapons.LRAVENG, camp.returnToCampUseOneHour);
		}

		public function tookSword():void{
			flags[kFLAGS.GRABBED_LIGHT_RAIL_AVENGER] = 1;
			camp.returnToCampUseOneHour();
		}
		private function nothingSpecial():void {
			outputText(images.showImage("location-boat"));
			if (rand(2) == 0) {
				outputText("You row for nearly an hour, until your arms practically burn with exhaustion from all the rowing.");
			} else {
				outputText("You give up on finding anything interesting, and decide to go check up on your camp.");
			}
			doNext(camp.returnToCampUseOneHour);
		}
	}
}


code:
/**
 * Created by aimozg on 06.01.14.
 */
package classes.Scenes.Places.Boat
{
	import classes.*;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.Scenes.Places.Boat;

	public class AbstractBoatContent extends BaseContent
	{
		protected function get boat():Boat {
			return game.boat;
		}
		public function AbstractBoatContent()
		{
		}
	}
}


code:
package classes.Scenes.Places.Boat
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.GlobalFlags.*;
	import classes.internals.*;

	public class Marae extends Monster
	{

		//Corrupted Marae's specials
		public function tentacleAttack():void {
			outputText("You spot barrage of tentacles coming your way! You attempt to dodge your way out ");
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (result.dodge == EVASION_SPEED)
			{
				outputText("and you successfully dodge her tentacles!");
			}
			else if (result.dodge != null)
			{
				outputText("and you successfully dodge her tentacles thanks to your superior evasion!");
			}
			else
			{
				outputText("but you fail and get hit instead! The feel of the tentacles left your groin slightly warmer. ");
				var damage:int = ((str + 100) + rand(50))
				player.takeLustDamage(rand(5) + 5, true);
				damage = player.reduceDamage(damage,this);
				player.takeDamage(damage, true);
			}

		}

		public function tentacleRape():void {

			outputText("You spot barrage of tentacles coming your way! The tentacles are coming your way, aiming for your groin! ");
			var result:Object = combatAvoidDamage({doDodge:true,doParry:false,doBlock:false});
			if (result.dodge == EVASION_SPEED)
			{
				outputText("You manage to successfully run from her tentacles! ");
			}
			else if (result.dodge != null)
			{
				outputText("You manage to avoid her tentacles thanks to your superior evasion!");
			}
			else
			{
				outputText("You attempt to slap away the tentacles but it's too late! The tentacles tickle your groin and you can feel your [ass] being teased! \"You know you want me!\" Marae giggles. ");
				var lustDmg:int = (20 + rand(player.cor / 10) + rand(player.sens / 5) + rand(player.lib / 10) + rand(10)) * (player.lustPercent() / 100);
				player.takeLustDamage(lustDmg, true, false);

			}

		}

		//Pure Marae's specials
		public function smite():void {
			outputText("Marae mouths a chant. The clouds gather and quickly darkens. It looks like a lightning might strike you!");
			createStatusEffect(StatusEffects.Uber, 1, 0, 0, 0);

		}
		public function smiteHit():void {
			if (game.flags[kFLAGS.IN_COMBAT_USE_PLAYER_WAITED_FLAG] == 1) {
				outputText("You look up in the sky to see the lightning incoming! Thanks to your preparedness, you manage to leap away before the lightning hits you! ");
			}
			else {
				outputText("Without warning, the lightning hits you! Surge of electricity rushes through you painfully. ");
				if (player.cor >= 50) outputText("The intensity of the pain is unbearable. ");
				var damage:int = 100 + str + (player.corAdjustedDown() * 5);
				damage = player.reduceDamage(damage,this);
				player.takeDamage(damage, true);
			}
			if (hasStatusEffect(StatusEffects.Uber)) removeStatusEffect(StatusEffects.Uber);

		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.boat.marae.winAgainstMarae();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			game.boat.marae.loseAgainstMarae();
		}

		override protected function handleFear():Boolean
		{
			game.outputText("\"You think I'm afraid of anything? Foolish mortal.\" Marae snarls.\n\n");
			removeStatusEffect(StatusEffects.Fear);
			return true;
		}

		override protected function performCombatAction():void{
			if (hasStatusEffect(StatusEffects.Uber)) {
				smiteHit();
				return;
			}
			var actionChoices:MonsterAI = new MonsterAI();
			actionChoices.add(eAttack, 3, true, 0, FATIGUE_NONE, game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2 ? RANGE_MELEE_FLYING : RANGE_MELEE);
			actionChoices.add(smite, 3, game.flags[kFLAGS.FACTORY_SHUTDOWN] == 1, 15,FATIGUE_NONE,RANGE_SELF);
			actionChoices.add(tentacleAttack, 3, game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2, 10, FATIGUE_PHYSICAL, RANGE_MELEE_FLYING);
			actionChoices.add(tentacleRape, 3, game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2, 10, FATIGUE_PHYSICAL, RANGE_MELEE_FLYING);
			actionChoices.exec();
		}

		public function Marae()
		{
			this.a = "";
			this.short = "Marae";
			this.imageName = "marae";
			if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2) {
				this.long = "This being is known as the goddess of Mareth. She is corrupted due to the aftermath of the factory valves being blown up. She's white all over and textured with bark. The \"flower\" below her belly button resembles more of a vagina than a flower. Her G-cup sized breasts jiggle with every motion."
				this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
				createBreastRow(Appearance.breastCupInverse("G"));
			}
			else {
				this.long = "This being is known as the goddess of Mareth. She is no longer corrupted thanks to your actions at the factory. She's white all over and textured with bark. Her breasts are modestly sized."
				this.createVagina(false, Vagina.WETNESS_WET, Vagina.LOOSENESS_NORMAL);
				createBreastRow(Appearance.breastCupInverse("DD"));
			}
			this.race = "Deity";
			this.ass.analLooseness = 1;
			this.ass.analWetness = 1;
			this.tallness = 10*12;
			this.hips.rating = 10;
			this.butt.rating = 8;
			this.skin.tone = "white";
			this.skin.setType(Skin.PLAIN);
			this.hair.color = "green";
			this.hair.length = 36;
			if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2) {
				initStrTouSpeInte(150, 150, 70, 110);
				initLibSensCor(60, 25, 100);
				this.weaponName = "tentacles";
				this.weaponVerb="slap";
				this.weaponAttack = 40;
			}
			else {
				initStrTouSpeInte(200, 150, 100, 150);
				initLibSensCor(25, 25, 0);
				this.weaponName = "fists";
				this.weaponVerb="wrathful punch";
				this.weaponAttack = 50;
			}
			this.weaponPerk = [];
			this.weaponValue = 25;
			this.armorName = "bark";
			this.armorDef = 30;
			this.bonusHP = 4750;
			this.bonusLust = 80;
			if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 1) {
				this.bonusHP += 2700;
				if (game.flags[kFLAGS.MINERVA_TOWER_TREE] > 0) this.bonusHP += 1000;
			}
			this.lust = 30;
			this.lustVuln = .07;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 99;
			this.additionalXP = 2500;
			if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 1) {
				this.additionalXP += 500;
			}
			this.drop = NO_DROP;
			this.gems = 1000;
			if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 1) {
				this.special1 = smite;
			}
			if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2) {
				this.special1 = tentacleAttack;
				this.special2 = tentacleRape;
			}
			this.createPerk(PerkLib.Tank, 0, 0, 0, 0);
			this.createPerk(PerkLib.Tank2, 0, 0, 0, 0);
			this.createPerk(PerkLib.ImprovedSelfControl, 0, 0, 0, 0);
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Places.Boat
{
	import classes.*;
	import classes.BodyParts.Butt;
	import classes.BodyParts.Hips;
	import classes.display.SpriteDb;
	import classes.internals.*;

	public class SharkGirl extends Monster
	{
		//Lust-based attacks:
		private function sharkTease():void {
			game.spriteSelect(SpriteDb.s_sharkgirl);
			if (rand(2) == 0) {
				outputText("You charge at the shark girl, prepared to strike again, but stop dead in your tracks when she bends over and wiggles her toned ass towards you. It distracts you long enough for her tail to swing out and smack you to the ground. She coos, \"Aw... You really do like me!\" ");
				//(Small health damage, medium lust build).
				player.takeDamage(4+rand(4), true);
				player.takeLustDamage(10+(player.lib/20), true);
			}
			else {
				outputText("You pull your " + player.weaponName + " back, getting a running start to land another attack. The Shark girl smirks and pulls up her bikini top, shaking her perky breasts in your direction. You stop abruptly, aroused by the sight just long enough for the shark girl to kick you across the face and knock you to the ground.  She teases, \"Aw, don't worry baby, you're gonna get the full package in a moment!\" ");
				//(Small health damage, medium lust build)
				player.takeDamage(4+rand(4), true);
				player.takeLustDamage(5+(player.lib/10), true);
			}

		}

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

		override public function outputAttack(damage:int):void{
			super.outputAttack(damage);
			if (damage > 0 && rand(3) == 0){
				if(player.bleed(this))outputText("\nThe shark-girl's sharp teeth tear through your skin, causing blood to gush out with every beat of your heart! You're bleeding!");
			}
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.boat.sharkGirlScene.sharkWinChoices();
		}

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

		public function SharkGirl()
		{
			//trace("SharkGirl Constructor!");
			this.a = "the ";
			this.short = "shark-girl";
			this.imageName = "sharkgirl";
			this.long = "The shark girl stands just over 5'5\", with gray skin shimmering from water droplets catching the sunlight and slender muscles built for swimming.  Her shoulder-length silver hair brushes past her pretty face and her eyes are a striking shade of red. She has rows of intimidating sharp teeth glinting in the light. A fish-like tail protrudes from her backside, wrapping around her toned legs at every opportunity. She's wearing a rather skimpy black bikini, strings done in such a way that they move around her fin; though the swimwear itself barely covers her perky breasts and tight snatch.";
			this.race = "Shark-Morph";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 15, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("D"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,40,0,0,0);
			this.tallness = 5*12+5;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "gray";
			this.hair.color = "silver";
			this.hair.length = 16;
			initStrTouSpeInte(40, 40, 55, 42);
			initLibSensCor(75, 35, 40);
			this.weaponName = "shark teeth";
			this.weaponVerb="bite";
			this.weaponAttack = 3;
			this.armorName = "tough skin";
			this.armorDef = 5;
			this.bonusHP = 20;
			this.lust = 40;
			this.lustVuln = .9;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 4;
			this.gems = rand(15) + 5;
			this.drop = new WeightedDrop().
					add(consumables.L_DRAFT,3).
					add(armors.S_SWMWR,1).
					add(consumables.SHARK_T,5).
					add(null,1);
			this.special1 = sharkTease;
			this.special2 = sharkTease;
			checkMonster();
		}

	}

}