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

	public class AscensionWisdomPerk extends PerkType
	{

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

		public function AscensionWisdomPerk()
		{
			super("Ascension: Wisdom", "Ascension: Wisdom", "", "Increases experience gains by 10% per level.");
		}

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

}


code:
package classes.Perks
{
import classes.BonusDerivedStats;
import classes.Items.ShieldLib;
import classes.Perk;
import classes.PerkType;
import classes.GlobalFlags.kGAMECLASS;
import classes.CharCreation;
import classes.Player;

public class BlademasterPerk extends PerkType
{

    public function BlademasterPerk()
    {
        super("Blademaster", "Blademaster",
                "Gain +5% to critical strike chance when wielding a bladed weapon and not using a shield.",
                "You choose the 'Blademaster' perk.  Your chance of critical hit is increased by 5% as long as you're wielding a bladed weapon and not using a shield.");
        boostsCritChance(critBonus);
    }

    public function critBonus():Number{
        if(host is Player){
            if((host as Player).weapon.isSharp() && (host as Player).shield == ShieldLib.NOTHING) {
                return 5;
            }else return 0;
        }
        return 5;//give monsters a break, they can't exactly do much here
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}

license: unknown


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

	public class CleansingPalmPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			if (!player.isPureEnough(10)) return "<b>DISABLED</b> - Corruption too high!";
			else return super.desc(params);
		}

		public function CleansingPalmPerk()
		{
			super("Cleansing Palm", "Cleansing Palm", "A ranged fighting technique of Jojo’s order, allows you to blast your enemies with waves of pure spiritual energy, weakening them and hurting the corrupt.");
		}
	}
}


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

	public class ControlledBreathPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			if (!player.isPureEnough(30)) return "<b>DISABLED</b> - Corruption too high!";
			else return super.desc(params);
		}

		public function ControlledBreathPerk()
		{
			super("Controlled Breath", "Controlled Breath", "Jojo’s training allows you to recover more quickly. Increases rate of fatigue regeneration by 10%");
		}
	}
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class CunningPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases your critical chance by " + params.value1 + "%, but reduces critical damage by " + params.value2 * 100 + "%";
		}

		public function CunningPerk()
		{
			super("Cunning", "Cunning", "Increases critical chance, but reduces critical damage.");
		}

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


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

public class DemonBiologyBerk extends PerkType
{

    public function DemonBiologyBerk()
    {
        super("Demonic Biology", "Demonic Biology", "Your body has been altered to possess some demonic properties. You have 20 more maximum fatigue, but hunger and fatigue can only be" +
                " recovered by having sex after combat. The lustier your opponent, the more fatigue and hunger are recovered.", "Your body has been altered to possess some demonic properties. You have 20 more maximum fatigue, but hunger and fatigue can only be" +
                " recovered by having sex after combat. The lustier your opponent, the more fatigue and hunger are recovered.");
        boostsMaxFatigue(20);
    }
}

}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class ElvenBountyPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases fertility by " + params.value2 + "% and cum production by " + params.value1 + "mLs.";
		}

		public function ElvenBountyPerk()
		{
			super("Elven Bounty", "Elven Bounty", "After your encounter with an elf, her magic has left you with increased fertility and virility.", null, true);
		}
	}
}


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

	public class EnlightenedPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			if (!player.isPureEnough(10)) return "<b>DISABLED</b> - Corruption too high!";
			else return super.desc(params);
		}

		public function EnlightenedPerk()
		{
			super("Enlightened", "Enlightened", "Jojo’s tutelage has given you a master’s focus and you can feel the universe in all its glory spread out before you. You’ve finally surpassed your teacher.");
		}
	}
}


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

public class EvadePerk extends PerkType
{

    public function EvadePerk()
    {
        super("Evade", "Evade",
                "Increases chances of evading enemy attacks.",
                "You choose the 'Evade' perk, allowing you to avoid enemy attacks more often!");
        boostsDodge(10);
    }

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

}


