code:
		// Lookup dictionary for converting any single argument brackets into it's corresponding string
		// basically [armor] results in the "[armor]" segment of the string being replaced with the
		// results of the corresponding anonymous function, in this case: function():* {return player.armorName;}
		// tags not present in the singleArgConverters object return an error message.
		//
		//Calls are now made through kGAMECLASS rather than thisPtr. This allows the compiler to detect if/when a function is inaccessible.
		import classes.BodyParts.BaseBodyPart;
        import classes.BodyParts.LowerBody;
        import classes.GlobalFlags.kFLAGS;
		import classes.GlobalFlags.kGAMECLASS;
		import classes.Measurements;
		import classes.internals.Utils;

		public var singleArgConverters:Object =
		{
				// all the errors related to trying to parse stuff if not present are
				// already handled in the various *Descript() functions.
				// no need to duplicate them.

				// Note: all key strings MUST be ENTIRELY lowercase.

				"agility"					: function():* { return "[Agility]"; },
				"age"						: function(thisPtr:*):* { return kGAMECLASS.player.ageDesc(); },
				"allbreasts"				: function():* { return kGAMECLASS.player.allBreastsDescript(); },
				"alltits"				    : function():* { return kGAMECLASS.player.allBreastsDescript(); },
				"armor"						: function():* { return kGAMECLASS.player.armorName;},
				"armorname"					: function():* { return kGAMECLASS.player.armorName;},
				"arms"						: function():* { return kGAMECLASS.player.arms.phrase();},
				"armadj"					: function():* { return kGAMECLASS.player.arms.adj();},
				"ass"						: function():* { return kGAMECLASS.player.buttDescript();},
				"asshole"					: function():* { return kGAMECLASS.player.assholeDescript(); },
				"assholeorpussy"			: function():* { return kGAMECLASS.player.assholeOrPussy(); },
				"balls"						: function():* { return kGAMECLASS.player.ballsDescriptLight(); },
				"ballsfull"					: function():* { return kGAMECLASS.player.ballsDescript(); },
				"bed"						: function():* { return kGAMECLASS.camp.bedDesc(); },
				"bodytype"					: function():* { return kGAMECLASS.player.bodyType(); },
				"boyfriend"					: function():* { return kGAMECLASS.player.mf("boyfriend", "girlfriend"); },
				"breasts"					: function():* { return kGAMECLASS.player.breastDescript(0); },
				"lastbreasts"				: function():* { return kGAMECLASS.player.breastDescript(-1); },
				"butt"						: function():* { return kGAMECLASS.player.buttDescript();},
				"butthole"					: function():* { return kGAMECLASS.player.assholeDescript(); },
				"cabin"						: function():* { return kGAMECLASS.camp.homeDesc(); },
				"chest"						: function():* { return kGAMECLASS.player.chestDesc(); },
				"claws"						: function():* { return kGAMECLASS.player.clawsDescript(); },
				"clit"						: function():* { return kGAMECLASS.player.clitDescript(); },
				"cock"						: function():* { return kGAMECLASS.player.cockDescript(0); },
				"cocktype"					: function():* { return kGAMECLASS.player.cockMultiNoun(0); },
				"cockhead"					: function():* { return kGAMECLASS.player.cockHead(0);},
				"cocks"						: function():* { return kGAMECLASS.player.multiCockDescriptLight(); },
				"cunt"						: function():* { return kGAMECLASS.player.vaginaDescript(); },
				"dad"						: function():* { return kGAMECLASS.player.mf("dad", "mom"); },
				"daddy"						: function():* { return kGAMECLASS.player.mf("daddy", "mommy"); },
				"day"						: function():* { return kGAMECLASS.time.hours < 12 ? "morning" : (kGAMECLASS.time.hours < 19 ? "day" : "evening"); },
				"dpg"						: function():* { return "\n\n\""; },
				"eachcock"					: function():* { return kGAMECLASS.player.sMultiCockDesc(); },
				"ear"						: function():* { return kGAMECLASS.player.earDescript(false); }, //Hail Satan
				"ears"						: function():* { return kGAMECLASS.player.earDescript(); },
				"evade"						: function():* { return "[Evade]"; },
				"extraeyes"					: function():* { return kGAMECLASS.player.extraEyesDescript();},
				"extraeyesshort"			: function():* { return kGAMECLASS.player.extraEyesDescriptShort();},
				"eyes"						: function():* { return kGAMECLASS.player.eyesDescript();},
				"eyecount"					: function():* { return kGAMECLASS.player.eyes.count;},
				"face"						: function():* { return kGAMECLASS.player.faceDescript(); },
				"facelong"					: function():* { return kGAMECLASS.player.faceDesc(); },
				"father"					: function():* { return kGAMECLASS.player.mf("father", "mother"); },
				"feet"						: function():* { return kGAMECLASS.player.feet(); },
				"foot"						: function():* { return kGAMECLASS.player.foot(); },
				"fullchest"					: function():* { return kGAMECLASS.player.allChestDesc(); },
				"furcolor"					: function():* { return kGAMECLASS.player.skin.furColor; },
				"god"						: function():* { return kGAMECLASS.player.mf("god","goddess"); },
				"hair"						: function():* { return kGAMECLASS.player.hairDescript(); },
				"haircolor"					: function():* { return kGAMECLASS.player.hair.color; },
				"hairorfur"					: function():* { return kGAMECLASS.player.hairOrFur(); },
				"hairorfurcolors"			: function():* { return kGAMECLASS.player.hairOrFurColors; },
				"hairorfurcolor"			: function():* { return kGAMECLASS.player.hairOrFurColor(); },
				"hand"						: function():* { return kGAMECLASS.player.handsDescript(false); },
				"hands"						: function():* { return kGAMECLASS.player.handsDescript(true); },
				"he"						: function():* { return kGAMECLASS.player.mf("he", "she"); },
				"he2"						: function():* { return kGAMECLASS.player2.mf("he", "she"); },
				"hers"						: function():* { return kGAMECLASS.player.mf("his", "hers"); },
				"him"						: function():* { return kGAMECLASS.player.mf("him", "her"); },
				"him2"						: function():* { return kGAMECLASS.player2.mf("him", "her"); },
				"himself"					: function():* { return kGAMECLASS.player.mf("himself", "herself"); },
				"herself"					: function():* { return kGAMECLASS.player.mf("himself", "herself"); },
				"hips"						: function():* { return kGAMECLASS.player.hipDescript();},
				"his"						: function():* { return kGAMECLASS.player.mf("his", "her"); },
				"his2"						: function():* { return kGAMECLASS.player2.mf("his", "her"); },
				"horns"						: function():* { return kGAMECLASS.player.hornDescript(); },
				"inv"						: function():* { return kGAMECLASS.player.inventoryName; },
				"inventory"					: function():* { return kGAMECLASS.player.inventoryName; },
				"pouch"						: function():* { return kGAMECLASS.player.inventoryName; },
				"pack"						: function():* { return kGAMECLASS.player.inventoryName; },
				"king"						: function():* { return kGAMECLASS.player.mf("king", "queen"); },
				"leg"						: function():* { return kGAMECLASS.player.leg(); },
				"legcounttext"				: function():* { return Utils.num2Text(kGAMECLASS.player.lowerBody.legCount); },
				"legs"						: function():* { return kGAMECLASS.player.legs(); },
				"lowerbodyskin"				: function():* { return kGAMECLASS.player.lowerBody.skin(); },
				"lowergarment"				: function():* { return kGAMECLASS.player.lowerGarmentName; },
				"lord"						: function():* { return kGAMECLASS.player.mf("lord","lady"); },
				"maam"						: function():* { return kGAMECLASS.player.mf("sir", "ma'am"); },
				"ma'am"						: function():* { return kGAMECLASS.player.mf("sir", "ma'am"); },
				"madam"						: function():* { return kGAMECLASS.player.mf("sir", "madam"); },
				"magic"						: function():* {
												switch(kGAMECLASS.flags[kFLAGS.MAGIC_SWITCH]) {
													case 0:
														return "Black & White";
													case 1:
														return "Terrestrial Fire";
												}
				},
				"malespersons"				: function():* { return kGAMECLASS.player.mf("males", "persons"); },
				"man"						: function():* { return kGAMECLASS.player.mf("man", "woman"); },
				"men"						: function():* { return kGAMECLASS.player.mf("men", "women"); },
				"malefemaleherm"			: function():* { return kGAMECLASS.player.maleFemaleHerm(); },
				"master"					: function():* { return kGAMECLASS.player.mf("master","mistress"); },
				"misdirection"				: function():* { return "[Misdirection]"; },
				"mister"					: function():* { return kGAMECLASS.player.mf("mister", "miss"); },
				"multicock"					: function():* { return kGAMECLASS.player.multiCockDescriptLight(); },
				"multicockdescriptlight"	: function():* { return kGAMECLASS.player.multiCockDescriptLight(); },
				"name"						: function():* { return kGAMECLASS.player.short;},
				"neck"						: function():* { return kGAMECLASS.player.neckDescript(); },
				"neckcolor"					: function():* { return kGAMECLASS.player.neck.color;},
				"nipple"					: function():* { return kGAMECLASS.player.nippleDescript(0);},
				"nipples"					: function():* { return kGAMECLASS.player.nippleDescript(0) + "s";},
				"lastnipple"				: function():* { return kGAMECLASS.player.nippleDescript(-1);},
				"lastnipples"				: function():* { return kGAMECLASS.player.nippleDescript(-1) + "s";},
				"onecock"					: function():* { return kGAMECLASS.player.oMultiCockDesc(); },
				"paternal"					: function():* { return kGAMECLASS.player.mf("paternal", "maternal"); },
				"player"					: function():* { return kGAMECLASS.player.short;},
				"pg"						: function():* { return "\n\n";},
				"pussy"						: function():* { return kGAMECLASS.player.vaginaDescript(); },
				"race"						: function():* { return kGAMECLASS.player.race; },
				"rearbody"					: function():* { return kGAMECLASS.player.rearBodyDescript(); },
				"rearbodycolor"				: function():* { return kGAMECLASS.player.rearBody.color; },
				"sack"						: function():* { return kGAMECLASS.player.sackDescript(); },
				"sheath"					: function():* { return kGAMECLASS.player.sheathDescript(); },
				"shield"					: function():* { return kGAMECLASS.player.shieldName; },
				"sir"						: function():* { return kGAMECLASS.player.mf("sir", "ma'am"); },
				"skin"						: function():* { return kGAMECLASS.player.skinDescript(); },
				"skin.noadj"				: function():* { return kGAMECLASS.player.skinDescript(true); },
				"skinis"					: function():* { return kGAMECLASS.player.hasScales() ? "are" : "is"; },
				"skindesc"					: function():* { return kGAMECLASS.player.skin.desc; },
				"skinfurscales"				: function():* { return kGAMECLASS.player.skinFurScales(); },
				"skinshort"					: function():* { return kGAMECLASS.player.skinDescript(true, true); },
				"skintone"					: function():* { return kGAMECLASS.player.skin.tone; },
				"son"						: function():* { return kGAMECLASS.player.mf("son", "daughter"); },
				"sun"						: function():* { return kGAMECLASS.time.hours < 21 ? "sun" : "moon"; },
				"tallness"					: function():* { return Measurements.footInchOrMetres(kGAMECLASS.player.tallness); },
				"tits"						: function():* { return kGAMECLASS.player.breastDescript(0); },
				"lasttits"					: function():* { return kGAMECLASS.player.breastDescript(-1); },
				"breastcup"					: function():* { return kGAMECLASS.player.breastCup(0); },
				"lastbreastcup"				: function():* { return kGAMECLASS.player.breastCup(-1); },
				"tongue"					: function():* { return kGAMECLASS.player.tongueDescript(); },
				"underbody.skinfurscales"	: function():* { return kGAMECLASS.player.underBody.skinFurScales(); },
				"underbody.skintone"		: function():* { return kGAMECLASS.player.underBody.skin.tone; },
				"underbody.furcolor"		: function():* { return kGAMECLASS.player.underBody.skin.furColor; },
				"uppergarment"				: function():* { return kGAMECLASS.player.upperGarmentName; },
				"vag"						: function():* { return kGAMECLASS.player.vaginaDescript(); },
				"vagina"					: function():* { return kGAMECLASS.player.vaginaDescript(); },
				"vagorass"					: function():* { return (kGAMECLASS.player.hasVagina() ? kGAMECLASS.player.vaginaDescript() : kGAMECLASS.player.assholeDescript()); },
				"weapon"					: function():* { return kGAMECLASS.player.weaponName;},
				"weaponname"				: function():* { return kGAMECLASS.player.weaponName; },
				"cockplural"				: function():* { return (kGAMECLASS.player.cocks.length == 1) ? "cock" : "cocks"; },
				"dickplural"				: function():* { return (kGAMECLASS.player.cocks.length == 1) ? "dick" : "dicks"; },
				"headplural"				: function():* { return (kGAMECLASS.player.cocks.length == 1) ? "head" : "heads"; },
				"prickplural"				: function():* { return (kGAMECLASS.player.cocks.length == 1) ? "prick" : "pricks"; },
				"boy"						: function():* { return kGAMECLASS.player.mf("boy", "girl"); },
				"guy"						: function():* { return kGAMECLASS.player.mf("guy", "girl"); },
				"wet"						: function():* { return kGAMECLASS.player.wetnessDescript(0); },
				"wings"						: function():* { return kGAMECLASS.player.wingsDescript(); },
				"wingcolor"					: function():* { return kGAMECLASS.player.wings.color; },
				"wingcolor2"				: function():* { return kGAMECLASS.player.wings.color2; },
				"wingcolordesc"				: function():* { return kGAMECLASS.player.wings.getColorDesc(BaseBodyPart.COLOR_ID_MAIN); },
				"wingcolor2desc"			: function():* { return kGAMECLASS.player.wings.getColorDesc(BaseBodyPart.COLOR_ID_2ND); },
				"genitalis"                 : function(thisPtr:*):* {
												if (kGAMECLASS.player.gender == 0) return "anus is";
												if (kGAMECLASS.player.gender == 1) return kGAMECLASS.player.cockTotal() > 1 ? "cocks are" : "cock is";
												if (kGAMECLASS.player.gender == 2) return "pussy is";
												if (kGAMECLASS.player.gender == 3) return "cock and pussy are"; },
				"genitalsdetail"            : function(thisPtr:*):* {
												if (kGAMECLASS.player.gender == 0) return kGAMECLASS.player.assholeDescript();
												if (kGAMECLASS.player.gender == 1) return kGAMECLASS.player.cockTotal() > 1 ? kGAMECLASS.player.multiCockDescriptLight(): kGAMECLASS.player.cockDescript();
												if (kGAMECLASS.player.gender == 2) return kGAMECLASS.player.vaginaDescript();
												if (kGAMECLASS.player.gender == 3) return kGAMECLASS.player.cockDescript()+ " and " + kGAMECLASS.player.vaginaDescript(); },
				"genitals"                  : function(thisPtr:*):* {
												if (kGAMECLASS.player.gender == 0) return "anus";
												if (kGAMECLASS.player.gender == 1) return kGAMECLASS.player.cockTotal() > 1 ? "cocks" : "cock";
												if (kGAMECLASS.player.gender == 2) return "pussy";
												if (kGAMECLASS.player.gender == 3) return "cock and pussy"; },
				"genitaley"					: function(thisPtr:*):* {
												if (kGAMECLASS.player.gender == 0) return "it";
												if (kGAMECLASS.player.gender == 1) return kGAMECLASS.player.cockTotal() > 1 ? "they" : "it";
												if (kGAMECLASS.player.gender == 2) return "it";
												if (kGAMECLASS.player.gender == 3) return "they"; },
				"genitalem"					: function(thisPtr:*):* {
												if (kGAMECLASS.player.gender == 0) return "it";
												if (kGAMECLASS.player.gender == 1) return kGAMECLASS.player.cockTotal() > 1 ? "them" : "it";
												if (kGAMECLASS.player.gender == 2) return "it";
												if (kGAMECLASS.player.gender == 3) return "them"; },
				"cockhas"					: function(thisPtr:*):* { return kGAMECLASS.player.cockTotal() > 1 ? "cocks have" : "cock has"; },
				"cockey"					: function(thisPtr:*):* { return kGAMECLASS.player.cockTotal() > 1 ? "it" : "they"; },
				"cockem"					: function(thisPtr:*):* { return kGAMECLASS.player.cockTotal() > 1 ? "it" : "them"; },
				"cockeir"					: function(thisPtr:*):* { return kGAMECLASS.player.cockTotal() > 1 ? "its" : "their"; },
				"tail"						: function():* { return kGAMECLASS.player.tailDescript(); },
				"onetail"					: function():* { return kGAMECLASS.player.oneTailDescript(); },
				"walk"                      : function():* {
												if (kGAMECLASS.player.isNaga()) return "slither";
												if (kGAMECLASS.player.isCentaur()) return "trot";
												if (kGAMECLASS.player.isGoo()) return "slide";
												if (kGAMECLASS.player.isDrider()) return "skitter";
												if (kGAMECLASS.player.isHoppy()) return "hop";
												return "walk" },
				"walking"                   : function():* {
												if (kGAMECLASS.player.isNaga()) return "slithering";
												if (kGAMECLASS.player.isCentaur()) return "trotting";
												if (kGAMECLASS.player.isGoo()) return "sliding";
												if (kGAMECLASS.player.isDrider()) return "skittering";
												if (kGAMECLASS.player.isHoppy()) return "hopping";
												return "walking" },
				//Monster strings
				"monster.short"				: function():* { return kGAMECLASS.monster.short; },
				"monster.a"					: function():* { return kGAMECLASS.monster.a; },
				"monster.capitala"			: function():* { return kGAMECLASS.monster.capitalA; },
				"themonster"				: function():* { return kGAMECLASS.monster.a + kGAMECLASS.monster.short; },
				"monster.pronoun1"			: function():* { return kGAMECLASS.monster.pronoun1; }, // he/she/they
				"monster.pronoun1caps"		: function():* { return kGAMECLASS.monster.Pronoun1; },
				"monster.pronoun2"			: function():* { return kGAMECLASS.monster.pronoun2; }, // him/her/them
				"monster.pronoun2caps"		: function():* { return kGAMECLASS.monster.Pronoun2; },
				"monster.pronoun3"			: function():* { return kGAMECLASS.monster.pronoun3; }, // his/her/their
				"monster.pronoun3caps"		: function():* { return kGAMECLASS.monster.Pronoun3; },
				"monster.hair"				: function():* { return kGAMECLASS.monster.hair.color; },
				"monster.skin"				: function():* { return kGAMECLASS.monster.skin.tone; },
				//Prisoner
				"captortitle"				: function():* { return kGAMECLASS.prison.prisonCaptor.captorTitle; },
				"captorname"				: function():* { return kGAMECLASS.prison.prisonCaptor.captorName; },
				"captorhe"					: function():* { return kGAMECLASS.prison.prisonCaptor.captorPronoun1; },
				"captorhim"					: function():* { return kGAMECLASS.prison.prisonCaptor.captorPronoun2; },
				"captorhis"					: function():* { return kGAMECLASS.prison.prisonCaptor.captorPronoun3; },
				//NPC tags
				"garg"                      : function(thisPtr:*):* { return kGAMECLASS.flags[kFLAGS.GAR_NAME]; },
				"akky"                      : function(thisPtr:*):* { return kGAMECLASS.flags[kFLAGS.AKKY_NAME]; },
				"latexyname"				: function():* { return kGAMECLASS.flags[kFLAGS.GOO_NAME]; },
				"bathgirlname"				: function():* { return kGAMECLASS.flags[kFLAGS.MILK_NAME]; },
				"dullhorse"				    : function():* { return kGAMECLASS.flags[kFLAGS.DULLAHAN_HORSE_NAME] == 1 ? "Lenore" : "her horse" },
				"aliceeyes"					: function():* { return kGAMECLASS.forest.aliceScene.eyeColor; },
				"alicepanties"				: function():* { return kGAMECLASS.forest.aliceScene.panties; },
				"alicepantieslong"			: function():* { return kGAMECLASS.forest.aliceScene.pantiesLong; },
				"tellyvisual"				: function():* { return kGAMECLASS.bazaar.telly.tellyScope; },
				"helspawn"                  : function():* { return kGAMECLASS.flags[kFLAGS.HELSPAWN_NAME]; },
				"ceraphbus"                 : function():* { return kGAMECLASS.ceraphFollowerScene.ceraphBus(); },
				"ringname"					: function():* { return kGAMECLASS.demonfistScene.saveContent.playerName; }
		}


