code:
package classes
{
	import flash.events.Event;
	import fl.controls.ComboBox;;
	import fl.data.DataProvider;
	import classes.*;
	import classes.Scenes.NPCs.IsabellaScene;
	import classes.GlobalFlags.*;

	/**
	 * The new home of Stats and Perks
	 * @author Kitteh6660
	 */
	public class PlayerInfo extends BaseContent
	{
		public function PlayerInfo() {}

		//------------
		// STATS
		//------------
		public function displayStats():void {
			spriteSelect(-1);
			clearOutput();
			displayHeader("Stats");
			// Begin Combat Stats
			var combatStats:String = "";

			if (player.hasKeyItem("Bow") >= 0 || player.hasKeyItem("Kelt's Bow") >= 0)
				combatStats += "Bow Skill: " + Math.round(player.statusEffectv1(StatusEffects.Kelt)) + " / 100\n";

			combatStats += "Damage Resistance: " + (100 - Math.round(player.damagePercent(true))) + "-" + (100 - Math.round(player.damagePercent(true) - player.damageToughnessModifier(true))) + "% (Higher is better.)\n";

			combatStats += "Lust Resistance: " + (100 - Math.round(player.lustPercent())) + "% (Higher is better.)\n";

			combatStats += "Spell Effect Multiplier: " + Math.round(100 * player.spellMod()) + "%\n";

			combatStats += "Spell Cost: " + player.spellCost(100) + "%\n";

			if (flags[kFLAGS.RAPHAEL_RAPIER_TRANING] > 0)
				combatStats += "Rapier Skill: " + flags[kFLAGS.RAPHAEL_RAPIER_TRANING] + " / 4\n";

			if (player.teaseLevel < 5)
				combatStats += "Tease Skill:  " + player.teaseLevel + " / 5 (Exp: " + player.teaseXP + " / "+ (10 + (player.teaseLevel + 1) * 5 * (player.teaseLevel + 1))+ ")\n";
			else
				combatStats += "Tease Skill:  " + player.teaseLevel + " / 5 (Exp: MAX)\n";

			if (combatStats != "")
				outputText("Combat Stats\n" + combatStats, false);
			// End Combat Stats

			if (prison.inPrison || flags[kFLAGS.PRISON_CAPTURE_COUNTER] > 0) prison.displayPrisonStats();

			// Begin Children Stats
			var childStats:String = "";

			if (player.statusEffectv1(StatusEffects.Birthed) > 0)
				childStats += "Times Given Birth: " + player.statusEffectv1(StatusEffects.Birthed) + "\n";

			if (flags[kFLAGS.AMILY_MET] > 0)
				childStats += "Litters With Amily: " + (flags[kFLAGS.AMILY_BIRTH_TOTAL] + flags[kFLAGS.PC_TIMES_BIRTHED_AMILYKIDS]) + "\n";

			if (flags[kFLAGS.BEHEMOTH_CHILDREN] > 0)
				childStats += "Children With Behemoth: " + flags[kFLAGS.BEHEMOTH_CHILDREN] + "\n";

			if (flags[kFLAGS.BENOIT_EGGS] > 0)
				childStats += "Benoit Eggs Laid: " + flags[kFLAGS.BENOIT_EGGS] + "\n";
			if (flags[kFLAGS.FEMOIT_EGGS_LAID] > 0)
				childStats += "Benoite Eggs Produced: " + flags[kFLAGS.FEMOIT_EGGS_LAID] + "\n";

			if (flags[kFLAGS.COTTON_KID_COUNT] > 0)
				childStats += "Children With Cotton: " + flags[kFLAGS.COTTON_KID_COUNT] + "\n";

			if (flags[kFLAGS.EDRYN_NUMBER_OF_KIDS] > 0)
				childStats += "Children With Edryn: " + flags[kFLAGS.EDRYN_NUMBER_OF_KIDS] + "\n";

			if (flags[kFLAGS.EMBER_CHILDREN_MALES] > 0)
				childStats += "Ember Offspring (Males): " + flags[kFLAGS.EMBER_CHILDREN_MALES] + "\n";
			if (flags[kFLAGS.EMBER_CHILDREN_FEMALES] > 0)
				childStats += "Ember Offspring (Females): " + flags[kFLAGS.EMBER_CHILDREN_FEMALES] + "\n";
			if (flags[kFLAGS.EMBER_CHILDREN_HERMS] > 0)
				childStats += "Ember Offspring (Herms): " + flags[kFLAGS.EMBER_CHILDREN_HERMS] + "\n";
			if (getGame().emberScene.emberChildren() > 0)
				childStats += "Total Children With Ember: " + (getGame().emberScene.emberChildren()) + "\n";

			if (flags[kFLAGS.EMBER_EGGS] > 0)
				childStats += "Ember Eggs Produced: " + flags[kFLAGS.EMBER_EGGS] + "\n";

			if (getGame().isabellaScene.totalIsabellaChildren() > 0) {
				if (getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_HUMAN_BOYS) > 0)
					childStats += "Children With Isabella (Human, Males): " + getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_HUMAN_BOYS) + "\n";
				if (getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_HUMAN_GIRLS) > 0)
					childStats += "Children With Isabella (Human, Females): " + getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_HUMAN_GIRLS) + "\n";
				if (getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_HUMAN_HERMS) > 0)
					childStats += "Children With Isabella (Human, Herms): " + getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_HUMAN_HERMS) + "\n";
				if (getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_COWGIRLS) > 0)
					childStats += "Children With Isabella (Cowgirl, Females): " + getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_COWGIRLS) + "\n";
				if (getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_COWFUTAS) > 0)
					childStats += "Children With Isabella (Cowgirl, Herms): " + getGame().isabellaScene.getIsabellaChildType(IsabellaScene.OFFSPRING_COWFUTAS) + "\n";
				childStats += "Total Children With Isabella: " + getGame().isabellaScene.totalIsabellaChildren() + "\n"
			}

			if (flags[kFLAGS.IZMA_CHILDREN_SHARKGIRLS] > 0)
				childStats += "Children With Izma (Sharkgirls): " + flags[kFLAGS.IZMA_CHILDREN_SHARKGIRLS] + "\n";
			if (flags[kFLAGS.IZMA_CHILDREN_TIGERSHARKS] > 0)
				childStats += "Children With Izma (Tigersharks): " + flags[kFLAGS.IZMA_CHILDREN_TIGERSHARKS] + "\n";
			if (flags[kFLAGS.IZMA_CHILDREN_SHARKGIRLS] > 0 && flags[kFLAGS.IZMA_CHILDREN_TIGERSHARKS] > 0)
				childStats += "Total Children with Izma: " + (flags[kFLAGS.IZMA_CHILDREN_SHARKGIRLS] + flags[kFLAGS.IZMA_CHILDREN_TIGERSHARKS]) + "\n";

			if (getGame().joyScene.getTotalLitters() > 0)
				childStats += "Litters With " + (flags[kFLAGS.JOJO_BIMBO_STATE] >= 3 ? "Joy" : "Jojo") + ": " + getGame().joyScene.getTotalLitters() + "\n";

			if (flags[kFLAGS.KELLY_KIDS_MALE] > 0)
				childStats += "Children With Kelly (Males): " + flags[kFLAGS.KELLY_KIDS_MALE] + "\n";
			if (flags[kFLAGS.KELLY_KIDS] - flags[kFLAGS.KELLY_KIDS_MALE] > 0)
				childStats += "Children With Kelly (Females): " + (flags[kFLAGS.KELLY_KIDS] - flags[kFLAGS.KELLY_KIDS_MALE]) + "\n";
			if (flags[kFLAGS.KELLY_KIDS] > 0)
				childStats += "Total Children With Kelly: " + flags[kFLAGS.KELLY_KIDS] + "\n";
			//if (getGame().kihaFollower.pregnancy.isPregnant) This was originally a debug.
			//	childStats += "Kiha's Pregnancy: " + getGame().kihaFollower.pregnancy.incubation + "\n";
			if (flags[kFLAGS.KIHA_CHILDREN_BOYS] > 0)
				childStats += "Kiha Offspring (Males): " + flags[kFLAGS.KIHA_CHILDREN_BOYS] + "\n";
			if (flags[kFLAGS.KIHA_CHILDREN_GIRLS] > 0)
				childStats += "Kiha Offspring (Females): " + flags[kFLAGS.KIHA_CHILDREN_GIRLS] + "\n";
			if (flags[kFLAGS.KIHA_CHILDREN_HERMS] > 0)
				childStats += "Kiha Offspring (Herms): " + flags[kFLAGS.KIHA_CHILDREN_HERMS] + "\n";
			if (getGame().kihaFollower.totalKihaChildren() > 0)
				childStats += "Total Children With Kiha: " + getGame().kihaFollower.totalKihaChildren() + "\n";

			if (getGame().mountain.salon.lynnetteApproval() != 0)
				childStats += "Lynnette Children: " + flags[kFLAGS.LYNNETTE_BABY_COUNT] + "\n";

			if (flags[kFLAGS.MARBLE_KIDS] > 0)
				childStats += "Children With Marble: " + flags[kFLAGS.MARBLE_KIDS] + "\n";

			if (flags[kFLAGS.MINERVA_CHILDREN] > 0)
				childStats += "Children With Minerva: " + flags[kFLAGS.MINERVA_CHILDREN] + "\n";

			if (flags[kFLAGS.ANT_KIDS] > 0)
				childStats += "Ant Children With Phylla: " + flags[kFLAGS.ANT_KIDS] + "\n";
			if (flags[kFLAGS.PHYLLA_DRIDER_BABIES_COUNT] > 0)
				childStats += "Drider Children With Phylla: " + flags[kFLAGS.PHYLLA_DRIDER_BABIES_COUNT] + "\n";
			if (flags[kFLAGS.ANT_KIDS] > 0 && flags[kFLAGS.PHYLLA_DRIDER_BABIES_COUNT] > 0)
				childStats += "Total Children With Phylla: " + (flags[kFLAGS.ANT_KIDS] + flags[kFLAGS.PHYLLA_DRIDER_BABIES_COUNT]) + "\n";

			if (flags[kFLAGS.SHEILA_JOEYS] > 0)
				childStats += "Children With Sheila (Joeys): " + flags[kFLAGS.SHEILA_JOEYS] + "\n";
			if (flags[kFLAGS.SHEILA_IMPS] > 0)
				childStats += "Children With Sheila (Imps): " + flags[kFLAGS.SHEILA_IMPS] + "\n";
			if (flags[kFLAGS.SHEILA_JOEYS] > 0 && flags[kFLAGS.SHEILA_IMPS] > 0)
				childStats += "Total Children With Sheila: " + (flags[kFLAGS.SHEILA_JOEYS] + flags[kFLAGS.SHEILA_IMPS]) + "\n";

			if (flags[kFLAGS.SOPHIE_ADULT_KID_COUNT] > 0 || flags[kFLAGS.SOPHIE_DAUGHTER_MATURITY_COUNTER] > 0)
			{
				childStats += "Children With Sophie: ";
				var sophie:int = 0;
				if (flags[kFLAGS.SOPHIE_DAUGHTER_MATURITY_COUNTER] > 0) sophie++;
				sophie += flags[kFLAGS.SOPHIE_ADULT_KID_COUNT];
				if (flags[kFLAGS.SOPHIE_CAMP_EGG_COUNTDOWN] > 0) sophie++;
				childStats += sophie + "\n";
			}

			if (flags[kFLAGS.SOPHIE_EGGS_LAID] > 0)
				childStats += "Eggs Fertilized For Sophie: " + (flags[kFLAGS.SOPHIE_EGGS_LAID] + sophie) + "\n";

			if (flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] > 0)
				childStats += "Children With Tamani: " + flags[kFLAGS.TAMANI_NUMBER_OF_DAUGHTERS] + " (after all forms of natural selection)\n";

			if (getGame().urtaPregs.urtaKids() > 0)
				childStats += "Children With Urta: " + getGame().urtaPregs.urtaKids() + "\n";

			//Mino sons
			if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00326] > 0)
				childStats += "Number of Adult Minotaur Offspring: " + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00326] + "\n";

			if (childStats != "")
				outputText("\nChildren\n" + childStats, false);
			// End Children Stats

			// Begin Body Stats
			var bodyStats:String = "";

			if (flags[kFLAGS.HUNGER_ENABLED] > 0 || flags[kFLAGS.IN_PRISON] > 0)
			{
				bodyStats += "Satiety: " + Math.floor(player.hunger) + " / 100 (";
				if (player.hunger <= 0) bodyStats += "Dying";
				if (player.hunger > 0 && player.hunger < 10) bodyStats += "Starving";
				if (player.hunger >= 10 && player.hunger < 25) bodyStats += "Very hungry";
				if (player.hunger >= 25 && player.hunger < 50) bodyStats += "Hungry";
				if (player.hunger >= 50 && player.hunger < 75) bodyStats += "Not hungry";
				if (player.hunger >= 75 && player.hunger < 90) bodyStats += "Satiated";
				if (player.hunger >= 90 && player.hunger < 100) bodyStats += "Full";
				if (player.hunger >= 100) bodyStats += "Very full";
				bodyStats += ")\n";
			}

			bodyStats += "Anal Capacity: " + Math.round(player.analCapacity()) + "\n";
			bodyStats += "Anal Looseness: " + Math.round(player.ass.analLooseness) + "\n";

			bodyStats += "Fertility (Base) Rating: " + Math.round(player.fertility) + "\n";
			bodyStats += "Fertility (With Bonuses) Rating: " + Math.round(player.totalFertility()) + "\n";

			if (player.cumQ() > 0)
				bodyStats += "Virility Rating: " + Math.round(player.virilityQ() * 100) + "\n";
				if (flags[kFLAGS.HUNGER_ENABLED] >= 1) bodyStats += "Cum Production: " + addComma(Math.round(player.cumQ())) + " / " + addComma(Math.round(player.cumCapacity())) + "mL (" + Math.round((player.cumQ() / player.cumCapacity()) * 100) + "%) \n";
				else bodyStats += "Cum Production: " + addComma(Math.round(player.cumQ())) + "mL\n";
			if (player.lactationQ() > 0)
				bodyStats += "Milk Production: " + addComma(Math.round(player.lactationQ())) + "mL\n";

			if (player.findStatusEffect(StatusEffects.Feeder) >= 0) {
				bodyStats += "Hours Since Last Time Breastfed Someone:  " + player.statusEffectv2(StatusEffects.Feeder);
				if (player.statusEffectv2(StatusEffects.Feeder) >= 72)
					bodyStats += " (Too long! Sensitivity Increasing!)";

				bodyStats += "\n";
			}

			bodyStats += "Pregnancy Speed Multiplier: ";
			var preg:Number = 1;
			if (player.findPerk(PerkLib.Diapause) >= 0)
				bodyStats += "? (Variable due to Diapause)\n";
			else {
				if (player.findPerk(PerkLib.MaraesGiftFertility) >= 0) preg++;
				if (player.findPerk(PerkLib.BroodMother) >= 0) preg++;
				if (player.findPerk(PerkLib.FerasBoonBreedingBitch) >= 0) preg++;
				if (player.findPerk(PerkLib.MagicalFertility) >= 0) preg++;
				if (player.findPerk(PerkLib.FerasBoonWideOpen) >= 0 || player.findPerk(PerkLib.FerasBoonMilkingTwat) >= 0) preg++;
				bodyStats += preg + "\n";
			}

			if (player.cocks.length > 0) {
				bodyStats += "Total Cocks: " + player.cocks.length + "\n";

				var totalCockLength:Number = 0;
				var totalCockGirth:Number = 0;

				for (var i:Number = 0; i < player.cocks.length; i++) {
						totalCockLength += player.cocks[i].cockLength;
						totalCockGirth += player.cocks[i].cockThickness
				}

				bodyStats += "Total Cock Length: " + Math.round(totalCockLength) + " inches\n";
				bodyStats += "Total Cock Girth: " + Math.round(totalCockGirth) + " inches\n";

			}

			if (player.vaginas.length > 0)
				bodyStats += "Vaginal Capacity: " + Math.round(player.vaginalCapacity()) + "\n" + "Vaginal Looseness: " + Math.round(player.looseness()) + "\n";

			if (player.findPerk(PerkLib.SpiderOvipositor) >= 0 || player.findPerk(PerkLib.BeeOvipositor) >= 0)
				bodyStats += "Ovipositor Total Egg Count: " + player.eggs() + "\nOvipositor Fertilized Egg Count: " + player.fertilizedEggs() + "\n";

			if (player.findStatusEffect(StatusEffects.SlimeCraving) >= 0) {
				if (player.statusEffectv1(StatusEffects.SlimeCraving) >= 18)
					bodyStats += "Slime Craving: Active! You are currently losing strength and speed.  You should find fluids.\n";
				else {
					if (player.findPerk(PerkLib.SlimeCore) >= 0)
						bodyStats += "Slime Stored: " + ((17 - player.statusEffectv1(StatusEffects.SlimeCraving)) * 2) + " hours until you start losing strength.\n";
					else
						bodyStats += "Slime Stored: " + (17 - player.statusEffectv1(StatusEffects.SlimeCraving)) + " hours until you start losing strength.\n";
				}
			}

			if (bodyStats != "")
				outputText("\nBody Stats\n" + bodyStats, false);
			// End Body Stats

			// Begin Misc Stats
			var miscStats:String = "";

			if (camp.getCampPopulation() > 0)
				miscStats += "Camp Population: " + camp.getCampPopulation() + "\n";

			if (flags[kFLAGS.CORRUPTED_GLADES_DESTROYED] > 0) {
				if (flags[kFLAGS.CORRUPTED_GLADES_DESTROYED] < 100)
					miscStats += "Corrupted Glades Status: " + (100 - flags[kFLAGS.CORRUPTED_GLADES_DESTROYED]) + "% remaining\n";
				else
					miscStats += "Corrupted Glades Status: Extinct\n";
			}

			if (flags[kFLAGS.EGGS_BOUGHT] > 0)
				miscStats += "Eggs Traded For: " + flags[kFLAGS.EGGS_BOUGHT] + "\n";

			if (flags[kFLAGS.TIMES_AUTOFELLATIO_DUE_TO_CAT_FLEXABILITY] > 0)
				miscStats += "Times Had Fun with Feline Flexibility: " + flags[kFLAGS.TIMES_AUTOFELLATIO_DUE_TO_CAT_FLEXABILITY] + "\n";

			if (flags[kFLAGS.FAP_ARENA_SESSIONS] > 0)
				miscStats += "Times Circle Jerked in the Arena: " + flags[kFLAGS.FAP_ARENA_SESSIONS] + "\nVictories in the Arena: " + flags[kFLAGS.FAP_ARENA_VICTORIES] + "\n";

			if (flags[kFLAGS.SPELLS_CAST] > 0)
				miscStats += "Spells Cast: " + flags[kFLAGS.SPELLS_CAST] + "\n";

			if (flags[kFLAGS.TIMES_BAD_ENDED] > 0)
				miscStats += "Times Bad-Ended: " + flags[kFLAGS.TIMES_BAD_ENDED] + "\n";

			if (flags[kFLAGS.TIMES_ORGASMED] > 0)
				miscStats += "Times Orgasmed: " + flags[kFLAGS.TIMES_ORGASMED] + "\n";

			if (miscStats != "")
				outputText("\nMiscellaneous Stats\n" + miscStats);
			// End Misc Stats

			// Begin Addition Stats
			var addictStats:String = "";
			//Marble Milk Addition
			if (player.statusEffectv3(StatusEffects.Marble) > 0) {
				addictStats += "Marble Milk: ";
				if (player.findPerk(PerkLib.MarbleResistant) < 0 && player.findPerk(PerkLib.MarblesMilk) < 0)
					addictStats += Math.round(player.statusEffectv2(StatusEffects.Marble)) + "%\n";
				else if (player.findPerk(PerkLib.MarbleResistant) >= 0)
					addictStats += "0%\n";
				else
					addictStats += "100%\n";
			}

			// Corrupted Minerva's Cum Addiction
			if (flags[kFLAGS.MINERVA_CORRUPTION_PROGRESS] >= 10 && flags[kFLAGS.MINERVA_CORRUPTED_CUM_ADDICTION] > 0) {
				addictStats += "Minerva's Cum: " + (flags[kFLAGS.MINERVA_CORRUPTED_CUM_ADDICTION] * 20) + "%";
			}

			// Mino Cum Addiction
			if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00340] > 0 || flags[kFLAGS.MINOTAUR_CUM_ADDICTION_TRACKER] > 0 || player.findPerk(PerkLib.MinotaurCumAddict) >= 0 || player.findPerk(PerkLib.MinotaurCumResistance) >= 0) {
				if (player.findPerk(PerkLib.MinotaurCumAddict) < 0)
					addictStats += "Minotaur Cum: " + Math.round(flags[kFLAGS.MINOTAUR_CUM_ADDICTION_TRACKER] * 10)/10 + "%\n";
				else if (player.findPerk(PerkLib.MinotaurCumResistance) >= 0)
					addictStats += "Minotaur Cum: 0% (Immune)\n";
				else
					addictStats += "Minotaur Cum: 100+%\n";
			}

			if (addictStats != "")
				outputText("\nAddictions\n" + addictStats, false);
			// End Addition Stats

			// Begin Interpersonal Stats
			var interpersonStats:String = "";

			if (flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] > 0) {
				interpersonStats += "Anzu Affection: " + flags[kFLAGS.ANZU_AFFECTION] + "%\n";
				interpersonStats += "Anzu's Relationship Level: " + (flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] == 1 ? "Acquaintances" : flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] == 2 ? "Friend" : flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] == 3 ? "Close Friend" : flags[kFLAGS.ANZU_RELATIONSHIP_LEVEL] == 4 ? "Lover" : "Undefined") + "\n";
			}

			if (flags[kFLAGS.ARIAN_PARK] > 0)
				interpersonStats += "Arian's Health: " + Math.round(getGame().arianScene.arianHealth()) + "\n";

			if (flags[kFLAGS.ARIAN_VIRGIN] > 0)
				interpersonStats += "Arian Sex Counter: " + Math.round(flags[kFLAGS.ARIAN_VIRGIN]) + "\n";

			if (getGame().bazaar.benoit.benoitAffection() > 0)
				interpersonStats += "" + getGame().bazaar.benoit.benoitMF("Benoit", "Benoite") + " Affection: " + Math.round(getGame().bazaar.benoit.benoitAffection()) + "%\n";

			if (flags[kFLAGS.BROOKE_MET] > 0)
				interpersonStats += "Brooke Affection: " + Math.round(getGame().telAdre.brooke.brookeAffection()) + "\n";

			if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00218] + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00219] + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00220] > 0)
				interpersonStats += "Body Parts Taken By Ceraph: " + (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00218] + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00219] + flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00220]) + "\n";

			if (getGame().emberScene.emberAffection() > 0)
				interpersonStats += "Ember Affection: " + Math.round(getGame().emberScene.emberAffection()) + "%\n";
			if (getGame().emberScene.emberSparIntensity() > 0)
				interpersonStats += "Ember Spar Intensity: " + getGame().emberScene.emberSparIntensity() + "\n";

			if (getGame().helFollower.helAffection() > 0)
				interpersonStats += "Helia Affection: " + Math.round(getGame().helFollower.helAffection()) + "%\n";
			if (getGame().helFollower.helAffection() >= 100)
				interpersonStats += "Helia Bonus Points: " + Math.round(flags[kFLAGS.HEL_BONUS_POINTS]) + "\n";

			if (flags[kFLAGS.ISABELLA_AFFECTION] > 0) {
				interpersonStats += "Isabella Affection: ";

				if (!getGame().isabellaFollowerScene.isabellaFollower())
					interpersonStats += Math.round(flags[kFLAGS.ISABELLA_AFFECTION]) + "%\n", false;
				else
					interpersonStats += "100%\n";
			}

			if (flags[kFLAGS.JOJO_BIMBO_STATE] >= 3) {
				interpersonStats += "Joy's Intelligence: " + flags[kFLAGS.JOY_INTELLIGENCE];
				if (flags[kFLAGS.JOY_INTELLIGENCE] >= 50) interpersonStats += " (MAX)"
				interpersonStats += "\n";
			}

			if (flags[kFLAGS.KATHERINE_UNLOCKED] >= 4) {
				interpersonStats += "Katherine Submissiveness: " + getGame().telAdre.katherine.submissiveness() + "\n";
			}

			if (player.findStatusEffect(StatusEffects.Kelt) >= 0 && flags[kFLAGS.KELT_BREAK_LEVEL] == 0 && flags[kFLAGS.KELT_KILLED] == 0) {
				if (player.statusEffectv2(StatusEffects.Kelt) >= 130)
					interpersonStats += "Submissiveness To Kelt: " + 100 + "%\n";
				else
					interpersonStats += "Submissiveness To Kelt: " + Math.round(player.statusEffectv2(StatusEffects.Kelt) / 130 * 100) + "%\n";

			}

			if (flags[kFLAGS.ANEMONE_KID] > 0)
				interpersonStats += "Kid A's Confidence: " + getGame().anemoneScene.kidAXP() + "%\n";

			if (flags[kFLAGS.KIHA_AFFECTION_LEVEL] == 2) {
				if (getGame().kihaFollower.followerKiha())
					interpersonStats += "Kiha Affection: " + 100 + "%\n";
				else
					interpersonStats += "Kiha Affection: " + Math.round(flags[kFLAGS.KIHA_AFFECTION]) + "%\n";
			}
			//Lottie stuff
			if (flags[kFLAGS.UNKNOWN_FLAG_NUMBER_00281] > 0)
				interpersonStats += "Lottie's Encouragement: " + getGame().telAdre.lottie.lottieMorale() + " (higher is better)\n" + "Lottie's Figure: " + getGame().telAdre.lottie.lottieTone() + " (higher is better)\n";

			if (getGame().mountain.salon.lynnetteApproval() != 0)
				interpersonStats += "Lynnette's Approval: " + getGame().mountain.salon.lynnetteApproval() + "\n";

			if (flags[kFLAGS.OWCAS_ATTITUDE] > 0)
				interpersonStats += "Owca's Attitude: " + flags[kFLAGS.OWCAS_ATTITUDE] + "\n";

			if (getGame().telAdre.rubi.rubiAffection() > 0)
				interpersonStats += "Rubi's Affection: " + Math.round(getGame().telAdre.rubi.rubiAffection()) + "%\n" + "Rubi's Orifice Capacity: " + Math.round(getGame().telAdre.rubi.rubiCapacity()) + "%\n";

			if (flags[kFLAGS.SHEILA_XP] != 0) {
				interpersonStats += "Sheila's Corruption: " + getGame().sheilaScene.sheilaCorruption();
				if (getGame().sheilaScene.sheilaCorruption() > 100)
					interpersonStats += " (Yes, it can go above 100)";
				interpersonStats += "\n";
			}

			if (getGame().valeria.valeriaFluidsEnabled()) {
				interpersonStats += "Valeria's Fluid: " + flags[kFLAGS.VALERIA_FLUIDS] + "%\n"
			}

			if (flags[kFLAGS.URTA_COMFORTABLE_WITH_OWN_BODY] != 0) {
				if (getGame().urta.urtaLove()) {
					if (flags[kFLAGS.URTA_QUEST_STATUS] == -1) interpersonStats += "Urta Status: Gone\n";
					if (flags[kFLAGS.URTA_QUEST_STATUS] == 0) interpersonStats += "Urta Status: Lover\n";
					if (flags[kFLAGS.URTA_QUEST_STATUS] == 1) interpersonStats += "Urta Status: Lover+\n";
				}
				else if (flags[kFLAGS.URTA_COMFORTABLE_WITH_OWN_BODY] == -1)
					interpersonStats += "Urta Status: Ashamed\n";
				else if (flags[kFLAGS.URTA_PC_AFFECTION_COUNTER] < 30)
					interpersonStats += "Urta's Affection: " + Math.round(flags[kFLAGS.URTA_PC_AFFECTION_COUNTER] * 3.3333) + "%\n";
				else
					interpersonStats += "Urta Status: Ready To Confess Love\n";
			}

			if (interpersonStats != "")
				outputText("\nInterpersonal Stats\n" + interpersonStats, false);
			// End Interpersonal Stats

			// Begin Ongoing Stat Effects
			var statEffects:String = "";

			if (player.inHeat)
				statEffects += "Heat - " + Math.round(player.statusEffectv3(StatusEffects.Heat)) + " hours remaining\n";

			if (player.inRut)
				statEffects += "Rut - " + Math.round(player.statusEffectv3(StatusEffects.Rut)) + " hours remaining\n";

			if (player.statusEffectv1(StatusEffects.ParasiteSlug) > 0)
				statEffects += "Slug - " + Math.round(player.statusEffectv1(StatusEffects.ParasiteSlug)) + " stage\n";

			if (player.statusEffectv1(StatusEffects.Luststick) > 0)
				statEffects += "Luststick - " + Math.round(player.statusEffectv1(StatusEffects.Luststick)) + " hours remaining\n";

			if (player.statusEffectv1(StatusEffects.LustStickApplied) > 0)
				statEffects += "Luststick Application - " + Math.round(player.statusEffectv1(StatusEffects.LustStickApplied)) + " hours remaining\n";

			if (player.statusEffectv1(StatusEffects.LustyTongue) > 0)
				statEffects += "Lusty Tongue - " + Math.round(player.statusEffectv1(StatusEffects.LustyTongue)) + " hours remaining\n";

			if (player.statusEffectv1(StatusEffects.BlackCatBeer) > 0)
				statEffects += "Black Cat Beer - " + player.statusEffectv1(StatusEffects.BlackCatBeer) + " hours remaining (Lust resistance 20% lower, physical resistance 25% higher.)\n";

			if (player.statusEffectv1(StatusEffects.AndysSmoke) > 0)
				statEffects += "Andy's Pipe Smoke - " + player.statusEffectv1(StatusEffects.AndysSmoke) + " hours remaining (Speed temporarily lowered, intelligence temporarily increased.)\n";

			if (player.statusEffectv1(StatusEffects.IzumisPipeSmoke) > 0)
				statEffects += "Izumi's Pipe Smoke - " + player.statusEffectv1(StatusEffects.IzumisPipeSmoke) + " hours remaining. (Speed temporarily lowered.)\n";

			if (player.statusEffectv1(StatusEffects.UmasMassage) > 0)
				statEffects += "Uma's Massage - " + player.statusEffectv3(StatusEffects.UmasMassage) + " hours remaining.\n";

			if (player.statusEffectv1(StatusEffects.Dysfunction) > 0)
				statEffects += "Dysfunction - " + player.statusEffectv1(StatusEffects.Dysfunction) + " hours remaining. (Disables masturbation)\n";

			if (statEffects != "")
				outputText("\nOngoing Status Effects\n" + statEffects, false);
			// End Ongoing Stat Effects
			menu();
			if (player.statPoints > 0) {
				outputText("\n\nYou have " + num2Text(player.statPoints) + " attribute point" + (player.statPoints == 1 ? "" : "s") + " to distribute.");
				addButton(1, "Stat Up", attributeMenu);
			}
			doNext(playerMenu);
		}

		//------------
		// PERKS
		//------------
		public function displayPerks():void {
			clearOutput();
			displayHeader("Perks");
			for (var i:int = 0; i < player.perks.length; i++) {
				outputText("" + player.perks[i].perkName + " - " + player.perks[i].perkDesc + "\n", false);
			}
			menu();
			var button:int = 0;
			addButton(button++, "Next", playerMenu);
			if (player.perkPoints > 0) {
				outputText("\nYou have " + num2Text(player.perkPoints) + " perk point", false);
				if (player.perkPoints > 1) outputText("s", false);
				outputText(" to spend.", false);
				addButton(button++, "Perk Up", perkBuyMenu);
			}
			if (player.findPerk(PerkLib.DoubleAttack) >= 0) {
				outputText("\nYou can adjust your double attack settings.");
				addButton(button++,"Dbl Options",doubleAttackOptions);
			}
		}

		public function doubleAttackOptions():void {
			clearOutput();
			menu();
			if (flags[kFLAGS.DOUBLE_ATTACK_STYLE] == 0) {
				outputText("You will currently always double attack in combat.  If your strength exceeds sixty, your double-attacks will be done at sixty strength in order to double-attack.");
				outputText("\n\nYou can change it to double attack until sixty strength and then dynamicly switch to single attacks.");
				outputText("\nYou can change it to always single attack.");
			}
			else if (flags[kFLAGS.DOUBLE_ATTACK_STYLE] == 1) {
				outputText("You will currently double attack until your strength exceeds sixty, and then single attack.");
				outputText("\n\nYou can choose to force double attacks at reduced strength (when over sixty, it makes attacks at a strength of sixty.");
				outputText("\nYou can change it to always single attack.");
			}
			else {
				outputText("You will always single attack your foes in combat.");
				outputText("\n\nYou can choose to force double attacks at reduced strength (when over sixty, it makes attacks at a strength of sixty.");
				outputText("\nYou can change it to double attack until sixty strength and then switch to single attacks.");
			}
			if (flags[kFLAGS.DOUBLE_ATTACK_STYLE] != 0) addButton(0, "All Double", doubleAttackForce);
			if (flags[kFLAGS.DOUBLE_ATTACK_STYLE] != 1) addButton(1, "Dynamic", doubleAttackDynamic);
			if (flags[kFLAGS.DOUBLE_ATTACK_STYLE] != 2) addButton(2, "Single", doubleAttackOff);
			addButton(4, "Back", displayPerks);
		}

		public function doubleAttackForce():void {
			flags[kFLAGS.DOUBLE_ATTACK_STYLE] = 0;
			doubleAttackOptions();
		}
		public function doubleAttackDynamic():void {
			flags[kFLAGS.DOUBLE_ATTACK_STYLE] = 1;
			doubleAttackOptions();
		}
		public function doubleAttackOff():void {
			flags[kFLAGS.DOUBLE_ATTACK_STYLE] = 2;
			doubleAttackOptions();
		}

		//------------
		// LEVEL UP
		//------------
		public function levelUpGo():void {
			clearOutput();
			hideMenus();
			//Level up
			if (player.XP >= player.requiredXP() && player.level < getGame().levelCap) {
				player.XP -= player.requiredXP();
				player.level++;
				player.perkPoints++;
				player.statPoints += 5;
				if (player.level % 2 == 0) player.ascensionPerkPoints++;
				outputText("You are now level " + num2Text(player.level) + "!\n\nYou have gained five attribute points and one perk point!");
				doNext(attributeMenu);
			}
			//Spend attribute points
			else if (player.statPoints > 0) {
				attributeMenu();
			}
			//Spend perk points
			else if (player.perkPoints > 0) {
				perkBuyMenu();
			}
			else {
				outputText("ERROR.  LEVEL UP PUSHED WHEN PC CANNOT LEVEL OR GAIN PERKS.  PLEASE REPORT THE STEPS TO REPRODUCE THIS BUG TO FENOXO@GMAIL.COM OR THE FENOXO.COM BUG REPORT FORUM.");
				doNext(playerMenu);
			}
		}

		//Attribute menu
		private function attributeMenu():void {
			clearOutput();
			outputText("You have " + (player.statPoints) + " left to spend.\n\n");

			outputText("Strength: ");
			if (player.str < player.getMaxStats("str")) outputText("" + Math.floor(player.str) + " + " + player.tempStr + " → " + Math.floor(player.str + player.tempStr) + "\n");
			else outputText("" + Math.floor(player.str) + " (Maximum)\n");

			outputText("Toughness: ");
			if (player.tou < player.getMaxStats("tou")) outputText("" + Math.floor(player.tou) + " + " + player.tempTou + " → " + Math.floor(player.tou + player.tempTou) + "\n");
			else outputText("" + Math.floor(player.tou) + " (Maximum)\n");

			outputText("Speed: ");
			if (player.spe < player.getMaxStats("spe")) outputText("" + Math.floor(player.spe) + " + " + player.tempSpe + " → " + Math.floor(player.spe + player.tempSpe) + "\n");
			else outputText("" + Math.floor(player.spe) + " (Maximum)\n");

			outputText("Intelligence: ");
			if (player.inte < player.getMaxStats("int")) outputText("" + Math.floor(player.inte) + " + " + player.tempInt + " → " + Math.floor(player.inte + player.tempInt) + "\n");
			else outputText("" + Math.floor(player.inte) + " (Maximum)\n");

			menu();
			//Add
			if (player.statPoints > 0) {
				if ((player.str + player.tempStr) < player.getMaxStats("str")) addButton(0, "Add STR", addAttribute, "str", null, null, "Add 1 point to Strength.", "Add Strength");
				if ((player.tou + player.tempTou) < player.getMaxStats("tou")) addButton(1, "Add TOU", addAttribute, "tou", null, null, "Add 1 point to Toughness.", "Add Toughness");
				if ((player.spe + player.tempSpe) < player.getMaxStats("spe")) addButton(2, "Add SPE", addAttribute, "spe", null, null, "Add 1 point to Speed.", "Add Speed");
				if ((player.inte + player.tempInt) < player.getMaxStats("int")) addButton(3, "Add INT", addAttribute, "int", null, null, "Add 1 point to Intelligence.", "Add Intelligence");
			}
			//Subtract
			if (player.tempStr > 0) addButton(5, "Sub STR", subtractAttribute, "str", null, null, "Subtract 1 point from Strength.", "Subtract Strength");
			if (player.tempTou > 0) addButton(6, "Sub TOU", subtractAttribute, "tou", null, null, "Subtract 1 point from Toughness.", "Subtract Toughness");
			if (player.tempSpe > 0) addButton(7, "Sub SPE", subtractAttribute, "spe", null, null, "Subtract 1 point from Speed.", "Subtract Speed");
			if (player.tempInt > 0) addButton(8, "Sub INT", subtractAttribute, "int", null, null, "Subtract 1 point from Intelligence.", "Subtract Intelligence");

			addButton(4, "Reset", resetAttributes);
			addButton(9, "Done", finishAttributes);
		}

		private function addAttribute(attribute:String):void {
			switch(attribute) {
				case "str":
					player.tempStr++;
					break;
				case "tou":
					player.tempTou++;
					break;
				case "spe":
					player.tempSpe++;
					break;
				case "int":
					player.tempInt++;
					break;
				default:
					player.statPoints++; //Failsafe
			}
			player.statPoints--;
			attributeMenu();
		}
		private function subtractAttribute(attribute:String):void {
			switch(attribute) {
				case "str":
					player.tempStr--;
					break;
				case "tou":
					player.tempTou--;
					break;
				case "spe":
					player.tempSpe--;
					break;
				case "int":
					player.tempInt--;
					break;
				default:
					player.statPoints--; //Failsafe
			}
			player.statPoints++;
			attributeMenu();
		}
		private function resetAttributes():void {
			//Increment unspent attribute points.
			player.statPoints += player.tempStr;
			player.statPoints += player.tempTou;
			player.statPoints += player.tempSpe;
			player.statPoints += player.tempInt;
			//Reset temporary attributes to 0.
			player.tempStr = 0;
			player.tempTou = 0;
			player.tempSpe = 0;
			player.tempInt = 0;
			//DONE!
			attributeMenu();
		}
		private function finishAttributes():void {
			clearOutput()
			if (player.tempStr > 0)
			{
				if (player.tempStr >= 3) outputText("Your muscles feel significantly stronger from your time adventuring.\n");
				else outputText("Your muscles feel slightly stronger from your time adventuring.\n");
			}
			if (player.tempTou > 0)
			{
				if (player.tempTou >= 3) outputText("You feel tougher from all the fights you have endured.\n");
				else outputText("You feel slightly tougher from all the fights you have endured.\n");
			}
			if (player.tempSpe > 0)
			{
				if (player.tempSpe >= 3) outputText("Your time in combat has driven you to move faster.\n");
				else outputText("Your time in combat has driven you to move slightly faster.\n");
			}
			if (player.tempInt > 0)
			{
				if (player.tempInt >= 3) outputText("Your time spent fighting the creatures of this realm has sharpened your wit.\n");
				else outputText("Your time spent fighting the creatures of this realm has sharpened your wit slightly.\n");
			}
			if (player.tempStr + player.tempTou + player.tempSpe + player.tempInt <= 0 || player.statPoints > 0)
			{
				outputText("\nYou may allocate your remaining stat points later.", false);
			}
			dynStats("str", player.tempStr, "tou", player.tempTou, "spe", player.tempSpe, "int", player.tempInt, "noBimbo", true); //Ignores bro/bimbo perks.
			player.tempStr = 0;
			player.tempTou = 0;
			player.tempSpe = 0;
			player.tempInt = 0;
			if (player.perkPoints > 0)
				doNext(perkBuyMenu);
			else
				doNext(playerMenu);
		}

		//Perk menu
		private function perkBuyMenu():void {
			clearOutput();
			var perkList:Array = buildPerkList();

			if (perkList.length == 0) {
				outputText("You do not qualify for any perks at present.  In case you qualify for any in the future, you will keep your " + num2Text(player.perkPoints) + " perk point");
				if (player.perkPoints > 1) outputText("s");
				outputText(".");
				doNext(playerMenu);
				return;
			}
			outputText("Please select a perk from the drop-down list, then click 'Okay'.  You can press 'Skip' to save your perk point for later.\n\n");
			mainView.aCb.x = 210;
			mainView.aCb.y = 112;

			if (mainView.aCb.parent == null) {
				mainView.addChild(mainView.aCb);
				mainView.aCb.visible = true;
			}
			menu();
			addButton(1, "Skip", perkSkip);
		}
		private function perkSelect(selected:PerkClass):void {
			mainView.stage.focus = null;
			if (mainView.aCb.parent != null) {
				mainView.removeChild(mainView.aCb);
				applyPerk(selected);
			}
		}
		private function perkSkip():void {
			mainView.stage.focus = null;
			if (mainView.aCb.parent != null) {
				mainView.removeChild(mainView.aCb);
				playerMenu();
			}
		}

		public function changeHandler(event:Event):void {
			//Store perk name for later addition
			clearOutput();
			var selected:PerkClass = ComboBox(event.target).selectedItem.perk;
			mainView.aCb.move(210, 85);
			outputText("You have selected the following perk:\n\n");
			outputText("" + selected.perkName + ": " + selected.perkLongDesc + "\n\nIf you would like to select this perk, click Okay.  Otherwise, select a new perk, or press Skip to make a decision later.");
			menu();
			addButton(0, "Okay", perkSelect, selected);
			addButton(1, "Skip", perkSkip);
		}

		public function buildPerkList():Array {
			var perkList:Array = [];
			function _add(p:PerkClass):void{
				perkList.push({label: p.perkName,perk:p});
			}
			//------------
			// STRENGTH
			//------------
			if (player.str >= 25) {
				_add(new PerkClass(PerkLib.StrongBack));
			}
			if (player.findPerk(PerkLib.StrongBack) >= 0 && player.str >= 50) {
				_add(new PerkClass(PerkLib.StrongBack2));
			}
			//Tier 1 Strength Perks
			if (player.level >= 6) {
				//Thunderous Strikes - +20% basic attack damage while str > 80.
				if (player.str >= 80) {
					_add(new PerkClass(PerkLib.ThunderousStrikes));
				}
				//Weapon Mastery - Doubles weapon damage bonus of 'large' type weapons. (Minotaur Axe, M. Hammer, etc)
				if (player.str > 60) {
					_add(new PerkClass(PerkLib.WeaponMastery));
				}
				if (player.str >= 75)
					_add(new PerkClass(PerkLib.BrutalBlows));
				if (player.str >= 50)
					_add(new PerkClass(PerkLib.IronFists));
				if (player.str >= 65 && player.findPerk(PerkLib.IronFists) >= 0 && player.newGamePlusMod() >= 1)
					_add(new PerkClass(PerkLib.IronFists2));
				if (player.str >= 80 && player.findPerk(PerkLib.IronFists2) >= 0 && player.newGamePlusMod() >= 1)
					_add(new PerkClass(PerkLib.IronFists3));
				if (player.str >= 50 && player.spe >= 50)
					_add(new PerkClass(PerkLib.Parry));
			}
			//Tier 2 Strength Perks
			if (player.level >= 12) {
				if (player.str >= 75)
					_add(new PerkClass(PerkLib.Berzerker));
				if (player.str >= 80)
					_add(new PerkClass(PerkLib.HoldWithBothHands));
				if (player.str >= 80 && player.tou >= 60)
					_add(new PerkClass(PerkLib.ShieldSlam));
			}
			//Tier 3 Strength Perks
			if (player.level >= 18) {
				if (player.findPerk(PerkLib.Berzerker) >= 0 && player.findPerk(PerkLib.ImprovedSelfControl) >= 0 && player.str >= 75)
					_add(new PerkClass(PerkLib.ColdFury));
			}
			//------------
			// TOUGHNESS
			//------------
			//slot 2 - toughness perk 1
			if (player.findPerk(PerkLib.Tank) < 0 && player.tou >= 25) {
				_add(new PerkClass(PerkLib.Tank));
			}
			//slot 2 - regeneration perk
			if (player.findPerk(PerkLib.Tank) >= 0 && player.tou >= 50) {
				_add(new PerkClass(PerkLib.Regeneration));
			}
			if (player.tou >= 50 && player.str >= 50) {
				_add(new PerkClass(PerkLib.ImprovedEndurance));
			}
			//Tier 1 Toughness Perks
			if (player.level >= 6) {
				if (player.findPerk(PerkLib.Tank) >= 0 && player.tou >= 60) {
					_add(new PerkClass(PerkLib.Tank2));
				}
				if (player.findPerk(PerkLib.Regeneration) >= 0 && player.tou >= 70) {
					_add(new PerkClass(PerkLib.Regeneration2));
				}
				if (player.tou >= 75) {
					_add(new PerkClass(PerkLib.ImmovableObject));
				}
				if (player.tou >= 50) {
					_add(new PerkClass(PerkLib.ShieldMastery));
				}
			}
			//Tier 2 Toughness Perks
			if (player.level >= 12) {
				if (player.tou >= 75) {
					_add(new PerkClass(PerkLib.Resolute));
				}
				if (player.tou >= 75) {
					_add(new PerkClass(PerkLib.Juggernaut));
				}
				if (player.tou >= 60) {
					_add(new PerkClass(PerkLib.IronMan));
				}
			}
			//------------
			// SPEED
			//------------
			//slot 3 - speed perk
			if (player.spe >= 25) {
					_add(new PerkClass(PerkLib.Evade));
			}
			//slot 3 - run perk
			if (player.spe >= 25) {
					_add(new PerkClass(PerkLib.Runner));
			}
			//slot 3 - Double Attack perk
			if (player.findPerk(PerkLib.Evade) >= 0 && player.findPerk(PerkLib.Runner) >= 0 && player.spe >= 50) {
					_add(new PerkClass(PerkLib.DoubleAttack));
			}

			//Tier 1 Speed Perks
			if (player.level >= 6) {
				//Speedy Recovery - Regain Fatigue 50% faster speed.
				if (player.findPerk(PerkLib.Evade) >= 0 && player.spe >= 60) {
					_add(new PerkClass(PerkLib.SpeedyRecovery));
				}
				//Agility - A small portion of your speed is applied to your defense rating when wearing light armors.
				if (player.spe > 75 && player.findPerk(PerkLib.Runner) >= 0) {
					_add(new PerkClass(PerkLib.Agility));
				}
				if (player.spe >= 75 && player.findPerk(PerkLib.Evade) >= 0 && player.findPerk(PerkLib.Agility) >= 0) {
						_add(new PerkClass(PerkLib.Unhindered));
				}
				if (player.spe >= 60) {
					_add(new PerkClass(PerkLib.LightningStrikes));
				}
				/*if (player.spe >= 60 && player.str >= 60) {
					_add(new PerkClass(PerkLib.Brawler));
				}*/ //Would it be fitting to have Urta teach you?
			}
			//Tier 2 Speed Perks
			if (player.level >= 12) {
				if (player.spe >= 75) {
					_add(new PerkClass(PerkLib.LungingAttacks));
				}
				if (player.spe >= 80 && player.str >= 60) {
					_add(new PerkClass(PerkLib.Blademaster));
				}
			}
			//------------
			// INTELLIGENCE
			//------------
			//Slot 4 - precision - -10 enemy toughness for damage calc
			if (player.inte >= 25) {
					_add(new PerkClass(PerkLib.Precision));
			}
			//Spellpower - boosts spell power
			if (player.inte >= 50) {
					_add(new PerkClass(PerkLib.Spellpower));
			}
			if (player.findPerk(PerkLib.Spellpower) >= 0 && player.inte >= 50) {
					_add(new PerkClass(PerkLib.Mage));
			}
			//Tier 1 Intelligence Perks
			if (player.level >= 6) {
				if (player.inte >= 50)
					_add(new PerkClass(PerkLib.Tactician));
				if (player.spellCount() > 0 && player.findPerk(PerkLib.Spellpower) >= 0 && player.findPerk(PerkLib.Mage) >= 0 && player.inte >= 60) {
					_add(new PerkClass(PerkLib.Channeling));
				}
				if (player.inte >= 60) {
					_add(new PerkClass(PerkLib.Medicine));
				}
				if (player.findPerk(PerkLib.Channeling) >= 0 && player.inte >= 60) {
						_add(new PerkClass(PerkLib.StaffChanneling));
				}
			}
			//Tier 2 Intelligence perks
			if (player.level >= 12) {
				if (player.findPerk(PerkLib.Mage) >= 0 && player.inte >= 75) {
					_add(new PerkClass(PerkLib.Archmage));
				}
				if (player.inte >= 75) {
						if (player.findPerk(PerkLib.Mage) >= 0)
							_add(new PerkClass(PerkLib.FocusedMind));

						if (player.findPerk(PerkLib.Archmage) >= 0 && player.findPerk(PerkLib.Channeling) >= 0  &&
						(player.findStatusEffect(StatusEffects.KnowsWhitefire) >= 0
						|| player.findPerk(PerkLib.FireLord) >= 0
						|| player.findPerk(PerkLib.Hellfire) >= 0
						|| player.findPerk(PerkLib.EnlightenedNinetails) >= 0
						|| player.findPerk(PerkLib.CorruptedNinetails) >= 0))
							_add(new PerkClass(PerkLib.RagingInferno));
				}
				// Spell-boosting perks
				// Battlemage: auto-use Might
				if (player.findPerk(PerkLib.Channeling) >= 0 && player.findStatusEffect(StatusEffects.KnowsMight) >= 0 && player.inte >= 80) {
						_add(new PerkClass(PerkLib.Battlemage));
				}
				// Spellsword: auto-use Charge Weapon
				if (player.findPerk(PerkLib.Channeling) >= 0 && player.findStatusEffect(StatusEffects.KnowsCharge) >= 0 && player.inte >= 80) {
						_add(new PerkClass(PerkLib.Spellsword));
				}
			}

			//------------
			// LIBIDO
			//------------
			//slot 5 - libido perks

			//Slot 5 - Fertile+ increases cum production and fertility (+15%)
			if (player.lib >= 25) {
					_add(new PerkClass(PerkLib.FertilityPlus,15,1.75,0,0));
			}
			if (player.lib >= 25 && player.inte >= 50) {
				_add(new PerkClass(PerkLib.ImprovedSelfControl));
			}
			//Slot 5 - minimum libido
			if (player.minLust() >= 20) {
					_add(new PerkClass(PerkLib.ColdBlooded,20,0,0,0));
			}
			if (player.lib >= 50) {
					_add(new PerkClass(PerkLib.HotBlooded,20,0,0,0));
			}
			//Tier 1 Libido Perks
			if (player.level >= 6) {
				//Slot 5 - minimum libido
				//Slot 5 - Fertility- decreases cum production and fertility.
				if (player.lib < 25) {
						_add(new PerkClass(PerkLib.FertilityMinus, 15, 0.7, 0, 0));
				}
				if (player.lib >= 60) {
					_add(new PerkClass(PerkLib.WellAdjusted));
				}
				//Slot 5 - minimum libido
				if (player.lib >= 60 && player.cor >= 50) {
					_add(new PerkClass(PerkLib.Masochist));
				}
			}
			//------------
			// SENSITIVITY
			//------------
			//Nope.avi
			//------------
			// CORRUPTION
			//------------
			//Slot 7 - Corrupted Libido - lust raises 10% slower.
			if (player.cor >= 25) {
					_add(new PerkClass(PerkLib.CorruptedLibido,20,0,0,0));
			}
			//Slot 7 - Seduction (Must have seduced Jojo
			if (player.cor >= 50) {
					_add(new PerkClass(PerkLib.Seduction));
			}
			//Slot 7 - Nymphomania
			if (player.findPerk(PerkLib.CorruptedLibido) >= 0 && player.cor >= 75) {
					_add(new PerkClass(PerkLib.Nymphomania));
			}
			//Slot 7 - UNFINISHED :3
			if (player.minLust() >= 20 && player.findPerk(PerkLib.CorruptedLibido) >= 0 && player.cor >= 50) {
					_add(new PerkClass(PerkLib.Acclimation));
			}
			//Tier 1 Corruption Perks - acclimation over-rides
			if (player.level >= 6)
			{
				if (player.cor >= 60 && player.findPerk(PerkLib.CorruptedLibido) >= 0) {
					_add(new PerkClass(PerkLib.Sadist));
				}
				if (player.findPerk(PerkLib.CorruptedLibido) >= 0 && player.cor >= 70) {
					_add(new PerkClass(PerkLib.ArousingAura));
				}
			}
			//Tier 1 Misc Perks
			if (player.level >= 6) {
				_add(new PerkClass(PerkLib.Resistance));
				if (flags[kFLAGS.HUNGER_ENABLED] > 0) _add(new PerkClass(PerkLib.Survivalist));
			}
			//Tier 2 Misc Perks
			if (player.level >= 12 && player.findPerk(PerkLib.Survivalist) > 0) {
				if (flags[kFLAGS.HUNGER_ENABLED] > 0) _add(new PerkClass(PerkLib.Survivalist2));
			}
			// FILTER PERKS
			perkList = perkList.filter(
					function(perk:*,idx:int,array:Array):Boolean{
						return player.findPerk(perk.perk.ptype) < 0;
					});
			mainView.aCb.dataProvider = new DataProvider(perkList);
			return perkList;
		}
		public function applyPerk(perk:PerkClass):void {
			clearOutput();
			player.perkPoints--;
			//Apply perk here.
			outputText("" + perk.perkName + " gained!");
			player.createPerk(perk.ptype, perk.value1, perk.value2, perk.value3, perk.value4);
			if (perk.ptype == PerkLib.StrongBack2) player.itemSlot5.unlocked = true;
			if (perk.ptype == PerkLib.StrongBack) player.itemSlot4.unlocked = true;
			if (perk.ptype == PerkLib.Tank2) {
				HPChange(player.tou, false);
				statScreenRefresh();
			}
			doNext(playerMenu);
		}
	}

}


