/
mudd/docs/html/
mudd/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mud.h"

void 
undo_it (ROOM_DATA * rid)
{
  int i = 0;
  if (!IS_SET(rid->room_flags, R_MARK))
    return;
  REMOVE_BIT(rid->room_flags, R_MARK);
  for (i = 0; i < 6; i ++)
    if (rid->exit[i] && rid->exit[i]->to_room)
      undo_it (rid->exit[i]->to_room);
  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, j;
  if (strength < 1)
    return;
  if (IS_SET(rid->room_flags, R_MARK)) 
    return;
  SET_BIT(rid->room_flags, R_MARK);
  if (IS_SET (rid->room_flags, ROOM_NOHEAR))
    return;
  for (fch = rid->people; fch != NULL; fch = fch->next_in_room)
    {
      if (fch == ch || 
	  IS_HURT(fch, DEAF) || 
	  (IS_PLAYER(fch) && 
	   (ignore(ch,fch) ||
	    IS_SET (fch->pcdata->deaf, CHANNEL_YELL)))) continue;
      sprintf (buffr, "\x1b[1;31m%s\x1b[1;31m yells, '%s'\x1b[0m\n\r", capitalize(rNAME (ch, fch)), yellbuff);
      send_to_char (buffr, fch);
      if (being_attacked_yell && IS_MOB(fch) && FIGHTING (ch) &&  
	  IS_MOB(ch) &&  !FIGHTING(fch) && 
	  ((fch->pIndexData->yeller_number == ch->pIndexData->yeller_number && 
	    fch->pIndexData->will_help > 0 && 
	    number_range(1, fch->pIndexData->will_help) == 1) ||
	   (ch->society && fch->society == ch->society && 
	    number_range(1,3) == 2)))
	{
	  check_fgt(fch);
	  if (fch->fgt->hunting)
	    {
	      free_string(fch->fgt->hunting);
	      fch->fgt->hunting = &str_empty[0];
	    }
	  fch->fgt->hunting = str_dup(NAME(FIGHTING(ch)));
	  add_to_fighting_list(fch);
	  SET_BIT (fch->act, ACT_FASTHUNT);
	}
    }
  for (j = 0; j < 6; j++)
    {
      i = ((came_from + j) % 6);
      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 25.\n\r", ch);
      return;
    }
  do_it (ch, ch->in_room, n, 9999);
  undo_it (ch->in_room);
  return;
}