I assume you know escript.  If you don't, here's some stuff:

http://poldoc.fem.tu-ilmenau.de/escriptguide.html
http://poldoc.fem.tu-ilmenau.de/
http://polserver.com

How to add a perk:

1) Decide what you want your perk to do.  Perks are designed to be
passive effects, like special hits when attacking.  To give an example
from standard UO, there is a perk-style ability attached to healing
and anatomy that allows you to rez people.  (I think.)


2) Add a constant at the top of perk.inc.

example:
const PERKID_FINESSE := 1; (make sure the number is unique)


3) add an entry to perk.cfg.
Perk 1 (should be the same as the constant from step 2)
{                                
	perkid		1 (should be the same as the constant from step 2)
	name		(give it a name)
	maintainer	(your email address - or you can wuss out)
	must		(numerical skill ids from client.inc, space seperated)
	should		
	shouldnt
	cant
	beta		(a positive value flags the perk as being tested)
	active		(the perk can't be used if this is 0)
}

example:
Perk 1
{                                
	perkid		1
	name		Finesse
	maintainer	shren@io.com
	must		42 40
	should		27
	gftactics	1
	beta		1
}


4) add an include for your perk in perks\individual and write the function
there.

generally, a perk function should accept the value that it will modify
as a parameter, and pass that parameter back unchanged if the perk does
not modify the value.  

a perk function should *never* do anything if the power is 0.

example perk function:
function perk_finesse(chance_to_hit,wsid,attacker, debug := 0)
	
	var power := PerkPower(PERKID_FINESSE,attacker);
	if ( ( power ) && ( wsid in {40,42} ) ) // fencing and swords
		if ( (power/4) > random(100) )
			PrintTextAbove( attacker, "*Finesse*" );
			chance_to_hit := 100; // can't miss
		endif
	endif
	
	return chance_to_hit;
	
endfunction


5) find the area in the code where you need to call your perk and 
add the call.

examples of perk calls from code:
chance_to_hit := perk_finesse(chance_to_hit,wsid,attacker);
rawdamage := perk_overbear(rawdamage,wsid,attacker);
damagetype := perk_magicblow(damagetype,wsid,attacker);
defender_ar := perk_breach(defender_ar,wsid,attacker);