code:
package classes
{
	public class Perk
	{
		//constructor
		public function Perk(perk:PerkType,value1:Number=0,value2:Number=0,value3:Number=0,value4:Number=0)
		{
			_ptype = perk;
			this.value1 = value1;
			this.value2 = value2;
			this.value3 = value3;
			this.value4 = value4;
		}
		//data
		private var _ptype:PerkType;
		public var value1:Number;
		public var value2:Number;
		public var value3:Number;
		public var value4:Number;
		//MEMBER FUNCTIONS

		public function get ptype():PerkType
		{
			return _ptype;
		}

		public function get perkName():String
		{
			return _ptype.name;
		}

		public function get perkDesc():String
		{
			return _ptype.desc(this);
		}

		public function get perkLongDesc():String
		{
			return _ptype.longDesc;
		}

	}
}

license: unknown


code:
/**
 * Created by aimozg on 26.01.14.
 */
package classes
{
	import classes.Perks.*;
	import classes.GlobalFlags.*;
import classes.Scenes.Places.TelAdre.UmasShop;

public class PerkLib
	{

		// UNSORTED perks TODO these are mostly incorrect perks: tested but never created
		public static const Buttslut:PerkType = mk("Buttslut", "Buttslut",
				"");
		public static const Focused:PerkType = mk("Focused", "Focused",
				"");
/* Never used, removed because it used a numbered event. Could be re-implemented differently if some new monster actually uses it
		public static const LastStrike:PerkType = mk("Last Strike", "Last Strike",
				"");
		public static const AnalFertility:PerkType = mk("Anal Fertility", "Anal Fertility", //Not implemented
				"Unlocks the ability to get anally pregnant other than Satyrs.");

*/
		// Player creation perks
		public static const Fast:PerkType = mk("Fast", "Fast",
				"Gains speed faster.", null, true);
		public static const Lusty:PerkType = mk("Lusty", "Lusty",
				"Gains lust 25% faster.", null, true);
		public static const Pervert:PerkType = mk("Pervert", "Pervert",
				"Gains corruption 25% faster. Reduces corruption requirement for high-corruption variant of scenes.", null, true);
		public static const Sensitive:PerkType = mk("Sensitive", "Sensitive",
				"Gains sensitivity 25% faster.", null, true);
		public static const Smart:PerkType = mk("Smart", "Smart",
				"Gains intelligence faster.", null, true);
		public static const Strong:PerkType = mk("Strong", "Strong",
				"Gains strength faster.", null, true);
		public static const Tough:PerkType = mk("Tough", "Tough",
				"Gains toughness faster.", null, true);
		// Female creation perks
		public static const BigClit:PerkType = mk("Big Clit", "Big Clit",
				"Allows your clit to grow larger more easily and faster.", null, true);
		public static const BigTits:PerkType = mk("Big Tits", "Big Tits",
				"Makes your tits grow larger more easily.", null, true);
		public static const Fertile:PerkType = mk("Fertile", "Fertile",
				"Makes you 15% more likely to become pregnant.", null, true);
		public static const WetPussy:PerkType = mk("Wet Pussy", "Wet Pussy",
				"Keeps your pussy wet and provides a bonus to capacity.", null, true);
		// Male creation perks
		public static const BigCock:PerkType = mk("Big Cock", "Big Cock",
				"Gains cock size 25% faster and with less limitations.", null, true);
		public static const MessyOrgasms:PerkType = mk("Messy Orgasms", "Messy Orgasms",
				"Produces 50% more cum volume.", null, true);

		// Ascension perks
		public static const AscensionDesires:AscensionDesiresPerk = new AscensionDesiresPerk();
		public static const AscensionEndurance:AscensionEndurancePerk = new AscensionEndurancePerk();
		public static const AscensionFertility:AscensionFertilityPerk = new AscensionFertilityPerk();
		public static const AscensionFortune:AscensionFortunePerk = new AscensionFortunePerk();
		public static const AscensionMoralShifter:AscensionMoralShifterPerk = new AscensionMoralShifterPerk();
		public static const AscensionMysticality:AscensionMysticalityPerk = new AscensionMysticalityPerk();
		public static const AscensionTolerance:AscensionTolerancePerk = new AscensionTolerancePerk();
		public static const AscensionVirility:AscensionVirilityPerk = new AscensionVirilityPerk();
		public static const AscensionWisdom:AscensionWisdomPerk = new AscensionWisdomPerk();
		public static const AscensionMartiality:AscensionMartialityPerk = new AscensionMartialityPerk();
	    public static const AscensionSeduction:AscensionSeductionPerk = new AscensionSeductionPerk();
		// History perks
		public static const HistoryAlchemist:PerkType = mk("History: Alchemist", "History: Alchemist",
				"Alchemical experience makes items more reactive to your body.", null, true);
		public static const HistoryFighter:PerkType = mk("History: Fighter", "History: Fighter",
				"A Past full of conflict increases physical damage dealt by 10%.", null, true).boostsPhysDamage(1.1,true);
		public static const HistoryFortune:PerkType = mk("History: Fortune", "History: Fortune",
				"Your luck and skills at gathering currency allows you to get 15% more gems from victories.", null, true);
		public static const HistoryHealer:PerkType = mk("History: Healer", "History: Healer",
				"Healing experience increases HP gains by 20%.", null, true);
		public static const HistoryReligious:PerkType = mk("History: Religious", "History: Religious",
				"Replaces masturbate with meditate when corruption less than or equal to 66. Reduces minimum libido slightly.", null, true);
		public static const HistoryScholar:PerkType = mk("History: Scholar", "History: Scholar",
				"Time spent focusing your mind makes spellcasting 20% less fatiguing.", null, true).boostsSpellCost(0.8,true);
		public static const HistorySlacker:PerkType = mk("History: Slacker", "History: Slacker",
				"Regenerate fatigue 20% faster.", null, true);
		public static const HistorySlut:PerkType = mk("History: Slut", "History: Slut",
				"Sexual experience has made you more able to handle large insertions and more resistant to stretching.", null, true);
		public static const HistorySmith:PerkType = mk("History: Smith", "History: Smith",
				"Knowledge of armor and fitting increases armor effectiveness by roughly 10%.", null, true);
		public static const HistoryWhore:PerkType = mk("History: Whore", "History: Whore",
				"Seductive experience causes your tease attacks to be 15% more effective.", null, true);
		//Elder history perks
		public static const HistoryAlchemist2:PerkType = mk("History: Master Alchemist", "History: Master Alchemist",
				"Alchemical experience makes items more reactive to your body.", null, true);
		public static const HistoryFighter2:PerkType = mk("History: Guard", "History: Guard",
				"A past full of conflict increases physical damage dealt by 20%.", null, true).boostsPhysDamage(1.1,true);
		public static const HistoryFortune2:PerkType = mk("History: Gambler", "History: Gambler",
				"Your luck and skills at gathering currency allows you to get 15% more gems from victories.", null, true);
		public static const HistoryHealer2:PerkType = mk("History: Master Healer", "History: Master Healer",
				"Healing experience increases HP gains by 20%.", null, true);
		public static const HistoryReligious2:PerkType = mk("History: Monk", "History: Monk",
				"Replaces masturbate with meditate when corruption less than or equal to 66. Reduces minimum libido slightly.", null, true);
		public static const HistoryScholar2:PerkType = mk("History: Teacher", "History: Teacher",
				"Time spent focusing your mind makes spellcasting 20% less fatiguing.", null, true).boostsSpellCost(0.8,true);
		public static const HistoryThief2:PerkType = mk("History: Thief", "History: Thief",
				"Your theft skills give you a greater chance of finding valuable items.", null, true);
		public static const HistorySlut2:PerkType = mk("History: Libertine", "History: Libertine",
				"Sexual experience has made you more able to handle large insertions and more resistant to stretching.", null, true);
		public static const HistorySmith2:PerkType = mk("History: Master Smith", "History: Master Smith",
				"Knowledge of smithing and equipment maintenance increases armor effectiveness by roughly 10%.", null, true);
		public static const HistoryWhore2:PerkType = mk("History: Brothel Owner", "History: Brothel Owner",
				"Seductive experience causes your tease attacks to be 15% more effective.", null, true);
		public static const HistoryDEUSVULT:HistoryDEUSVULTPerk = new HistoryDEUSVULTPerk();

		// Ordinary (levelup) perks
		public static const Acclimation:PerkType = mk("Acclimation", "Acclimation",
				"Reduces lust gain by 15%.",
				"You choose the 'Acclimation' perk, making your body 15% more resistant to lust, up to a maximum of 75%.").boostsLustResistance(15);
		public static const Agility:PerkType = mk("Agility", "Agility",
				"Boosts armor points by a portion of your speed on light/medium armors.",
				"You choose the 'Agility' perk, increasing the effectiveness of Light/Medium armors by a portion of your speed.");
		// Not sure if this should be repurposed or removed.
		public static const AncestralArchery:PerkType = mk("Ancestral Archery", "Ancestral Archery",
				"Allows your skill with bows to exceed normal limits.",
				"You choose the 'Ancestral Archery' perk, allowing a higher maximum value for the bow skill.");
		public static const Archmage:PerkType = mk("Archmage", "Archmage",
				"[if (player.inte>=75)" +
						"Increases base spell strength by 50%." +
						"|" +
						"You are too dumb to gain benefit from this perk." +
						"]",
				"You choose the 'Archmage' perk, increasing base spell strength by 50%.").boostsSpellMod(50);
		public static const ArousingAura:PerkType = mk("Arousing Aura", "Arousing Aura",
				"Exude a lust-inducing aura (Req's corruption of 70 or more)",
				"You choose the 'Arousing Aura' perk, causing you to radiate an aura of lust when your corruption is over 70.");
		public static const Awareness:PerkType = mk("Awareness", "Awareness", "Get additional information about your enemy in combat.", "You choose the 'Awareness' perk, allowing you to see the Armor and Corruption values of an opponent.");
		public static const Battlemage:PerkType = mk("Battlemage", "Battlemage",
				"Start every battle with Might enabled, if you meet Black Magic requirements before it starts.",
				"You choose the 'Battlemage' perk. You start every battle with Might effect, as long as you meet Black Magic requirements to cast it before battle.");
		public static const Berzerker:PerkType = mk("Berzerker", "Berserker",
				"[if (player.str>=75)" +
						"Grants 'Berserk' ability." +
						"|" +
						"You aren't strong enough to benefit from this anymore." +
						"]",
				"You choose the 'Berserker' perk, which unlocks the 'Berserk' magical ability.  Berserking increases attack and lust resistance but reduces physical defenses.");
		public static const Blademaster:PerkType = new BlademasterPerk();
		public static const Brawler:PerkType = mk("Brawler", "Brawler",
				"Brawling experience allows you to make two unarmed attacks in a turn.",
				"You choose the 'Brawler' perk, allowing you to make two unarmed attacks in a turn!");
		public static const BrutalBlows:PerkType = mk("Brutal Blows", "Brutal Blows",
				"[if (player.str>=75)" +
						"Reduces enemy armor with each hit." +
						"|" +
						"You aren't strong enough to benefit from this anymore." +
						"]",
				"You choose the 'Brutal Blows' perk, which reduces enemy armor with each hit.");
		public static const Channeling:PerkType = mk("Channeling", "Channeling",
				"Increases base spell strength by 50%.",
				"You choose the 'Channeling' perk, boosting the strength of your spellcasting!").boostsSpellMod(50);
		public static const ColdBlooded:PerkType = mk("Cold Blooded", "Cold Blooded",
				"Reduces minimum lust by up to 20, down to min of 20. Caps min lust at 20 below max.",
				"You choose the 'Cold Blooded' perk.  Thanks to increased control over your desires, your minimum lust is reduced! (Caps minimum lust at 20 below max. Won't reduce minimum lust below 20 though.)");
		public static const ColdFury:PerkType = mk("Cold Fury", "Cold Fury",
				"Berserking halves your defense instead of reducing it to zero.",
				"You choose the 'Cold Fury' perk, causing Berserking to only reduce your armor by half instead of completely reducing it to zero.");
		public static const CorruptedLibido:PerkType = mk("Corrupted Libido", "Corrupted Libido",
				"Reduces lust gain by 10%.",
				"You choose the 'Corrupted Libido' perk.  As a result of your body's corruption, you've become a bit harder to turn on. (Lust gain reduced by 10%!)").boostsLustResistance(10);
        public static const DemonBiology:PerkType = new DemonBiologyBerk();
		public static const DoubleAttack:PerkType = mk("Double Attack", "Double Attack",
				"[if (player.spe<50)" +
						"You're too slow to double attack!" +
						"|[if (player.str<61)" +
						"Allows you to perform two melee attacks per round." +
						"|" +
						"You are stronger than double attack allows.  To choose between reduced strength double-attacks and a single strong attack, access \"Dbl Options\" in the perks menu." +
						"]]",
				"You choose the 'Double Attack' perk.  This allows you to make two attacks so long as your strength is at 60 or below.  By default your effective strength will be reduced to 60 if it is too high when double attacking.  You can enter the perks menu at any time to toggle options as to how you will use this perk.");
		public static const EagleEye:PerkType = mk("Eagle Eye", "Eagle Eye",
				"Careful planning behind each shot reduces the chance of missing bow shots.",
				"You choose the 'Eagle Eye' perk, increasing chance to hit when firing a bow.");
		public static const Evade:EvadePerk = new EvadePerk();
		public static const FanShot:PerkType = mk("Fan Shot", "Fan Shot",
				"Allows you to fire arrows to hit all enemies in combat at once, for great fatigue cost.",
				"You choose the 'Fan Shot' perk, granting the Fan Shot combat ability.");
		public static const FertilityMinus:PerkType = mk("Fertility-", "Fertility-",
				"Decreases fertility rating by 15 and cum volume by up to 30%. (Req's libido of less than 25.)",
				"You choose the 'Fertility-' perk, making it harder to get pregnant.  It also decreases your cum volume by up to 30% (if appropriate)!");
		public static const FertilityPlus:PerkType = mk("Fertility+", "Fertility+",
				"Increases fertility rating by 15 and cum volume by up to 50%.",
				"You choose the 'Fertility+' perk, making it easier to get pregnant.  It also increases your cum volume by up to 50% (if appropriate)!");
		public static const FocusedMind:PerkType = mk("Focused Mind", "Focused Mind",
				"Black Magic is less likely to backfire and White Magic threshold is increased.",
				"You choose the 'Focused Mind' perk. Black Magic is less likely to backfire and White Magic threshold is increased.");
		public static const Frustration:PerkType = new FrustrationPerk();
		public static const HoldWithBothHands:PerkType = new HoldWithBothHandsPerk();
		public static const HotBlooded:PerkType = mk("Hot Blooded", "Hot Blooded",
				"Raises minimum lust by up to 20.",
				"You choose the 'Hot Blooded' perk.  As a result of your enhanced libido, your lust no longer drops below 20! (If you already have some minimum lust, it will be increased by 10)").boostsMinLust(20);
		public static const ImmovableObject:PerkType = mk("Immovable Object", "Immovable Object",
				"[if (player.tou>=75)" +
						"Grants 10% physical damage reduction." +
						"|" +
						"You aren't tough enough to benefit from this anymore." +
						"]",
				"You choose the 'Immovable Object' perk, granting 10% physical damage reduction.");
		public static const ImprovedEndurance:PerkType = mk("Improved Endurance", "Improved Endurance",
				"Increases maximum fatigue by 20.",
				"You choose the 'Improved Endurance' perk. Thanks to your physical conditioning, your maximum fatigue has been increased by 20!");
		public static const ImprovedEndurance2:PerkType = mk("Improved Endurance 2", "Improved Endurance 2",
				"Increases maximum fatigue by 10.",
				"You choose the 'Improved Endurance 2' perk. Thanks to your improved physical conditioning, your maximum fatigue has been further increased by 10!");
		public static const ImprovedEndurance3:PerkType = mk("Improved Endurance 3", "Improved Endurance 3",
				"Increases maximum fatigue by 10.",
				"You choose the 'Improved Endurance 2' perk. Thanks to your superior physical conditioning, your maximum fatigue has bee further increased by 10!");
		public static const ImprovedSelfControl:PerkType = mk("Improved Self-Control", "Improved Self-Control",
				"Increases maximum lust by 20.",
				"You choose the 'Improved Self-Control' perk. Thanks to your mental conditioning, your maximum lust has been increased by 20!");
		public static const ImprovedSelfControl2:PerkType = mk("Improved Self-Control 2", "Improved Self-Control 2",
				"Increases maximum lust by 10.",
				"You choose the 'Improved Self-Control 2' perk. Thanks to your improved mental conditioning, your maximum lust has been further increased by 10!");
		public static const ImprovedSelfControl3:PerkType = mk("Improved Self-Control 3", "Improved Self-Control 3",
				"Increases maximum lust by 10.",
				"You choose the 'Improved Self-Control 2' perk. Thanks to your superior mental conditioning, your maximum lust has been further increased by 10!");
		//Move to their own classes and use statboost system
 		public static const ImprovedVision:PerkType = mk("Improved Vision", "Improved Vision",
				"Improves your vision allowing you to see openings most wouldn't (+3% Crit)",
				"You've chosen the 'Improved Vision' perk, which raises your critical strike chance by 3%.");
		public static const ImprovedVision2:PerkType = mk("Improved Vision 2", "Improved Vision 2",
				"Improves your vision allowing you to see openings most wouldn't (+7% Crit)",
				"You've chosen the 'Improved Vision 2' perk, which raises your critical strike chance by 7%.");
		public static const ImprovedVision3:PerkType = mk("Improved Vision 3", "Improved Vision 3",
				"Improves your vision allowing you to see openings most wouldn't (+10% Crit)",
				"You've chosen the 'Improved Vision 3' perk, which raises your critical strike chance by 10%.");
		public static const Indefatigable:PerkType = mk("Indefatigable", "Indefatigable",
				"Can no longer lose by lust. Can still submit manually at maximum lust via Fantasize.",
				"You choose the 'Indefatigable' perk. Thanks to your sheer willpower, you can no longer lose when your lust reaches maximum. (Choosing Fantasize at maximum lust still allows you to submit.)")
		public static const IronFists:PerkType = mk("Iron Fists", "Iron Fists",
				"Hardens your fists to increase attack rating by 5.",
				"You choose the 'Iron Fists' perk, hardening your fists. This increases attack power by 5.");
		public static const IronFists2:PerkType = mk("Iron Fists 2", "Iron Fists 2",
				"Further hardens your fists to increase attack rating by another 3.",
				"You choose the 'Iron Fists 2' perk, further hardening your fists. This increases attack power by another 3.");
		public static const IronFists3:PerkType = mk("Iron Fists 3", "Iron Fists 3",
				"Hardens your fists even more to increase attack rating again by 3.",
				"You choose the 'Iron Fists 3' perk, even further hardening your fists. This increases attack power again by 3.");
		public static const IronMan:PerkType = mk("Iron Man", "Iron Man",
				"Reduces the fatigue cost of physical specials by 50%.",
				"You choose the 'Iron Man' perk, reducing the fatigue cost of physical special attacks by 50%");
		public static const Juggernaut:PerkType = mk("Juggernaut", "Juggernaut",
				"When wearing heavy armor, you have extra 10 armor points and are immune to damage from being constricted/squeezed.",
				"You choose the 'Juggernaut' perk, granting extra 10 armor points when wearing heavy armor and immunity to damage from been constricted/squeezed.");
		public static const LightningStrikes:PerkType = new LightningStrikesPerk();
		public static const LungingAttacks:PerkType = mk("Lunging Attacks", "Lunging Attacks",
				"[if (player.spe>=75)" +
						"Grants 25% armor penetration for standard attacks." +
						"|" +
						"You are too slow to benefit from this perk." +
						"]",
				"You choose the 'Lunging Attacks' perk, granting 25% armor penetration for standard attacks.");
		public static const Mage:PerkType = mk("Mage", "Mage",
				"Increases base spell strength by 50%.",
				"You choose the 'Mage' perk.  You are able to focus your magical abilities even more keenly, boosting your base spell effects by 50%.").boostsSpellMod(50);
		public static const Masochist:PerkType = mk("Masochist", "Masochist",
				"Take 20% less physical damage but gain lust when you take damage.",
				"You choose the 'Masochist' perk, reducing the damage you take but raising your lust each time!  This perk only functions while your libido is at or above 60!");
		public static const Medicine:PerkType = mk("Medicine", "Medicine",
				"Grants 15% chance per round of cleansing poisons/drugs from your body. Increases HP restoration on rest.",
				"You choose the 'Medicine' perk, giving you a chance to remove debilitating poisons automatically! Also, increases HP restoration on rest.");
		public static const NoBaggage:PerkType = mk("No Baggage", "No Baggage",
				"If wearing light/medium armor, no weapon, and no shield, bow attacks become much more powerful.",
				"You choose the 'No Baggage' perk, greatly increasing bow attack damage while unencumbered.");
		public static const Nymphomania:PerkType = mk("Nymphomania", "Nymphomania",
				"Raises minimum lust by up to 30.",
				"You've chosen the 'Nymphomania' perk.  Due to the incredible amount of corruption you've been exposed to, you've begun to live in a state of minor constant arousal.  Your minimum" +
				" lust will be increased by as much as 30 (If you already have minimum lust, the increase is 10-15).").boostsMinLust(30);
		public static const Opportunist:PerkType = mk("Opportunist", "Opportunist", "Don't turn your back to your opponent! When an enemy attempts to distance himself, get a free attack of opportunity.","You choose the 'Opportunist' perk, giving you a free attack against any enemy that attempts to distance himself from you.");
		public static const Parry:PerkType = mk("Parry", "Parry",
				"[if (player.spe>=50)" +
						"Increases deflect chance by up to 10% while wielding a weapon. (Speed-based)." +
						"|" +
						"You are not durable enough to gain benefit from this perk." +
						"]",
				"You choose the 'Parry' perk, giving you a chance to deflect blow with your weapon. (Speed-based).");
		public static const PracticedForm:PerkType = mk("Practiced Form", "Practiced Form",
				"Long hours spent practicing your form have resulted in your bow based combat abilities requiring 5 less fatigue.",
				"You choose the 'Practiced Form' perk, reducing fatigue cost when firing a bow.");
		public static const Precision:PerkType = mk("Precision", "Precision",
				"Reduces enemy armor by 10. (Req's 25+ Intelligence)",
				"You've chosen the 'Precision' perk.  Thanks to your intelligence, you're now more adept at finding and striking an enemy's weak points, reducing their damage resistance from armor by 10.  If your intelligence ever drops below 25 you'll no longer be smart enough to benefit from this perk.");
		public static const RagingInferno:PerkType = mk("Raging Inferno", "Raging Inferno",
				"Cumulative 20% damage increase for every subsequent fire spell without interruption.",
				"You choose the 'Raging Inferno' perk. Cumulative 20% damage increase for every subsequent fire spell without interruption.");
		public static const Regeneration:RegenerationPerk = new RegenerationPerk();
		public static const Regeneration2:Regeneration2Perk = new Regeneration2Perk();
		public static const Resistance:PerkType = mk("Resistance", "Resistance",
				"Reduces lust gain by 10%.",
				"You choose the 'Resistance' perk, reducing the rate at which your lust increases by 10%.").boostsLustResistance(10);
		public static const Resolute:PerkType = mk("Resolute", "Resolute",
				"[if (player.tou>=75)" +
						"Grants immunity to stuns and some statuses." +
						"|" +
						"You aren't tough enough to benefit from this anymore." +
						"]",
				"You choose the 'Resolute' perk, granting immunity to stuns and some statuses.");
		public static const Runner:PerkType = mk("Runner", "Runner",
				"Increases chances of escaping combat.",
				"You choose the 'Runner' perk, increasing your chances to escape from your foes when fleeing!");
		public static const Sadist:PerkType = mk("Sadist", "Sadist",
				"Deal 20% more damage, but gain lust at the same time.",
				"You choose the 'Sadist' perk, increasing damage by 20 percent but causing you to gain lust from dealing damage.").boostsGlobalDamage(1.2,true);
		public static const Seduction:PerkType = mk("Seduction", "Seduction",
				"Upgrades your tease attack, making it more effective.",
				"You choose the 'Seduction' perk, upgrading the 'tease' attack with a more powerful damage and a higher chance of success.").boostsSeduction(10).boostsSexiness(5);
        public static const SeverTendons:PerkType = mk("Sever Tendons", "Sever Tendons",
                "Adds a chance for every attack to reduce your target's strength and speed.",
                "You choose the 'Sever Tendons' perk, adding a chance for every attack to reduce your target's strength and speed permanently.");
		public static const ShieldMastery:PerkType = mk("Shield Mastery", "Shield Mastery",
				"[if (player.tou>=50)" +
						"Increases block chance by up to 10% while using a shield (Toughness-based)." +
						"|" +
						"You are not durable enough to gain benefit from this perk." +
						"]",
				"You choose the 'Shield Mastery' perk, increasing block chance by up to 10% as long as you're wielding a shield (Toughness-based).");
		public static const ShieldSlam:PerkType = mk("Shield Slam", "Shield Slam",
				"Reduces shield bash diminishing returns by 50% and increases bash damage by 20%.",
				"You choose the 'Shield Slam' perk.  Stun diminishing returns is reduced by 50% and shield bash damage is increased by 20%.");
		public static const SpeedyRecovery:PerkType = mk("Speedy Recovery", "Speedy Recovery",
				"Regain fatigue 50% faster.",
				"You choose the 'Speedy Recovery' perk, boosting your fatigue recovery rate!");
		public static const Spellpower:PerkType = mk("Spellpower", "Spellpower",
				"Increases base spell strength by 50%.",
				"You choose the 'Spellpower' perk.  Thanks to your sizeable intellect and willpower, you are able to more effectively use magic, boosting base spell effects by 50%.").boostsSpellMod(50);
		public static const Spellsword:PerkType = new SpellswordPerk();
		public static const Survivalist:PerkType = mk("Survivalist", "Survivalist",
				"Slows hunger rate by 20%.",
				"You choose the 'Survivalist' perk.  With this perk, your hunger rate is reduced by 20%.");
		public static const Survivalist2:PerkType = mk("Survivalist 2", "Survivalist 2",
				"Slows hunger rate by 20%.",
				"You choose the 'Survivalist 2' perk.  With this perk, your hunger rate is reduced by another 20%.");
		public static const StaffChanneling:PerkType = mk("Staff Channeling", "Staff Channeling",
				"Basic attack with wizard's staff is replaced with ranged magic bolt.",
				"You choose the 'Staff Channeling' perk. Basic attack with wizard's staff is replaced with ranged magic bolt.");
		public static const StrongBack:PerkType = mk("Strong Back", "Strong Back",
				"Enables additional inventory slot.",
				"You choose the 'Strong Back' perk, enabling an additional inventory slot.");
		public static const StrongBack2:PerkType = mk("Strong Back 2: Strong Harder", "Strong Back 2: Strong Harder",
				"Enables additional inventory slot.",
				"You choose the 'Strong Back 2: Strong Harder' perk, enabling an additional inventory slot.");
		public static const StrongDraw:PerkType = mk("Strong Draw", "Strong Draw",
				"While shooting a bow, increases damage by a portion of your strength.",
				"You choose the 'Strong Draw' perk, granting increased damage when firing a bow.");
		public static const Tactician:PerkType = new TacticianPerk();
		public static const Tank:PerkType = mk("Tank", "Tank",
				"Raises max HP by 50.",
				"You choose the 'Tank' perk, giving you an additional 50 HP!");
		public static const Tank2:PerkType = mk("Tank 2", "Tank 2",
				"+1 extra HP per point of toughness.",
				"You choose the 'Tank 2' perk, granting an extra maximum HP for each point of toughness.");
		public static const Tank3:PerkType = mk("Tank 3", "Tank 3",
				"+5 extra HP per character level.",
				"You choose the 'Tank 3' perk, granting 5 extra maximum HP for each level.");
		public static const TitanGrip:PerkType = mk("Titan Grip", "Titan Grip",
				"Allows you to wield large weapons in one hand, granting shield usage.",
				"You choose the 'Titan Grip' perk. Thanks to your incredible strength, you can now wield large weapons with one hand!");
		public static const ThunderousStrikes:PerkType = new ThunderousStrikesPerk();
		public static const Unhindered:PerkType = new UnhinderedPerk();
		public static const VitalAim:PerkType = mk("Vital Aim", "Vital Aim",
				"While shooting a bow, increases critical chance by 5%",
				"You choose the 'Vital Aim' perk, granting critical chance when shooting a bow.");
		public static const WeaponMastery:PerkType = new WeaponMasteryPerk();
		public static const WellAdjusted:PerkType = mk("Well Adjusted", "Well Adjusted",
				"You gain half as much lust as time passes in Mareth.",
				"You choose the 'Well Adjusted' perk, reducing the amount of lust you naturally gain over time while in this strange land!");

		// Needlework perks
		public static const ChiReflowAttack:PerkType = mk("Chi Reflow - Attack", "Chi Reflow - Attack",
				"Regular attacks boosted, but damage resistance decreased.");
		public static const ChiReflowDefense:PerkType = mk("Chi Reflow - Defense", "Chi Reflow - Defense",
				"Passive damage resistance, but caps speed");
		public static const ChiReflowLust:PerkType = mk("Chi Reflow - Lust", "Chi Reflow - Lust",
				"Lust resistance and Tease are enhanced, but Libido and Sensitivity gains increased.").boostsLustResistance(UmasShop.NEEDLEWORK_LUST_LUST_RESIST).boostsSeduction(UmasShop.NEEDLEWORK_LUST_TEASE_MULTI);
		public static const ChiReflowMagic:PerkType = mk("Chi Reflow - Magic", "Chi Reflow - Magic",
				"Magic attacks boosted, but regular attacks are weaker.");
		public static const ChiReflowSpeed:PerkType = mk("Chi Reflow - Speed", "Chi Reflow - Speed",
				"Speed reductions are halved but caps strength");

		// Piercing perks
		public static const PiercedCrimstone:PiercedCrimstonePerk = new PiercedCrimstonePerk();
		public static const PiercedIcestone:PiercedIcestonePerk = new PiercedIcestonePerk();
		public static const PiercedFertite:PiercedFertitePerk = new PiercedFertitePerk();
		public static const PiercedFurrite:PerkType = mk("Pierced: Furrite", "Pierced: Furrite",
				"Increases chances of encountering 'furry' foes.");
		public static const PiercedLethite:PerkType = mk("Pierced: Lethite", "Pierced: Lethite",
				"Increases chances of encountering demonic foes.");

		// Cock sock perks
		public static const LustyRegeneration:PerkType = mk("Lusty Regeneration", "Lusty Regeneration",
				"Regenerates 1% of HP per round in combat and 2% of HP per hour.").boostsHealthRegenPercentage(1);
		public static const MidasCock:PerkType = mk("Midas Cock", "Midas Cock",
				"Increases the gems awarded from victory in battle.");
		public static const PentUp:PentUpPerk = new PentUpPerk();
		public static const PhallicPotential:PerkType = mk("Phallic Potential", "Phallic Potential",
				"Increases the effects of penis-enlarging transformations.");
		public static const PhallicRestraint:PerkType = mk("Phallic Restraint", "Phallic Restraint",
				"Reduces the effects of penis-enlarging transformations.");

		// Armor perks
		public static const BloodMage:PerkType = mk("Blood Mage", "Blood Mage",
				"Spellcasting now consumes health instead of fatigue!", null, true);
		public static const Patience:PatiencePerk = new PatiencePerk();
		public static const LesserBloodMage:PerkType = mk("Lesser Blood Mage", "Lesser Blood Mage",
				"Spellcasting now consumes a large amount of health instead of fatigue.");
		public static const QuickPockets:PerkType = mk("Quick Pockets", "Quick Pockets", "The first item used in a turn does not end it.");
		public static const SluttySeduction:SluttySeductionPerk = new SluttySeductionPerk();
		public static const WizardsEndurance:WizardsEndurancePerk = new WizardsEndurancePerk();
		public static const WellspringOfLust:PerkType = mk("Wellspring of Lust", "Wellspring of Lust",
				"At the beginning of combat, lust raises to black magic threshold if lust is below black magic threshold.");
		public static const FeralBerserker:PerkType = mk("Feral Berserker", "Feral Berserker",
				"The Berserk ability is improved and costs health instead of fatigue.");
		public static const DemonHunter:PerkType = mk("Demon Hunter", "Demon Hunter",
				"Casting spells may reduce lust at the cost of health when fighting demons.");
		public static const BlazingLust:PerkType = mk("Blazing Lust", "Blazing Lust",
				"Tease effectiveness increases with each successive tease, but so does the damage you take.");
		public static const BestialPassion:PerkType = mk("Bestial Passion", "Bestial Passion",
				"Tease has a chance to deal critical lust damage, but your own lust will be raised as well.");
		public static const SetDemonbane:PerkType = mk("Set bonus: Demonbane", "Set bonus: Demonbane",
				"You have a passive chance to cause fear in demons and weaker enemies.");
		public static const SetRavager:PerkType = mk("Set bonus: Ravager", "Set bonus: Ravager",
				"You can activate Berserk without using up your turn.");
		public static const SetPrimal:PerkType = mk("Set bonus: Primal", "Set bonus: Primal",
				"The Berserk ability will now increase the amount of lust you give.");
		public static const AlrauneVines:VineArmorPerk = new VineArmorPerk();

		// Weapon perks
		public static const WizardsFocus:WizardsFocusPerk = new WizardsFocusPerk();
		public static const Cunning:PerkType = new CunningPerk();
		public static const ArcaneSmithing:PerkType = mk("Arcane Smithing", "Arcane Smithing", "Increases the magnitude of Leech and Charge Weapon.");
		public static const Scattering:PerkType = new ScatteringPerk();

		// Achievement perks
		public static const BroodMother:PerkType = mk("Brood Mother", "Brood Mother",
				"Pregnancy moves twice as fast as a normal woman's.");
		public static const SpellcastingAffinity:SpellcastingAffinityPerk = new SpellcastingAffinityPerk();
		public static const KillerInstinct:KillerInstinctPerk = new KillerInstinctPerk();

		// Mutation perks
		public static const Androgyny:PerkType = mk("Androgyny", "Androgyny",
				"No gender limits on facial masculinity or femininity.");
		public static const BasiliskWomb:PerkType = mk("Basilisk Womb", "Basilisk Womb",
				"Enables your eggs to be properly fertilized into basilisks of both genders!");
		public static const BeeOvipositor:PerkType = mk("Bee Ovipositor", "Bee Ovipositor",
				"Allows you to lay eggs through a special organ on your insect abdomen, though you need at least 10 eggs to lay.");
		public static const BimboBody:PerkType = mk("Bimbo Body", "Bimbo Body",
				"Gives the body of a bimbo.  Tits will never stay below a 'DD' cup, libido is raised, lust resistance is raised, and upgrades tease.").boostsSeduction(10).boostsSexiness(5).boostsLustResistance(1.33,true);
		public static const BimboBrains:PerkType = mk("Bimbo Brains", "Bimbo Brains",
				"Now that you've drank bimbo liquer, you'll never, like, have the attention span and intelligence you once did!  But it's okay, 'cause you get to be so horny an' stuff!");
        public static const Bloodhound:PerkType = mk("Bloodhound", "Bloodhound",
                "Your excellent sense of smell triggers a primal instinct to hunt when your foe is bleeding - Gain +10% accuracy, +10% critical chance and" +
				" +20% movement chance against bleeding targets. ");
		public static const BroBody:PerkType = mk("Bro Body", "Bro Body",
				"Grants an ubermasculine body that's sure to impress.").boostsSeduction(10).boostsSexiness(5).boostsLustResistance(1.33,true);
		public static const BroBrains:PerkType = mk("Bro Brains", "Bro Brains",
				"Makes thou... thin... fuck, that shit's for nerds.");
		public static const BunnyEggs:PerkType = mk("Bunny Eggs", "Bunny Eggs",
				"Laying eggs has become a normal part of your bunny-body's routine.");
		public static const CorruptedNinetails:PerkType = mk("Corrupted Nine-tails", "Corrupted Nine-tails",
				"The mystical energy of the nine-tails surges through you, filling you with phenomenal cosmic power!  Your boundless magic allows you to recover quickly after casting spells, but your method of attaining it has corrupted the transformation, preventing you from achieving true enlightenment.",null,true);
		public static const Diapause:PerkType = mk("Diapause", "Diapause",
				"Pregnancy does not advance normally, but develops quickly after taking in fluids.");
		public static const Dragonfire:PerkType = mk("Dragonfire", "Dragonfire",
				"Allows access to a dragon breath attack.");
		public static const EnlightenedNinetails:PerkType = mk("Enlightened Nine-tails", "Enlightened Nine-tails",
				"The mystical energy of the nine-tails surges through you, filling you with phenomenal cosmic power!  Your boundless magic allows you to recover quickly after casting spells.",null,true);
		public static const Feeder:PerkType = mk("Feeder", "Feeder",
				"Lactation does not decrease and gives a compulsion to breastfeed others.");
		public static const Flexibility:PerkType = mk("Flexibility", "Flexibility",
				"Grants cat-like flexibility.  Useful for dodging and 'fun'.").boostsDodge(6);
		public static const FutaFaculties:PerkType = mk("Futa Faculties", "Futa Faculties",
				"It's super hard to think about stuff that like, isn't working out or fucking!");
		public static const FutaForm:PerkType = mk("Futa Form", "Futa Form",
				"Ensures that your body fits the Futa look (Tits DD+, Dick 8\"+, & Pussy).  Also keeps your lusts burning bright and improves the tease skill.").boostsSeduction(10).boostsSexiness(5).boostsLustResistance(1.33,true);
		public static const HarpyWomb:PerkType = mk("Harpy Womb", "Harpy Womb",
				"Increases all laid eggs to large size so long as you have harpy legs and a harpy tail.");
		public static const Incorporeality:PerkType = mk("Incorporeality", "Incorporeality",
				"Allows you to fade into a ghost-like state and temporarily possess others.");
		public static const Lustzerker:PerkType = mk("Lustserker", "Lustserker",
				"Grants 'Lustserk' ability.");
		public static const MilkMaid:MilkMaidPerk = new MilkMaidPerk();
		public static const MinotaurCumAddict:PerkType = mk("Minotaur Cum Addict", "Minotaur Cum Addict",
				"Causes you to crave minotaur cum frequently.  You cannot shake this addiction.");
		public static const MinotaurCumResistance:PerkType = mk("Minotaur Cum Resistance", "Minotaur Cum Resistance",
				"You can never become a Minotaur Cum Addict. Grants immunity to Minotaur Cum addiction.");
		public static const Oviposition:PerkType = mk("Oviposition", "Oviposition",
				"Causes you to regularly lay eggs when not otherwise pregnant.");
		public static const PurityBlessing:PerkType = mk("Purity Blessing", "Purity Blessing",
				"Reduces the rate at which your corruption, libido, and lust increase. Reduces minimum libido slightly.").boostsLustResistance(5);
		public static const RapierTraining:PerkType = mk("Rapier Training", "Rapier Training",
				"After finishing of your training, increase attack power of any rapier you're using.");
		public static const SatyrSexuality:PerkType = mk("Satyr Sexuality", "Satyr Sexuality",
				"Thanks to your satyr biology, you now have the ability to impregnate both vaginas and asses. Also increases your virility rating. (Anal impregnation not implemented yet)");
		public static const SlimeCore:PerkType = mk("Slime Core", "Slime Core",
				"Grants more control over your slimy body, allowing you to go twice as long without fluids.");
		public static const SpiderOvipositor:PerkType = mk("Spider Ovipositor", "Spider Ovipositor",
				"Allows you to lay eggs through a special organ on your arachnid abdomen, though you need at least 10 eggs to lay.");
		public static const ThickSkin:PerkType = mk("Thick Skin", "Thick Skin",
				"Toughens your dermis to provide 2 points of armor.");
		public static const TransformationResistance:PerkType = mk("Transformation Resistance", "Transformation Resistance",
				"Reduces the likelihood of undergoing a transformation. Disables Bad Ends from transformative items.");
		public static const LoliliciousBody:PerkType = mk("Lolilicious Body", "Liddellium Resistance",
				"Makes it difficult to escape your new loli form by massively reducing the likelihood of transformation.");//Easier to leave name and ID and simply change name and description.
		public static const ParasiteMusk:PerkType = mk("Parasite Musk", "Parasite Musk",
				"The Bog parasite constantly releases pheromones that boost cum production and allow for a special move in combat.");
		public static const AntiCoagulant:PerkType = mk("Anti Coagulant", "Anti Coagulant", "Bleed effects on opponents last one turn longer.");

		// Quest, Event & NPC perks
		public static const AChristmasCarol:PerkType = mk("A Christmas Carol", "A Christmas Carol",
				"Grants year-round access to Christmas event. Note that some events are only accessible once per year.", null, true);
		public static const BasiliskResistance:PerkType = mk("Basilisk Resistance", "Basilisk Resistance",
				"Grants immunity to Basilisk's paralyzing gaze. Disables Basilisk Bad End.");
		public static const BulgeArmor:PerkType = mk("Bulge Armor", "Bulge Armor",
				"Grants a 5 point damage bonus to dick-based tease attacks.");
		public static const Cornucopia:PerkType = mk("Cornucopia", "Cornucopia",
				"Vaginal and Anal capacities increased by 30.", null, true);
		public static const CounterAB:PerkType = mk("Counter Stance", "Counter Stance",
				"The Dullahan's teachings allows you to enter a countering stance in combat.", null);
		public static const ElvenBounty:ElvenBountyPerk = new ElvenBountyPerk();
		public static const FerasBoonAlpha:PerkType = mk("Fera's Boon - Alpha", "Fera's Boon - Alpha",
				"Increases the rate your cum builds up and cum production in general.", null, true);
		public static const FerasBoonBreedingBitch:PerkType = mk("Fera's Boon - Breeding Bitch", "Fera's Boon - Breeding Bitch",
				"Increases fertility and reduces the time it takes to birth young.", null, true);
		public static const FerasBoonMilkingTwat:PerkType = mk("Fera's Boon - Milking Twat", "Fera's Boon - Milking Twat",
				"Keeps your pussy from ever getting too loose and increases pregnancy speed.",null,true);
		public static const FerasBoonSeeder:PerkType = mk("Fera's Boon - Seeder", "Fera's Boon - Seeder",
				"Increases cum output by 1,000 mLs.", null, true);
		public static const FerasBoonWideOpen:PerkType = mk("Fera's Boon - Wide Open", "Fera's Boon - Wide Open",
				"Keeps your pussy permanently gaped and increases pregnancy speed.",null,true);
		public static const FireLord:PerkType = mk("Fire Lord", "Fire Lord",
				"Akbal's blessings grant the ability to breathe burning green flames.");
		public static const Hellfire:PerkType = mk("Hellfire", "Hellfire",
				"Grants a corrupted fire breath attack, like the hellhounds in the mountains.");
		public static const LuststickAdapted:PerkType = mk("Luststick Adapted", "Luststick Adapted",
				"Grants immunity to the lust-increasing effects of lust-stick and allows its use.").boostsMinLust(10).boostsLustResistance(1.10,true);
		public static const MagicalFertility:PerkType = mk("Magical Fertility", "Magical Fertility",
				"10% higher chance of pregnancy and increased pregnancy speed.");
		public static const MagicalVirility:PerkType = mk("Magical Virility", "Magical Virility",
				"200 mLs more cum per orgasm and enhanced virility.");
		public static const MaraesGiftButtslut:PerkType = mk("Marae's Gift - Buttslut", "Marae's Gift - Buttslut",
				"Makes your anus provide lubrication when aroused.");
		public static const MaraesGiftFertility:PerkType = mk("Marae's Gift - Fertility", "Marae's Gift - Fertility",
				"Greatly increases fertility and halves base pregnancy speed.");
		public static const MaraesGiftProfractory:PerkType = mk("Marae's Gift - Profractory", "Marae's Gift - Profractory",
				"Causes your cum to build up at 3x the normal rate.");
		public static const MaraesGiftStud:PerkType = mk("Marae's Gift - Stud", "Marae's Gift - Stud",
				"Increases your cum production and potency greatly.");
		public static const MarbleResistant:PerkType = mk("Marble Resistant", "Marble Resistant",
				"Provides resistance to the addictive effects of bottled LaBova milk.");
		public static const MarblesMilk:PerkType = mk("Marble's Milk", "Marble's Milk",
				"Requires you to drink LaBova milk frequently or eventually die.  You cannot shake this addiction.");
		public static const Misdirection:MisdirectionPerk = new MisdirectionPerk();
		public static const OmnibusGift:PerkType = mk("Omnibus' Gift", "Omnibus' Gift",
				"Increases minimum lust but provides some lust resistance.").boostsMinLust(30).boostsLustResistance(1.18,true);
		public static const OneTrackMind:PerkType = mk("One Track Mind", "One Track Mind",
				"Your constant desire for sex causes your sexual organs to be able to take larger insertions and disgorge greater amounts of fluid.", null, true);
		public static const PilgrimsBounty:PerkType = mk("Pilgrim's Bounty", "Pilgrim's Bounty",
				"Causes you to always cum as hard as if you had max lust.", null, true);
		public static const PureAndLoving:PerkType = mk("Pure and Loving", "Pure and Loving",
				"Your caring attitude towards love and romance makes you slightly more resistant to lust and corruption.", null, true).boostsLustResistance(1.05,true);
		public static const PotentProstate:PerkType = mk("Potent Prostate", "Potent Prostate",
				"Whenever you have a dick and no balls(or tiny balls), produce cum equivalent to a pair of large balls.", null);
		public static const MysticLearnings:PerkType = mk("Mystic Learnings", "Mystic Learnings",
				"Reading and fully comprehending the Heptarchia Mystica allows you to cast stronger spells.", null).boostsSpellMod(25);
		public static const PotentPregnancy:PerkType = mk("Potent Pregnancy", "Potent Pregnancy",
				"Whenever you are pregnant, you gain strength and toughness bonuses.", null);
		public static const ParasiteQueen:PerkType = mk("Parasite Queen", "Parasite Queen",
				"Allow you to sacrifice a parasite to boost your stats in battle.", null);
		public static const Revelation:PerkType = mk("Revelation", "Revelation",
				"You have seen things beyond mortal comprehension. Peering into the abyss has a lower chance of breaking your psyche.", null, true);
		public static const SensualLover:PerkType = mk("Sensual Lover", "Sensual Lover",
				"Your sensual attitude towards love and romance makes your tease ability slightly more effective.", null, true).boostsSeduction(2).boostsSexiness(2);
		public static const TerrestrialFire:PerkType = mk("Terrestrial Fire", "Terrestrial Fire",
				"You've unlocked a new type of magic based on the elements of Earth and Fire.");
		public static const WarDance:PerkType = mk("War Dance", "War Dance",
				"+15% Damage against enemies in hand to hand combat and -20% Evasion chance for the enemy.");
		public static const Whispered:PerkType = mk("Whispered", "Whispered",
				"Akbal's blessings grant limited telepathy that can induce fear.");
		public static const NephilaQueen:PerkType = mk("Nephila Queen", "Nephila Queen",
				"Allow you to sacrifice a nephila parasite to boost your intelligence in battle.");
		public static const NephilaArchQueen:PerkType = mk("Nephila Arch Queen", "Nephila Arch Queen",
				"Your womb dwarfs you, serving as a veritable paradise for the countless slime monsters within; as a result, you are a crowned Nephila Arch Queen and can use the Unleash Brood attack to send them forth to fight for you in battle.");

		public static const ControlledBreath:ControlledBreathPerk = new ControlledBreathPerk();
		public static const CleansingPalm:CleansingPalmPerk = new CleansingPalmPerk();
		public static const Enlightened:EnlightenedPerk = new EnlightenedPerk();

		// Monster perks
		public static const Acid:PerkType = mk("Acid", "Acid", "");
		public static const PoisonImmune:PerkType = mk("PoisonImmune", "Poison Immune", "Target is immune to poison effects.");
		public static const BleedImmune:PerkType = mk("BleedImmune", "Bleed Immune", "Target is immune to bleeding effects.");
		public static const ExtraDodge:PerkType = mk("ExtraDodge", "Extra Dodgy", "Target has a higher chance to dodge attacks.");
		public static const PhysicalResistance:PerkType = mk("PhysicalResistance", "Physical Resistance", "Target is more resilient to physical attacks. ");
		public static const Invincible:PerkType = mk("Invincible", "Invincible", "Target is invincible, impervious to all damage!");
		public static const BlindImmune:PerkType = mk("Blind Immune", "Blind Immune", "Blind does not affect this target.");
		public static const PsiImmune:PerkType = mk("Psi Immune", "Psi Immune", "Psionic attacks do not affect this target.");
		public static const FearImmune:PerkType = mk("Fear Immune", "Fear Immune", "Target is immune to Fear effects.");
		public static const Flying:PerkType = mk("Flying", "Flying", "Target can fly, and regular attacks will hit you even if you're flying.");
		public static const ChargingSwings:PerkType = mk("ChargingSwings", "Charging Swings", "This creature's regular attacks remove distance.");
		public static const SoftSkull:PerkType = mk("SoftSkull", "SoftSkull", "Stuns on this creature last one turn longer.");
		public static const Immovable:PerkType = mk("Immovable","Immovable","This creature cannot be moved, and will not move.");
		private static function mk(id:String, name:String, desc:String, longDesc:String = null, keepOnAscension:Boolean = false):PerkType
		{
			return new PerkType(id, name, desc, longDesc, keepOnAscension);
		}
		private static function initRequirements():void {
			//------------
			// STRENGTH
			//------------
			StrongBack.requireStr(25);
			StrongBack2.requireStr(25)
					   .requirePerk(StrongBack);
			//Tier 1 Strength Perks
			//Thunderous Strikes - +20% basic attack damage while str > 80.
			ThunderousStrikes.requireStr(80)
							 .requireLevel(6);
			//Weapon Mastery - Doubles weapon damage bonus of 'large' type weapons. (Minotaur Axe, M. Hammer, etc)
			WeaponMastery.requireStr(60)
						 .requireLevel(6);
			BrutalBlows.requireStr(75)
					   .requireLevel(6);
			IronFists.requireStr(50)
					 .requireLevel(6);
			IronFists2.requireStr(65)
					  .requireLevel(6)
					  .requirePerk(IronFists);
			Parry.requireStr(50)
				 .requireSpe(50)
				 .requireLevel(6);
			//Tier 2 Strength Perks
			Berzerker.requireStr(75)
					 .requireLevel(12);
			HoldWithBothHands.requireStr(80)
							 .requireLevel(12);
			/*ShieldSlam.requireStr(80)
					  .requireTou(60)
					  .requireLevel(12);*/
			IronFists3.requireStr(80)
					  .requireLevel(12)
					  .requireNGPlus(1)
					  .requirePerk(IronFists2);
			//Tier 3 Strength Perks
			ColdFury.requireStr(75)
					.requireLevel(18)
					.requirePerk(Berzerker)
					.requirePerk(ImprovedSelfControl);
			Opportunist.requireStr(50).requireLevel(10);
			/*TitanGrip.requireStr(90)
					.requireLevel(18)
					.requirePerk(StrongBack);*/
			//------------
			// TOUGHNESS
			//------------
			//slot 2 - toughness perk 1
			Tank.requireTou(25);
			//slot 2 - regeneration perk
			Regeneration.requireTou(50)
						.requirePerk(Tank);
			ImprovedEndurance.requireStr(50)
							 .requireTou(50);
			//Tier 1 Toughness Perks
			Tank2.requireTou(60)
				 .requireLevel(6)
				 .requirePerk(Tank);
			Regeneration2.requireTou(70)
						 .requireLevel(6)
						 .requirePerk(Regeneration);
			ImmovableObject.requireTou(75)
						   .requireLevel(6);
			ShieldMastery.requireTou(50)
						 .requireLevel(6);
			ImprovedEndurance2.requireLevel(6)
							  .requireStr(60)
							  .requireTou(60)
							  .requirePerk(ImprovedEndurance);
			//Tier 2 Toughness Perks
			/*Tank3.requireTou(80)
				 .requireLevel(12)
				 .requireNGPlus(1)
				 .requirePerk(Tank2);*/
			Resolute.requireTou(75)
					.requireLevel(12);
			Juggernaut.requireTou(75)
					  .requireLevel(12);
			IronMan.requireTou(60)
				   .requireLevel(12);
			/*ImprovedEndurance3.requireLevel(12)
							  .requireStr(70)
							  .requireTou(70)
							  .requireNGPlus(1)
							  .requirePerk(ImprovedEndurance2);*/
			//------------
			// SPEED
			//------------
			//slot 3 - speed perk
			Evade.requireSpe(25);
			//slot 3 - run perk
			Runner.requireSpe(25);
			//slot 3 - Double Attack perk
			DoubleAttack.requireSpe(50)
						.requirePerk(Evade)
						.requirePerk(Runner);

			//Tier 1 Speed Perks
			//Speedy Recovery - Regain Fatigue 50% faster speed.
			SpeedyRecovery.requireSpe(60)
						  .requireLevel(6)
						  .requirePerk(Evade);
			//Agility - A small portion of your speed is applied to your defense rating when wearing light armors.
			Agility.requireSpe(75)
				   .requireLevel(6)
				   .requirePerk(Runner);
			Unhindered.requireSpe(75)
					  .requireLevel(6)
					  .requirePerk(Evade)
					  .requirePerk(Agility);
			LightningStrikes.requireSpe(60)
							.requireLevel(6);
			/*
			 Brawler.requireStr(60).requireSpe(60);
			 */ //Would it be fitting to have Urta teach you?
			//Tier 2 Speed Perks
			LungingAttacks.requireSpe(75)
						  .requireLevel(12);
			Blademaster.requireStr(60)
					   .requireSpe(80)
					   .requireLevel(12);
			//------------
			// INTELLIGENCE
			//------------
			//Slot 4 - precision - -10 enemy toughness for damage calc
			Precision.requireInt(25);
			//Spellpower - boosts spell power
			Spellpower.requireInt(50);
			Mage.requireInt(50)
				.requirePerk(Spellpower);
			//Tier 1 Intelligence Perks
			Awareness.requireInt(5);
			Tactician.requireInt(50)
					 .requireLevel(6);
			Channeling.requireInt(60)
					  .requireLevel(6)
					  .requirePerk(Spellpower)
					  .requirePerk(Mage)
					  .requireCustomFunction(function (player:Player):Boolean {
						  return player.spellCount() > 0;
					  }, "Any Spell");
			Medicine.requireInt(60)
					.requireLevel(6);
			StaffChanneling.requireInt(60)
						   .requireLevel(6)
						   .requirePerk(Channeling);
			//Tier 2 Intelligence perks
			Archmage.requireInt(75)
					.requireLevel(12)
					.requirePerk(Mage);
			FocusedMind.requireInt(75)
					   .requireLevel(12)
					   .requirePerk(Mage);

			RagingInferno.requireInt(75)
						 .requireLevel(12)
						 .requirePerk(Archmage)
						 .requirePerk(Channeling)
						 .requireCustomFunction(function (player:Player):Boolean {
							 return player.hasStatusEffect(StatusEffects.KnowsWhitefire)
									 /*|| player.hasStatusEffect(StatusEffects.KnowsBlackfire)*/
									 || player.hasPerk(FireLord)
									 || player.hasPerk(Hellfire)
									 || player.hasPerk(EnlightenedNinetails)
									 || player.hasPerk(CorruptedNinetails);
						 }, "Any Fire Spell");
			//Tier 3 Intelligence perks
			/*Indefatigable.requireInt(90)
						 .requireLevel(18)
						 .requirePerk(ImprovedSelfControl3)
						 .requireNGPlus(1);*/
			// Spell-boosting perks
			// Battlemage: auto-use Might
			Battlemage.requireInt(80)
					  .requireLevel(12)
					  .requirePerk(Channeling)
					  .requireStatusEffect(StatusEffects.KnowsMight, "Might Spell");
			// Spellsword: auto-use Charge Weapon
			Spellsword.requireInt(80)
					  .requireLevel(12)
					  .requirePerk(Channeling)
					  .requireStatusEffect(StatusEffects.KnowsCharge, "Charge Weapon Spell");
			SeverTendons.requireStr(50)
						.requireLevel(12)
						.requireInt(50);
			//------------
			// LIBIDO
			//------------
			//slot 5 - libido perks

			//Slot 5 - Fertile+ increases cum production and fertility (+15%)
			FertilityPlus.requireLib(25);
			FertilityPlus.defaultValue1 = 15;
			FertilityPlus.defaultValue2 = 1.75;
			ImprovedSelfControl.requireInt(50).requireLib(25);
			//Slot 5 - minimum libido
			ColdBlooded.requireMinLust(20);
			ColdBlooded.defaultValue1 = 20;
			HotBlooded.requireLib(50);
			HotBlooded.defaultValue1 = 20;
			//Tier 1 Libido Perks
			//Slot 5 - minimum libido
			//Slot 5 - Fertility- decreases cum production and fertility.
			FertilityMinus.requireLevel(6)
						  .requireLibLessThan(25);
			FertilityMinus.defaultValue1 = 15;
			FertilityMinus.defaultValue2 = 0.7;
			WellAdjusted.requireLevel(6).requireLib(60);
			/*ImprovedSelfControl2.requireLevel(6)
			                    .requireInt(60)
								.requireLib(50)
								.requirePerk(ImprovedSelfControl);*/
			//Slot 5 - minimum libido
			Masochist.requireLevel(6).requireLib(60).requireCor(50);
			//Tier 2 Libido Perks
			/*ImprovedSelfControl3.requireLevel(12)
			                    .requireInt(70)
								.requireLib(75)
								.requireNGPlus(1)
								.requirePerk(ImprovedSelfControl2);*/
			//------------
			// SENSITIVITY
			//------------
			//Nope.avi
			//------------
			// CORRUPTION
			//------------
			//Slot 7 - Corrupted Libido - lust raises 10% slower.
			CorruptedLibido.requireCor(25);
			CorruptedLibido.defaultValue1 = 20;
			//Slot 7 - Seduction (Must have seduced Jojo
			Seduction.requireCor(50);
			//Slot 7 - Nymphomania
			Nymphomania.requirePerk(CorruptedLibido)
					   .requireCor(75);
			//Slot 7 - UNFINISHED :3
			Acclimation.requirePerk(CorruptedLibido)
					   .requireMinLust(20)
					   .requireCor(50);
			//Tier 1 Corruption Perks - acclimation over-rides
			Sadist.requireLevel(6)
				  .requirePerk(CorruptedLibido)
				  .requireCor(60);
			ArousingAura.requireLevel(6)
						.requirePerk(CorruptedLibido)
						.requireCor(70);
			//Tier 1 Misc Perks
			Resistance.requireLevel(6);
			Survivalist.requireLevel(6)
					   .requireHungerEnabled();
			//Tier 2 Misc Perks
			Survivalist2.requireLevel(12)
						.requirePerk(Survivalist)
						.requireHungerEnabled();
			//Other Misc Perks
			/* Disabled for now
			ImprovedVision.requireLevel(30)
						.requirePerk(Tactician);
			ImprovedVision2.requireLevel(60)
						.requirePerk(ImprovedVision);
			ImprovedVision3.requireLevel(90)
						.requirePerk(ImprovedVision2);
			**/
			//------------
			// BOW
			//------------
			VitalAim.requireSpe(25)
					.requireInt(25)
				.requirePerk(KillerInstinct)
				.requireCustomFunction(function (player:Player):Boolean {
					return (player.hasKeyItem("Bow") || player.hasKeyItem("Kelt's Bow"))
				}, "Has a bow");
			StrongDraw.requireStr(25)
					  .requireCustomFunction(function (player:Player):Boolean {
							return (player.hasKeyItem("Bow") || player.hasKeyItem("Kelt's Bow"))
					  }, "Has a bow");
			//Tier 1
			PracticedForm.requireTou(40)
						 .requireSpe(40)
						 .requirePerk(StrongDraw)
						 .requireLevel(6)
						 .requireCustomFunction(function (player:Player):Boolean {
							return (player.hasKeyItem("Bow") || player.hasKeyItem("Kelt's Bow"))
						 }, "Has a bow");
			EagleEye.requireSpe(50)
					.requirePerk(VitalAim)
					.requireLevel(6)
					.requireCustomFunction(function (player:Player):Boolean {
						return (player.hasKeyItem("Bow") || player.hasKeyItem("Kelt's Bow"))
					}, "Has a bow");
			//Tier 2
			NoBaggage.requireSpe(80)
					 .requireStr(80)
					 .requireLevel(12)
					 .requirePerk(PracticedForm)
					 .requireCustomFunction(function (player:Player):Boolean {
						return (player.hasKeyItem("Bow") || player.hasKeyItem("Kelt's Bow"))
					 }, "Has a bow");

			//Tier 3
			FanShot.requireSpe(50)
				   .requireStr(90)
				   .requireLevel(18)
				   .requirePerk(PracticedForm)
				   .requireCustomFunction(function (player:Player):Boolean {
						return (player.hasKeyItem("Bow") || player.hasKeyItem("Kelt's Bow"))
				   }, "Has a bow");

			//------------
			// MIXED
			//------------
			Frustration.requireStr(60)
					   .requireCor(40)
					   .requireLevel(12)
		}

		{
			initRequirements();
		}
	}
}


