/* Scatters everything in the room to random rooms all over your mud */
/* Written by Dither of Planes of Dominion webmaster@podmud.com */
/* Updated by Alderon of Anime MUD 2, anime2.ipupdater.net:7000 */
/* Added the ability to scatter objects, mobiles, and players seperately */
/* Further updated by Jaagari of Anime MUD 2 to allow specific areas to be */
/* chosen */

void do_scatter( CHAR_DATA *ch, char *argument )
{
  char arg[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  int tmp;
  CHAR_DATA *victim;
  OBJ_DATA *obj;
  OBJ_DATA *obj_next;
  ROOM_INDEX_DATA *pRoomIndex;
  CHAR_DATA *vnext;
  AREA_DATA *area = NULL;
  

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


  if (arg[0] == '\0' && arg2[0] == '\0') {
	send_to_char("You must specify `#object`7, `#mobile`7, or `#players``.\n\r", ch);
	return;
    }

  if (arg2[0] != '\0')
  {
	  for (area = area_first; area; area = area->next)
	  {
		  if (!str_prefix(arg2, area->name) && area->security == 9)
		  {
			  break;
		  }
	  }
	  if (!str_prefix(arg2, "here") && ch->in_room->area->security == 9)
	  {
		  area =  ch->in_room->area;
	  }
	  if (area == NULL)
	  {
		  send_to_char("That is not a valid area!\n\r", ch);
		  send_to_char("Syntax is:\n\rscatter <objext|mobile|player> [name of area|here]\n\r", ch);
		  return;
	  }
  }
		
			  

  
	if (!str_prefix(arg, "object"))
	{

		for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next ) 
		{
			obj_next = obj->next_content;

			if (area)
			{
				/* This gets an actual loop because it can get caught in an inf-loop
					much easier */
				for (tmp=0;tmp < 1000;tmp++ )
				{
					pRoomIndex = get_room_index( number_range( area->min_vnum, area->max_vnum ) );
					if ( pRoomIndex != NULL )
						if ( CAN_ACCESS(pRoomIndex) )
							break;
				}
				if (pRoomIndex == NULL)
					pRoomIndex = ch->in_room;
			}
			else
			{
				for ( ; ; )
				{
					pRoomIndex = get_room_index( number_range( 0, 65535 ) );
					if ( pRoomIndex != NULL )
						if ( CAN_ACCESS(pRoomIndex) )
							break;
				}
			}

			if (CAN_WEAR(obj, ITEM_TAKE))
			{
				obj_from_room(obj);
				obj_to_room(obj, pRoomIndex);
			}
		}
		send_to_char("Items scattered.\n\r",ch);
	return;
	}

	if (!str_prefix(arg, "mobile"))
	{

		for (victim = ch->in_room->people; victim != NULL; victim = vnext) 
		{
			vnext = victim->next_in_room;
			if (area)
			{
				/* This gets an actual loop because it can get caught in an inf-loop
					much easier */
				for (tmp=0;tmp < 1000;tmp++ )
				{
					pRoomIndex = get_room_index( number_range( area->min_vnum, area->max_vnum ) );
					if ( pRoomIndex != NULL )
						if ( CAN_ACCESS(pRoomIndex) )
							break;
				}
				if (pRoomIndex == NULL)
					pRoomIndex = ch->in_room;
			}
			else
			{
				for ( ; ; )
				{
					pRoomIndex = get_room_index( number_range( 0, 65535 ) );
					if ( pRoomIndex != NULL )
						if ( CAN_ACCESS(pRoomIndex) )
							break;
				}
			}

			if (IS_NPC(victim)
				&& !IS_SET(victim->act, ACT_AGGRESSIVE) )
			{
				char_from_room(victim);
				char_to_room(victim, pRoomIndex);
			}
		}
		send_to_char("Mobiles scattered.\n\r",ch);
		return;
	}

	if (!str_prefix(arg, "players"))
	{
		for (victim = ch->in_room->people; victim != NULL; victim = vnext) 
		{
			vnext = victim->next_in_room;
			if (area)
			{
				/* This gets an actual loop because it can get caught in an inf-loop
					much easier */
				for (tmp=0;tmp < 1000;tmp++ )
				{
					pRoomIndex = get_room_index( number_range( area->min_vnum, area->max_vnum ) );
					if ( pRoomIndex != NULL )
						if ( CAN_ACCESS(pRoomIndex) )
							break;
				}
				if (pRoomIndex == NULL)
					pRoomIndex = ch->in_room;
			}
			else
			{
				for ( ; ; )
				{
					pRoomIndex = get_room_index( number_range( 0, 65535 ) );
					if ( pRoomIndex != NULL )
						if ( CAN_ACCESS(pRoomIndex) )
							break;
				}
			}
			if (!IS_NPC(victim)
				&& !IS_IMMORTAL(victim))
			{
				char_from_room(victim);
				char_to_room(victim, pRoomIndex);
				send_to_char("`!You have been scattered!``\n\r", victim);
				do_look(victim, "auto");
			}
		}
		send_to_char("Players scattered.\n\r",ch);
		return;
	}
}