The sharpen skill was written for warriors so they had a skill that
other classes could hound on them for their services as well :) If you
have trouble installing this skill or have comments email me at
froboz@cyberdude.com.

-----------------------------------------------------------------------------
To begin this skill requires that a stone be created in an area file.
I like to define objects as such in the limbo.are but it can be placed in any
area file.  It should look something like this:

#38
sharpening stone~
a sharpening stone~
A sharpening stone has been dropped here.~
~
41 0 16385
0 0 0 0
3 650 65
---------------------------------------------------------------------------

Now to install this skill:

---------------------------------------------------------------------------
mud.h

under:
/*
 * Well known object virtual numbers.  
 * Defined in #OBJECTS.
 */
add:
#define OBJ_VNUM_STONE               38 /*Stone vnum for sharpen*/

under:
/*
 * These are skill_lookup return values for common skills and spells.
 */
add:
extern  sh_int  gsn_sharpen;

under:
/*
 * Command functions.
 * Defined in act_*.c (mostly).   
 */
add:

DECLARE_DO_FUN( do_sharpen      );

under:
/*
 * Extra flags.
 * Used in #OBJECTS.
 */
add:
#define ITEM_SHARP              BV31 /* open bv */
----------------------------------------------------------------------------
act_info.c

under:
char *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort )
add:
    if ( IS_OBJ_STAT(obj, ITEM_SHARP)     )   strcat( buf, "(Sharp) "     );
-----------------------------------------------------------------------------
db.c

under:
/* weaponry */
add:
sh_int                  gsn_sharpen;

under:
    /*
     * Assign gsn's for skills which need them.
     */
add:
        ASSIGN_GSN( gsn_sharpen,        "sharpen" );

-----------------------------------------------------------------------------
handler.c

under:
char *extra_bit_name( int extra_flags )
add:
    if ( extra_flags & ITEM_SHARP        ) strcat( buf, " sharpened"    );

-----------------------------------------------------------------------------
skills.c

/* Sharpen skill by Froboz questions comments send to froboz@cyberdude.com */
void do_sharpen( CHAR_DATA *ch, char *argument )
{
  OBJ_DATA *obj;
  OBJ_DATA *sobj;
  AFFECT_DATA *paf;
  char      arg [MAX_INPUT_LENGTH ];
  int       percent;

  if (! IS_NPC( ch )
  && ch->level < skill_table [gsn_sharpen]->skill_level [ch->class] )
    {
         send_to_char( "What do you think you are, a warrior?\n\r", ch );
         return;
    }

 one_argument ( argument, arg );

    if (arg[0] == '\0' )
    {
        send_to_char( "What are you trying to sharpen?\n\r", ch );
        return;
    }

    if ( ch->fighting )
    {
        send_to_char( "While you are fighting? Yea right!.\n\r", ch );
        return;
    }

    if ( ms_find_obj (ch) )
        return;

    if ( !( obj = get_obj_carry( ch, arg ) ) )
    {
        send_to_char( "You do not have that weapon.\n\r", ch );
        return;
    }

    if ( obj->item_type != ITEM_WEAPON )
    {
        send_to_char( "That item is not a weapon.\n\r", ch );
        return;
    }

    if ( IS_OBJ_STAT( obj, ITEM_SHARP ) )
    {
        send_to_char( "That weapon is already sharpened.\n\r", ch );
        return;
    }

    /* Ok we have a sharpenable weapon but do we have the stone */ 
    for ( sobj = ch->first_carrying; sobj; sobj = sobj->next_content )
    {
        if ( sobj->pIndexData->vnum == OBJ_VNUM_STONE )
        break;
    }
    if ( !sobj )
    {
        send_to_char( "You do not have a sharpening stone.\n\r", ch );
        return;
    }

   if ( !IS_NPC( ch )
   && percent > ch->pcdata->learned[gsn_sharpen] )
   {
       set_char_color( AT_RED, ch );
       send_to_char( "You failed and slice your finger. Ouch!\n\r", ch );
       set_char_color( AT_GREY, ch );
       damage( ch, ch, ch->level, gsn_sharpen );
       act(AT_RED, "$n slices $s finger!", ch, NULL, NULL, TO_ROOM );
       learn_from_failure( ch, gsn_sharpen );
       return;
   }

separate_obj(obj);
       CREATE( paf, AFFECT_DATA, 1 );
       paf->type           = -1;
       paf->duration       = 0;
       paf->location       = APPLY_DAMROLL;
       paf->modifier       = number_fuzzy(6);
       paf->bitvector      = 0;
       LINK( paf, obj->first_affect, obj->last_affect, next, prev );

      act(AT_GREEN, "You sharpen $p.\n\r", ch, obj, NULL, TO_CHAR );
      act(AT_GREEN, "$n pulls out a piece of stone and begins sharpening $p.", ch, obj, NULL, TO_ROOM );  
      SET_BIT( obj->extra_flags, ITEM_SHARP );

      /* 
       *Sharp weapon control, if you don't mind surplus sharp weapons
       *just comment out the next line.
       */     
      obj->timer = 10 + ch->level;
      learn_from_success( ch, gsn_sharpen );
      return;
}
--------------------------------------------------------------------------------
Don't forget to define the command in tables.c, make clean recompile and
all that good stuff.

also command.dat should be something like this:
#SKILL
Name         sharpen~
Type         Skill
Flags        0
Target       4
Minpos       8
Rounds       12
Code         do_sharpen
Dammsg       ~  
Wearoff      !Sharpen!~
Minlevel     12
END