/
mudtem/
mudtem/area/scripts/
mudtem/bin/
mudtem/log/
mudtem/player/
mudtem/slang/autoconf/
mudtem/slang/doc/
mudtem/slang/doc/OLD/help/
mudtem/slang/doc/internal/
mudtem/slang/doc/text/
mudtem/slang/doc/tm/tools/
mudtem/slang/examples/
mudtem/slang/modules/
mudtem/slang/slsh/
mudtem/slang/slsh/lib/
mudtem/slang/slsh/scripts/
mudtem/slang/src/mkfiles/
mudtem/slang/src/util/
mudtem/src/CVS/
mudtem/src/include/
mudtem/src/include/CVS/
mudtem/src/var/CVS/
    char buf[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    ROOM_INDEX_DATA *location;
    int temp = -1, tempvnum;

    if (IS_NPC(ch) && !IS_SET(ch->act,ACT_PET))
    {
	send_to_char("Solo los jugadores pueden revocar.\n\r",ch);
	return;
    }
  
    if ( !IS_NULLSTR(argument) )
    {
    	temp = get_hometown(argument);

    	if ( temp == -1 )
    	{
    		send_to_char( "Debes poner una ciudad como argumento.\n\r", ch );
    		return;
    	}
    }

    act( "$n ruega por transporte!", ch, NULL, NULL, TO_ROOM );

    if ( IS_NPC(ch) && IS_PET(ch) && ch->position == POS_FIGHTING )
    	return;

    if ( temp > -1 )
    {
    	tempvnum = hometown_table[temp].recall;
	if ( !IS_NPC(ch) )
		ch->pcdata->hometown = temp;
    }
    else
    {
    	if ( IS_NPC(ch)
    	&&   IS_SET(ch->act,ACT_PET)
    	&&   ch->master
    	&&  !IS_NPC(ch->master) )
    		tempvnum = hometown_table[ch->master->pcdata->hometown].recall;
    	else    	
	if ( !IS_NPC(ch) )
    		tempvnum = hometown_table[ch->pcdata->hometown].recall;
    	else
    		tempvnum = ROOM_VNUM_TEMPLE;
    }

    if ( ( location = get_room_index( tempvnum ) ) == NULL )
    {
	send_to_char( "Estas completamente perdido.\n\r", ch );
	return;
    }

    if ( ch->in_room == location )
	return;

    if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL)
    ||   IS_AFFECTED(ch, AFF_CURSE))
    {
	send_to_char( "Mota te ha olvidado.\n\r", ch );
	return;
    }

    if ( ( victim = ch->fighting ) != NULL )
    {
	int lose,skill;

	skill = get_skill(ch,gsn_recall);

	if ( number_percent() < 80 * skill / 100 )
	{
	    check_improve(ch,gsn_recall,FALSE,2);
	    WAIT_STATE( ch, 4 );
	    send_to_char( "Fallaste!\n\r", ch );
	    return;
	}

	lose = (ch->desc != NULL) ? 25 : 50;
	gain_exp( ch, 0 - lose );
	check_improve(ch,gsn_recall,TRUE,2);
	sprintf( buf, "Revocas del combate!  Pierdes %d exps.\n\r", lose );
	send_to_char( buf, ch );
	stop_fighting( ch, TRUE );
    }

    if ( (ch->level > 14) && !CHANCE(get_skill(ch,gsn_recall)) && CHANCE(ch->level) )
	location = get_random_room( chToEnt(ch) );

    ch->move /= 2;
    act( "$n desaparece.", ch, NULL, NULL, TO_ROOM );
    char_from_room( ch );
    char_to_room( ch, location );
    act( "$n aparece en el cuarto.", ch, NULL, NULL, TO_ROOM );
    do_look( ch, "auto" );
    check_improve(ch,gsn_recall,TRUE,3);
    
    if (ch->pet != NULL)
	do_recall(ch->pet,"");

    return;