code:
package classes
{
	import classes.GlobalFlags.kGAMECLASS;
	import flash.system.System;

	public class PregnancyStore extends Object
	{
		//Pregancy types. Both butt and normal. Each type represents the father of this baby.
		public static const PREGNANCY_IMP:int                   =   1;
		public static const PREGNANCY_MINOTAUR:int              =   2;
		public static const PREGNANCY_MOUSE:int                 =   4;
		public static const PREGNANCY_OVIELIXIR_EGGS:int        =   5; //Also caused by Phoenixes apparently
		public static const PREGNANCY_HELL_HOUND:int            =   6;
		public static const PREGNANCY_CENTAUR:int               =   7;
		public static const PREGNANCY_MARBLE:int                =   8;
		public static const PREGNANCY_BUNNY:int                 =   9;
		public static const PREGNANCY_ANEMONE:int               =  10;
		public static const PREGNANCY_AMILY:int                 =  11;
		public static const PREGNANCY_IZMA:int                  =  12;
		public static const PREGNANCY_SPIDER:int                =  13;
		public static const PREGNANCY_BASILISK:int              =  14;
		public static const PREGNANCY_DRIDER_EGGS:int           =  15;
		public static const PREGNANCY_GOO_GIRL:int              =  16;
		public static const PREGNANCY_EMBER:int                 =  17;
		public static const PREGNANCY_BENOIT:int                =  18;
		public static const PREGNANCY_SATYR:int                 =  19;
		public static const PREGNANCY_COTTON:int                =  20;
		public static const PREGNANCY_URTA:int                  =  21;
		public static const PREGNANCY_SAND_WITCH:int            =  22;
		public static const PREGNANCY_FROG_GIRL:int             =  23;
		public static const PREGNANCY_FAERIE:int                =  24; //Indicates you are carrying either a phouka or faerie baby. Which one is determined by the PREGNANCY_CORRUPTION flag
		public static const PREGNANCY_PLAYER:int                =  25; //The player is the father. Will be used when an NPC is able to have children from multiple different fathers.
		public static const PREGNANCY_BEE_EGGS:int              =  26;
		public static const PREGNANCY_SANDTRAP_FERTILE:int      =  27;
		public static const PREGNANCY_SANDTRAP:int              =  28;
		public static const PREGNANCY_JOJO:int                  =  29; //So we can track them separately from other mouse pregnancies
		public static const PREGNANCY_KELT:int                  =  30; //So we can track them separately from other centaur pregnancies
		public static const PREGNANCY_TAOTH:int                 =  31;
		public static const PREGNANCY_GOO_STUFFED:int           =  32; //Used to fill the player's ass and/or vagina when Valeria has a goo girl take up residence. This prevents any other
																	   //form of pregnancy from taking hold. Does not respond to ovielixirs.
		public static const PREGNANCY_WORM_STUFFED:int          =  33; //Used to fill the player's vagina when the worms take up residence. This prevents any other form of
																	   //pregnancy from taking hold. Does not respond to ovielixirs.
		public static const PREGNANCY_MINERVA:int				=  34;
		public static const PREGNANCY_BEHEMOTH:int				=  35;
		public static const PREGNANCY_PHOENIX:int				=  36;
		public static const PREGNANCY_ANDY:int                  =  37; //This is functionally the same as Satyr but less corrupt. 10% chance of fauns, if ever implemented.

		public static const PREG_NOT_PREGANT:int                =   0; //The PREG_* consts are returned by the size function
		public static const PREG_NO_SIGNS_UNKNOWN:int           =   1; //NPC has conceived but doesn’t know she’s pregnant, no visible signs
		public static const PREG_NO_SIGNS_KNOWN:int             =   2; //NPC is in the first trimester, knows she’s pregnant
		public static const PREG_START_BULGE:int                =   3; //NPC is in the first trimester, belly is just starting to bulge
		public static const PREG_SWOLLEN:int                    =   4; //NPC is in the second trimester, belly is small but definitely swollen
		public static const PREG_SIZEABLE:int                   =   5; //NPC is in the second trimester, belly is now sizable
		public static const PREG_BLATANT:int                    =   6; //NPC is in the third trimester, belly is blatantly bulging
		public static const PREG_FULL_TERM:int                  =   7; //NPC is in the third trimester, belly is big as it will get for a normal pregnancy
		public static const PREG_OVERDUE:int                    =   8; //NPC is overdue. Usually means a centaur baby, twins or some similar condition. Effectively looks 10 months pregnant
		public static const PREG_VERY_OVERDUE:int               =   9; //NPC is very overdue. Probably triplets or more. Effectively looks 11 months pregnant
//Old Value, replaced in Saves.unFuckSave()		public static const PREGNANCY_BUTT_BEE:int              =   2;
//Old Value, replaced in Saves.unFuckSave()		public static const PREGNANCY_BUTT_DRIDER:int           =   3;
//Old Value, replaced in Saves.unFuckSave()		public static const PREGNANCY_BUTT_SANDTRAP_FERTILE:int =   4;
//Old Value, replaced in Saves.unFuckSave()		public static const PREGNANCY_BUTT_SANDTRAP:int         =   5; //Sandtrap did not have fertilized eggs

		public static const INCUBATION_IMP:int                  = 432; //Time for standard imps. Imp lords, Ceraph, Lilium and the imp horde cause slightly faster pregnancies
		public static const INCUBATION_MINOTAUR:int             = 432;
		public static const INCUBATION_MOUSE:int                = 350;
		public static const INCUBATION_OVIELIXIR_EGGS:int       =  50;
		public static const INCUBATION_HELL_HOUND:int           = 352;
		public static const INCUBATION_CENTAUR:int              = 420;
		public static const INCUBATION_MARBLE:int               = 368;
		public static const INCUBATION_BUNNY_BABY:int           = 200;
		public static const INCUBATION_BUNNY_EGGS:int           = 808; //High time indicates neon egg pregnancy
		public static const INCUBATION_ANEMONE:int              = 256;
		public static const INCUBATION_IZMA:int                 = 300;
		public static const INCUBATION_SPIDER:int               = 400;
		public static const INCUBATION_BASILISK:int             = 250;
		public static const INCUBATION_DRIDER:int               = 400;
		public static const INCUBATION_GOO_GIRL:int             =  85;
		public static const INCUBATION_EMBER:int                = 336;
		public static const INCUBATION_SATYR:int                = 160;
		public static const INCUBATION_COTTON:int               = 350;
		public static const INCUBATION_URTA:int                 = 515;
		public static const INCUBATION_SAND_WITCH:int           = 360;
		public static const INCUBATION_FROG_GIRL:int            =  30;
		public static const INCUBATION_FAERIE:int               = 200;
		public static const INCUBATION_BEE:int                  =  48;
		public static const INCUBATION_SANDTRAP:int             =  42;
		public static const INCUBATION_HARPY:int                = 168;
		public static const INCUBATION_SHIELA:int               =  72;
		public static const INCUBATION_SALAMANDER:int           = 336;
		public static const INCUBATION_MINERVA:int           	= 216;
		public static const INCUBATION_BEHEMOTH:int           	=1440; //Sorry Behemoth, but Isabella wins.
		public static const INCUBATION_PHOENIX:int           	= 168;
		public static const INCUBATION_KIHA:int                 = 384;
		public static const INCUBATION_ISABELLA:int             =2160; //Longest pregnancy ever.

		private static const MAX_FLAG_VALUE:int                 = 2999;
		private static const PREG_TYPE_MASK:int                 = 0x0000FFFF; //Should be safe with 65535 different pregnancy types
		private static const PREG_NOTICE_MASK:int               = 0x7FFF0000; //Use upper half to store the latest stages of pregnancy the player has noticed

		private var _pregnancyTypeFlag:int;
		private var _pregnancyIncubationFlag:int;
		private var _buttPregnancyTypeFlag:int;
		private var _buttPregnancyIncubationFlag:int;
		private var _pregnancyEventValue:Vector.< Vector.<int> >; //Using a vector of vectors so that each different pregnancy type can have its own set of events
		private var _buttPregnancyEventValue:Vector.< Vector.<int> >;

		//All the flags are passed through the constructor so that they can be different in every class that uses PregnancyStore but the pregnancy code remains the same
		public function PregnancyStore(pregType:int, pregInc:int, buttPregType:int, buttPregInc:int) {
			_pregnancyTypeFlag = pregType;
			_pregnancyIncubationFlag = pregInc;
			_buttPregnancyTypeFlag = buttPregType;
			_buttPregnancyIncubationFlag = buttPregInc;
			_pregnancyEventValue = new Vector.< Vector.<int> >();
			_buttPregnancyEventValue = new Vector.< Vector.<int> >();
			if (pregType < 0 || pregType > MAX_FLAG_VALUE || pregInc < 0 || pregInc > MAX_FLAG_VALUE || buttPregType < 0 || buttPregType > MAX_FLAG_VALUE || buttPregInc < 0 || buttPregInc > MAX_FLAG_VALUE || pregType == buttPregType || pregInc == buttPregInc) {
				trace("Error: PregnancyStore created with invalid values for its flags. PregnancyStore(" + pregType + ", " + pregInc + ", " + buttPregType + ", " + buttPregInc + ")");
			}
		}

		public function get type():int { return (_pregnancyTypeFlag == 0 ? 0 : kGAMECLASS.flags[_pregnancyTypeFlag] & PREG_TYPE_MASK); }

		public function get incubation():int { return (_pregnancyIncubationFlag == 0 ? 0 : kGAMECLASS.flags[_pregnancyIncubationFlag]); }

		public function get buttType():int { return (_buttPregnancyTypeFlag == 0 ? 0 : kGAMECLASS.flags[_buttPregnancyTypeFlag] & PREG_TYPE_MASK); }

		public function get buttIncubation():int { return (_buttPregnancyIncubationFlag == 0 ? 0 : kGAMECLASS.flags[_buttPregnancyIncubationFlag]); }

		public function get isPregnant():Boolean { return type != 0; } //At birth the incubation can be zero so a check vs. type is safer

		public function get isButtPregnant():Boolean { return buttType != 0; } //At birth the incubation can be zero so a check vs. type is safer

		/* Using this function adds a series of events which happen during the pregnancy. They must be added in descending order (ex. 500, 450, 350, 225, 100, 25)
		   to work properly. For NPCs who have multiple pregnancy types each type has its own set of events. Events can be used to see how far along the NPC
		   is in her pregnancy with the event property. They can also be checked using the eventTriggered() function. This checks to see which was the latest event
		   the player noticed. The eventTriggered() function only triggers once per event per pregnancy. */
		public function addPregnancyEventSet(pregType:int, ... pregStage):void
		{
			var pregVector:Vector.<int> = new Vector.<int>(pregStage.length + 2);
			pregVector[0] = pregType; //First element is the pregnancy type
			for (var i:int = 0; i < pregStage.length; i++) pregVector[i + 1] = pregStage[i];
			pregVector[pregVector.length - 1] = -1; //Make last element -1 to ensure there is always a match
			_pregnancyEventValue.push(pregVector);
		}

		//Same as addPregnancyEventSet, but for butts
		public function addButtPregnancyEventSet(buttPregType:int, ... buttPregStage):void
		{
			var pregVector:Vector.<int> = new Vector.<int>(buttPregStage.length + 1);
			pregVector[0] = buttPregType; //First element is the butt pregnancy type
			for (var i:int = 0; i < buttPregStage.length; i++) pregVector[i + 1] = buttPregStage[i];
			pregVector[pregVector.length - 1] = -1; //Make last element -1 to ensure there is always a match
			_buttPregnancyEventValue.push(pregVector);
		}

		public function knockUp(newPregType:int = 0, newPregIncubation:int = 0):void
		{
			if (!isPregnant) knockUpForce(newPregType, newPregIncubation);
		}

		public function knockUpForce(newPregType:int = 0, newPregIncubation:int = 0):void
		{
			if (_pregnancyTypeFlag == 0 || _pregnancyIncubationFlag == 0) return; //Check that these variables were provided by the containing class
			if (newPregType != 0) newPregType = (kGAMECLASS.flags[_pregnancyTypeFlag] & PREG_NOTICE_MASK) + newPregType;
				//If a pregnancy 'continues' an existing pregnancy then do not change the value for last noticed stage
			kGAMECLASS.flags[_pregnancyTypeFlag] = newPregType;
			kGAMECLASS.flags[_pregnancyIncubationFlag] = (newPregType == 0 ? 0 : newPregIncubation); //Won't allow incubation time without pregnancy type
		}

		public function buttKnockUp(newPregType:int = 0, newPregIncubation:int = 0):void
		{
			if (!isButtPregnant) buttKnockUpForce(newPregType, newPregIncubation);
		}

		public function buttKnockUpForce(newPregType:int = 0, newPregIncubation:int = 0):void
		{
			if (_buttPregnancyTypeFlag == 0 || _buttPregnancyIncubationFlag == 0) return; //Check that these variables were provided by the containing class
			if (newPregType != 0) newPregType = (kGAMECLASS.flags[_buttPregnancyTypeFlag] & PREG_NOTICE_MASK) + newPregType;
				//If a pregnancy 'continues' an existing pregnancy then do not change the value for last noticed stage
			kGAMECLASS.flags[_buttPregnancyTypeFlag] = newPregType;
			kGAMECLASS.flags[_buttPregnancyIncubationFlag] = (newPregType == 0 ? 0 : newPregIncubation); //Won't allow incubation time without pregnancy type
		}

		//The containing class is responsible for calling pregnancyAdvance, usually once per timeChange()
		public function pregnancyAdvance():void //Separate function so it can be called more often than timeChange if neccessary
		{
			if (incubation != 0) {
				kGAMECLASS.flags[_pregnancyIncubationFlag]--;
				if (kGAMECLASS.flags[_pregnancyIncubationFlag] < 0) kGAMECLASS.flags[_pregnancyIncubationFlag] = 0;
			}
			if (buttIncubation != 0) {
				kGAMECLASS.flags[_buttPregnancyIncubationFlag]--;
				if (kGAMECLASS.flags[_buttPregnancyIncubationFlag] < 0) kGAMECLASS.flags[_buttPregnancyIncubationFlag] = 0;
			}
		}

		/* Many NPCs go through several events during their pregnancies. This function returns the latest event the NPC qualifies for.
		   When the NPC is not pregnant this always returns 0, when pregnant it will return at least 1. The further along the NPC is the larger the value. Each NPC
		   is free to have as many event as desired. They must be added using the addPregnancyEventSet function and are unique to each pregnancy type. */
		public function get event():int
		{
			var pregType:int = type;
			if (pregType == 0) return 0; //Not pregnant
			var incubationValue:int = incubation;
			var pregEventVector:Vector.<int> = null;
			for (var i:int = 0; i < _pregnancyEventValue.length; i++) {
				pregEventVector = _pregnancyEventValue[i];
				if (pregEventVector[0] == pregType) {
					for (var j:int = 1; j < pregEventVector.length; j++) { //Skip element zero, the pregnancy type
						if (incubationValue > pregEventVector[j]) return j; //Will always find a value that is < incubationValue as last value is -1
					}
				}
			}
			return 1; //If there are no pregnancy events for this type of pregnancy then return 1
		}

		//The same event system as for vaginal pregnacies, but for butts
		public function get buttEvent():int
		{
			var pregType:int = buttType;
			if (pregType == 0) return 0; //Not pregnant
			var incubationValue:int = buttIncubation;
			var pregEventVector:Vector.<int> = null;
			for (var i:int = 0; i < _buttPregnancyEventValue.length; i++) {
				pregEventVector = _buttPregnancyEventValue[i];
				if (pregEventVector[0] == pregType) {
					for (var j:int = 1; j < pregEventVector.length; j++) { //Skip element zero, the pregnancy type
						if (incubationValue > pregEventVector[j]) return j; //Will always find a value that is < incubationValue as last value is -1
					}
				}
			}
			return 1; //If there are no pregnancy events for this type of pregnancy then return 1
		}

		//Returns either zero - for no change - or the value of the new pregnancy event which the player has not yet noticed
		//This function updates the noticed pregnancy event, so it only triggers once per event per pregnancy.
		public function eventTriggered():int
		{
			var currentStage:int = event;
			var lastNoticed:int = kGAMECLASS.flags[_pregnancyTypeFlag] & PREG_NOTICE_MASK;
			if (currentStage * 65536 == lastNoticed) return 0; //Player has already noticed this stage
			kGAMECLASS.flags[_pregnancyTypeFlag] = (kGAMECLASS.flags[_pregnancyTypeFlag] & PREG_TYPE_MASK) + (currentStage * 65536);
				//Strip off the old noticed value by ANDing with PREG_TYPE_MASK
			return currentStage;
		}

		//Same as eventTriggered, but for butts
		public function buttEventTriggered():int
		{
			var currentStage:int = buttEvent;
			var lastNoticed:int = kGAMECLASS.flags[_buttPregnancyTypeFlag] & PREG_NOTICE_MASK;
			if (currentStage * 65536 == lastNoticed) return 0; //Player has already noticed this stage
			kGAMECLASS.flags[_buttPregnancyTypeFlag] = (kGAMECLASS.flags[_buttPregnancyTypeFlag] & PREG_TYPE_MASK) + (currentStage * 65536);
				//Strip off the old noticed value by ANDing with PREG_TYPE_MASK
			return currentStage;
		}

		public function get size():int {
			//This function exists to provide consistency across different NPC's pregnancies. This is most useful when trying to write descriptions of different belly sizes
			//in threesomes, where the author might not be familiar with how the different pregnancy events relate to belly size.
			return PREG_NOT_PREGANT;
		}
	}
}

license: unknown


code:
package classes
{
	//Call CoC.saveAwareClassAdd if you want a class that implements this interface to receive updates when the game is loaded or saved
	public interface SaveAwareInterface
	{
		/*	Called for every Class in the _saveAwareClassList just after the game is loaded from a save.
			Each class should use this opportunity to read all its stored information from one or more flag variables. */
		function updateAfterLoad(game:CoC):void;

		/*	Called for every Class in the _saveAwareClassList just before the game is to be saved.
			Each class should use this opportunity to write all its stored information to one or more flag variables so that it will be saved. */
		function updateBeforeSave(game:CoC):void;

	}
}