/* 
 * This snippet allows for you to insert "sockets" into weapons. The sockets
 * will add HITROLL or DAMROLL. This snippet was made up by me (IceCool) and Tornach.
 * All we ask is you give us some credit and email any bugs or fixes you might find.
 * 	sprintf( buf1, "{G[{W*{G]{x %s", obj2->short_descr );
 *	obj2->short_descr = buf1;
 * This spot we found something wrong because after you save the object will take on
 * anything for a short description. Other wise we haven't found anything else wrong.
 */

void do_newforge( CHAR_DATA *ch, char *argument )
{
	char arg[MAX_STRING_LENGTH];
        char arg2[MAX_STRING_LENGTH];
	char buf1[MAX_STRING_LENGTH];
	OBJ_DATA  *obj;
	OBJ_DATA  *obj2;
	char buf2[MAX_STRING_LENGTH];
    	AFFECT_DATA *pAf;
	int to_hit;
	int to_dam;

	argument = one_argument( argument, arg );
	argument = one_argument( argument, arg2 );

	if ( ( arg == '\0' ) || ( arg2 == '\0' ) )
	{
		send_to_char( "Syntax:  forge (item) (weapon)\n\r", ch );
		return;
	}

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

	if ( obj->item_type != ITEM_SOCKET )
	{
		send_to_char( "That isn't a socket.\n\r", ch );
		return;
	}

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

	to_hit = obj->value[0];
	to_dam = obj->value[1];

	extract_obj( obj );
	
	if ( to_hit != 0 )
	{
    		pAf             =   new_affect();
    		pAf->location   =   APPLY_HITROLL;
    		pAf->modifier   =   to_hit;
	    	pAf->where	=   TO_OBJECT;
    		pAf->type	=   0;
	    	pAf->duration   =   -1;
    		pAf->bitvector  =   0;
	    	pAf->level      =   obj2->level;
    		pAf->next       =   obj2->affected;
	    	obj2->affected  =   pAf;
	/*	affect_to_obj (obj2, pAf); */
	}
	if ( to_dam != 0 )
	{
		pAf		=  new_affect();
		pAf->location   =  APPLY_DAMROLL;
		pAf->modifier	=  to_dam;
		pAf->where	=  TO_OBJECT;
		pAf->type	=  0;
		pAf->duration	=  -1;
		pAf->bitvector  =  0;
		pAf->level	=  obj2->level;
		pAf->next	=  obj2->affected;
		obj2->affected  =  pAf;
               /* affect_to_obj (obj2, pAf); */
	}

	sprintf( buf1, "{G[{W*{G]{x %s", obj2->short_descr );
	obj2->short_descr = buf1;
	free_string( buf1 );  
	       	
	send_to_char( "You have inserted the socket into your weapon, it glows and humms for an instant and now seems much more powerful.\n\r", ch);
	return;
}

add the following case to show_object_values ( olc_act.c ) :

	case ITEM_SOCKET:
	    sprintf( buf,
	        "{G[{Yv0{G]{R to hit:   {W[{C%d{W]{x\n\r"
		  "{G[{Yv1{G]{R to dam:   {W[{C%d{W]{x\n\r",
	        obj->value[0],
	        obj->value[1] );
	    send_to_char( buf,ch );
	    break;
	
add the following case to set_object_values ( olc_act.c ) :

        case ITEM_SOCKET:
	    switch ( value_num )
	    {
	        default:
		    do_help( ch, "ITEM_SOCKET" );
		    return FALSE;
	        case 0:
		    send_to_char( "HIT modifier SET.\n\r\n\r", ch );
		    pObj->value[0] = atoi( argument );
		    break;
	        case 1:
		    send_to_char( "DAM modifier SET.\n\r\n\r", ch );
		    pObj->value[1] = atoi( argument );
		    break;
	    }
	    break;

there might be some more i'm forgetting too, but try this.