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 kGAMECLASS.boat;
		}
		public function AbstractBoatContent()
		{
		}
	}
}


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

	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 ", false);
			var evade:String = player.getEvasionReason();
			if (evade == EVASION_SPEED)
			{
				outputText("and you successfully dodge her tentacles!", false);
			}
			else if (evade != null)
			{
				outputText("and you successfully dodge her tentacles thanks to your superior evasion!", false);
			}
			else
			{
				outputText("but you fail and get hit instead! The feel of the tentacles left your groin slightly warmer. ", false);
				var damage:int = ((str + 100) + rand(50))
				game.dynStats("lust", rand(5) + 5);
				damage = player.reduceDamage(damage);
				player.takeDamage(damage, true);
			}
			combatRoundOver();
		}

		public function tentacleRape():void {

			outputText("You spot barrage of tentacles coming your way! The tentacles are coming your way, aiming for your groin! ", false);
			var evade:String = player.getEvasionReason();
			if (evade == EVASION_SPEED)
			{
				outputText("You manage to successfully run from her tentacles! ", false);
			}
			else if (evade != null)
			{
				outputText("You manage to avoid her tentacles thanks to your superior evasion!", false);
			}
			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. ", false);
				var lustDmg:int = (20 + rand(player.cor / 10) + rand(player.sens / 5) + rand(player.lib / 10) + rand(10)) * (player.lustPercent() / 100);
				game.dynStats("lust", lustDmg, "resisted", false);
				outputText("(" + lustDmg + " lust)");

			}
			combatRoundOver();
		}

		//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);
			combatRoundOver();
		}
		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.cor * 5);
				damage = player.reduceDamage(damage);
				player.takeDamage(damage, true);
			}
			if (findStatusEffect(StatusEffects.Uber) >= 0) removeStatusEffect(StatusEffects.Uber);
			combatRoundOver();
		}

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

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

		override public function doAI():void {
			if (findStatusEffect(StatusEffects.Stunned) >= 0) {
				outputText("Your foe is too dazed from your last hit to strike back!", false)
				if (findStatusEffect(StatusEffects.Uber) >= 0) {
					outputText(" You've managed to interrupt her smite attack!");
					removeStatusEffect(StatusEffects.Uber);
				}
				if (statusEffectv1(StatusEffects.Stunned) <= 0) removeStatusEffect(StatusEffects.Stunned);
				else addStatusValue(StatusEffects.Stunned, 1, -1);
				combatRoundOver();
				return;
			}
			if (findStatusEffect(StatusEffects.Fear) >= 0) {
				game.outputText("\"You think I'm afraid of anything? Foolish mortal.\" Marae snarls.\n\n");
				removeStatusEffect(StatusEffects.Fear);
			}
			var chooser:int = rand(10);
			if (findStatusEffect(StatusEffects.Uber) >= 0) {
				smiteHit();
				return;
			}
			if (chooser < 4) {
				eAttack();
				return
			}
			else if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 1) {
				if (chooser >= 4 && chooser < 7) eAttack();
				if (chooser >= 7 && chooser < 10) smite();
			}
			else if (game.flags[kFLAGS.FACTORY_SHUTDOWN] == 2) {
				if (chooser >= 4 && chooser < 7) tentacleAttack();
				if (chooser >= 7 && chooser < 10) tentacleRape();
			}
		}

		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.ass.analLooseness = 1;
			this.ass.analWetness = 1;
			this.tallness = 10*12;
			this.hipRating = 10;
			this.buttRating = 8;
			this.skinTone = "white";
			this.skinType = 0;
			//this.skinDesc = Appearance.Appearance.DEFAULT_SKIN_DESCS[SKIN_TYPE_FUR];
			this.hairColor = "green";
			this.hairLength = 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();
		}

	}

}

license: unknown


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

	public class SharkGirl extends Monster
	{
		//Lust-based attacks:
		private function sharkTease():void {
			game.spriteSelect(70);
			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!\" ", false);
				//(Small health damage, medium lust build).
				player.takeDamage(4+rand(4), true);
				game.dynStats("lus", (10+(player.lib/20)));
			}
			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!\" ", false);
				//(Small health damage, medium lust build)
				player.takeDamage(4+rand(4), true);
				game.dynStats("lus", (5+(player.lib/10)));
			}
			combatRoundOver();
		}
		override public function defeated(hpVictory:Boolean):void
		{
			game.boat.sharkGirlScene.sharkWinChoices();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean):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 grey 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.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 = ANAL_LOOSENESS_TIGHT;
			this.ass.analWetness = ANAL_WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,40,0,0,0);
			this.tallness = 5*12+5;
			this.hipRating = HIP_RATING_AMPLE+2;
			this.buttRating = BUTT_RATING_LARGE;
			this.skinTone = "gray";
			this.hairColor = "silver";
			this.hairLength = 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();
		}

	}

}


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

	public class AbstractFarmContent extends BaseContent
	{
		public function AbstractFarmContent()
		{
		}
		protected function get farm():Farm {
			return kGAMECLASS.farm;
		}

	}
}


code:
package classes.Scenes.Places.Farm
{
	import classes.Monster;
	/**
	 * ...
	 * @author ...
	 */
	public class Whitney extends Monster
	{

		public function Whitney()
		{

		}

	}

}


