code:
package classes.Scenes
{
	import classes.CoC;
	import classes.GlobalFlags.kFLAGS;
	import classes.BaseContent;
	import classes.ItemType;
	import classes.Items.*;
	import classes.TimeAwareInterface;

	public class ItemUpgrade extends BaseContent
	{
	/*	private var shopkeeper:String = "";
		private var returnFunc:Function;

		public static const TELADRE_WEAPON_SHOP:String = "TelAdreWeaponShop";
		public static const TELADRE_ARMOUR_SHOP:String = "TelAdreArmourShop";
		public static const BAZAAR_SMITH_SHOP:String = "BazaarChillSmith";
		public static const ARIAN_ENHANCEMENTS:String = "ArianEnhancements";

		public function ItemUpgrade() {
			CoC.timeAwareClassAdd(this);
		}

		public function timeChange():Boolean {
			if (flags[kFLAGS.WEAPON_SHOP_UPGRADE_TIME] > 0) {
				flags[kFLAGS.WEAPON_SHOP_UPGRADE_TIME]--;
			}
			if (flags[kFLAGS.ARMOUR_SHOP_UPGRADE_TIME] > 0) {
				flags[kFLAGS.ARMOUR_SHOP_UPGRADE_TIME]--;
			}
			if (flags[kFLAGS.CHILL_SMITH_UPGRADE_TIME] > 0) {
				flags[kFLAGS.CHILL_SMITH_UPGRADE_TIME]--;
			}
			return false;
		}

		public function timeChangeLarge():Boolean {
			return false;
		}

		private function isAValidItem(item:ItemType):Boolean {
			var valid:Boolean = false;
			if (item is Weapon) {
				if (shopkeeper == TELADRE_WEAPON_SHOP || shopkeeper == BAZAAR_SMITH_SHOP) valid = true;
			}
			if (item is Armor || item is Shield) {
				if (shopkeeper == TELADRE_ARMOUR_SHOP) valid = true;
			}
			if (item is Jewelry) {
				if (shopkeeper == ARIAN_ENHANCEMENTS) valid = true;
			}
			return valid;
		}

		public function equipmentUpgradeMenu(chosenShop:String = "", exitFunc:Function = null, isObsidianUpgrade:Boolean = false):void {
			clearOutput();
			menu();
			//Set variables
			if (chosenShop != "") shopkeeper = chosenShop;
			if (exitFunc != null) returnFunc = exitFunc;
			switch(chosenShop) {
				case TELADRE_WEAPON_SHOP:
					if (flags[kFLAGS.WEAPON_SHOP_UPGRADE_TIME] > 0) {
						outputText("The weaponsmith is currently busy upgrading your weapon. Come back later.");
						doNext(returnFunc);
						return;
					}
					else if (flags[kFLAGS.WEAPON_SHOP_UPGRADE_ITEM] != 0) {
						claimWeapon();
						return;
					}
					break;
				case TELADRE_ARMOUR_SHOP:
					if (flags[kFLAGS.ARMOUR_SHOP_UPGRADE_TIME] > 0) {
						outputText("The armoursmith is currently busy upgrading your armour. Come back later.");
						doNext(returnFunc);
						return;
					}
					else if (flags[kFLAGS.ARMOUR_SHOP_UPGRADE_ITEM] != 0) {
						claimWeapon();
						return;
					}
					break;
				case BAZAAR_SMITH_SHOP:
					if (flags[kFLAGS.CHILL_SMITH_UPGRADE_TIME] > 0) {
						outputText("The grouchy weaponsmith is currently busy upgrading your weapon. Come back later.");
						doNext(returnFunc);
						return;
					}
					else if (flags[kFLAGS.CHILL_SMITH_UPGRADE_ITEM] != 0) {
						claimWeapon();
						return;
					}
					break;
				default:
					//Nothing here, move on.
			}
			//The main meat of this function
			outputText("(Placeholder) What equipment would you like to reinforce" + (isObsidianUpgrade ? " with obsidian" : "") + "?");
			for (var i:int = 0; i < inventory.getMaxSlots(); i++) {
				if (player.itemSlot(i).itype == ItemType.NOTHING) {
					addButtonDisabled(i, "", "");
				}
				else if (player.itemSlot(i).itype is Weapon && isObsidianUpgrade) {
					addButton(i, player.itemSlot(i).itype.shortName, obsidianWeaponUpgrade, player.itemSlot(i).itype, false, chosenShop).hint(player.itemSlot(i).itype.description, capitalizeFirstLetter(player.itemSlot(i).itype.longName));
				}
				else if (player.itemSlot(i).itype is Weapon && (player.itemSlot(i).itype as Weapon).tier >= 2) {
					addButtonDisabled(i, player.itemSlot(i).itype.shortName, "This equipment is already at its maximum tier.");
				}
				else if (isAValidItem(player.itemSlot(i).itype)) {
					addButton(i, player.itemSlot(i).itype.shortName, equipmentUpgradeRouter, player.itemSlot(i).itype).hint(player.itemSlot(i).itype.description, capitalizeFirstLetter(player.itemSlot(i).itype.longName));
				}
				else {
					addButtonDisabled(i, player.itemSlot(i).itype.shortName, "This is not a valid type of equipment to upgrade.");
				}
			}
			if ((chosenShop == TELADRE_WEAPON_SHOP || chosenShop == BAZAAR_SMITH_SHOP) && !isObsidianUpgrade) {
				addButton(11, "Obsidian", equipmentUpgradeMenu, chosenShop, exitFunc, true).hint("You can reinforce certain weapons with obsidian to make it even deadlier.", "Obsidian Reinforcement");
			}
			addButton(14, "Back", returnFunc);
		}
		private function equipmentUpgradeRouter(item:ItemType):void {
			clearOutput();
			var isSpecial:Boolean = false;
			//Special upgrades that will require certain items.
			switch(item) {
				case weapons.BBSWORD:
				case weapons.B_SWORD:
				case weapons.U_SWORD:
				case weapons.S_BLADE:
				case weapons.JRAPIER:
				case weapons.W_STAFF:
					isSpecial = true;
					break;
				default:
			}
			if (isSpecial) {
				specialUpgradePrompt(item);
				return;
			}
			else {
				equipmentUpgrade(item, false);
			}
		}
		private function specialUpgradePrompt(item:ItemType):void {
			//Beautiful Sword -> Divine Pearl Sword
			if (item == weapons.B_SWORD) {
				outputText("(Placeholder) You'll need 1x pure pearl and 2000 gems for the upgrade.");
				if (player.hasItem(consumables.P_PEARL) && player.gems >= 2000) {
					doYesNo(createCallBackFunction(equipmentUpgrade, item, true), equipmentUpgradeMenu);
				}
				else {
					outputText("\n\nUnfortunately, you don't have the required materials and gems.");
					doNext(equipmentUpgradeMenu);
				}
			}
			//Ugly Sword -> Scarred Blade
			if (item == weapons.U_SWORD) {
				outputText("(Placeholder) You'll need 5x regular lethicite or 1x large lethicite of any kind and 2000 gems for the upgrade.");
				if ((player.hasKeyItem("Marae's Lethicite") >= 0 || player.hasKeyItem("Stone Statue Lethicite") >= 0 || player.hasKeyItem("Sheila's Lethicite") || player.hasItem(useables.LETHITE, 5)) && player.gems >= 2000) {
					menu();
					outputText("Which lethicite will you use?");
					if (player.hasItem(useables.LETHITE, 5)) addButton(0, "Regular x5", routeLethiciteUpgrade, "Normal");
					if (player.hasKeyItem("Marae's Lethicite") >= 0) addButton(1, "Marae", routeLethiciteUpgrade, "Marae");
					if (player.hasKeyItem("Sheila's Lethicite") >= 0) addButton(2, "Sheila", routeLethiciteUpgrade, "Sheila");
					if (player.hasKeyItem("Stone Statue Lethicite") >= 0) addButton(3, "Statue", routeLethiciteUpgrade, "Statue");
					addButton(5, "Cancel", equipmentUpgradeMenu);
				}
				else {
					outputText("\n\nUnfortunately, you don't have the required materials and gems.");
					doNext(equipmentUpgradeMenu);
				}
			}
			//Jeweled Rapier -> Midnight Rapier
			if (item == weapons.JRAPIER) {
				outputText("(Placeholder) You'll need 5x regular lethicite and 2000 gems for the upgrade.");
				if (player.hasItem(useables.LETHITE, 5) && player.gems >= 2000) {
					doYesNo(createCallBackFunction(equipmentUpgrade, item, true), equipmentUpgradeMenu);
				}
				else {
					outputText("\n\nUnfortunately, you don't have the required materials and gems.");
					doNext(equipmentUpgradeMenu);
				}
			}
			if (item == weapons.S_BLADE) {
				outputText("(Placeholder) You'll need 1x regular lethicite, 1x fox jewel and 1500 gems for the upgrade.");
				if (player.hasItem(useables.LETHITE, 1) && player.hasItem(consumables.FOXJEWL) && player.gems >= 1500) {
					doYesNo(createCallBackFunction(equipmentUpgrade, item, true), equipmentUpgradeMenu);
				}
				else {
					outputText("\n\nUnfortunately, you don't have the required materials and gems.");
					doNext(equipmentUpgradeMenu);
				}
			}
			//Eggshell Shield -> Runed Eggshell Shield
			if (item == shields.DRGNSHL) {
				outputText("(Placeholder) You'll need 2x dragon eggs, 1x lethicite and 1250 gems for the upgrade.");
				if (player.hasItem(useables.LETHITE, 1) && player.hasItem(consumables.DRGNEGG, 2) && player.gems >= 1250) {
					doYesNo(createCallBackFunction(equipmentUpgrade, item, true), equipmentUpgradeMenu);
				}
				else {
					outputText("\n\nUnfortunately, you don't have the required materials and gems.");
					doNext(equipmentUpgradeMenu);
				}
			}
		}
		private function routeLethiciteUpgrade(choice:String):void {
			switch(choice) {
				case "Marae":
					player.removeKeyItem("Marae's Lethicite");
					break;
				case "Sheila":
					player.removeKeyItem("Sheila's Lethicite");
					break;
				case "Statue":
					player.removeKeyItem("Stone Statue Lethicite");
					break;
				default:
					player.destroyItems(useables.LETHITE, 5);
			}
			equipmentUpgrade(weapons.U_SWORD, true);
		}
		private function equipmentUpgrade(item:ItemType, confirmation:Boolean = false):void {
			clearOutput();
			//Determine which flag to set.
			var flagID:int = 0;
			switch(shopkeeper) {
				case TELADRE_WEAPON_SHOP:
					flagID = kFLAGS.WEAPON_SHOP_UPGRADE_ITEM;
					break;
				case TELADRE_ARMOUR_SHOP:
					flagID = kFLAGS.ARMOUR_SHOP_UPGRADE_ITEM;
					break;
				case BAZAAR_SMITH_SHOP:
					flagID = kFLAGS.CHILL_SMITH_UPGRADE_ITEM;
					break;
				default:
					flagID = 0;
			}
			//Sort through item upgrade process
			var itemToGet:ItemType = null;
			var gemCost:int = item.value;
			switch(item) {
				//Weapons
				case weapons.BLUNDR0:
					itemToGet = weapons.BLUNDR1;
					break;
				case weapons.BLUNDR1:
					itemToGet = weapons.BLUNDR2;
					break;
				case weapons.CLAYMR0:
					itemToGet = weapons.CLAYMR1;
					break;
				case weapons.CLAYMR1:
					itemToGet = weapons.CLAYMR2;
					break;
				case weapons.CRSBOW0:
					itemToGet = weapons.CRSBOW1;
					break;
				case weapons.CRSBOW1:
					itemToGet = weapons.CRSBOW2;
					break;
				case weapons.DAGGER0:
					itemToGet = weapons.DAGGER1;
					break;
				case weapons.DAGGER1:
					itemToGet = weapons.DAGGER2;
					break;
				case weapons.FLAIL_0:
					itemToGet = weapons.FLAIL_1;
					break;
				case weapons.FLAIL_1:
					itemToGet = weapons.FLAIL_2;
					break;
				case weapons.FLNTLK0:
					itemToGet = weapons.FLNTLK1;
					break;
				case weapons.FLNTLK1:
					itemToGet = weapons.FLNTLK2;
					break;
				case weapons.S_GAUNT:
					itemToGet = weapons.H_GAUNT;
					break;
				case weapons.RRAPIER:
					itemToGet = weapons.JRAPIER;
					break;
				case weapons.KATANA0:
					itemToGet = weapons.KATANA1;
					break;
				case weapons.KATANA1:
					itemToGet = weapons.KATANA2;
					break;
				case weapons.L__AXE0:
					itemToGet = weapons.L__AXE1;
					break;
				case weapons.L__AXE1:
					itemToGet = weapons.L__AXE2;
					break;
				case weapons.L_HAMR0:
					itemToGet = weapons.L_HAMR1;
					break;
				case weapons.L_HAMR1:
					itemToGet = weapons.L_HAMR2;
					break;
				case weapons.MACE__0:
					itemToGet = weapons.MACE__1;
					break;
				case weapons.MACE__1:
					itemToGet = weapons.MACE__2;
					break;
				case weapons.RIDING:
					itemToGet = weapons.RIDING1;
					break;
				case weapons.RIDING1:
					itemToGet = weapons.RIDING2;
					break;
				case weapons.SCIMTR0:
					itemToGet = weapons.SCIMTR1;
					break;
				case weapons.SCIMTR1:
					itemToGet = weapons.SCIMTR2;
					break;
				case weapons.SPEAR_0:
					itemToGet = weapons.SPEAR_1;
					break;
				case weapons.SPEAR_1:
					itemToGet = weapons.SPEAR_2;
					break;
				case weapons.WARHAM0:
					itemToGet = weapons.WARHAM1;
					break;
				case weapons.WARHAM1:
					itemToGet = weapons.WARHAM2;
					break;
				case weapons.WHIP__0:
					itemToGet = weapons.WHIP__1;
					break;
				case weapons.WHIP__1:
					itemToGet = weapons.WHIP__2;
					break;
				//Unique Weapons
				case weapons.BBSWORD:
					gemCost = 1500;
					itemToGet = weapons.B_SWORD;
					break;
				case weapons.B_SWORD:
					gemCost = 2000;
					if (confirmation) player.destroyItems(consumables.P_PEARL, 1);
					itemToGet = weapons.DPSWORD;
					break;
				case weapons.U_SWORD:
					gemCost = 2000;
					itemToGet = weapons.SCARBLD;
					break;
				case weapons.JRAPIER:
					gemCost = 2000;
					if (confirmation) player.destroyItems(useables.LETHITE, 5);
					itemToGet = weapons.MRAPIER;
					break;
				case weapons.S_BLADE:
					gemCost = 1500;
					if (confirmation) {
						player.destroyItems(useables.LETHITE, 1);
						player.destroyItems(consumables.FOXJEWL, 2); //May change
					}
					itemToGet = weapons.RSBLADE;
					break;
				//Armours
				// < NOT YET IMPLEMENTED >
				//Shields
				case shields.BUCKLR0:
					itemToGet = shields.BUCKLR1;
					break;
				case shields.BUCKLR1:
					itemToGet = shields.BUCKLR2;
					break;
				case shields.KITESH0:
					itemToGet = shields.KITESH1;
					break;
				case shields.KITESH1:
					itemToGet = shields.KITESH2;
					break;
				case shields.GRTSHL0:
					itemToGet = shields.GRTSHL1;
					break;
				case shields.GRTSHL1:
					itemToGet = shields.GRTSHL2;
					break;
				case shields.TOWRSH0:
					itemToGet = shields.TOWRSH1;
					break;
				case shields.TOWRSH1:
					itemToGet = shields.TOWRSH2;
					break;
				case shields.DRGNSHL:
					gemCost = 1250;
					if (confirmation) {
						player.destroyItems(useables.LETHITE, 1);
						player.destroyItems(consumables.DRGNEGG, 2);
					}
					itemToGet = shields.RUNESHL;
					break;
			}
			//Check to make sure item is valid.
			if (itemToGet == null) {
				outputText("(Placeholder) Sorry, it doesn't look like this one can be upgraded.");
				doNext(returnFunc);
				return;
			}
			if (!confirmation) {
				outputText("(Placeholder) This will cost you " + item.value + " gems to upgrade. Proceed?");
				if (player.gems >= item.value) {
					doYesNo(createCallBackFunction(equipmentUpgrade, item, true), equipmentUpgradeMenu);
				}
				else {
					outputText("\n\nUnfortunately, you don't have the required gems.");
					doNext(equipmentUpgradeMenu);
				}
				return;
			}
			//Set flags
			outputText("(Placeholder) Your weapon upgrade has been commissioned. Come back later to pick it up.");
			flags[flagID] = itemToGet.id;
			flags[flagID+1] = 24;
			player.gems -= gemCost;
			player.destroyItems(item, 1);
			doNext(returnFunc);
		}
		private function obsidianWeaponUpgrade(item:ItemType, confirmation:Boolean = false, shop:String = ""):void {
			clearOutput();
			//Determine which flag to set.
			var flagID:int = 0;
			switch(shopkeeper) {
				case TELADRE_WEAPON_SHOP:
					flagID = kFLAGS.WEAPON_SHOP_UPGRADE_ITEM;
					break;
				case TELADRE_ARMOUR_SHOP:
					flagID = kFLAGS.ARMOUR_SHOP_UPGRADE_ITEM;
					break;
				case BAZAAR_SMITH_SHOP:
					flagID = kFLAGS.CHILL_SMITH_UPGRADE_ITEM;
					break;
				default:
					flagID = 0;
			}
			//Sort through item upgrade process
			var itemToGet:ItemType = null;
			var gemCost:int = item.value;
			var gemCostDivided:int = (item as Weapon).tier + 1;
			var shardCost:int = 0;
			switch(item) {
				case weapons.CLAYMR0:
				case weapons.CLAYMR1:
				case weapons.CLAYMR2:
					gemCost = 1500 / gemCostDivided;
					shardCost = 9;
					itemToGet = weapons.CLAYMRO;
					break;
				case weapons.DAGGER0:
				case weapons.DAGGER1:
				case weapons.DAGGER2:
					gemCost = 500 / gemCostDivided;
					shardCost = 3;
					itemToGet = weapons.DAGGERO;
					break;
				case weapons.FLAIL_0:
				case weapons.FLAIL_1:
				case weapons.FLAIL_2:
					gemCost = 1000 / gemCostDivided;
					shardCost = 5;
					itemToGet = weapons.FLAIL_O;
					break;
				case weapons.HALBRD0:
				case weapons.HALBRD1:
				case weapons.HALBRD2:
					gemCost = 1000 / gemCostDivided;
					shardCost = 6;
					itemToGet = weapons.HALBRDO;
					break;
				case weapons.KATANA0:
				case weapons.KATANA1:
				case weapons.KATANA2:
					gemCost = 1000 / gemCostDivided;
					shardCost = 6;
					itemToGet = weapons.KATANAO;
					break;
				case weapons.L__AXE0:
				case weapons.L__AXE1:
				case weapons.L__AXE2:
					gemCost = 1500 / gemCostDivided;
					shardCost = 9;
					itemToGet = weapons.L__AXEO;
					break;
				case weapons.L_HAMR0:
				case weapons.L_HAMR1:
				case weapons.L_HAMR2:
					gemCost = 1200 / gemCostDivided;
					shardCost = 8;
					itemToGet = weapons.L_HAMRO;
					break;
				case weapons.MACE__0:
				case weapons.MACE__1:
				case weapons.MACE__2:
					gemCost = 500 / gemCostDivided;
					shardCost = 4;
					itemToGet = weapons.MACE__O;
					break;
				case weapons.SCIMTR0:
				case weapons.SCIMTR1:
				case weapons.SCIMTR2:
					gemCost = 1000 / gemCostDivided;
					shardCost = 6;
					itemToGet = weapons.SCIMTRO;
					break;
				case weapons.SPEAR_0:
				case weapons.SPEAR_1:
				case weapons.SPEAR_2:
					gemCost = 1000 / gemCostDivided;
					shardCost = 6;
					itemToGet = weapons.SPEAR_O;
					break;
				case weapons.WARHAM0:
				case weapons.WARHAM1:
				case weapons.WARHAM2:
					gemCost = 1500 / gemCostDivided;
					shardCost = 6;
					itemToGet = weapons.WARHAMO;
					break;
				default:
					itemToGet = null;
			}
			//Check to make sure item is valid.
			if ((item as Weapon).isObsidian()) {
				outputText("That weapon is already reinforced with obsidian.");
				doNext(equipmentUpgradeMenu);
				return;
			}
			if (itemToGet == null) {
				outputText("(Placeholder) Sorry, it doesn't look like this one can be improved with obsidian.");
				doNext(equipmentUpgradeMenu);
				return;
			}
			if (!confirmation) {
				outputText("This will cost you " + gemCost + " gems and " + num2Text(shardCost) + " obsidian shards to improve that with obsidian. Proceed?");
				if (player.gems < gemCost) {
					outputText("\n\nUnfortunately, you don't have enough gems to pay for that.");
					doNext(equipmentUpgradeMenu);
					return;
				}
				if (!player.hasItem(useables.OBSHARD, shardCost)) {
					outputText("\n\nYou don't have enough obsidian shards to improve the weapon.");
					doNext(equipmentUpgradeMenu);
					return;
				}
				doYesNo(createCallBackFunction(obsidianWeaponUpgrade, item, true), equipmentUpgradeMenu);
				return;
			}
			//Set flags
			outputText("(Placeholder) Your weapon upgrade has been commissioned. Come back later to pick it up");
			flags[flagID] = itemToGet.id;
			flags[flagID+1] = 24;
			player.gems -= gemCost;
			player.destroyItems(item, 1);
			player.destroyItems(useables.OBSHARD, shardCost);
			doNext(returnFunc);
		}
		private function claimWeapon():void {
			//Determine which flag to set.
			var flagID:int = 0;
			switch(shopkeeper) {
				case TELADRE_WEAPON_SHOP:
					flagID = kFLAGS.WEAPON_SHOP_UPGRADE_ITEM;
					break;
				case TELADRE_ARMOUR_SHOP:
					flagID = kFLAGS.ARMOUR_SHOP_UPGRADE_ITEM;
					break;
				case BAZAAR_SMITH_SHOP:
					flagID = kFLAGS.CHILL_SMITH_UPGRADE_ITEM;
					break;
				default:
					flagID = 0;
			}
			inventory.takeItem(ItemType.lookupItem(flags[flagID]), equipmentUpgradeMenu);
			flags[flagID] = 0; //Clear the flag
		}*/

	}

}