code:
package classes.Perks
{
import classes.BonusDerivedStats;
import classes.Items.ShieldLib;
import classes.Perk;
import classes.PerkType;
import classes.GlobalFlags.kGAMECLASS;
import classes.CharCreation;
import classes.Player;

public class FrustrationPerk extends PerkType
{

    public function FrustrationPerk()
    {
        super("Enraged Frustration", "Enraged Frustration",
                "Gain +10% cumulative damage for each missed attack. Resets when an attack lands.",
                "You choose the 'Enraged Frustration' perk. Every missed attack grants the next one +10% cumulative damage. Resets when an attack lands.");
        boostsPhysDamage(dmgBonus,true);
    }

    public function dmgBonus():Number{
        return 1 + getOwnValue(0) * 0.01;
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class HistoryDEUSVULTPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			if (params.value2 == 0) return "Increases your damage by " + params.value1 + "%. Increases lust resistance by 15%";
			else return "Fallen:Decreases damage by 25%";
		}

		public function getDeusVultDamage():Number{
            if (getOwnValue(1) == 0) return 1 + getOwnValue(0)*0.01;
            else return 0.75;
		}

		public function getDeusVultLustRes():Number{
            if (getOwnValue(1) == 0) return 1.17;
            else return 1;
		}

		public function HistoryDEUSVULTPerk()
		{
			super("History: Paladin", "History: Paladin",
				"Trained from birth to fight with holy purpose, you grow stronger and sate your lusts by vanquishing demons.");
			boostsGlobalDamage(getDeusVultDamage,true);
			boostsLustResistance(getDeusVultLustRes,true);
		}

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


code:
package classes.Perks
{
import classes.BonusDerivedStats;
import classes.Items.ShieldLib;
import classes.Items.WeaponLib;
import classes.Perk;
import classes.PerkType;
import classes.GlobalFlags.kGAMECLASS;
import classes.CharCreation;
import classes.Player;

public class HoldWithBothHandsPerk extends PerkType
{

    public function HoldWithBothHandsPerk()
    {
        super("Hold With Both Hands", "Hold With Both Hands",
                "Gain +20% strength modifier with melee weapons when not using a shield.",
                "You choose the 'Hold With Both Hands' perk.  As long as you're wielding a melee weapon and you're not using a shield, you gain 20% strength modifier to damage.");
        boostsAttackDamage(dmgBonus);
    }

    public function dmgBonus():Number{
        if(host is Player){
            if(player.weapon != WeaponLib.FISTS && player.shield == ShieldLib.NOTHING && !combat.isWieldingRangedWeapon()) return Math.round(player.str * 0.2);
            else return 0;
        }
        return Math.round(host.str * 0.2);
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}


code:
package classes.Perks {

	public class ImprovedVisionPerk extends PerkType {

		public function ImprovedVisionPerk() {
			super("Improved Vision 2", "Improved Vision 2",
				"Improves your vision allowing you to see openings most wouldn't (+3% Crit)",
				"You've chosen the 'Improved Vision 2' perk, which raises your critical strike chance by 3%.");
			boostsCritChance(3);
		}

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


code:
package classes.Perks {

	public class ImprovedVisionPerk extends PerkType {

		public function ImprovedVisionPerk() {
			super("Improved Vision 3", "Improved Vision 3",
				"Improves your vision allowing you to see openings most wouldn't (+3% Crit)",
				"You've chosen the 'Improved Vision 3' perk, which raises your critical strike chance by 3%.");
			boostsCritChance(3);
		}

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


code:
package classes.Perks {

	public class ImprovedVisionPerk extends PerkType {

		public function ImprovedVisionPerk() {
			super("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%.");
			boostsCritChance(3);
		}

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


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class KillerInstinctPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Extra bow experience allows some shots to deal massive critical damage. Shots against stunned targets automatically deal minor critical damage.";
		}

		public function KillerInstinctPerk()
		{
			super("Killer Instinct","Killer Instinct", "Allows bow attacks to crit.");
		}
	}
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
import classes.Perk;
import classes.PerkLib;
import classes.PerkType;
import classes.Player;

public class LightningStrikesPerk extends PerkType
{

    public function getBonusWeaponDamage():Number{
        if (host is Player && player.spe >= 60 && !player.weapon.isLarge()) {
            return Math.round((player.spe - 50) / 3);
        }else return 0;
    }

    public function LightningStrikesPerk()
    {
        super("Lightning Strikes", "Lightning Strikes",
                "[if (player.spe>=60)" +
                "Increases the attack damage for non-heavy weapons." +
                "|" +
                "You are too slow to benefit from this perk." +
                "]",
                "You choose the 'Lightning Strikes' perk, increasing the attack damage for non-heavy weapons.");
        boostsWeaponDamage(getBonusWeaponDamage);
    }

}
}


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

	public class MilkMaidPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "(Rank: " + params.value1 + "/10) Increases milk production by " + (200 + (params.value1 * 100)) + "mL.";
		}

		public function MilkMaidPerk()
		{
			super("Milk Maid", "Milk Maid", "Increases milk production by ---mL. Allows you to lactate perpetually.");
		}
	}
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
import classes.Perk;
import classes.PerkType;

public class MisdirectionPerk extends PerkType
{

    public function getDodgeBonus():Number{
        return (host.armorName == armors.R_BDYST.name) ? 10 : 0;
    }
    public function MisdirectionPerk()
    {
        super("Misdirection", "Misdirection",
                "Grants additional evasion chances while wearing Raphael's red bodysuit.");
        boostsDodge(getDodgeBonus);
    }
}
}


code:
package classes.Perks
{
import classes.BonusDerivedStats;
import classes.Items.ShieldLib;
import classes.Perk;
import classes.PerkType;
import classes.GlobalFlags.kGAMECLASS;
import classes.CharCreation;
import classes.Player;

public class PatiencePerk extends PerkType
{

    public function PatiencePerk()
    {
        super("Patience", "Patience",
                "Gain +20% damage, +10% crit chance and +10% dodge after waiting through a turn.",
                "");
        boostsGlobalDamage(dmgBonus,true);
        boostsCritChance(critBonus);
        boostsDodge(dodgeBonus);
    }

    public function dmgBonus():Number{
        return 1 + getOwnValue(0) * 0.01;
    }

    public function critBonus():Number{
        return getOwnValue(1);
    }

    public function dodgeBonus():Number{
        return getOwnValue(2);
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class PentUpPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases minimum lust by " + Math.round(params.value1) + " and makes you more vulnerable to seduction.";
		}

		public function PentUpPerk()
		{
			super("Pent Up","Pent Up", "Increases minimum lust and makes you more vulnerable to seduction");
            boostsMinLust(minLustBoost);
			boostsLustResistance(lustResBoost);
		}

        public function minLustBoost():Number{
            return getOwnValue(0);
        }
        public function lustResBoost():Number{
            return -getOwnValue(0)/2;
        }

    }
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class PiercedCrimstonePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases minimum lust by " + Math.round(params.value1) + ".";
		}

		public function PiercedCrimstonePerk()
		{
			super("Pierced: Crimstone", "Pierced: Crimstone",
					"You've been pierced with Crimstone and your lust seems to stay a bit higher than before.");
			boostsMinLust(minLustBoost);
		}

		public function minLustBoost():Number{
			return getOwnValue(0);
		}

	}
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class PiercedFertitePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases cum production by " + Math.round(2*params.value1) + "% and fertility by " + Math.round(params.value1) + ".";
		}

		public function PiercedFertitePerk()
		{
			super("Pierced: Fertite", "Pierced: Fertite",
					"You've been pierced with Fertite and any male or female organs have become more fertile.");
		}
	}
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class PiercedIcestonePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Reduces minimum lust by " + Math.round(params.value1) + ".";
		}

		public function PiercedIcestonePerk()
		{
			super("Pierced: Icestone", "Pierced: Icestone",
					"You've been pierced with Icestone and your lust seems to stay a bit lower than before.");
            boostsMinLust(minLustBoost);
		}

        public function minLustBoost():Number{
            return -getOwnValue(0);
        }
	}
}


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

	public class Regeneration2Perk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			if (game.flags[kFLAGS.HUNGER_ENABLED] > 0 && game.player.hunger < 25) return "<b>DISABLED</b> - You are too hungry!";
			else return super.desc(params);
		}

		public function Regeneration2Perk()
		{
			super("Regeneration 2", "Regeneration 2",
				"Regenerates an additional 2% of max HP/hour and 1% of max HP/round.",
				"You choose the 'Regeneration 2' perk, giving you an additional 1% of max HP per turn in combat and 2% of max HP per hour.");
            boostsHealthRegenPercentage(1);
		}

	}

}


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

	public class RegenerationPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			if (game.flags[kFLAGS.HUNGER_ENABLED] > 0 && game.player.hunger < 25) return "<b>DISABLED</b> - You are too hungry!";
			else return super.desc(params);
		}

		public function RegenerationPerk()
		{
			super("Regeneration", "Regeneration",
				"Regenerates 2% of max HP/hour and 1% of max HP/round.",
				"You choose the 'Regeneration' perk, allowing you to heal 1% of max HP every round of combat and 2% of max HP every hour!");
            boostsHealthRegenPercentage(1);
		}

	}

}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class ScatteringPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Missed attacks still deal <b>" + params.value1 * 100 + "%</b> damage";
		}

		public function ScatteringPerk()
		{
			super("Scattering", "Scattering", "Missed attacks still deal some damage.");
		}

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


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class SluttySeductionPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases odds of successfully teasing and lust damage of successful teases by " + params.value1 + " points."
		}

		public function SluttySeductionPerk()
		{
			super("Slutty Seduction", "Slutty Seduction",
					"Your armor allows you access to 'Seduce', an improved form of 'Tease'.");
		}

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


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class SpellcastingAffinityPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Reduces spell costs by " + params.value1 + "%.";
		}

		public function costReduction():Number{
			return -getOwnValue(0);
		}
		public function SpellcastingAffinityPerk()
		{
			super("Spellcasting Affinity","Spellcasting Affinity", "Reduces spell costs.");
			boostsSpellCost(costReduction);
		}

	}
}