code:
//Ingnam: The Prologue
package classes.Scenes.Places
{
	import classes.*;
	import classes.GlobalFlags.*;
	import classes.Items.*;
	import classes.Scenes.Places.Ingnam.*;

	import coc.view.MainView;

	public class Ingnam extends BaseContent
	{
		public var ingnamFarm:IngnamFarm = new IngnamFarm();
		public var thiefScene:ThiefScene = new ThiefScene();

		public function get inIngnam():Boolean { return flags[kFLAGS.IN_INGNAM] > 0; }

		public function Ingnam()
		{
		}

		//Main Ingnam menu.
		public function menuIngnam():void {
			//Force autosave
			if (player.slotName != "VOID" && mainView.getButtonText(0) != "Game Over" && flags[kFLAGS.HARDCORE_MODE] > 0)
			{
				trace("Autosaving to slot: " + player.slotName);

				getGame().saves.saveGame(player.slotName);
			}
			//Banished to Mareth.
			if (model.time.days >= 0 && flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] <= 0) {
				getBanishedToMareth();
				return;
			}
			clearOutput();
			outputText(images.showImage("location-ingnam"));
			outputText("Ingnam is a rich and prosperous village despite its small size. There is already a well-established array of shops with a constant hum of tradesmen and merchants. The temple sits within view of the patrons sitting at tables at the tavern which serves as a hub for people near and far to drink and dance. On the road leading out of the plaza that sits before the temple is a trail that meanders its way to a large farm in the distance.");
			outputText("\n\nLooming ominously in the distance is a mountain known by the locals as Mount Ilgast. Surrounding Ingnam is a vast expanse of wilderness.");
			if (model.time.hours >= 21 || model.time.hours < 6) outputText("\n\nIt's dark outside. Stars dot the night sky and a moon casts the moonlight over the landscape, providing little light. Shops are closed at this time.");
			mainView.showMenuButton( MainView.MENU_NEW_MAIN );
			mainView.showMenuButton( MainView.MENU_DATA );
			mainView.showMenuButton( MainView.MENU_STATS );
			mainView.showMenuButton( MainView.MENU_PERKS );
			mainView.showMenuButton( MainView.MENU_APPEARANCE );
			showStats();
			mainView.setMenuButton( MainView.MENU_NEW_MAIN, "Main Menu", kGAMECLASS.mainMenu );
			mainView.newGameButton.toolTipText = "Return to main menu.";
			mainView.newGameButton.toolTipHeader = "Main Menu";
			if (camp.setLevelButton()) return;
			hideUpDown();
			menu();
			addButton(0, "Explore", exploreIngnam);
			addButton(1, "Shops", menuShops);
			addButton(2, "Temple", menuTemple);
			addButton(3, "Inn", menuTavern);
			addButton(4, "Farm", ingnamFarm.menuFarm);
			if (flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] > 0) addButton(5, "Return2Camp", returnToMareth);
			if (flags[kFLAGS.NEW_GAME_PLUS_LEVEL] > 0 && inventory.showStash() && flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] <= 0) addButton(6, "Stash", inventory.stash);
			addButton(7, "Inventory", inventory.inventoryMenu);
			if (player.lust >= 30) {
				if (player.lust >= player.maxLust()) {
					outputText("\n\nYou are debilitatingly aroused, and can think of doing nothing other than masturbating.", false);
					removeButton(0);
					removeButton(4);
				}
				addButton(8, "Masturbate", kGAMECLASS.masturbation.masturbateMenu);
				if (((player.findPerk(PerkLib.HistoryReligious) >= 0 && player.cor <= 66) || (player.findPerk(PerkLib.Enlightened) >= 0 && player.cor < 10)) && !(player.findStatusEffect(StatusEffects.Exgartuan) >= 0 && player.statusEffectv2(StatusEffects.Exgartuan) == 0) || flags[kFLAGS.SFW_MODE] >= 1) addButton(8, "Meditate", kGAMECLASS.masturbation.masturbateMenu);
			}
			//Show wait/rest/sleep depending on conditions.
			addButton(9, "Wait", kGAMECLASS.camp.doWait);
			if (player.fatigue > 40 || player.HP / player.maxHP() <= .9) addButton(9, "Rest", getGame().camp.rest);
			if (model.time.hours >= 21 || model.time.hours < 6) {
				removeButton(0);
				removeButton(1);
				removeButton(2);
				removeButton(4);
				addButton(9, "Sleep", getGame().camp.doSleep);
			}
		}

		//The end of prologue, starts the game.
		public function getBanishedToMareth():void {
			var hasWeapon:Boolean = false;
			clearOutput();
			hideMenus();
			outputText("Your time has come to meet up with the village elders. You know you are going to get sent to the demon realm and you're most likely not going to be able to return to Ingnam. You give your family and friends a long farewell.");
			if (flags[kFLAGS.NEW_GAME_PLUS_LEVEL] == 0) { //Doesn't happen in New Game+.
				if (player.weaponName != "fists") {
					hasWeapon = true;
					player.setWeapon(WeaponLib.FISTS);
				}
				while (player.hasItem(weapons.DAGGER, 1)) {
					hasWeapon = true;
					player.destroyItems(weapons.DAGGER, 1);
				}
				while (player.hasItem(weapons.PIPE, 1)) {
					hasWeapon = true;
					player.destroyItems(weapons.PIPE, 1);
				}
				while (player.hasItem(weapons.SPEAR, 1)) {
					hasWeapon = true;
					player.destroyItems(weapons.SPEAR, 1);
				}
				while (player.hasItem(weapons.KATANA, 1)) {
					hasWeapon = true;
					player.destroyItems(weapons.KATANA, 1);
				}
				if (hasWeapon) outputText("\n\nUnfortunately, you were instructed to leave your weapon behind.");
			}
			flags[kFLAGS.IN_INGNAM] = 0;
			flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] = 1;
			doNext(kGAMECLASS.charCreation.arrival);
		}

		public function returnToMareth():void {
			clearOutput();
			outputText("You make your journey to Mount Ilgast, walk through the portal back to Mareth and return to your camp.");
			flags[kFLAGS.IN_INGNAM] = 0;
			doNext(camp.returnToCampUseOneHour);
		}

		public function returnToIngnam():void {
			clearOutput();
			outputText("You enter the portal and make your return to Ingnam, thanks to the debug powers.");
			flags[kFLAGS.IN_INGNAM] = 1;
			doNext(camp.returnToCampUseOneHour);
		}

		//Explore Ingnam
		public function exploreIngnam():void {
			hideMenus();
			clearOutput();
			var chooser:int = rand(4);
			if (chooser == 0) {
				thiefScene.encounterThief();
				return;
			}
			else {
				outputText("You explore the village of Ingnam for a while but you don't find anything intersting.");
			}
			doNext(camp.returnToCampUseOneHour);
		}

		//Shopping time!
		public function menuShops():void {
			hideMenus();
			clearOutput();
			outputText("Which shop would you like to visit?");
			menu();
			addButton(0, "Blacksmith", shopBlacksmith);
			addButton(1, "Tailor", shopTailor);
			addButton(2, "Alchemist", shopAlchemist);
			addButton(3, "Trading Post", shopTradingPost);
			addButton(4, "Black Market", shopBlackMarket);
			addButton(14, "Back", menuIngnam);
		}

		public function shopBlacksmith():void {
			clearOutput();
			outputText("You enter the armor shop, noting the sign depicting armors. Some armor is proudly displayed on racks. You can hear the sound of hammering although it stops shortly after you enter. The local blacksmith, Ben, comes from the rear door and steps up to the counter and wipes away sweat from his face flushed red by the forge, \"Welcome to my shop. In a need of protection? Or something sharp?\"");
			if (flags[kFLAGS.INGNAM_WEAPONSMITH_TALKED] <= 0 && flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] <= 0) {
				outputText("\n\n\Before you can get a word in Ben lets out an exasperated sigh \"Ah, just forget about…\"");
				outputText("\n\nYou crook an eyebrow questioningly at the blacksmith. Ben then realizes his blunder.");
				outputText("\n\n\"Ah, well it’s just… You’re the new Champion, right? None of the people I’ve seen who get sent to the portal brought a weapon and you would waste some gems. Still, if you want to train with weapons, you can go ahead and buy them. A little preparation never hurt anyone.\" the blacksmith says.");
				flags[kFLAGS.INGNAM_WEAPONSMITH_TALKED] = 1;
			}
			outputText("\n\nBlacksmith's pricings");
			menu();
			if (player.findPerk(PerkLib.HistoryFighter) >= 0) { //20% discount for History: Fighter
				addShopItem(weapons.DAGGER, 32, 1);
				addShopItem(weapons.PIPE, 40, 1);
				addShopItem(weapons.SPEAR, 140, 1);
				addShopItem(weapons.KATANA, 200, 1);
				addShopItem(weapons.MACE, 80, 1);
			}
			else {
				addShopItem(weapons.DAGGER, 40, 1);
				addShopItem(weapons.PIPE, 50, 1);
				addShopItem(weapons.SPEAR, 175, 1);
				addShopItem(weapons.KATANA, 250, 1);
				addShopItem(weapons.MACE, 100, 1);
			}
			if (player.findPerk(PerkLib.HistorySmith) >= 0) { //20% discount for History: Smith perk
				addShopItem(armors.LEATHRA, 40, 2);
				addShopItem(armors.FULLCHN, 120, 2);
				addShopItem(armors.SCALEML, 160, 2);
			}
			else {
				addShopItem(armors.LEATHRA, 50, 2);
				addShopItem(armors.FULLCHN, 150, 2);
				addShopItem(armors.SCALEML, 200, 2);
			}
			addButton(14, "Leave", menuShops);
		}

		public function shopTailor():void {
			clearOutput();
			outputText("You enter the tailor’s. The interior is laden with mannequins wearing half-finished works. Clothes are displayed on racks without obvious flaws. A fastidious, well-groomed young man with an immaculate blue three-piece suit topped with a measuring tape draping around his collar stands behind the counter and smiles at you with deference.");
			outputText("\n\n\"Welcome to my shop. Do you need to get outfitted?\" he says pulling keenly at the measuring tape draping his shoulders.");
			outputText("\n\nTailor shop pricings");
			menu();
			addShopItem(armors.C_CLOTH, 10, 3);
			addShopItem(armors.ADVCLTH, 75, 3);
			addShopItem(armors.CLSSYCL, 100, 3);
			addShopItem(armors.TUBETOP, 40, 3);
			addShopItem(armors.OVERALL, 30, 3);
			addShopItem(armors.M_ROBES, 75, 3);
			addShopItem(armors.LTHRPNT, 200, 3);
			addShopItem(armors.RBBRCLT, 500, 3);
			addShopItem(armors.T_BSUIT, 650, 3);
			addButton(14, "Leave", menuShops);
		}

		public function shopAlchemist():void {
			clearOutput();
			if (flags[kFLAGS.INGNAM_ALCHEMIST_TALKED] <= 0) {
				outputText("As you approach the stone building the overpowering smell of herbs and plants being brewed hits your nose. The crimson banner over the heavy wooden door indicates that this is where the potions are made. You enter what appears to be the place where the alchemist works on his famed remedies.");
				outputText("\n\nYou open the door and enter. Despite the establishment being dimly lit by candlelight you can make out the vast multicolored rows of countless potions, elixirs and tonics. Fragrant drying herbs are hanging from the rafters and various strange-looking equipment is set up in a variety of locations in the store.");
				outputText("\n\nAn ancient-looking man in a much-singed pair of robes is working on something volatile in the corner until he hears your presence. He stops and shuffles up to the timber counter, drumming it under his stained fingers. \"What can I do for you, young master?\" he says from under his frayed hood.");
				flags[kFLAGS.INGNAM_ALCHEMIST_TALKED] = 1;
			}
			else {
				outputText("Once again, you return to the alchemist, letting the overpowering smell of herbs and plants being brewed hits your nose.");
				outputText("\n\nThe alchemist senses your presences and he steps up to the counter and says, \"How may I help you?\"");
			}
			outputText("\n\nAlchemy shop pricings");
			menu();
			if (player.findPerk(PerkLib.HistoryAlchemist) >= 0) { //20% discount for History: Alchemist perk
				addShopItem(consumables.REDUCTO, 80, 4);
				addShopItem(consumables.GROPLUS, 80, 4);
				addShopItem(consumables.L_DRAFT, 25, 4);
				addShopItem(consumables.LACTAID, 40, 4);
			}
			else {
				addShopItem(consumables.REDUCTO, 100, 4);
				addShopItem(consumables.GROPLUS, 100, 4);
				addShopItem(consumables.L_DRAFT, 30, 4);
				addShopItem(consumables.LACTAID, 50, 4);
			}
			addButton(14, "Leave", menuShops);
		}

		public function shopTradingPost():void {
			clearOutput();
			outputText("The trading post is one of the larger buildings in the village with its porch covered in barrels filled with pickled goods, preserved delicacies and dried goods from the humble local farm to exotic faraway lands. The interior is packed with crowded shelves that boast a variety of goods, all arranged neatly on shelves.");
			outputText("\n\nYou suspect you could buy some imported goods here.");
			outputText("\n\nTrading post pricings");
			menu();
			addShopItem(consumables.VITAL_T, 30, 5);
			addShopItem(consumables.SMART_T, 30, 5);
			addShopItem(consumables.FISHFIL, 5, 5);
			addButton(14, "Leave", menuShops);
		}

		public function shopBlackMarket():void {
			clearOutput();
			if (flags[kFLAGS.INGNAM_BLACKMARKET_TALKED] <= 0) {
				outputText("You walk into an alley you swear you have never explored before. You stifle your fear as you walk into the dingy looking alley.");
				outputText("\n\nUnease creeps over you until you hear a raspy voice whisper from the darkness of the alley. You look around to see a hooded figure skulk from the shadows to approach you.");
				outputText("\n\n\"Greetings. I know you. You’re going to be the new Champion, right?\" The hooded figure croaks. His face is mostly concealed by the shade of his hood. Slightly unnerved by the prowling figure you tell him that yes, you’re going to be the Champion of Ingnam.");
				outputText("\n\nHe pulls his hood down, quickly looking for the all-clear and rasps, \"I’ve managed to sneak into the portal at the mountains. There is extraordinary stuff that can transform you! It takes me years of planning as the portal is only open for a short window of time before it closes for the rest of the year.\"");
				outputText("\n\nWith a skin-crawling chuckle he opens up his coat and shows you the array of goods and says, \"I’ve managed to smuggle these in. They aren’t cheap but I guarantee you, they’re the real deal! See anything you like?\"");
				flags[kFLAGS.INGNAM_BLACKMARKET_TALKED] = 1;
			}
			else {
				outputText("Once again, you walk into the alley where the shady dealer should be. He approaches you as if he knows you.");
				outputText("\n\n\"Back, I see? See any deals you like?\" The shady man asks.");
			}
			outputText("\n\nBlack market pricings");
			menu();
			addShopItem(consumables.W_FRUIT, 75, 6);
			addShopItem(consumables.CANINEP, 75, 6);
			addShopItem(consumables.EQUINUM, 75, 6);
			addShopItem(consumables.INCUBID, 75, 6);
			addShopItem(consumables.SUCMILK, 75, 6);
			addButton(14, "Leave", menuShops);
		}

		//Transaction for buying items.
		public function transactionItemConfirmation(item:ItemType, price:int, shop:int):void {
			clearOutput();
			outputText("\"That will be " + num2Text(price) + " gems for " + item.longName + ".\"");
			if (player.gems >= price) {
				outputText("\n\nDo you buy it?");
				menu();
				addButton(0, "Yes", transactionYes, item, price, shop);
				addButton(1, "No", transactionNo, shop);
			}
			else {
				outputText("\n\nYou count out your gems and realize it's beyond your price range.");
				menu()
				addButton(0, "Next", transactionNo, shop);
			}
		}
		public function transactionYes(item:ItemType, price:int, shop:int):void {
			//Determine shop
			var shopToGo:Function = null
			if (shop == 1) shopToGo = shopBlacksmith;
			else if (shop == 2) shopToGo = shopBlacksmith;
			else if (shop == 3) shopToGo = shopTailor;
			else if (shop == 4) shopToGo = shopAlchemist;
			else if (shop == 5) shopToGo = shopTradingPost;
			else shopToGo = shopBlackMarket;
			//Process
			clearOutput();
			if (player.gems >= price) {
				outputText("You have purchased " + item.longName + " for " + price + " gems. ");
				player.gems -= price;
				menu();
				statScreenRefresh();
				inventory.takeItem(item, shopToGo);
			}
			else {
				outputText("You count out your gems and realize it's beyond your price range.");
				menu();
				addButton(0, "Next", transactionNo, shop);
			}
		}
		public function transactionNo(shop:int):void {
			if (shop == 1) shopBlacksmith();
			else if (shop == 2) shopBlacksmith();
			else if (shop == 3) shopTailor();
			else if (shop == 4) shopAlchemist();
			else if (shop == 5) shopTradingPost();
			else if (shop == 6) shopBlackMarket();
			else shopBlackMarket();
		}

		public function addShopItem(item:ItemType, price:int, shop:int):void {
			outputText("\n" + capitalizeFirstLetter(item.longName) + " - " + price + " gems");
			var button:int = 0;
			for (var i:int = 0; i < 14; i++) {
				if (buttonIsVisible(i)) button++;
			}
			addButton(button, item.shortName, transactionItemConfirmation, item, price, shop);
		}

		//Temple
		public function menuTemple():void {
			hideMenus();
			clearOutput();
			outputText(images.showImage("location-ingnam-temple"));
			outputText("The village’s temple appears humble looking from its stony exterior but the interior of temple is truly a marvel to behold - intricately decorated wooden arches adorned with complex patterns of arcane runes of the Old World, walls adorned with majestic tapestries depicting the Gods and their most valiant of feats and, to the end of the temple stands an incredibly designed shrine to the All-Giving, the mother of all Gods.");
			outputText("\n\nIncense languorously wafts from the alcoves where offerings of fruit are left out for the Gods. Monks passively move amongst the parishioners, offering solace to those in need, food or drink to those who are weary, or in meditation.");
			outputText("\n\nThere are several soft mats on the floor to provide soft areas for people to pray on.");
			menu();
			addButton(0, "Meditate", kGAMECLASS.masturbation.meditate);
			addButton(14, "Leave", menuIngnam);
		}

		//Tavern
		public function menuTavern():void {
			hideMenus();
			clearOutput();
			outputText(images.showImage("location-ingnam-inn"));
			outputText("The inn is a cozy little nook that exudes a warm and welcoming air. You see several guardsmen roaring with laughter over a few steins and a hand of cards, and some townsfolk chatting about random topics. The innkeeper stands behind the polished wooden counter, serving beverages to his patrons and cleaning up spilled drinks.");
			if (flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] > 0 && flags[kFLAGS.INGNAM_GREETED_AFTER_LONGTIME] <= 0) {
				welcomeBack();
			}
			if ((player.earType > 0 && player.earType != flags[kFLAGS.INGNAM_EARS_LAST_TYPE] && flags[kFLAGS.INGNAM_EARS_FREAKOUT] <= 0) || (player.tailType > 0 && player.tailType != flags[kFLAGS.INGNAM_TAIL_LAST_TYPE] && flags[kFLAGS.INGNAM_TAIL_FREAKOUT] <= 0) && flags[kFLAGS.INGNAM_PROLOGUE_COMPLETE] <= 0) {
				appearanceFreakout();
				return;
			}
			menu();
			addButton(0, "Order Drink", orderDrink, null, null, null, "Buy some refreshing beverages.");
			addButton(1, "Order Food", orderFood, null, null, null, "Buy some food" + (flags[kFLAGS.HUNGER_ENABLED] > 0 && player.hunger < 50 ? " and curb that hunger of yours!": ".") + "");
			if (flags[kFLAGS.INGNAM_RUMORS] < 3) addButton(2, "Stories", hearRumors, null, null, null, "Hear the story the innkeeper has to offer.");
			//if (player.findPerk(PerkLib.HistoryWhore) >= 0) addButton(5, "Prostitute", whoreForGems, null, null, null, "Seek someone who's willing to have sex with you for profit.");
			addButton(14, "Leave", menuIngnam);
		}

		public function welcomeBack():void {
			clearOutput();
			outputText("The innkeeper looks at you and says, \"Welcome back! I've missed you! How did your adventures go?\"");
			outputText("\n\nYou tell the innkeeper about your adventures and how you've met various denizens in Mareth.\n\n");
			if (flags[kFLAGS.TIMES_TRANSFORMED] <= 0) outputText("The innkeeper looks at you in awe and says, \"Wow, you haven't changed at all! How did you manage to stay in that strange realm for years and still be normal?\"");
			else if (player.race() == "human") {
				outputText("The innkeeper looks at you and says, \"I can see that you have changed a bit.\" ");
			}
			else {
				outputText("The innkeeper looks at you and says, \"I can see that you have changed quite a lot! Back then, before you left, you were a human. Now look at yourself!\"");
			}
			if (player.horns > 0 && player.hornType > 0) {
				outputText("\n\n\"Are these " + (player.hornType == HORNS_ANTLERS ? "antlers" : "horns") + "? I can imagine they must be real,\" The innkeeper says before touching your [horns]. You can already feel his fingers rubbing against your [horns]. \"Yes, they're real and I think you look better,\" he says. You thank him for complimenting on your horns.");
			}
			if (player.wingType > 0 && player.wingType != WING_TYPE_SHARK_FIN) {
				outputText("\n\nNext, he looks at your wings that sprout from your back and says, \"Wings? I've never seen a person with wings before!\" ");
				if (player.canFly()) outputText("You tell him that you can fly. To demonstrate, you guide the innkeeper outside and you grit your teeth with effort as you flap your wings and you finally launch off from the ground and fly around the town! The people of Ingnam, including your family and friends, look at you in shock and some even say, \"" + player.mf("He", "She") + " can fly!\"");
			}
			outputText("\n\nPLACEHOLDER.");
			flags[kFLAGS.INGNAM_GREETED_AFTER_LONGTIME] = 1;
			doNext(menuTavern);
		}

		public function appearanceFreakout():void {
			clearOutput();
			outputText("The innkeeper stands up to see that there's something unusual with your appearance.");
			if (player.earType > 0) {
				if (player.earType == EARS_HORSE) {
					outputText("\n\nHe says, \"Your ears... They look different! They look like horse's! I have no idea how your ears changed.\"");
				}
				if (player.earType == EARS_DOG) {
					outputText("\n\nHe says, \"Your ears... They look like dog's! I have no idea how your ears changed.\"");
				}
				if (player.earType == EARS_CAT) {
					outputText("\n\nHe says, \"Your ears... They look like cat's! I have no idea how your ears changed but other than that, you look much cuter with cat ears!\" He walks over to you and scratch your cat-ears. \"They look and feel so real,\" he says.");
				}
				flags[kFLAGS.INGNAM_EARS_LAST_TYPE] = player.earType;
				flags[kFLAGS.INGNAM_EARS_FREAKOUT] = 1;
			}
			if (player.earType > 0 && player.tailType > 0 && player.hasLongTail()) outputText("Next, he walks behind you, taking a glance at your tail.");
			if (player.tailType > 0) {
				if (player.hasLongTail()) {
					outputText("\n\nHe says with a surprised look, \"You have a tail now? Are you sure this is fake?\" You tell him that your tail is not fake; it's real. \"Prove it,\" he says as he tugs your tail. Ouch! That hurts! \"Sorry about that,\" he says, \"but that tail definitely looks and feels real! I think your tail does look nice.\"");
					outputText("\n\nYou wag your tail and thank him for the compliment and he walks behind the counter.");
				}
				flags[kFLAGS.INGNAM_TAIL_LAST_TYPE] = player.tailType;
				flags[kFLAGS.INGNAM_TAIL_FREAKOUT] = 1;
			}
			doNext(menuTavern);
		}

		public function orderDrink():void {
			clearOutput();
			outputText("What kind of drink would you like?");
			outputText("\n\nPricings");
			outputText("\n5 gems - Beer");
			outputText("\n2 gems - Milk");
			outputText("\n3 gems - Root Beer");

			menu();
			addButton(0, "Beer", buyBeer);
			addButton(1, "Milk", buyMilk);
			addButton(2, "Root Beer", buyRootBeer);
			addButton(14, "Back", menuTavern);
		}

		public function buyBeer():void {
			clearOutput();
			if (player.gems < 5) {
				outputText("You don't have enough gems for that.");
				doNext(orderDrink);
				return;
			}
			player.gems -= 5;
			outputText("\"I'd like a glass of beer please,\" you say. You hand over the five gems to the innkeeper and he pours you a glass of beer.");
			outputText("\n\nYou kick back and drink the beer slowly. ");
			dynStats("lus", 20);
			player.refillHunger(10);
			if (player.findStatusEffect(StatusEffects.Drunk) < 0) {
				player.createStatusEffect(StatusEffects.Drunk, 2, 1, 1, 0);
				dynStats("str", 0.1);
				dynStats("inte", -0.5);
				dynStats("lib", 0.25);
			}
			else {
				player.addStatusValue(StatusEffects.Drunk, 2, 1);
				if (player.statusEffectv1(StatusEffects.Drunk) < 2) player.addStatusValue(StatusEffects.Drunk, 1, 1);
				if (player.statusEffectv2(StatusEffects.Drunk) == 2) {
					outputText("\n\nYou feel a bit drunk. Maybe you should cut back on the beers?");
				}
				//Get so drunk you end up peeing! Genderless can still urinate.
				if (player.statusEffectv2(StatusEffects.Drunk) >= 3) {
					outputText("\n\nYou feel so drunk. Your vision is blurry and you realize something's not feeling right. Gasp! You have to piss like a racehorse! You stumble toward the back door and go outside. ")
					if (player.hasVagina() && !player.hasCock()) outputText("You open up your [armor] and squat down while you release your pressure onto the ground. ");
					else outputText("You open up your [armor] and lean against the wall using one of your arms for support while you release your pressure onto the wall. ");
					outputText("It's like as if the floodgate has opened! ");
					awardAchievement("Urine Trouble", kACHIEVEMENTS.GENERAL_URINE_TROUBLE, true, true, false);
					awardAchievement("Smashed", kACHIEVEMENTS.GENERAL_SMASHED, true, true, false);
					outputText("\n\nIt seems to take forever but it eventually stops. You look down to see that your urine has been absorbed into the ground. You close up your [armor] and head back inside.");
					player.removeStatusEffect(StatusEffects.Drunk);
					cheatTime(1/12);
				}
			}
			cheatTime(1/12);
			doNext(menuTavern);
		}
		public function buyMilk():void {
			clearOutput();
			if (player.gems < 2) {
				outputText("You don't have enough gems for that.");
				doNext(orderDrink);
				return;
			}
			player.gems -= 2;
			outputText("\"I'd like a glass of milk please,\" you say. You hand over the two gems to the innkeeper and he pours you a glass of milk.");
			outputText("\n\nYou drink the cup of milk. You feel calm and refreshed. ");
			player.changeFatigue(-15);
			HPChange(player.maxHP() / 4, false);
			player.refillHunger(10);
			cheatTime(1/12);
			doNext(menuTavern);
		}
		public function buyRootBeer():void {
			clearOutput();
			if (player.gems < 3) {
				outputText("You don't have enough gems for that.");
				doNext(orderDrink);
				return;
			}
			player.gems -= 3;
			outputText("\"I'd like a glass of root beer please,\" you say. You hand over the three gems to the innkeeper and he pours you a glass of root beer.");
			outputText("\n\nYou drink the cup of root beer. Refreshing! ");
			player.changeFatigue(-15);
			HPChange(player.maxHP() / 4, false);
			player.refillHunger(10);
			cheatTime(1/12);
			doNext(menuTavern);
		}

		public function orderFood():void { //Order food, because you need to be able to fill hunger.
			clearOutput();
			outputText("You take a seat and look at the menu. What would you like?");
			outputText("\n\nPricings");
			outputText("\n5 gems - Sandwich");
			outputText("\n3 gems - Soup");
			outputText("\n5 gems - Hard biscuits (Packed)");
			outputText("\n10 gems - Trail mix (Packed)");
			menu();
			addButton(0, "Sandwich", buySandwich);
			addButton(1, "Soup", buySoup);
			addButton(2, "Biscuits", buyHardBiscuits);
			addButton(3, "Trail Mix", buyTrailMix);
			addButton(14, "Back", menuTavern);
		}

		public function buySandwich():void { //Eat sandwich, refill hunger. The reason it's ambiguous is to let you imagine what sandwich you're eating.
			clearOutput();
			if (player.gems < 5) {
				outputText("You don't have enough gems for that.");
				doNext(orderDrink);
				return;
			}
			player.gems -= 5;
			outputText("You tell the innkeeper that you would like a sandwich and toss five gems at him. \"Certainly, " + player.mf("sir", "madam") + ",\" he says as he quickly grabs a plate and assembles a sandwich. Hey, it's your favorite type!");
			outputText("\n\nYou eat the sandwich. Delicious!");
			HPChange(player.maxHP() / 3, false);
			player.refillHunger(25);
			cheatTime(1/12);
			doNext(menuTavern);
		}

		public function buySoup():void { //Eat soup. Again, it's vague to let you imagine what soup you're eating.
			clearOutput();
			if (player.gems < 3) {
				outputText("You don't have enough gems for that.");
				doNext(orderDrink);
				return;
			}
			player.gems -= 3;
			outputText("You tell the innkeeper that you would like a bowl of soup and toss three gems at him. \"Certainly, " + player.mf("sir", "madam") + ",\" he says as he grabs a bowl and fills it with steaming soup. Hey, it's your favorite type!");
			outputText("\n\nYou take one spoonful at a time, blowing to make sure the soup isn't too hot. You eventually finish the soup. Delicious!");
			HPChange(player.maxHP() / 3, false);
			player.refillHunger(20);
			cheatTime(1/12);
			doNext(menuTavern);
		}

		private function buyHardBiscuits():void {
			clearOutput();
			if (player.gems < 5) {
				outputText("You can't afford one of those!");
				doNext(orderFood);
				return;
			}
			outputText("You pay five gems for a pack of hard biscuits.  ");
			player.gems -= 5;
			statScreenRefresh();
			inventory.takeItem(consumables.H_BISCU, orderFood);
		}

		private function buyTrailMix():void {
			clearOutput();
			if (player.gems < 10) {
				outputText("You can't afford one of those!");
				doNext(orderFood);
				return;
			}
			outputText("You pay twenty gems for a pack of trail mix.  ");
			player.gems -= 10;
			statScreenRefresh();
			inventory.takeItem(consumables.TRAILMX, orderFood);
		}

		public function hearRumors():void { //Hear rumors. Will be altered after defeating Lethice so he will say "Welcome back".
			clearOutput();
			var rumor:int = rand(4);
			outputText("You ask the innkeeper if he has anything special to tell you.");
			if (flags[kFLAGS.INGNAM_RUMORS] == 0) {
				outputText("\n\nHe nods and says, \"Let me tell you. You know what happens to the so-called 'champions'?\" ");
				outputText("\n\nYou nod in response and he continues, \"Well... Nobody ever came. I've seen twenty people departing over the course of my career. Twenty years. None of them ever returned. Who knows what happened to them? Some say they're abducted by an evil presence as soon as they set foot into the portal.\"");
				outputText("\n\nHe looks at you and sniffles. \"Truth be told, you're going to be the Champion of Ingnam. You will be sent to the so-called 'portal' that is supposedly located in Mount Ilgast. I will miss your patronage at the inn. You're still welcome anytime.\"");
				flags[kFLAGS.INGNAM_RUMORS] = 1;
			}
			else if (flags[kFLAGS.INGNAM_RUMORS] == 1) {
				outputText("\n\nHe nods and says, \"You know Mount Ilgast?\" ");
				outputText("\n\nYou nod in response and he continues, \"Before I began my work as an innkeeper, I was an adventurer. I've explored Mount Ilgast once. There was something glowing. It's a portal but it's no ordinary portal. Even strange was that there was something stirring in my groin. Honestly, I swear I never felt that sensation before. I winded up masturbating at the cave entrance just because of that warmth. As soon as I go near the portal, the warm sensation came back again. It's just strange, really strange. So I've hurried back to Ingnam and never visited the mountain again.\"");
				outputText("\n\nYou thank him for telling you.");
				flags[kFLAGS.INGNAM_RUMORS] = 2;
			}
			else if (flags[kFLAGS.INGNAM_RUMORS] == 2) {
				outputText("\n\nHe nods and says, \"Would you really like to know something special?\" You nod in response and he continues, \"One time I've seen a man with cat ears and a tail. I thought they were just accessories but he insisted it was real. So I tugged on his ears and it was... real. I thought he used a lot of glue but he insisted that it's real. His ears do feel real. His tail even swished from side to side like it's an actual cat tail. He told me about something called 'Whisker Fruit' or something. So my guess is that the food in the so-called 'demon realm' can change you.\"");
				outputText("\n\nYou tell him if he has some tips for you. He says, \"Yes. If I were you, I would eat them only as last resort. Even a food that could transform you can make the difference between life and death.\" You thank him for the advice.");
				outputText("\n\n\"You're welcome. I have nothing left to tell you but you're always welcome,\" he says.");
				flags[kFLAGS.INGNAM_RUMORS] = 3; //Finished
			}
			doNext(camp.returnToCampUseOneHour);
		}

	}

}