code:
/**
 * Created by aimozg on 18.01.14.
 */
package classes.Scenes.Monsters
{
	import classes.*;
	import classes.Items.*

	public class AbstractSuccubus extends Monster
	{
		protected function whipAttack():void
		{
			if (hasStatusEffect(StatusEffects.WhipReady)) {
				//Blind dodge change
				if (hasStatusEffect(StatusEffects.Blind)) {
					outputText(capitalA + short + " swings her whip at you wildly, totally missing due to her blindness!!");

					return;
				}
				outputText("Grinning deviously, the succubus cracks her whip with expert skill, landing a painful blow on your ");
				var temp:int = rand(6);
				var damage:int;
				var lustDmg:int;
				//Whip yo ass!
				if (temp == 0) {
					outputText("ass");
					damage = 4;
					lustDmg = 6 + int(player.sens / 20);
				}
				//Whip yo tits!
				if (temp == 1) {
					if (player.breastRows.length > 0 && player.biggestTitSize() > 0) outputText(player.allBreastsDescript() + "");
					else outputText("chest");
					damage = 9 - player.armor.def;
					if (damage <= 0) {
						outputText(" but you feel no pain thanks to your protection");
						damage = 0;
					}
					lustDmg = 4 + int(player.sens / 15);
				}
				//Whip yo groin
				if (temp == 2) {
					var groinProtection:int = 0;
					//Take armor in account.
					if (player.armor != ArmorLib.NOTHING) {
						if (player.armor.perk == "Light") groinProtection = 1;
						else if (player.armor.perk == "Medium") groinProtection = 2;
						else groinProtection = 3;
						//Certain armor affects protection.
						if (player.armor == armors.BEEARMR || player.armor == armors.SSARMOR || player.armor == armors.DBARMOR || player.armor == armors.TBARMOR) groinProtection = 2; //The only thing protecting your groin is a loincloth.
						if (player.armor == armors.GOOARMR) groinProtection = 2; //Goo armor is soft and gooey so not complete protection.
						if (player.armor == armors.LTHCARM) groinProtection = 0; //Lethicite armor exposes your groin.
					}
					//Wearing armored undergarments? BONUS POINTS!
					if (player.lowerGarment != UndergarmentLib.NOTHING) {
						if (player.lowerGarment == undergarments.SS_LOIN || player.lowerGarment == undergarments.SSPANTY) groinProtection += 1;
						else if (player.lowerGarment == undergarments.DS_LOIN || player.lowerGarment == undergarments.DSTHONG) groinProtection += 2;
					}
					//Apply damage
					if (groinProtection >= 3) {
						outputText("groin but luckily you're wearing groin protection");
						damage = 0;
					}
					else {
						if (player.gender == 0) {
							outputText("groin");
							damage = 5;
							damage = int(damage / (groinProtection + 1));
						}
						if (player.gender == 1) {
							outputText("groin, dealing painful damage to your " + player.multiCockDescriptLight() + ", doubling you over in agony");
							damage = int((player.maxHP()) / 4);
							if (groinProtection > 0) {
								outputText("! Of course, it would have been worse if you didn't wear groin protection");
								damage = int(damage / (groinProtection + 1));
							}
							damage = player.reduceDamage(damage,this);
							if (damage < 20) damage = 10;
							lustDmg = -15;
						}
						if (player.gender == 2) {
							outputText("groin, making your " + player.vaginaDescript(0) + " sting with pain");
							damage = 10;
							lustDmg = -8;
						}
						if (player.gender == 3) {
							outputText("groin, dealing painful damage to your " + player.multiCockDescriptLight() + " and " + player.vaginaDescript(0) + ", doubling you over in agony");
							damage = int((player.maxHP()) / 3)
							if (groinProtection > 0) {
								outputText("! Of course, it would have been worse if you didn't wear groin protection");
								damage = int(damage / (groinProtection + 1));
							}
							damage = player.reduceDamage(damage,this);
							if (damage < 30) damage = 30;
							lustDmg = -20;
						}
					}
				}
				//Whip yo legs
				if (temp == 3) {
					outputText("legs");
					damage = 7;
				}
				//Whip yo arms
				if (temp == 4) {
					outputText("arms");
					damage = 8;
				}
				//Whip yo neck
				if (temp == 5) {
					outputText("neck (24)");
					damage = 24;
				}
				outputText("! ");
				player.takeDamage(damage, true);
				player.takeLustDamage(lustDmg, true);
			}
			else {
				outputText("The succubus flicks her wrist, allowing a whip-like cord to slither out from the palm of her clawed hand.  She cracks the whip experimentally, cackling with glee.");
				createStatusEffect(StatusEffects.WhipReady, 0, 0, 0, 0);
				str += 20;
				this.weaponName = "whip";
				this.weaponVerb = "brutal whip-crack";
			}

		}

		public function AbstractSuccubus()
		{
		}

		protected function kissAttack():void
		{
			//[Kiss of Death Text]
			outputText("The succubus dances forwards, cocking her elbow back for a vicious strike.");
			//avoid!
			if (player.spe > spe && rand(4) == 0 || (player.findPerk(PerkLib.Evade) >= 0 && rand(4) == 0) || (player.findPerk(PerkLib.Misdirection) >= 0 && rand(4) == 0 && player.armorName == "red, high-society bodysuit")) {
				outputText("  You start to sidestep and realize it's a feint.   Ducking low, you slide under her real attack... a kiss?!  ");
				if (player.lust100 >= 70) outputText("  Maybe you shouldn't have bothered to move, it might have been fun.");
			}
			//get hit
			else {
				outputText("  You start to dodge to the side, but she shifts direction expertly and plants a wet kiss on your lips.  She spins and dodges away with a ballet dancer's grace, leaving you to wonder what just happened.  ");
				if (!player.hasStatusEffect(StatusEffects.KissOfDeath)) player.createStatusEffect(StatusEffects.KissOfDeath, 0, 0, 0, 0);
			}

		}

		protected function seduceAttack():void
		{
			var temp:int;
			var lustDmg:int;
			//determine which method of teasing you use
			temp = rand(3);
			//Butt slap!
			if (temp == 0) {
				outputText(capitalA + short + " slaps her " + Appearance.buttDescriptionShort(this));
				if (butt.rating >= 10) {
					outputText(", making it jiggle delightfully.");
					//85% success rate for the jiggly girls
					if (rand(100) <= 95) {
						lustDmg = rand(butt.rating) + 10;
						outputText("\nThe display is quite arousing.");
					}
					else outputText("\nYou're unimpressed.\n\n");
				}
				else {
					outputText(".");
					//50%ish chance of success for the tight butted.
					if (rand(100) <= (70 + butt.rating * 2)) {
						lustDmg = rand(butt.rating) + 9;
						outputText("\nThe display is quite arousing.");
					}
					else outputText("\nYou're unimpressed.\n\n");
				}
			player.takeLustDamage(lustDmg, true);
			}
			//Jiggly-tits
			if (temp == 1 && breastRows[0].breastRating >= 2) {
				//rand(breastRating) + breastRows*BreastperRow
				//Single breast row
				if (breastRows.length == 1) {
					//50+ breastsize% success rate
					outputText(capitalA + short + " caresses some of her ample chest-flesh before shaking it from side to side enticingly.");
					if (lust100 >= 50) outputText("  " + pronoun2 + " hard nipples seem to demand your attention.");
					if (rand(100) <= (65 + biggestTitSize())) {
						outputText("\nThe display is quite arousing.");
						lustDmg = rand(breastRows[0].breastRating) + breastRows.length + 10;
					}
					else outputText("\nYou're unimpressed.\n\n");
				}
				if (breastRows.length > 1) {
					//50 + 10% per breastRow + breastSize%
					outputText(capitalA + short + " caresses " + pronoun2 + " some of her rows of ample chest-flesh before shaking it all from side to side enticingly.");
					if (lust100 >= 50) outputText(", your " + player.nippleDescript(0) + "s painfully visible.");
					else outputText(".");
					if (rand(100) <= (54 + (breastRows.length - 1) * 15 + breastRows[0].breastRating)) {
						outputText("\nThe display is quite arousing.");
						lustDmg = rand(breastRows[0].breastRating) + breastRows.length * breastRows[0].breasts + 5;
					}
					else outputText("\nYou're unimpressed.\n\n");
				}
			player.takeLustDamage(lustDmg, true);
			}
			//Genitals flash!
			if (temp == 2) {
				outputText(capitalA + short + " reaches down and strokes her moist lips.  She sighs and licks her fingers clean, giving you a smoldering gaze.");
				//Success = 50% + 10% times each cock/vagina
				//rand(vaginas*2 + cocks*2) + wetness and/or length/6
				if (rand(101) <= (65 + vaginas.length * 10 + cocks.length * 10)) {
					outputText("\nThe display is quite arousing.");
					lustDmg = rand(vaginas.length * 2 + cocks.length * 2) + 13;
				}
				else outputText("\nYou're unimpressed.\n\n");
			player.takeLustDamage(lustDmg, true);
			}

		}
	}
}