code:
/**
 * Created by aimozg on 22.05.2017.
 */
package classes {
import classes.GlobalFlags.kFLAGS;
import classes.GlobalFlags.kGAMECLASS;
import classes.GlobalFlags.kGAMECLASS;

import flash.utils.Dictionary;

public class PerkTree extends BaseContent {
	private var pdata:Dictionary = new Dictionary();

	public function PerkTree() {
		var library:Dictionary = PerkType.getPerkLibrary();
		var perk:PerkType;
		for each(perk in library) {
			//var perk:PerkType = library[k];
			pdata[perk.id] = {
				perk   : perk,
				ctxt   : perk.allRequirementDesc(),
				unlocks: []
			};
		}
		for each(perk in library) {
			for each (var c:Object in perk.requirements) {
				switch (c.type) {
					case "perk":
						var p2:PerkType = c.perk;
						pdata[p2.id].unlocks.push(perk);
						break;
					case "anyperk":
						var ps:Array = c.perks;
						for each(p2 in ps) pdata[p2.id].unlocks.push(perk);
						break;
					default: //Move along
				}
			}
		}
		/*for each(var pd:Object in pdata) {
			var s:Array = [];
			for each (perk in pd.unlocks) s.push(perk.name);
			if (s.length>0 || pd.ctxt) trace("Perk " + pd.perk.name + (pd.ctxt ? "; requires " + pd.ctxt : "") + (s.length > 0 ? "; unlocks " + s.join(", ") : ""));
		}*/
	}
	/**
	 * Returns Array of PerkType
	 */
	public function listUnlocks(p:PerkType):Array {
		return pdata[p.id].unlocks;
	}
	/**
	 * Returns Array of PerkType
	 */
	public static function obtainablePerks():Array {
		var rslt:Array=[];
		for each(var perk:PerkType in PerkType.getPerkLibrary()) {
			if (perk.requirements.length > 0) {
				rslt.push(perk);
			}
		}
		return rslt.sortOn("name");
	}
	/**
	 * Returns Array of PerkType
	 */
	public static function availablePerks(player:Player):Array {
		return obtainablePerks().filter(
				function (perk:PerkType,idx:int,array:Array):Boolean {
					return !player.hasPerk(perk) && perk.available(player);
				});
	}
}
}


