#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"

void 
undo_it (CHAR_DATA * ch, ROOM_DATA * rid, int strength, short came_from)
{
  int i = 0;
  if (strength < 1)
    return;
  if (rid->y == 0)
    return;
  rid->y = 0;
  for (i = 0; i < 6; i ++)
    {
      if (rid->exit[i] && rid->exit[i]->to_room)
	{
	  undo_it (ch, rid->exit[i]->to_room, strength--, i);
	}
    }
  return;
}

void 
do_it (CHAR_DATA * ch, ROOM_DATA * rid, int strength, short came_from)
{
  CHAR_DATA *fch;
  char buffr[1200];
  int ctr = 0;
  int i = 0;
  if (strength < 1)
    return;
  if (IS_SET (rid->room_flags, ROOM_NOHEAR))
    return;
  if (rid->y == TRUE)
    return;
  rid->y = TRUE;
  check_room_more(rid);
  for (fch = rid->more->people; fch != NULL; fch = fch->next_in_room)
    {
      if (fch == ch) continue;
      if (IS_MOB(fch)) continue;
      if (ignore(ch,fch)) continue;
      if (IS_SET (fch->pcdata->deaf, CHANNEL_YELL))
	continue;
      sprintf (buffr, "\x1b[1;31m%s yells, '%s'\x1b[0;37m\n\r", capitalize(rNAME (ch, fch)), yellbuff);
      send_to_char (buffr, fch);
    }
  for (i = 0; i < 6; i++)
    {
      if (rid->exit[i] && rid->exit[i]->to_room  && came_from != rev_dir[i])
	{
	  if (IS_SET (rid->room_flags, ROOM_NOISY))
	    ctr = 1;
	  else
	    ctr = 0;
	  if (rid->exit[i]->d_info)
	    if(IS_SET (rid->exit[i]->d_info->exit_info, EX_HIDDEN))
	      ctr = 9999;
	    else if (IS_SET (rid->exit[i]->d_info->exit_info, EX_CLOSED))
	      ctr++;
	  do_it (ch, rid->exit[i]->to_room, (strength - ctr - 1), i);
	}
    }
  
  return;
}

void 
find_people_n (CHAR_DATA * ch, int n)
{
  if (!ch->in_room)
    {
      return;
    }
  if (n > 25)
    {
      send_to_char ("Error in find_people_n: Max depth is 15.\n\r", ch);
      return;
    }
  do_it (ch, ch->in_room, n, 9999);
  undo_it (ch, ch->in_room, n, 9999);
  return;
}