license: unknown


code:
package classes.Scenes.Monsters
{
	import classes.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.GlobalFlags.kACHIEVEMENTS;
	import classes.Scenes.Camp.*;
	import classes.Items.*;

	public class BeautifulSwordScene extends BaseContent
	{
		public function BeautifulSwordScene()
		{
		}

		public function defeatedBySword():void
			{
			clearOutput();
			outputText("You stumble back, your wounds becoming too great to bear. You breathe deeply, trying to regain your ground before the sword can finish you off.");
			outputText("\n\nYou look at the sword again. It has laid itself horizontally, pointing its tip straight at you. Before you can react, it launches itself at you, at unbelievable speed!\n\nYou're impaled by the blade, but it doesn't end there. It continues moving forward, lifting you off the ground and taking you with it.");
			outputText("\nThe sword speeds across the area before lodging itself deeply into a nearby tree. You're pinned, your chest skewered. You perform a token attempt at escape, but it is useless. You soon give up, and accept your imminent death.");
			outputText("\n\nJust as death begins taking you, the sword glows with a blue flame, causing you even more pain. A new surge of energy pumps through you, a last bit of survival instinct to fight against this searing sensation. You claw and grasp at the sword, to try to dislodge it, but every time you touch it, more of your body burns away, turning into ashes and being blown away by the wind.");
			outputText("\n\nIt takes mere seconds for you to be completely disintegrated. The sword remains stuck to the tree. It returns to its rusted state, having been completely drained of energy in its attempt to purge the land of corruption; You.");
			game.gameOver();
			}

		public function rebellingBeautifulSword(wieldAttempt:Boolean = false):void {
			if(flags[kFLAGS.DESTROYED_BEAUTIFUL_SWORD] != 1){
				if (game.player.cor < (55 + game.player.corruptionTolerance())) {
					if (!wieldAttempt) outputText("The beautiful sword you carry begins glowing with a pale blue flame, burning and damaging you. No matter where you attempt to hold it, the pain is too much to bear. It seems you can't wield it while as corrupted as you are.\n\n");
					else outputText("As soon as you try to wield the sword, it lights up in flame, burning you. You quickly put it back into your pouches before it can do harm to you.");
					if (!wieldAttempt) {
						var dmg:int = 20
						dmg -= player.armorDef;
						if (dmg < 1) dmg = 1;
						player.HPChange(-dmg, false);
						player.setWeapon(WeaponLib.FISTS);
						inventory.takeItem(game.weapons.B_SWORD, playerMenu);
						return;
					}
					doNext(playerMenu);
				}
				else {
					outputText("The sword dashes out of your grasp and begins floating in the air. Its edge turns to face you. It seems you have a fight on your hands! You may equip a weapon from your inventory now. It's your last chance!");
					player.destroyItems(weapons.B_SWORD, 1);
					startCombat(new BeautifulSwordFight);
				}
			}else{
				outputText("Not sure how you got here, since you're not supposed to have a beautiful sword after destroying one. Still, go on your way, and complain to OtherCoCAnon about this.");
				doNext(camp.returnToCampUseOneHour);
			}
		}

			public function destroyBeautifulSword():void{
			flags[kFLAGS.DESTROYED_BEAUTIFUL_SWORD] = 1;
			menu();
			if(flags[kFLAGS.SWORD_SHARDS_TAKEN] < 5) addButton(0, "Take Shard",takeShard);
			addButton(1, "Leave", combat.cleanupAfterCombat);
			}

			private function takeShard():void {
			flags[kFLAGS.SWORD_SHARDS_TAKEN]++;
			inventory.takeItem(consumables.B_SHARD, destroyBeautifulSword);
		}
	}
}