code:
package classes.Perks
{
import classes.MasteryLib;
import classes.Perk;
import classes.PerkType;
import classes.Player;

	public class SpellswordPerk extends PerkType {
		public function SpellswordPerk() {
			super("Spellsword", "Spellsword", "Start every battle with Charge Weapon enabled, if you meet White Magic requirements before it starts.", "You choose the 'Spellsword' perk. You start every battle with the Charge Weapon effect, as long as you meet the requirements to cast it before battle.");
		}

		override public function desc(params:Perk = null):String {
			if (host is Player && player.masteryLevel(MasteryLib.TerrestrialFire) >= 2) return "Start every battle with Charge Weapon or Inflame enabled, if you meet the requirements for casting them.";
			return super.desc();
		}

		override public function get longDesc():String {
			if (host is Player && player.masteryLevel(MasteryLib.TerrestrialFire) >= 2) return "You choose the 'Spellsword' perk. You start every battle with Charge Weapon or Inflame, as long as you meet the requirements for casting it before battle.";
			return super.longDesc;
		}

	}
}


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

public class TacticianPerk extends PerkType
{

    public function TacticianPerk()
    {
        super("Tactician", "Tactician",
                "[if (player.inte>=50)" +
                "Increases critical hit chance by up to 10% (Intelligence-based)." +
                "|" +
                "<b>You are too dumb to gain benefit from this perk.</b>" +
                "]",
                "You choose the 'Tactician' perk, increasing critical hit chance by up to 10% (Intelligence-based).");
        boostsCritChance(critBonus);
    }