code:
package classes.Scenes.Places.Ingnam
{
	import classes.*;
	import classes.GlobalFlags.*;
	import classes.Items.*;

	public class IngnamFarm extends BaseContent
	{

		public function IngnamFarm()
		{
		}

		//Farm
		public function menuFarm():void {
			hideMenus();
			clearOutput();
			outputText(images.showImage("location-ingnam-farm"));
			outputText("As you make your way up the dirt road to the farm, you immediately see the vast bountiful acres of crops ripe for harvest and dairy cows idly grazing in the fields by a large weather-worn barn. A wooden windmill creaks quietly nearby a quaint two-storey homestead.");
			if (flags[kFLAGS.INGNAM_FARMER_MET] <= 0) {
				outputText("\n\nYou hear a rustling from the swaying cornfield and instinctively tense up for a fight. To your relief it is the farm's owner who emerges. The farmer is woman of average build and she is modestly garbed in overalls. Wiping away her sweaty blond locks from her flushed face walks up to greet you with a warm smile.");
				outputText("\n\n\"I heard rumors that you're going to be the Champion of Ingnam, is that true [name]?.\" the young farmer asks nervously. You affirm somberly, yes, you are the next Champion. Tears start to well up in her eyes as her voice begins to crack with emotion \"I've known you since we were kids, I can't believe I won't be seeing you again [name]... This has to be some mistake.\"");
				outputText("\n\nYou embrace her and tell the shaking farmer that it is for the good of the village. Her tears start to roll down her reddened cheeks, you stroke her hair soothing, whispering that everything will be fine.");
				outputText("\n\nAfter talking about your upcoming task, the farming girl calms down and offers you some gems, \"You can still work here to get some gems. I'll pay you five gems for each hour you work. This should help you out while on your journey...\"");
				flags[kFLAGS.INGNAM_FARMER_MET] = 1;
			}
			outputText("\n\nYou could help out the farmer with some work for gems.");
			menu();
			addButton(0, "Work", workAtFarm, null, null, null, "Work at the farm for gems.");
			addButton(14, "Leave", kGAMECLASS.ingnam.menuIngnam);
		}

		public function workAtFarm():void { //Job at the farm.
			clearOutput();
			if (player.fatigue + 20 > player.maxFatigue()) {
				outputText("You are too exhausted to work at the farm!");
				doNext(menuFarm);
				return;
			}
			var chooser:int = rand(3);
			outputText("You let the farmer know that you're here to work for the farm.");
			if (chooser == 0) {
				outputText("\n\n\"Great! The stable needs cleaning. I understand it's not for the faint of the heart but I promise you'll be rewarded,\" the farmer says. She guides you to the stables and hands you the shovel for cleaning" + (silly() ? " and a clothespin to clip your nose shut": "") + ".");
				outputText("\n\nYou spend half an hour cleaning the muck out of the stable. When you're finished cleaning the muck, the farmer comes back at you and instructs you to change the straw pile. You do as she instructs, sweeping all the old straw piles into one large pile. Finally, you spend the rest of the hour laying a new layer of straw for the horses to lay on.");
				outputText("\n\n\"I'll take care of these from there. Thank you for helping me. You've taken some of the load off my burden. Here's your payment,\" she says. She hands you five gems.");
				if (player.str < 25 && rand(2) == 0) {
					outputText("\n\nYou feel a bit stronger from all the hard work you've done.");
					dynStats("str", 1);
				}
				if (player.tou < 25 && rand(2) == 0) {
					outputText("\n\nYour efforts have helped to improve your stamina.");
					dynStats("tou", 1);
				}
				player.changeFatigue(20);
			}
			else if (chooser == 1) {
				outputText("\n\n\"Great! I could use a hand harvesting crops,\" she says, \"We need five full baskets of crops.\"");
				outputText("\n\nShe escorts you to the field where the crops grow. She hands you the basket so you can collect the crops. \"We'll harvest the crops. You only need to fill five, I'll take care of the rest,\" she says.");
				outputText("\n\nYou pick the corn from the plant one by one and put them into basket. This continues until the basket gets full after which you switch to another empty basket. You get back to harvesting and repeat until all the baskets are full. The farmer comes to see that you've filled all the baskets. \"Good work! I'll take care of things from there. Here's your payment,\" she says. She hands you the five gems.");
				if (player.str < 25 && rand(2) == 0) {
					outputText("\n\nYou feel a bit stronger from all the hard work you've done.");
					dynStats("str", 1);
				}
				if (player.tou < 25 && rand(2) == 0) {
					outputText("\n\nYour efforts have helped to improve your stamina.");
					dynStats("tou", 1);
				}
				player.changeFatigue(20);
			}
			else {
				outputText("\n\n\"Great! The cows need to be milked. It should be a simple task,\" she says. She escorts you to the cow pen and says, \"Fill as much buckets as you can but make sure all the cows are milked. When you're done, we'll haul the buckets. I have things to attend. Good luck!\"");
				outputText("\n\nYou place the bucket under one of the cows' udders. You gently squeeze the udders. Milk squirts from its udders and into the bucket. When the milk flow stops, you move on to the next cow. You repeat the process, cow after cow.");
				outputText("\n\nBy the time you've finished milking all the cows, you are left with ten full buckets of milk. The farmer comes back and says, \"Did you milk all these cows?\" You give her a nod and show her the full buckets of milk. \"Thank you. You know what? You've deserved some free milk! Now would be a good time for some break,\" She says happily. She fills a cup with milk and gives it to you. You promptly drink the milk. Wow, this stuff is delicious when it's freshly milked! After a good drink, you strike up some conversation with her.");
				player.refillHunger(20);
				player.HP += 50;
				player.changeFatigue(-10);
				outputText("\n\nAfter a few minutes of chatting, the break is over and you help her with hauling the buckets to her farmhouse, four at a time. After three trips, she gives you a final task of filling the milk bottles. You carefully pour the milk through a funnel into the bottle and when you manage to fill it, you move on to the next bottle. You repeat the process until the buckets are empty. \"Good work! You have finished your work! Here's your payment,\" she says as she hands you the five gems you deserve.");
				if (player.str < 25 && rand(2) == 0) {
					outputText("\n\nYou feel a bit stronger from all the hard work you've done.");
					dynStats("str", 1);
				}
				if (player.tou < 25 && rand(2) == 0) {
					outputText("\n\nYour efforts have helped to improve your stamina.");
					dynStats("tou", 1);
				}
				player.changeFatigue(10);
			}
			if (player.findPerk(PerkLib.HistorySlacker) >= 0) player.changeFatigue(-5);
			outputText("\n\nYou walk back to Ingnam.");
			player.gems += 5;
			statScreenRefresh();
			doNext(camp.returnToCampUseOneHour);
		}
	}

}


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

	public class Thief extends Monster
	{

		override public function defeated(hpVictory:Boolean):void
		{
			game.ingnam.thiefScene.winAgainstThief();
		}

		public function Thief()
		{
			this.a = "the ";
			this.short = "thief";
			this.imageName = "thief";
			this.long = "The thief standing before you is a human.  His skin is fairly pale and his hair is brown.  He's wearing a set of leather armor and wielding a dagger in his right hand.  He's intent on knocking you out so he can take your gems.";
			// this.plural = false;
			this.createCock();
			createBreastRow(Appearance.breastCupInverse("flat"));
			this.ass.analLooseness = ANAL_LOOSENESS_NORMAL;
			this.ass.analWetness = ANAL_WETNESS_NORMAL;
			this.tallness = 5*12 + 5 + rand(4);
			this.hipRating = HIP_RATING_BOYISH;
			this.buttRating = BUTT_RATING_TIGHT;
			this.skinTone = "light";
			this.hairColor = "brown";
			this.hairLength = 4;
			initStrTouSpeInte(17, 16, 16, 17);
			initLibSensCor(20, 15, 20);
			this.weaponName = "knife";
			this.weaponVerb = "slash";
			this.weaponAttack = 4;
			this.armorName = "leather armor";
			this.lust = 25;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 1;
			this.gems = 5+rand(10);
			this.drop = new WeightedDrop().add(weapons.DAGGER,1)
					.add(armors.LEATHRA,1)
					.add(null,8);
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Places.Ingnam
{
	import classes.*;
	import classes.GlobalFlags.*;
	import classes.Items.*;

	public class ThiefScene extends BaseContent
	{

		public function ThiefScene()
		{
		}

		public function encounterThief():void {
			clearOutput();
			outputText("You wander the village for Ingnam until you feel something pressing against your shoulder and you look around to see the thief. \"Your money or your life,\" he demands.");
			menu();
			addButton(0, "Fight", startCombatImmediate, new Thief);
			addButton(1, "Give Gems", giveGems);
		}

		private function giveGems():void {
			clearOutput();
			outputText("You reach into your gem pouch");
			if (player.gems <= 0) outputText(", only to find it empty and tell the thief that you're poor. \"Damn! Looks like I've picked the wrong person,\" the thief says with a grumbled look. He lets go of you and saunters off.");
			else if (player.gems > 0 && player.gems <= 5) {
				outputText(" and fish into the only gem" + (player.gems == 1 ? "": "s") + " you have and give " + (player.gems == 1 ? "it": "them") + " to the thief. \"That's not much. Fine,\" the thief grumbles and lets you go before he takes your only gem" + (player.gems == 1 ? "": "s") + " and saunters off.");
				flags[kFLAGS.THIEF_GEMS] += player.gems;
				player.gems = 0;
			}
			else {
				outputText(" and take out five gems before handing them to the thief. The thief says, \"Thanks, now scram!\" before letting go of you and saunters off.");
				flags[kFLAGS.THIEF_GEMS] += 5;
				player.gems -= 5;
			}
			statScreenRefresh();
			doNext(camp.returnToCampUseOneHour);
		}

		public function winAgainstThief():void {
			clearOutput();
			outputText("The thief collapses from his " + (monster.lust >= monster.eMaxLust() ? "overwhelming desires": "injuries") + ". You smile in satisfaction as you rummage through his gem pouch");
			if (flags[kFLAGS.THIEF_GEMS] > 0) outputText(", happily retrieving the gems the thief has taken from you");
			outputText(".");
			monster.gems += flags[kFLAGS.THIEF_GEMS];
			flags[kFLAGS.THIEF_GEMS] = 0;
			menu();
			if (player.lust >= 33 && flags[kFLAGS.SFW_MODE] <= 0) {
				outputText("\n\nYou could punish the thief if you want to. If so, which parts would you use?");
				if (player.hasCock()) {
					if (player.cockThatFits(monster.analCapacity()) >= 0) addButton(0, "Anal Fuck", rapeThiefAnally, null, null, null, "The thief definitely needs to learn a lesson not to mess with you. Buttfuck the thief.");
					else outputText(" Your cock is too big to fit!");
				}
				if (player.hasVagina()) addButton(1, "Get Licked", getLicked, null, null, null, "Punish the thief by having him lick your [vagina].");
				addButton(4, "Leave", combat.cleanupAfterCombat);
				return;
			}
			combat.cleanupAfterCombat();
		}

		private function rapeThiefAnally():void {
			var x:int = player.cockThatFits(monster.analCapacity());
			clearOutput();
			outputText("You drag the unconscious thief into one of the alleys and remove his leather pants so he's naked from the waist down. The thief wakes up, realizing what you're doing and says with a whimper, \"Please don't put that in there. I've never had anything in there.\"");
			outputText("\n\nYou " + (player.armor != ArmorLib.NOTHING || player.lowerGarment != UndergarmentLib.NOTHING ? "remove your " + player.armorName + ", " : "") + "get the thief into position and you slowly slide your " + player.cockDescript(x) + " into his rear hole. Despite the thief's protestations, he seems to find pleasure.");
			outputText("\n\n\"Yes, fuck me! Please fuck me!\" The thief yells. That's the only encouragement you need as you thrust back and forth, abusing his ass. You grab his shoulders to get more leverage and you continue to pound with reckless abandon.");
			outputText("\n\nEventually, you can hold back no more and you unload your seed into his depths. The thief achieves orgasm as well, cumming all over the ground before falling on ground, dazed. You slide your " + player.cockDescript(x) + " out with a pop" + player.clothedOrNaked(", redress yourself") + " and leave the ravaged thief to recover.");
			player.orgasm();
			combat.cleanupAfterCombat();
		}

		private function getLicked():void {
			clearOutput();
			outputText("You drag the unconscious thief into one of the alleys. The thief wakes up and realize what you're going to do. You " + (player.armor != ArmorLib.NOTHING || player.lowerGarment != UndergarmentLib.NOTHING ? "remove the bottom half of your " + player.armorName + "" : "") + " to reveal your " + player.vaginaDescript() + (player.hasCock() ? " and " + player.cockDescript(): "") + ".");
			outputText("\n\n\"Now lick. I want it licked good!\" you tell the thief. The thief lets out a sigh as he licks your [pussy]. You let out a moan in pleasure while he's tongue-fucking your [pussy].");
			outputText("\n\nEventually, you can hold back no more and your [pussy] spasms, launching femcum");
			if (player.hasCock()) outputText(" while your [cock] fires ropes of jism");
			outputText(" all over his face. Still disoriented, the thief collapses back on the ground. You " + player.clothedOrNaked("redress yourself") + " and make a hasty exit while the thief is recovering from his ordeal.");
			player.orgasm();
			combat.cleanupAfterCombat();
		}

	}

}


code:
package classes.Scenes.Places.Owca
{
	import classes.*;

	public class Farmers extends Monster
	{

		override protected function performCombatAction():void
		{
			createStatusEffect(StatusEffects.Attacks,4,0,0,0);
			eAttack();
			combatRoundOver();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.owca.beatUpOwca();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean):void
		{
			game.owca.loseToOwca();
		}

		public function Farmers()
		{
			this.a = "the ";
			this.short = "farmers";
			this.imageName = "farmers";
			this.long = "This is a group of thirty angry villagers, almost all human-looking but for the tiny horn-like protrusions growing from their heads and the white fuzz that almost passes off as hair.  They are all armed with pitchforks or other crude farming tools they use in their everyday task.  Rebecc is staring from behind them with horrified eyes at the combat, paralyzed by the sudden turn of events.";
			this.plural = true;
			this.pronoun1 = "they";
			this.pronoun2 = "them";
			this.pronoun3 = "their";
			this.createCock(9,2,CockTypesEnum.HUMAN);
			this.balls = 2;
			this.ballSize = 1;
			this.cumMultiplier = 3;
			// this.hoursSinceCum = 0;
			this.createVagina(false, VAGINA_WETNESS_SLICK, VAGINA_LOOSENESS_LOOSE);
			createBreastRow(Appearance.breastCupInverse("A"));
			this.ass.analLooseness = ANAL_LOOSENESS_STRETCHED;
			this.ass.analWetness = ANAL_WETNESS_SLIME_DROOLING;
			this.tallness = rand(8) + 70;
			this.hipRating = HIP_RATING_AMPLE+2;
			this.buttRating = BUTT_RATING_LARGE;
			this.skinTone = "red";
			this.hairColor = "black";
			this.hairLength = 15;
			initStrTouSpeInte(40, 50, 99, 99);
			initLibSensCor(35, 35, 20);
			this.weaponName = "pitchforks";
			this.weaponVerb="stab";
			this.armorName = "chitin";
			this.bonusHP = 500;
			this.lustVuln = 0;
			this.temperment = TEMPERMENT_LOVE_GRAPPLES;
			this.level = 10;
			this.gems = rand(25) +40;
			this.hornType = HORNS_DEMON;
			this.horns = 2;
			this.tailType = TAIL_TYPE_DEMONIC;
			this.drop = NO_DROP;
			checkMonster();
		}

	}

}