code:
/**
 * Created by aimozg on 26.01.14.
 */
package classes
{
import classes.GlobalFlags.kFLAGS;
import classes.GlobalFlags.kGAMECLASS;

import flash.utils.Dictionary;

	public class PerkType extends BaseContent
	{
		private static var PERK_LIBRARY:Dictionary = new Dictionary();

		public static function lookupPerk(id:String):PerkType{
			return PERK_LIBRARY[id];
		}

		public static function getPerkLibrary():Dictionary
		{
			return PERK_LIBRARY;
		}

		private var _id:String;
		private var _name:String;
		private var _desc:String;
		private var _longDesc:String;
		private var _keepOnAscension:Boolean;
		public var defaultValue1:Number = 0;
		public var defaultValue2:Number = 0;
		public var defaultValue3:Number = 0;
		public var defaultValue4:Number = 0;

		/**
		 * Unique perk id, should be kept in future game versions
		 */
		public function get id():String
		{
			return _id;
		}

		/**
		 * Perk short name, could be changed in future game versions
		 */
		public function get name():String
		{
			return _name;
		}

		/**
		 * Short description used in perk listing
		 */
		public function desc(params:Perk=null):String
		{
			return _desc;
		}

		/**
		 * Long description used when offering perk at levelup
		 */
		public function get longDesc():String
		{
			return _longDesc;
		}

		public function keepOnAscension(respec:Boolean = false):Boolean
		{
			if (_keepOnAscension)
				return true;
            if (!_keepOnAscension && !respec)
                return false;

			//what the fuck is this?
			return _longDesc != _desc && !respec; // dirty condition
		}

		public function PerkType(id:String,name:String,desc:String,longDesc:String = null,keepOnAscension:Boolean = false)
		{
			this._id = id;
			this._name = name;
			this._desc = desc;
			this._longDesc = longDesc || _desc;
			this._keepOnAscension = keepOnAscension;
			if (PERK_LIBRARY[id] != null) {
				CoC_Settings.error("Duplicate perk id "+id+", old perk is "+(PERK_LIBRARY[id] as PerkType)._name);
			}
			PERK_LIBRARY[id] = this;
		}

		public function toString():String
		{
			return "\""+_id+"\"";
		}

		/**
		 * Array of:
		 * {
		 *   fn: (Player)=>Boolean,
		 *   text: String,
		 *   type: String
		 *   // additional depending on type
		 * }
		 */
		public var requirements:Array = [];

		/**
		 * @return "requirement1, requirement2, ..."
		 */
		public function allRequirementDesc():String {
			var s:Array = [];
			for each (var c:Object in requirements) {
				if (c.text) s.push(c.text);
			}
			return s.join(", ");
		}
		public function available(player:Player):Boolean {
			for each (var c: Object in requirements) {
				if (!c.fn(player)) return false;
			}
			return true;
		}

		public function requireCustomFunction(playerToBoolean:Function, requirementText:String, internalType:String = "custom"):PerkType {
			requirements.push({
				fn  : playerToBoolean,
				text: requirementText,
				type: internalType
			});
			return this;
		}

		public function requireLevel(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("level", value),
				text: "Level " + value,
				type: "level",
				value: value
			});
			return this;
		}
		public function requireStr(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("str", value),
				text: "Strength " + value,
				type: "attr",
				attr: "str",
				value: value
			});
			return this;
		}
		public function requireTou(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("tou", value),
				text: "Toughness " + value,
				type: "attr",
				attr: "tou",
				value: value
			});
			return this;
		}
		public function requireSpe(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("spe", value),
				text: "Speed " + value,
				type: "attr",
				attr: "spe",
				value: value
			});
			return this;
		}
		public function requireInt(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("inte", value),
				text: "Intellect " + value,
				type: "attr",
				attr: "inte",
				value: value
			});
			return this;
		}
		public function requireWis(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("wis", value),
				text: "Wisdom " + value,
				type: "attr",
				attr: "wis",
				value: value
			});
			return this;
		}
		public function requireLib(value:int):PerkType {
			requirements.push({
				fn  : fnRequireAttr("lib", value),
				text: "Libido " + value,
				type: "attr",
				attr: "lib",
				value: value
			});
			return this;
		}
		public function requireCor(value:int):PerkType {
			requirements.push({
				fn  : function(player:Player):Boolean {
					return player.isCorruptEnough(value);
				},
				text: "Corruption > " + value,
				type: "attr-gt",
				attr: "cor",
				value: value
			});
			return this;
		}
		public function requireLibLessThan(value:int):PerkType {
			requirements.push({
				fn  : function(player:Player):Boolean {
					return player.lib < value;
				},
				text: "Libido < " + value,
				type: "attr-lt",
				attr: "lib",
				value: value
			});
			return this;
		}
		public function requireNGPlus(value:int):PerkType {
			requirements.push({
				fn  : function(player:Player):Boolean {
					return player.newGamePlusMod() >= value;
				},
				text: "New Game+ " + value,
				type: "ng+",
				value: value
			});
			return this;
		}

		public function requireHungerEnabled():PerkType {
			requirements.push({
				fn  : function(player:Player):Boolean {
					return game.flags[kFLAGS.HUNGER_ENABLED] > 0;
				},
				text: "Hunger enabled",
				type: "hungerflag"
			});
			return this;
		}
		public function requireMinLust(value:int):PerkType {
			requirements.push({
				fn  : function(player:Player):Boolean {
					return player.minLust() >= value;
				},
				text: "Min. Lust "+value,
				type: "minlust",
				value: value
			});
			return this;
		}

		private function fnRequireAttr(attrname:String,value:int):Function {
			return function(player:Player):Boolean {
				return player[attrname] >= value;
			};
		}
		public function requireStatusEffect(effect:StatusEffectType, text:String):PerkType {
			requirements.push({
				fn  : function (player:Player):Boolean {
					return player.hasStatusEffect(effect);
				},
				text: text,
				type: "effect",
				effect: effect
			});
			return this;
		}
		public function requirePerk(perk:PerkType):PerkType {
			requirements.push({
				fn  : function (player:Player):Boolean {
					return player.findPerk(perk) >= 0;
				},
				text: perk.name,
				type: "perk",
				perk: perk
			});
			return this;
		}
		public function requireAnyPerk(...perks:Array):PerkType {
			if (perks.length == 0) throw ("Incorrect call of requireAnyPerk() - should NOT be empty");
			var text:Array = [];
			for each (var perk:PerkType in perks) {
				text.push(perk.allRequirementDesc());
			}
			requirements.push({
				fn  : function (player:Player):Boolean {
					for each (var perk:PerkType in perks) {
						if (player.findPerk(perk) >= 0) return true;
					}
					return false;
				},
				text: text.join(" or "),
				type: "anyperk",
				perks: perks
			});
			return this;
		}

		public var bonusStats:BonusDerivedStats = new BonusDerivedStats();
		public var host:Creature;

        public function boostsHealthRegenPercentage(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.healthRegenPercent,value,mult,name);
            return this;
        }

        public function boostsMinLust(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.minLust,value,mult,name);
            return this;
        }

        public function boostsLustResistance(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.lustRes,value,mult,name);
            return this;
        }

        public function boostsSpellMod(value:*, mult:Boolean = false):PerkType{
			bonusStats.boostStat(BonusDerivedStats.spellMod,value,mult,name);
			return this;
    	}

        public function boostsPhysDamage(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.physDmg,value,mult,name);
            return this;
        }

        public function boostsSpellCost(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.spellCost,value,mult,name);
            return this;
        }
        public function boostsDodge(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.dodge,value,mult,name);
            return this;
        }

		public function boostsCritChance(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.critC,value,mult,name);
            return this;
        }

        public function boostsAttackDamage(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.attackDamage,value,mult,name);
            return this;
        }

        public function boostsGlobalDamage(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.globalMod,value,mult,name);
            return this;
        }

        public function boostsWeaponDamage(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.weaponDamage,value,mult,name);
            return this;
        }

        public function boostsSeduction(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.seduction,value,mult,name);
            return this;
        }

        public function boostsSexiness(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.sexiness,value,mult,name);
            return this;
        }

        public function boostsMaxFatigue(value:*, mult:Boolean = false):PerkType{
            bonusStats.boostStat(BonusDerivedStats.fatigueMax,value,mult,name);
            return this;
        }

		public function onAttach():void{

		}
		public function getOwnValue(valId:int):Number{//Fuck me why do I have to do something like this
			switch(valId){
				case 0:
					return host.perkv1(this);
				case 1:
                    return host.perkv2(this);
				case 2:
                    return host.perkv3(this);
				case 3:
                    return host.perkv4(this);
			}
			return 0;
		}
	}
}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionDesiresPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_DESIRES_LEVEL + ") Increases maximum lust by " + params.value1 * 5 + ".";
		}

		public function AscensionDesiresPerk()
		{
			super("Ascension: Desires", "Ascension: Desires", "", "Increases maximum lust by 5 per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionEndurancePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_ENDURANCE_LEVEL + ") Increases maximum fatigue by " + params.value1 * 5 + ".";
		}

		public function AscensionEndurancePerk()
		{
			super("Ascension: Endurance", "Ascension: Endurance", "", "Increases maximum fatigue by 5 per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionFertilityPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_FERTILITY_LEVEL + ") Increases base fertility by " + params.value1 * 5 + ".";
		}

		public function AscensionFertilityPerk()
		{
			super("Ascension: Fertility", "Ascension: Fertility", "", "Increases fertility rating by 5 per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;

	public class AscensionFortunePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + ") Increases gems gained in battles by " + params.value1 * 10 + "%.";
		}

		public function AscensionFortunePerk()
		{
			super("Ascension: Fortune", "Ascension: Fortune", "", "Increases gems gains by 10% per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionMartialityPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_MARTIALITY_LEVEL + ") Increases physical damage " + params.value1 * 2.5 + "% multiplicatively.";
		}

		public function AscensionMartialityPerk()
		{
			super("Ascension: Martiality", "Ascension: Martiality", "", "Increases physical damage by 2.5% per level, multiplicatively.");
            boostsPhysDamage(getMultiplier,true);
		}

        public function getMultiplier():Number{
            return  1 + getOwnValue(0)*0.025;
        }

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionMoralShifterPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_MORALSHIFTER_LEVEL + ") Increases corruption gains and losses by " + params.value1 * 20 + "%.";
		}

		public function AscensionMoralShifterPerk()
		{
			super("Ascension: Moral Shifter", "Ascension: Moral Shifter", "", "All corruption gains and losses are increased by 20% per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionMysticalityPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_MYSTICALITY_LEVEL + ") Increases spell effect multiplier by " + params.value1 * 5 + "% multiplicatively.";
		}

		public function AscensionMysticalityPerk()
		{
			super("Ascension: Mysticality", "Ascension: Mysticality", "", "Increases spell effect multiplier by 5% per level, multiplicatively.");
			boostsSpellMod(getMultiplier,true);
		}

		public function getMultiplier():Number{
			return  1 + getOwnValue(0)*0.05;
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;
	public class AscensionSeductionPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_SEDUCTION_LEVEL + ") Increases tease damage " + params.value1 * 5 + "% multiplicatively.";
		}

		public function AscensionSeductionPerk()
		{
			super("Ascension: Seduction", "Ascension: Seduction", "", "Increases tease damage by 5% per level, multiplicatively.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionTolerancePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_TOLERANCE_LEVEL + ") Increases corruption tolerance by " + params.value1 * 5 + " and reduces corruption requirement by " + params.value1 * 5 + ".";
		}

		public function AscensionTolerancePerk()
		{
			super("Ascension: Corruption Tolerance", "Ascension: Corruption Tolerance", "", "Increases corruption tolerance by 5 per level and reduces corruption requirement by 5 per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}


code:
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;
	import classes.GlobalFlags.kGAMECLASS;
	import classes.CharCreation;

	public class AscensionVirilityPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/" + CharCreation.MAX_VIRILITY_LEVEL + ") Increases base virility rating by " + params.value1 * 5 + ".";
		}

		public function AscensionVirilityPerk()
		{
			super("Ascension: Virility", "Ascension: Virility", "", "Increases base virility rating by 5 per level.");
		}

		override public function keepOnAscension(respec:Boolean = false):Boolean
		{
			return true;
		}
	}

}