void do_shoot( CHAR_DATA *ch, char *argument )
{
  char arg1[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  char arg3[MAX_INPUT_LENGTH];
  CHAR_DATA *victim;
  ROOM_INDEX_DATA *to_room;
  OBJ_DATA *Obj;
  OBJ_DATA *bow;
  to_room = ch->in_room;

  argument = one_argument( argument, arg1 );
  argument = one_argument( argument, arg2 );
  argument = one_argument( argument, arg3 );

  if (!get_skill( ch, gsn_archery ) )
	{ send_to_char( "Maybe you should learn to use a bow.\n\r", ch );
  	return;
	}

  if ( arg1[0] == '\0' )
  {
    send_to_char( "What do you intend on shooting?\n\r", ch);
    return;
  }

  if ( ( Obj = get_obj_carry( ch, arg1 ) ) == NULL )
  {
    send_to_char( "You are not carrying that item.\n\r", ch );
    return;
  }

  if (!(IS_SET(Obj->extra_flags, ITEM_AMMO)) )
  {
    send_to_char( "You cannot shoot that item.\n\r", ch );
    return;
  }

  if (IS_SET( Obj->extra_flags, ITEM_NOREMOVE ) )
  {
    send_to_char( "You can't let go of it!\n\r", ch );
    return;
  }

  if ( ( bow = get_eq_char( ch, WEAR_WIELD ) ) == NULL || bow->item_type != ITEM_BOWTYPE )
    {
	send_to_char( "You aren't holding a ranged weapon.\n\r", ch);
	return;
    }

    if ( arg3[0] == '\0' )
    {
      if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
      {
	send_to_char( "They aren't here.\n\r", ch );
	return;
      }
    }

    if ( number_percent() > ch->pcdata->learned[gsn_archery] + get_curr_stat(ch,STAT_DEX) / 2)
	{
        send_to_char( "You fumble with your bow!\n\r", ch );
        return;
    }

	act( "{c$n shoots $p at $N!{x", ch, Obj, victim, TO_ROOM );
	act( "{cYou shoot $p at $N.{x", ch, Obj, victim, TO_CHAR );
	damage(ch,victim,number_range(2, 30 + 2 * ch->level),gsn_archery);
	check_improve(ch,gsn_archery,TRUE,2);
	obj_from_char( Obj );
	obj_to_room( Obj, ch->in_room );
	return;
}