code:
package classes.Scenes.Monsters
{
	/**
	 * ...
	 * @author ...
	 */
	public class DemonSoldier
	{

		public function DemonSoldier()
		{

		}

	}

}


code:
package classes.Scenes.Monsters
{
	/**
	 * ...
	 * @author ...
	 */
	public class DemonSoldierScene
	{

		public function DemonSoldierScene()
		{

		}

	}

}


code:
package classes.Scenes.Monsters
{
	import classes.Items.Consumables.SuccubisDream;
	import classes.Items.WeaponLib;
	import classes.Monster;
	import classes.Scenes.Areas.Bog.LizanRogue;
	import classes.Scenes.Areas.GlacialRift.Amarok;
	import classes.Scenes.Areas.GlacialRift.FrostGiant;
	import classes.Scenes.Areas.GlacialRift.Valkyrie;
	import classes.Scenes.Areas.GlacialRift.Yeti;
	import classes.Scenes.Areas.HighMountains.Basilisk;
	import classes.Scenes.Areas.HighMountains.Cockatrice;
	import classes.Scenes.Areas.HighMountains.Phoenix;
	import classes.Scenes.Areas.Swamp.CorruptedDrider;
import classes.Scenes.Combat.CombatAttackBuilder;
import classes.Scenes.Monsters.GoblinElder;
	import classes.Scenes.Monsters.ImpOverlord;
	import classes.Scenes.Quests.UrtaQuest.MinotaurLord;
	import classes.StatusEffects;
	import classes.PerkLib;
	import classes.GlobalFlags.kFLAGS;
import classes.Vagina;
import classes.lists.BreastCup;

public class EmptySpace extends Monster
	{

		public function EmptySpace()
		{
			this.a = "";
			this.short = "Empty Space";
			this.imageName = "aspctlaurentius";
			this.long = "placeholder";

			initStrTouSpeInte(60, 75, 75, 200);
			initLibSensCor(40, 40, 95);

			this.lustVuln = 0.75;

			this.tallness = 5 * 12 + 7;
			this.createBreastRow(BreastCup.D);
			this.createVagina(false,Vagina.WETNESS_NORMAL,Vagina.LOOSENESS_LOOSE);
			this.drop = NO_DROP;
			this.ignoreLust = true;
			this.level = 40;
			this.bonusHP = 150000;
			this.weaponName = "spectral sword";
			this.weaponVerb = "slash";
			this.weaponAttack = 0;
			this.armorName = "";
			this.armorDef = 0;
			this.lust = 30;
			this.bonusLust = 20;
			this.createPerk(PerkLib.Immovable);
			this.additionalXP = 3200;
			this.gems = 2500;
			this.createPerk(PerkLib.PoisonImmune);
            this.createPerk(PerkLib.Resolute);
			this.createPerk(PerkLib.Invincible);
			this.neverAct = true;
			checkMonster();
		}

		override public function doAI():void
		{

		}

	}

}


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

	public class Goblin extends Monster
	{
		protected function goblinDrugAttack():void {
			var temp2:Number = rand(2);
			var multiplier:Number = 1; //Higher tier goblins have powerful potions.
			if (short == "goblin assassin") multiplier += 0.2;
			if (short == "goblin shaman") multiplier += 0.4;
			if (short == "goblin warrior") multiplier += 0.5;
			if (short == "goblin elder") multiplier += 1;
			multiplier += player.newGamePlusMod() * 0.5;
			if (short == "Tamani") temp2 = rand(5);
			if (short == "Tamani's daughters") temp2 = rand(5);
			var color:String = "";
			if (temp2 == 0) color = "red";
			if (temp2 == 1) color = "green";
			if (temp2 == 2) color = "blue";
			if (temp2 == 3) color = "white";
			if (temp2 == 4) color = "black";
			//Throw offensive potions at the player
			if (color != "blue") {
				if (short == "Tamani's daughters") outputText("Tamani uncorks a glass bottle full of " + color + " fluid and swings her arm, flinging a wave of fluid at you.");
				else outputText(capitalA + short + " uncorks a glass bottle full of " + color + " fluid and swings her arm, flinging a wave of fluid at you.");
			}
			//Drink blue pots
			else {
				if (short == "Tamani's daughters") {
					outputText("Tamani pulls out a blue vial and uncaps it, then douses the mob with the contents.");
					if (HPRatio() < 1) {
						outputText("  Though less effective than ingesting it, the potion looks to have helped the goblins recover from their wounds!\n");
						addHP(80 * multiplier);
					}
					else outputText("  There doesn't seem to be any effect.\n");
					outputText("\n");
				}
				else {
					outputText(capitalA + short + " pulls out a blue vial and uncaps it, swiftly downing its contents.");
					if (HPRatio() < 1) {
						outputText("  She looks to have recovered from some of her wounds!\n");
						addHP((maxHP() / 4) * multiplier);
						if (short == "Tamani") addHP((maxHP() / 4) * multiplier);
					}
					else outputText("  There doesn't seem to be any effect.\n");

				}
				return;
			}
			//Dodge chance!
			if ((player.findPerk(PerkLib.Evade) >= 0 && rand(10) <= 3) || (rand(100) < player.spe/5)) {
				outputText("\nYou narrowly avoid the gush of alchemic fluids!\n");
			}
			else {
				//Get hit!
				if (color == "red") {
					//Temporary heat
					outputText("\nThe red fluids hit you and instantly soak into your skin, disappearing.  Your skin flushes and you feel warm.  Oh no...\n");
					if (!player.hasStatusEffect(StatusEffects.TemporaryHeat)) player.createStatusEffect(StatusEffects.TemporaryHeat, 0, multiplier, 0, 0);
				}
				else if (color == "green") {
					//Green poison
					outputText("\nThe greenish fluids splash over you, making you feel slimy and gross.  Nausea plagues you immediately - you have been poisoned!\n");
					if (!player.hasStatusEffect(StatusEffects.Poison)) player.createStatusEffect(StatusEffects.Poison, 0, multiplier, 0, 0);
				}
				else if (color == "white") {
					//sticky flee prevention
					outputText("\nYou try to avoid it, but it splatters the ground around you with very sticky white fluid, making it difficult to run.  You'll have a hard time escaping now!\n");
					if (!player.hasStatusEffect(StatusEffects.NoFlee)) player.createStatusEffect(StatusEffects.NoFlee, 0, 0, 0, 0);
				}
				else if (color == "black") {
					//Increase fatigue
					outputText("\nThe black fluid splashes all over you and wicks into your skin near-instantly.  It makes you feel tired and drowsy.\n");
					player.changeFatigue(10 + rand(25) * multiplier);
				}
			}
			outputText("\n");
		}
		protected function goblinTeaseAttack():void {
			var det:Number = rand(3);
			if (short == "goblin" || short == "goblin assassin") {
				if (det == 0) outputText(capitalA + short + " runs her hands along her leather-clad body and blows you a kiss. \"Why not walk on the wild side?\" she asks.");
				if (det == 1) outputText(capitalA + short + " grabs her heel and lifts it to her head in an amazing display of flexibility.  She caresses her snatch and gives you a come hither look.");
				if (det == 2) outputText(capitalA + short + " bends over, putting on a show and jiggling her heart-shaped ass at you.  She looks over her shoulder and sucks on her finger, batting her eyelashes.");
			}
			else if (short == "goblin warrior") {
				if (det == 0) outputText(capitalA + short + " runs her hands along her metal-clad body and blows you a kiss. \"Why not walk on the wild side?\" she asks.");
				if (det == 1) outputText(capitalA + short + " grabs her heel and lifts it to her head in an amazing display of flexibility despite the armor she's wearing.  She caresses her snatch and gives you a come hither look.");
				if (det == 2) outputText(capitalA + short + " bends over, putting on a show and jiggling her heart-shaped ass at you.  She looks over her shoulder and sucks on her finger, batting her eyelashes.");
			}
			else if (short == "goblin shaman") {
				if (det == 0) outputText(capitalA + short + " runs her hands along her leather-clad body and blows you a kiss. \"Why not walk on the wild side?\" she asks.");
				if (det == 1) outputText(capitalA + short + " grabs her heel and lifts it to her head in an amazing display of flexibility.  She lifts her loincloth and caresses her snatch and gives you a come hither look.");
				if (det == 2) outputText(capitalA + short + " bends over, putting on a show and jiggling her heart-shaped ass at you.  She looks over her shoulder and sucks on her finger, batting her eyelashes.");
			}
			else if (short == "goblin elder" || short == "Tamani") {
				if (det == 0) outputText(capitalA + short + " runs her hands along her bone-clad body and blows you a kiss. \"Why not walk on the wild side?\" she asks.");
				if (det == 1) outputText(capitalA + short + " grabs her heel and lifts it to her head in an amazing display of flexibility.  She lifts her loincloth and caresses her snatch and gives you a come hither look.");
				if (det == 2) outputText(capitalA + short + " bends over, putting on a show and jiggling her heart-shaped ass at you.  She looks over her shoulder and sucks on her finger, batting her eyelashes.");
			}
			var lustDmg:int = rand(player.lib / 10) + 8;
			if (short == "goblin assassin") lustDmg *= 1.4;
			if (short == "goblin warrior") lustDmg *= 1.6;
			if (short == "goblin shaman" || short == "Tamani") lustDmg *= 1.6;
			if (short == "goblin elder") lustDmg *= 2;
			outputText("  The display distracts you long enough to prevent you from taking advantage of her awkward pose, leaving you more than a little flushed.");
			player.takeLustDamage(lustDmg, true);
			outputText("\n\n");
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.goblinScene.gobboRapeIntro();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (player.gender == 0 || flags[kFLAGS.SFW_MODE] > 0) {
				outputText("You collapse in front of the goblin, too wounded to fight.  She giggles and takes out a tube of lipstick smearing it whorishly on your face.  You pass into unconsciousness immediately.  It must have been drugged.");
				game.combat.cleanupAfterCombat();
			} else if (pcCameWorms) {
				outputText("\n\nThe goblin's eyes go wide and she turns to leave, no longer interested in you.");
				player.orgasm('Generic');
				doNext(game.combat.cleanupAfterCombat);
			} else {
				game.goblinScene.goblinRapesPlayer();
			}
		}

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

		public function Goblin(noInit:Boolean=false) {
			if (noInit) return;
			//this.monsterCounters = game.counters.mGoblin;
			this.a = "the ";
			this.short = "goblin";
			this.imageName = "goblin";
			this.long = "The goblin before you is a typical example of her species, with dark green skin, pointed ears, and purple hair that would look more at home on a punk-rocker.  She's only about three feet tall, but makes up for it with her curvy body, sporting hips and breasts that would entice any of the men in your village were she full-size.  There isn't a single scrap of clothing on her, just lewd leather straps and a few clinking pouches.  She does sport quite a lot of piercings – the most noticeable being large studs hanging from her purple nipples.  Her eyes are fiery red, and practically glow with lust.  This one isn't going to be satisfied until she has her way with you.  It shouldn't be too hard to subdue such a little creature, right?";
			this.race = "Goblin";
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 40, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,30,0,0,0);
			this.tallness = 35 + rand(4);
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "dark green";
			this.hair.color = "purple";
			this.hair.length = 4;
			initStrTouSpeInte(12, 13, 35, 42);
			initLibSensCor(45, 45, 60);
			this.weaponName = "fists";
			this.weaponVerb="tiny punch";
			this.armorName = "leather straps";
			this.lust = 50;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 1;
			this.gems = rand(5) + 5;
			this.drop = new WeightedDrop().
					add(consumables.GOB_ALE,5).
					addMany(1,consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.PURPDYE);
			/*this.special1 = goblinDrugAttack;
			this.special2 = goblinTeaseAttack;*/
			checkMonster();
		}

	}

}


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

	public class GoblinAssassin extends Monster
	{

		protected function goblinDrugAttack():void {
			var temp2:Number = rand(5);
			var color:String = "";
			if (temp2 == 0) color = "red";
			if (temp2 == 1) color = "green";
			if (temp2 == 2) color = "blue";
			if (temp2 == 3) color = "white";
			if (temp2 == 4) color = "black";
			//Throw offensive potions at the player
			if (color != "blue") {
				outputText(capitalA + short + " uncorks a glass bottle full of " + color + " fluid and swings her arm, flinging a wave of fluid at you.");
			}
			//Drink blue pots
			else {
				outputText(capitalA + short + " pulls out a blue vial and uncaps it, swiftly downing its contents.");
				if (HPRatio() < 1) {
					outputText("  She looks to have recovered from some of her wounds!\n");
					addHP(maxHP() / 4);
				}
				else outputText("  There doesn't seem to be any effect.\n");
			}
			//Dodge chance!
			if ((player.findPerk(PerkLib.Evade) >= 0 && rand(10) <= 3) || (rand(100) < player.spe/5)) {
				outputText("\nYou narrowly avoid the gush of alchemic fluids!\n");
				return;
			}
			//Get hit!
			//Temporary heat
			if (color == "red") {
				outputText("\nThe red fluids hit you and instantly soak into your skin, disappearing.  Your skin flushes and you feel warm.  Oh no...\n");
				if (!player.hasStatusEffect(StatusEffects.TemporaryHeat)) player.createStatusEffect(StatusEffects.TemporaryHeat,0,0,0,0);
			}
			//Green poison
			if (color == "green") {
				outputText("\nThe greenish fluids splash over you, making you feel slimy and gross.  Nausea plagues you immediately - you have been poisoned!\n");
				if (!player.hasStatusEffect(StatusEffects.Poison)) player.createStatusEffect(StatusEffects.Poison,0,0,0,0);
			}
			//sticky flee prevention
			if (color == "white") {
				outputText("\nYou try to avoid it, but it splatters the ground around you with very sticky white fluid, making it difficult to run.  You'll have a hard time escaping now!\n");
				if (!player.hasStatusEffect(StatusEffects.NoFlee)) player.createStatusEffect(StatusEffects.NoFlee,0,0,0,0);
			}
			//Increase fatigue
			if (color == "black") {
				outputText("\nThe black fluid splashes all over you and wicks into your skin near-instantly.  It makes you feel tired and drowsy.\n");
				player.changeFatigue(10 + rand(25));
			}

			return;
		}
		//Lust Needle
		protected function lustNeedle():void {
			var lustDmg:int;
			outputText("With a swift step, the assassin vanishes, her movements too quick for you to follow. You take a sharp breath as you feel her ample thighs clench your head in between them, her slick cunt in full view as you take in her scent.");
			//Miss
			if (!combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed)
			{
				//Miss:
				outputText("\nYou’ve already prepared, however, as you hold your breath and grab the goblin by her sides. Unhindered by her advance, you take the opportunity to move backwards, throwing the goblin off balance and leaving you only faintly smelling of her pussy.");
				lustDmg = rand(player.lib/10) +4;
			}
			//Hit:
			else
			{
				outputText("\nYou’re far too distracted to notice the needle injected into the back of your neck, but by the time she flips back into her original position you already feel the contents of the syringe beginning to take effect.");
				lustDmg = rand(player.lib/4) +20;
			}
			player.takeLustDamage(lustDmg, true);
		}
		//Dual Shot
		protected function dualShot():void {
			outputText("The assassin throws a syringe onto the ground, shattering it and allowing the dissipating smoke from its contents to distract you long enough for her to slip underneath you. With a quick flick of her wrists two needles are placed into her hands, though you’ve already caught wind of her movements.");
			//Miss:
			if (!combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed)
			{
				outputText("\nYou jump backwards, far enough to avoid her quick thrust upwards as she attempts to lick the area in which your crotch once stood. Realising her situation, she quickly removes herself from the ground and faces you, more determined than before.");
			}
			//Hit:
			else {
				outputText("\nBefore you can do anything to stop her, she lifts her head and takes a swift lick of your crotch, taking a small moan from you and giving her enough time to stab into the back of your knees. She rolls out of the way just as you pluck the two needles out and throw them back to the ground. They didn’t seem to have anything in them, but the pain is enough to make you stagger. ");
				//(Medium HP loss, small lust gain)
				var damage:int = player.reduceDamage(str + weaponAttack + 40,this);
				damage = player.takeDamage(damage, true);
			}

		}
		//Explosion
		protected function goblinExplosion():void {
			outputText("Without a second thought, the assassin pulls a thin needle from the belt wrapped around her chest and strikes it against the ground, causing a flame to erupt on the tip. She twirls forward, launching the needle in your direction which subsequently bursts apart and showers you with heat.");
			outputText("\nYou shield yourself from the explosion, though the goblin has already lit a second needle which she throws behind you, launching your body forwards as it explodes behind your back. ");
			//(High HP loss, no lust gain)
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			var damage:int = 25 + rand(75);
			damage = player.takeDamage(damage, true);

		}
		override public function defeated(hpVictory:Boolean):void
		{
			game.goblinAssassinScene.gobboAssassinRapeIntro();

		}
		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (player.gender == 0 || flags[kFLAGS.SFW_MODE] > 0) {
				outputText("You collapse in front of the goblin, too wounded to fight.  She growls and kicks you in the head, making your vision swim. As your sight fades, you hear her murmur, \"<i>Fucking dicks can't even bother to grow a dick or cunt.</i>\"");
				game.combat.cleanupAfterCombat();
			}
			else {
				game.goblinAssassinScene.gobboAssassinBeatYaUp();
			}
		}
		public function GoblinAssassin(noInit:Boolean=false)
		{
			if (noInit) return;
			////this.monsterCounters = game.counters.mGoblinAssassin;
			this.a = "the ";
			this.short = "goblin assassin";
			this.imageName = "goblinassassin";
			this.long = "Her appearance is that of a regular goblin, curvy and pale green, perhaps slightly taller than the norm. Her wavy, untamed hair is a deep shade of blue, covering her pierced ears and reaching just above her shoulders. Her soft curves are accentuated by her choice of wear, a single belt lined with assorted needles strapped across her full chest and a pair of fishnet stockings reaching up to her thick thighs. She bounces on the spot, preparing to dodge anything you might have in store, though your eyes seem to wander towards her bare slit and jiggling ass. Despite her obvious knowledge in combat, she’s a goblin all the same – a hard cock can go a long way.";
			this.race = "Goblin";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 90, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_NORMAL;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,50,0,0,0);
			this.tallness = 35 + rand(4);
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "dark green";
			this.hair.color = "blue";
			this.hair.length = 7;
			initStrTouSpeInte(45, 55, 110, 95);
			initLibSensCor(65, 35, 60);
			this.weaponName = "needles";
			this.weaponVerb="stabbing needles";
			this.armorName = "leather straps";
			this.bonusHP = 70;
			this.lust = 50;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 10;
			this.gems = rand(50) + 25;
			this.createPerk(PerkLib.Evade, 0, 0, 0, 0);
			this.additionalXP = 150;
			this.drop = new WeightedDrop().
					add(consumables.GOB_ALE, 5).
					addMany(1, consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.PURPDYE);// TODO this is a copy of goblin drop. consider replacement with higher-lever stuff
			checkMonster();
		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI();
			actionChoices.add(eAttack, 1, true, 0, FATIGUE_NONE, RANGE_RANGED);
			actionChoices.add(goblinDrugAttack, 1, true, 10, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.add(lustNeedle, 1, true, 5, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.add(dualShot, 1, true, 10, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.add(goblinExplosion, 1, true, 10, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.exec();
		}
	}
}


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

	public class GoblinQueen extends Goblin
	{

		public function GoblinQueen()
		{
			this.a = "the ";
			this.short = "goblin queen";
			this.imageName = "goblinqueen";
			this.long = "The goblin before you stands nearly four feet tall. Her ears appear to be pierced more times than the amount of piercings a typical goblin has. Her hair is dark green and her skin color is a vibrant yellow, a sheer rarity. She’s unlike most of the goblins you’ve seen. She’s wielding a staff in her right hand. In addition to the straps covering her body, she’s wearing a necklace seemingly carved with what looks like shark teeth. She's wielding a glowing sword in her right hand and a shield in her left hand. ";
			this.race = "Goblin";
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 40, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("FF"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,30,0,0,0);
			this.tallness = 47;
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "dark green";
			this.hair.color = "dark green";
			this.hair.length = 4;
			initStrTouSpeInte(85, 65, 70, 100);
			initLibSensCor(55, 35, 65);
			this.weaponName = "sword";
			this.weaponVerb = "slash";
			this.weaponAttack = 14;
			this.armorName = "fur loincloth";
			this.armorDef = 6;
			this.fatigue = 0;
			this.bonusHP = 275;
			this.lust = 35;
			this.lustVuln = 0.4;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 14;
			this.canBlock = true;
			this.shieldName = "kite shield";
			this.shieldBlock = 15;
			this.additionalXP = 150;
			this.gems = rand(15) + 15;
			this.drop = new WeightedDrop().
					add(consumables.GOB_ALE,5).
					add(weapons.W_STAFF,1).
					add(armors.FURLOIN,1).
					add(jewelries.MYSTRNG,1).
					addMany(1,consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.GREEN_D,
							consumables.PURPDYE);
			/*this.special1 = goblinDrugAttack;
			this.special2 = goblinTeaseAttack;
			this.special3 = castSpell;*/
			checkMonster();
		}

	}

}


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

	public class GoblinShaman extends Goblin
	{
		public var spellCostCharge:int = 10;
		public var spellCostBlind:int = 8;
		public var spellCostWhitefire:int = 15;
		public var spellCostArouse:int = 10;
		public var spellCostHeal:int = 15;
		public var spellCostMight:int = 10;

		public function whitefire():void{
			outputText("The goblin narrows her eyes and focuses her mind with deadly intent. She snaps her fingers and you are enveloped in a flash of white flames!  ");
			var damage:int = inte + rand(50) * spellMultiplier();
			game.combat.monsterDamageType = game.combat.DAMAGE_FIRE;
			player.takeDamage(damage, true);
		}

		public function blind():void{
			outputText("The goblin glares at you and points at you! A bright flash erupts before you!  ");
			if (rand(player.inte / 5) <= 4) {
				outputText("You are blinded!");
				player.createStatusEffect(StatusEffects.Blind, 1 + rand(3), 0, 0, 0);
			}
			else {
				outputText("You manage to blink in the nick of time!");
			}
		}

		public function arouse():void{
			outputText("She makes a series of arcane gestures, drawing on her lust to inflict it upon you! ");
			var lustDmg:int = (inte / 10) + (player.lib / 10) + rand(10) * spellMultiplier();
			player.takeLustDamage(lustDmg, true);
		}

		public function chargeweapon():void{
			outputText("The goblin utters word of power, summoning an electrical charge around her staff. It looks like she'll deal more physical damage now!");
			createStatusEffect(StatusEffects.ChargeWeapon, 25 * spellMultiplier(), 0, 0, 0);
		}

		public function heal():void{
			outputText("She focuses on her body and her desire to end pain, trying to draw on her arousal without enhancing it.");
			var temp:int = int(10 + (inte/2) + rand(inte/3)) * spellMultiplier();
			outputText("She flushes with success as her wounds begin to knit! (+" + temp + ").");
			addHP(temp);
		}

		public function might():void{
			outputText("She flushes, drawing on her body's desires to empower her muscles and toughen her up.");
			outputText("The rush of success and power flows through her body.  She feels like she can do anything!");
			createStatusEffect(StatusEffects.Might, 20 * spellMultiplier(), 20 * spellMultiplier(), 0, 0);
			str += 20 * spellMultiplier();
			tou += 20 * spellMultiplier();
		}

		private function spellMultiplier():Number {
			var mult:Number = 1;
			mult += player.newGamePlusMod() * 0.5;
			return mult;
		}

		override protected function performCombatAction():void {
			var actionChoices:MonsterAI = new MonsterAI();
			actionChoices.add(this.whitefire, 1, lust < 50, spellCostWhitefire, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(this.blind, 1, lust < 50 && !player.hasStatusEffect(StatusEffects.Blind), spellCostBlind, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(this.chargeweapon, 1, lust < 50, spellCostCharge, FATIGUE_MAGICAL, RANGE_SELF);
			actionChoices.add(this.heal, 1, lust > 60, spellCostHeal, FATIGUE_MAGICAL_HEAL, RANGE_SELF);
			actionChoices.add(this.might, 1, lust > 50, spellCostMight, FATIGUE_MAGICAL, RANGE_SELF);
			actionChoices.add(this.arouse, 1, lust < 50, spellCostWhitefire, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(this.whitefire, 1, lust < 50, spellCostWhitefire, FATIGUE_MAGICAL, RANGE_RANGED);
			actionChoices.add(goblinDrugAttack, 1, true, 10, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.add(goblinTeaseAttack, 1, true, 0, FATIGUE_NONE, RANGE_TEASE);
			actionChoices.add(eAttack, 1, true, 0, FATIGUE_NONE, RANGE_MELEE);
			actionChoices.exec();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.goblinShamanScene.goblinShamanRapeIntro();
		}
		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (player.gender == 0 || flags[kFLAGS.SFW_MODE] > 0) {
				outputText("You collapse in front of the goblin, too wounded to fight.  She growls and kicks you in the head, making your vision swim. As your sight fades, you hear her murmur, \"Fucking dicks can't even bother to grow a dick or cunt.\"");
				game.combat.cleanupAfterCombat();
			}
			else {
				game.goblinShamanScene.goblinShamanBeatYaUp();
			}
		}

		public function GoblinShaman()
		{
			super(true);
			//this.monsterCounters = game.counters.mGoblinShaman;
			this.a = "the ";
			this.short = "goblin shaman";
			this.imageName = "goblinshaman";
			this.long = "The goblin before you stands approximately three feet and a half. Her ears appear to be pierced more times than the amount of piercings a typical goblin has. Her hair is deep indigo. She’s unlike most of the goblins you’ve seen. She’s wielding a staff in her right hand. In addition to the straps covering her body, she’s wearing a necklace seemingly carved with what looks like shark teeth. She’s also wearing a tattered loincloth, unlike most goblins who would show off their pussies. From the looks of one end of her staff glowing, she’s clearly a shaman!";
			this.race = "Goblin";
			if (player.hasCock()) this.long += "  She's clearly intent on casting you into submission just so she can forcibly make you impregnate her.";
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 40, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,30,0,0,0);
			this.tallness = 44 + rand(7);
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "dark green";
			this.hair.color = "indigo";
			this.hair.length = 4;
			initStrTouSpeInte(75, 50, 70, 87);
			initLibSensCor(45, 45, 60);
			this.weaponName = "wizard staff";
			this.weaponVerb = "bludgeon";
			this.weaponAttack = 14;
			this.armorName = "fur loincloth";
			this.armorDef = 6;
			this.fatigue = 0;
			this.bonusHP = 275;
			this.lust = 35;
			this.lustVuln = 0.4;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 14;
			this.gems = rand(15) + 15;
			this.drop = new WeightedDrop().
					add(consumables.GOB_ALE,5).
					add(weapons.W_STAFF,1).
					add(undergarments.FURLOIN,1).
					add(jewelries.MYSTRN1, 1).
					add(jewelries.LIFERN1,1).
					addMany(1,consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.GREEN_D,
							consumables.PURPDYE);
			/*this.special1 = goblinDrugAttack;
			this.special2 = goblinTeaseAttack;
			this.special3 = castSpell;*/
			checkMonster();
		}

	}

}


code:
package classes.Scenes.Monsters
{
	import classes.*;
	import classes.BodyParts.Butt;
	import classes.BodyParts.Hips;
import classes.Items.Armors.Nothing;
import classes.StatusEffects.Combat.TargetMarked;
import classes.display.SpriteDb;
import classes.internals.*;
	import classes.GlobalFlags.*;

	public class GoblinSharpshooter extends Monster
	{
		override public function defeated(hpVictory:Boolean):void
		{
			game.goblinSharpshooterScene.defeatSharpshooter();

		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (player.gender == 0 || flags[kFLAGS.SFW_MODE] > 0) {
				outputText("You collapse in front of the goblin, too wounded to fight.  She growls and kicks you in the head, making your vision swim. As your sight fades, you hear her murmur, \"Fucking dicks can't even bother to grow a dick or cunt.\"");
				game.combat.cleanupAfterCombat();
			}
			else {
				game.goblinWarriorScene.gobboWarriorBeatYaUp();
			}
		}

        override public function handleCombatLossText(inDungeon:Boolean, gemsLost:int):int {
            if (itsADraw) {
                outputText("[pg]You sigh in frustration and make your way back to your camp. You'll get her next time, or so you tell yourself.");
                return 1;
            }
            else return super.handleCombatLossText(false, gemsLost);
        }

		public function GoblinSharpshooter(noInit:Boolean=false)
		{
			if (noInit) return;
			////this.monsterCounters = game.counters.mGoblinAssassin;
			this.a = "the ";
			this.short = "goblin sharpshooter";
			this.imageName = "goblinsharpshooter";
			this.long = "Her appearance is that of a regular goblin, curvy and pale green, perhaps slightly taller than the norm. Her wavy, untamed hair is a fiery red, though you can't see much" +
					" of it due to the comical cavalier hat she's wearing. Her soft curves are accentuated by her choice of wear, a single belt lined with assorted pouches strapped across her full" +
					" chest and a pair of fishnet stockings reaching up to her thick thighs. She bounces on the spot, preparing to dodge anything you might have in store, though your eyes seem to" +
					" wander towards her bare slit and jiggling ass. Despite her obvious knowledge in combat, she’s a goblin all the same – a hard cock can go a long way.\n\nThis goblin has an" +
					" old blunderbuss in her hands! ";
			this.race = "Goblin";
			// this.plural = false;
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 90, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_NORMAL;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,50,0,0,0);
			this.tallness = 35 + rand(4);
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "dark green";
			this.hair.color = "blue";
			this.hair.length = 7;
			initStrTouSpeInte(45, 55, 110, 95);
			initLibSensCor(65, 35, 60);
			this.weaponName = "blunderbuss";
			this.weaponVerb="shot";
			this.armorName = "leather straps";
			this.weaponAttack = 130;
			this.bonusHP = 300;
			this.lust = 50;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 20;
			this.gems = rand(50) + 25;
			this.createPerk(PerkLib.Evade, 0, 0, 0, 0);
			this.additionalXP = 350;
			this.drop = new WeightedDrop().
					add(weapons.BLUNDER,1).add(null,2);
			checkMonster();
		}

		override protected function performCombatAction():void
		{
			var actionChoices:MonsterAI = new MonsterAI();
			actionChoices.add(eAttack, 3, ammo, 0, FATIGUE_NONE, RANGE_RANGED);
			actionChoices.add(pushBack, 1, ammo  && distance == DISTANCE_MELEE, 0, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.add(skeetShot, 1, ammo && distance == DISTANCE_DISTANT, 5, FATIGUE_PHYSICAL, RANGE_RANGED);
			actionChoices.add(reload, 1, !ammo, 0, FATIGUE_NONE, RANGE_OMNI);
			actionChoices.add(takeAim, 1, !hasStatusEffect(StatusEffects.TargetMarkedBuff), 25, FATIGUE_NONE, RANGE_SELF);
            actionChoices.add(buggerOut, 99, (this.HP < (this.maxHP() * 0.25)) && smokeGrenade, 0, FATIGUE_NONE, RANGE_OMNI);
			actionChoices.exec();
		}

		public var ammo:Boolean = true;
		public var smokeGrenade:Boolean = true;

		override public function eAttack():void{
			ammo = false;
			super.eAttack();
		}
		public var itsADraw:Boolean = false;
		public function buggerOut():void{
            itsADraw = true;
			outputText("The goblin staggers back, her body jiggling humorously as she struggles to stand. [say: Crikey, you're a tough nut, ain't ya? Rubbish, I ain't staying around for this!]");
			if(!game.goblinSharpshooterScene.saveContent.sawSmokeGrenade){
				outputText("\n\nShe quickly grabs some type of grenade from one of her pouches. It's not pink like her other grenades, however, and you remain on guard, prepared to dodge it." +
						"\nShe briefly threatens to throw it at you, but smiles and stops at the last moment. [say: I'll get ya one day!] she says, before throwing the grenade on her feet." +
						"\n\nThe grenade detonates with a bright flash, a deafening sound, and if that wasn't enough, a pitch black smoke cloud. You cough and rub your eyes, completely stunned by" +
						" her device. Damn it, she's going to escape!");
				game.combat.overrideEndOfRoundFunction = game.goblinSharpshooterScene.goblinEscapes;
            }else{
				outputText("\n\nShe reaches for the smoke grenade again, but you're prepared for that this time! You do your best to face away from her and cover your ears just before the device" +
						" detonates. You hear the bang, turn to face her again and notice something dashing away from the smoke cloud and out of sight. Time to get this slippery goblin!");
                game.combat.overrideEndOfRoundFunction = trytoGrabGobbo;
			}
		}

		public function trytoGrabGobbo():void{
			clearOutput();
            if(Utils.rand(player.spe) > Utils.rand(this.spe)){
                outputText("You dash into the cloud as quickly as you can manage. The smoke is thick and almost pitch black, but you manage to discern her voluptuous silhouette. You stretch" +
                        " your arm and grab her by her thong, causing the already weakened goblin to yelp and stumble, falling face first onto the ground. " +
						"\nWhen the smoke clears, you see a trembling goblin clutching a silly cavalier hat while staring in horror at you." +
						"\n\nYou cross your arms. That's a defeated goblin if you've ever seen one.");
				itsADraw = false;
				this.HP = 0;
                game.goblinScene.generateGobboSexMenu(SpriteDb.goblinSharpshooter);
            }else{
                outputText("You dash into the cloud as quickly as you can manage. You swing your arms wildly, attempting to grab the annoying fleeing goblin.\nDespite your efforts, however, she" + " manages to outsmart you, getting behind you and lightly kicking your [butt]. You lose your balance and fall face first on the ground, prompting a solid laugh from the" + " goblin as the flees." + "\n\nWhen the smoke clears, there's nothing but a dirtied and annoyed Champion on the ground. You cringe in anger before getting up to your feet and cleaning yourself as" + " best you can. That damn goblin.");
                doNext(game.combat.cleanupAfterCombat);
			}
		}

		public function takeAim():void{
            outputText("The goblin breathes deeply, carefully taking aim with her blunderbuss, locking onto you. [say: Gotta know where 'ta shoot to put 'em down], she says, a smile creeping up on" + " her face." + "\nYou're pretty sure she has marked a spot on your body, and will do a lot more damage now!");
            this.addStatusEffect(new TargetMarked(6));

		}

		public function pushBack():void{
            ammo = false;
            outputText("The goblin quickly takes a red paper cartridge from her pouch, rips it open with her mouth and loads her musket with it. To your surprise, instead of keeping her distance," + " she charges forward, intending on hitting you point blank! ");
            if(!playerAvoidDamage({doDodge:true, doParry:false, doBlock:false, doFatigue:false})){
                outputText(" She catches you by surprise, moving too fast for you to avoid her attack. She places the flared muzzle against your chest and fires! " + "\nYou're launched several feet backwards, lifted off the ground by the massive directed explosion of her special shot. When you finally land, you notice to your relief" + " that there was no projectile. You get up, and see that the goblin was also thrown back quite a few feet from the recoil; it seems you two are distanced" + " now!\nShe gets back on her feet and adjusts her now-dirtied hat, still focused on you.");
				this.distance = DISTANCE_DISTANT;
                var damage:int = player.reduceDamage(this.weaponAttack - 50,this);
				player.takeDamage(damage,true);

            }
        }

		public function reload():void{
            ammo = true;
			outputText("The goblin takes some time to reload her blunderbuss. She does it with surprising dexterity, but not enough to prevent you from attacking her again.");
		}

		public function skeetShot():void{
            ammo = false;
            outputText("The goblin takes a pink glass flask from her pouch and throws it at you, giving it quite the arc. You ready yourself to dodge the object, but she takes aim and attempts to" + " shoot it just as it reaches you, to prevent any evasion!");
			if(this.chanceToHit() - 30 > rand(100)){
                outputText("\nShe fires and hits the flask in full, detonating it before it reaches you and covering you in a pink mist! Despite your best attempts, you accidentally breathe it in," + " feeling your body heat up with unwanted arousal. You look at the goblin again and she throws a kiss at you, flashing a mischievous smile afterwards. Giving up and fucking" + " her  until that smile vanishes seems like such a great idea now...");
				player.takeLustDamage(30,true);
			}else{
				outputText("\nShe fires, but thankfully the shot goes wide. The flask lands in front of you before the fuse is up, giving you some time to avoid its blast radius!");
                if(!playerAvoidDamage({doDodge:true, doParry:false, doBlock:false, doFatigue:false})){
                    outputText("\nThe grenade detonates before you manage to get enough distance! Despite your best attempts, you accidentally breathe it in," + " feeling your body heat up with unwanted arousal. You look at the goblin again and she throws a kiss at you, flashing a mischievous smile afterwards. Giving up and" + " fucking her until that smile vanishes  seems like such a great idea now...");
                    player.takeLustDamage(20,true);
                }
			}
		}
	}
}


code:
package classes.Scenes.Monsters
{
	import classes.*;
	import classes.BodyParts.*;
	import classes.GlobalFlags.kFLAGS;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.display.SpriteDb;
	import classes.internals.*;
import classes.saves.SelfSaver;
import classes.saves.SelfSaving;

public class GoblinSharpshooterScene extends BaseContent implements SelfSaving, TimeAwareInterface
	{
		public function GoblinSharpshooterScene()
		{
            SelfSaver.register(this);
			CoC.timeAwareClassAdd(this);
		}

        public var saveContent:Object = {
            timesEncountered: 0,
            sawSmokeGrenade: false,
			encounterCooldown:0
        };

        public function get saveName():String {
            return "goblinSharpshooter";
        }

        public function get saveVersion():int {
            return 1;
        }

        public function load(version:int, saveObject:Object):void {
            for (var property:String in saveContent) {
                if (saveObject.hasOwnProperty(property)) saveContent[property] = saveObject[property];
            }
        }

        public function reset():void {
            saveContent.timesEncountered = 0;
            saveContent.sawSmokeGrenade = false;
            saveContent.encounterCooldown = 0;
        }

		public function onAscend(reset:Boolean):void {
            saveContent.timesEncountered = 0;
            saveContent.sawSmokeGrenade = false;
            saveContent.encounterCooldown = 0;
		}

        public function saveToObject():Object {
            return saveContent;
        }

        public function loadFromObject(o:Object, ignoreErrors:Boolean):void {
        }

		public function defeatSharpshooter():void{
			clearOutput();
			outputText("The goblin falls to the ground, defeated. [say: Bollocks to this! The hunter ain't becoming the hunted!] She says, reaching for her gear." +
					"\n\nYou approach her as she tries to grab something out of one of her pouches, but you quickly swat it away and out of her reach. This goblin is completely at your mercy now." +
					"\n[say: Alright, take it easy, yeah? I'm just not used to being on top.]" +
					"\n\nWell, what will you do with this little green hunter?");
			game.goblinScene.generateGobboSexMenu(SpriteDb.goblinSharpshooter);
		}

		public function goblinEscapes():void{
			clearOutput();
			outputText("When your vision clears and the smoke dissipates, the goblin is nowhere to be seen. Damn it! What a waste of time that was.");
			saveContent.sawSmokeGrenade = true;
			combat.cleanupAfterCombat();
		}

		public function meetGoblinSharpshooter():void {
			saveContent.encounterCooldown = 48;
			clearOutput();
			spriteSelect(SpriteDb.goblinSharpshooter);
			//First Time Intro
			if (saveContent.timesEncountered == 0)
			{
				outputText("Used as you are to exploring these lands, you've developed a kind of instinct that warns you when you're walking into an ambush. While it doesn't flare up as many times" +
						" as it should, you definitely feel it now; there's something watching you. ");
				switch(player.location){
					case Player.LOCATION_FOREST:
                    case Player.LOCATION_DEEPWOODS:
                    case Player.LOCATION_SWAMP:
						outputText("The rustling on a nearby bush all but confirms your suspicion. You turn to face it and ready yourself for anything that might suddenly jump out in your" +
								" direction." +
								"\nTo your surprise, there's no movement for several seconds. You move a meter towards it without any further reaction, and begin to think it might have been a" +
								" random critter instead of an enemy.");
						outputText("\nYou move another meter towards it and hear a crack under your [foot]: a broken branch." +
								"\n\n[say: Gotcha.]" +
								"\nIt all happens in a flash; a loud noise, a blast from within the bush, you falling to your back, feeling intense, burning pain. You've been shot!");
						outputText("\nYou hear a female voice from within the bush. [say: Yer a careful one, ain't ya? Ran out of patience for a bit.] Still groaning, you turn your head to the" +
								" source of the voice and see a goblin armed with a blunderbuss!");
						break;
					case Player.LOCATION_DESERT:
                        outputText("A large amount of sand slides down on a nearby dune, all but confirming your suspicion. You turn to face it and ready yourself for anything that might suddenly" +
								" jump out in your direction." +
                                "\nTo your surprise, there's no movement for several seconds. You move a meter towards it without any further reaction, and begin to think it might have been a" +
                                " random critter instead of an enemy.");
                        outputText("\nYou move another meter towards it and hear a crack under your [foot]: a broken branch. A branch, here?" +
                                "\n\n[say: Gotcha.]" +
                                "\nIt all happens in a flash; a loud noise, a blast from within the dune, you falling to your back, feeling intense, burning pain. You've been shot!");
                        outputText("\nYou hear a female voice from within the dune. [say: Yer a careful one, ain't ya? Ran out of patience for a bit.] Still groaning, you turn your head to the" +
                                " source of the voice and see a goblin! She removes a sand-colored cloak and removes some excess sand on her body. After being sufficiently clean, she points" +
								" her weapon towards you: a blunderbuss!");
                        break;

				}
                outputText("\n[say: I didn't aim for yer head, don't worry about it. Now just stand still so I can milk ya for all your cum!] She says, with a devious smile. [say: And" +
                        " probably rob some of yer stuff as well. Gotta make a living.]");
                outputText(" You put a hand over your chest and notice it isn't wounded or bleeding, though you can't say the same for your left arm. You get up from the ground," +
                        " prompting the goblin to quickly run back to a safer range. You're not out of the fight yet.");
                player.takeDamage(50 + rand(25),true);
                outputText("\n\n[say: Oh hell, should'a aimed for the legs!] She says, reloading her firearm. It's a fight!");
			}
			else {
				outputText("You hear the familiar sound of a musket's hammer being cocked behind you. It's all the warning you get to jump and roll out of the way as a wave of buckshot zooms past" +
						" you. You turn around and see the blunderbuss-wielding goblin again. It's a fight!");
			}
            saveContent.timesEncountered++;
			unlockCodexEntry(kFLAGS.CODEX_ENTRY_GOBLINS);
			startCombat(new GoblinSharpshooter());

	}

		public function encounterChance():Number{
            return 0.1 + player.hoursSinceCum/48;
		}

		public function encounterWhen():Boolean{
			return player.hasCock() && saveContent.encounterCooldown == 0 && player.level >= 14;
		}
        public function timeChange():Boolean {
            saveContent.encounterCooldown = Math.max(saveContent.encounterCooldown-1,0);
            return false;
        }

        public function timeChangeLarge():Boolean {
            return false;
        }

    }
}


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

	public class GoblinWarrior extends Goblin
	{
		public function slash():void {
			outputText("The goblin charges at you with her sword!  As soon as she approaches you, she swings her sword! ");
			if (!combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed) {
				outputText("You avoid her slash!");
			}
			else {
				outputText("You fail to dodge and you get hit. ");
				//Get hit
				var damage:int = str + weaponAttack + rand(40);
				damage = player.reduceDamage(damage,this);
				player.takeDamage(damage, true);
			}

		}

		public function shieldBash():void {
			outputText("The goblin charges at you with her shield! ");
			if (!combatAvoidDamage({doDodge:true,doParry:false,doBlock:false}).failed) {
				outputText("You avoid her shield bash!");
			}
			else {
				outputText("Her shield hits you! ");
				//Get hit
				if (player.stun(1,40)) {
					outputText("The impact from the shield has left you with a concussion. You are stunned. ");
				}
				var damage:int = str + rand(10);
				damage = player.reduceDamage(damage,this);
				player.takeDamage(damage, true);
			}

		}

		public function warriorSpecial():void {
			if (rand(2) == 0) slash();
			else shieldBash();
		}

		override public function defeated(hpVictory:Boolean):void
		{
			game.goblinWarriorScene.goblinWarriorRapeIntro();
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (player.gender == 0 || flags[kFLAGS.SFW_MODE] > 0) {
				outputText("You collapse in front of the goblin, too wounded to fight.  She growls and kicks you in the head, making your vision swim. As your sight fades, you hear her murmur, \"Fucking dicks can't even bother to grow a dick or cunt.\"");
				game.combat.cleanupAfterCombat();
			}
			else {
				game.goblinWarriorScene.gobboWarriorBeatYaUp();
			}
		}

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

		public function GoblinWarrior()
		{
			super(true);
			//this.monsterCounters = game.counters.mGoblinWarrior;
			this.a = "the ";
			this.short = "goblin warrior";
			this.imageName = "goblinwarrior";
			this.long = "The goblin before you is slightly taller than most of the goblins and her hair is a deep red hue. She has dark green skin and her ears are pierced in several spots. Unlike most goblins you've seen, this one is well armed. She's wearing a metal breastplate that covers her torso, offering her more defense. There are more straps covering her legs than a goblin typically has. She's wielding a shortsword in her right hand and a wooden shield in her left hand. Despite how well-armed she is, her nipples and cooter are exposed.";
			this.race = "Goblin";
			if (player.hasCock()) this.long += "  She's clearly intent on beating you up just so she can forcibly make you impregnate her.";
			this.createVagina(false, Vagina.WETNESS_DROOLING, Vagina.LOOSENESS_NORMAL);
			this.createStatusEffect(StatusEffects.BonusVCapacity, 40, 0, 0, 0);
			createBreastRow(Appearance.breastCupInverse("E"));
			this.ass.analLooseness = Ass.LOOSENESS_TIGHT;
			this.ass.analWetness = Ass.WETNESS_DRY;
			this.createStatusEffect(StatusEffects.BonusACapacity,30,0,0,0);
			this.tallness = 44 + rand(7);
			this.hips.rating = Hips.RATING_AMPLE+2;
			this.butt.rating = Butt.RATING_LARGE;
			this.skin.tone = "dark green";
			this.hair.color = "red";
			this.hair.length = 4;
			initStrTouSpeInte(75, 50, 70, 72);
			initLibSensCor(45, 45, 60);
			this.weaponName = "sword and shield";
			this.weaponVerb = "slash";
			this.weaponAttack = 14;
			this.armorName = "platemail";
			this.armorDef = 30;
			this.bonusHP = 400;
			this.lust = 50;
			this.shieldBlock = 10;
			this.shieldName = "small wooden shield";
			this.lustVuln = 0.44;
			this.temperment = TEMPERMENT_RANDOM_GRAPPLES;
			this.level = 16;
			this.gems = rand(15) + 15;
			this.drop = new WeightedDrop().
					add(consumables.GOB_ALE,5).
					addMany(1,consumables.L_DRAFT,
							consumables.PINKDYE,
							consumables.BLUEDYE,
							consumables.ORANGDY,
							consumables.GREEN_D,
							consumables.PURPDYE);
			/*this.special1 = goblinDrugAttack;
			this.special2 = goblinTeaseAttack;
			this.special3 = warriorSpecial;*/
			checkMonster();
		}

	}

}


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

	public class Imp extends Monster
	{
		override public function defeated(hpVictory:Boolean):void
		{
			game.flags[kFLAGS.DEMONS_DEFEATED]++;
			if (hasStatusEffect(StatusEffects.KitsuneFight)) {
				game.forest.kitsuneScene.winKitsuneImpFight();
			} else {
				game.impScene.impVictory();
			}
		}

		override public function won(hpVictory:Boolean, pcCameWorms:Boolean = false):void
		{
			if (hasStatusEffect(StatusEffects.KitsuneFight)) {
				game.forest.kitsuneScene.loseKitsuneImpFight();
			} else if (pcCameWorms) {
				outputText("\n\nThe imp grins at your already corrupted state...");
				player.lust = player.maxLust();
				doNext(game.impScene.impRapesYou);
			} else {
				game.impScene.impRapesYou();
			}
		}

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

		protected function lustMagicAttack():void {
			outputText("You see " + a + short + " make sudden arcane gestures at you!\n\n");
			var lustDmg:int = player.lib / 10 + player.cor / 10 + 10;
			if (player.lust100 < 30) outputText("You feel strangely warm.  ");
			if (player.lust100 >= 30 && player.lust100 < 60) outputText("Blood rushes to your groin as a surge of arousal hits you, making your knees weak.  ");
			if (player.lust100 >= 60) outputText("Images of yourself fellating and fucking the imp assault your mind, unnaturally arousing you.  ");
			if (player.cocks.length > 0) {
				if (player.lust100 >= 60)
					outputText("You feel your " + player.multiCockDescriptLight() + " dribble pre-cum.");
				else if (player.lust100 >= 30 && player.cocks.length == 1)
					outputText("Your " + player.cockDescript(0) + " hardens, distracting you further.");
				else if (player.lust100 >= 30 && player.cocks.length > 1)
					outputText("Your " + player.multiCockDescriptLight() + " harden uncomfortably.");
				if (player.hasVagina()) outputText("  ");
			}
			if (player.lust100 >= 60 && player.hasVagina()) {
				switch (player.vaginas[0].vaginalWetness) {
					case Vagina.WETNESS_NORMAL:
						outputText("Your " + player.allVaginaDescript() + " dampen" + (player.vaginas.length > 1 ? "" : "s") + " perceptibly.");
						break;
					case Vagina.WETNESS_WET:
						outputText("Your crotch becomes sticky with girl-lust.");
						break;
					case Vagina.WETNESS_SLICK:
						outputText("Your " + player.allVaginaDescript() + " become" + (player.vaginas.length > 1 ? "" : "s") + " sloppy and wet.");
						break;
					case Vagina.WETNESS_DROOLING:
						outputText("Thick runners of girl-lube stream down the insides of your thighs.");
						break;
					case Vagina.WETNESS_SLAVERING:
						outputText("Your " + player.allVaginaDescript() + " instantly soak" + (player.vaginas.length > 1 ? "" : "s") + " your groin.");
						break;
					default: //Dry vaginas are unaffected

				}
			}
			player.takeLustDamage(lustDmg, true);
		}

		public function Imp(noInit:Boolean=false)
		{
			if (noInit) return;
			//trace("Imp Constructor!");
			this.a = "the ";
			this.short = "imp";
			this.imageName = "imp";
			this.long = "An imp is short, only a few feet tall.  An unkempt mane of shaggy black hair hangs from his head, parted by two short curved horns.  His eyes are solid black, save for tiny red irises which glow with evil intent.  His skin is bright red, and unencumbered by clothing or armor, save for a small loincloth at his belt.  His feet are covered by tiny wooden sandals, and his hands tipped with sharp claws.  A pair of tiny but functional wings occasionally flap from his back.";
			this.race = "Imp";
			// this.plural = false;
			this.createCock(rand(2) + 11, 2.5, CockTypesEnum.DEMON);
			this.balls = 2;
			this.ballSize = 1;
			createBreastRow(0);
			this.ass.analLooseness = Ass.LOOSENESS_STRETCHED;
			this.ass.analWetness = Ass.WETNESS_NORMAL;
			this.tallness = rand(24) + 25;
			this.hips.rating = Hips.RATING_BOYISH;
			this.butt.rating = Butt.RATING_TIGHT;
			this.skin.tone = "red";
			this.hair.color = "black";
			this.hair.length = 5;
			initStrTouSpeInte(20, 10, 25, 12);
			initLibSensCor(45, 45, 100);
			this.weaponName = "claws";
			this.weaponVerb="claw-slash";
			this.armorName = "leathery skin";
			this.lust = 40;
			this.temperment = TEMPERMENT_LUSTY_GRAPPLES;
			this.level = 1;
			this.gems = rand(5) + 5;
			this.drop = new WeightedDrop().
					add(consumables.SUCMILK,3).
					add(consumables.INCUBID,3).
					add(consumables.IMPFOOD, 4).
					add(shields.WOODSHL, 1);
			//this.special1 = lustMagicAttack;
			this.wings.type = Wings.IMP;
			//this.createPerk(PerkLib.Flying,0,0,0,0);
			checkMonster();
		}

	}

}