    public function critBonus():Number{
       return host.inte >= 50 ? Math.max(Math.round(player.inte/10),10) : 0;
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}


code:
package classes.Perks
{
import classes.BonusDerivedStats;
import classes.Items.ShieldLib;
import classes.Perk;
import classes.PerkType;
import classes.GlobalFlags.kGAMECLASS;
import classes.CharCreation;
import classes.Player;

public class ThunderousStrikesPerk extends PerkType
{

    public function ThunderousStrikesPerk()
    {
        super("Thunderous Strikes", "Thunderous Strikes",
                "+20% 'Attack' damage while strength is at or above 80.",
                "You choose the 'Thunderous Strikes' perk, increasing normal damage by 20% while your strength is over 80.");
        boostsAttackDamage(dmgBonus,true);
    }

    public function dmgBonus():Number{
        return host.str >= 80 ? 1.2 : 1;
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}


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

public class UnhinderedPerk extends PerkType
{

    public function UnhinderedPerk()
    {
        super("Unhindered", "Unhindered",
                "Increases chances of evading enemy attacks when wearing armor with less than 15 defense.",
                "You choose the 'Unhindered' perk, granting chance to evade when you are wearing light clothing.");
        boostsDodge(dodgeFunc);
    }

    public function dodgeFunc():int{
        if(host is Player){
            return (host.armorDef - (host as Player).getAgiSpeedBonus()) < 15 ? 10 : 0;
        }
        return host.armorDef < 15 ? 10 : 0;
    }
    override public function keepOnAscension(respec:Boolean = false):Boolean
    {
        return false;
    }
}

}


code:
package classes.Perks
{
	import classes.PerkType;

	/**
	 * ...
	 * @author ...
	 */
	public class VineArmorPerk extends PerkType
	{

		public function VineArmorPerk()
		{
			super("Alraune Vines", "Alraune Vines", "Fire will exhaust you, though your living armor does grant some bonuses.");
		}
	}

}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
import classes.Perk;
import classes.PerkLib;
import classes.PerkType;
import classes.Player;

public class WeaponMasteryPerk extends PerkType
{

    public function getBonusWeaponDamage():Number{
        if (host is Player && player.weapon.isLarge()) {
            return 2
        }else return 1;
    }

    public function WeaponMasteryPerk()
    {
        super("Weapon Mastery", "Weapon Mastery",
                "[if (player.str>60)" +
                "Doubles damage bonus of weapons classified as 'Large'." +
                "|" +
                "<b>You aren't strong enough to benefit from this anymore.</b>" +
                "]",
                "You choose the 'Weapon Mastery' perk, doubling the effectiveness of large weapons.");
        boostsWeaponDamage(getBonusWeaponDamage,true);
    }

}
}


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class WizardsEndurancePerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Reduces fatigue cost of spells by " + params.value1 + "%.";
		}

		public function WizardsEndurancePerk()
		{
			super("Wizard's Endurance", "Wizard's Endurance",
					"Your spellcasting equipment makes it harder for spell-casting to fatigue you!");
            boostsSpellCost(costReduction);
		}

        public function costReduction():Number{
            return -getOwnValue(0);
        }

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


code:
/**
 * Created by aimozg on 27.01.14.
 */
package classes.Perks
{
	import classes.Perk;
	import classes.PerkType;

	public class WizardsFocusPerk extends PerkType
	{

		override public function desc(params:Perk = null):String
		{
			return "Increases your spell effect modifier by <b>" + params.value1 * 100 + "%</b>.";
		}

		public function WizardsFocusPerk()
		{
			super("Wizard's Focus", "Wizard's Focus",
					"Your wizard's staff grants you additional focus, reducing the use of fatigue for spells.");
		}

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