1stMud/CVS/
1stMud/area/CVS/
1stMud/backup/CVS/
1stMud/bin/
1stMud/bin/CVS/
1stMud/bin/extras/
1stMud/bin/extras/CVS/
1stMud/data/CVS/
1stMud/data/i3/CVS/
1stMud/doc/1stMud/
1stMud/doc/1stMud/CVS/
1stMud/doc/CVS/
1stMud/doc/Diku/
1stMud/doc/Diku/CVS/
1stMud/doc/MPDocs/CVS/
1stMud/doc/Merc/CVS/
1stMud/doc/Rom/
1stMud/doc/Rom/CVS/
1stMud/log/CVS/
1stMud/notes/
1stMud/notes/CVS/
1stMud/player/CVS/
1stMud/player/backup/CVS/
1stMud/player/deleted/CVS/
1stMud/src/CVS/
1stMud/src/config/CVS/
1stMud/src/h/CVS/
1stMud/src/o/CVS/
1stMud/win/CVS/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           Brian Moore (zump@rom.org)                                    *
*       By using this code, you have agreed to follow the terms of the    *
*       ROM license, in the file Rom24/doc/rom.license                    *
***************************************************************************
*          1stMud ROM Derivative (c) 2001-2004 by Markanth                *
*            http://www.firstmud.com/  <markanth@firstmud.com>            *
*         By using this code you have agreed to follow the term of        *
*             the 1stMud license in ../doc/1stMud/LICENSE                 *
***************************************************************************/

#include "merc.h"
#include "interp.h"
#include "tables.h"
#include "recycle.h"

bool
is_ignoring (CharData * ch, const char *name, flag_t bit)
{
  int pos;

  if (ch == NULL || NullStr (name))
    return false;

  if (IsNPC (ch))
    return false;

  for (pos = 0; pos < MAX_IGNORE; pos++)
    {
      if (NullStr (ch->pcdata->ignore[pos]))
	break;

      if (is_name (ch->pcdata->ignore[pos], name))
	{
	  if (bit == 0
	      || IsSet (ch->pcdata->ignore_flags[pos], bit | IGNORE_ALL))
	    return true;
	}
    }

  return false;
}

Do_Fun (do_ignore)
{
  CharData *victim;
  char arg[MIL];
  int pos;
  bool found = false;
  CharData *wch;
  flag_t iValue;

  argument = one_argument (argument, arg);

  if (IsNPC (ch))
    return;

  if (NullStr (arg))
    {
      Buffer *output = new_buf ();

      bprintln (output, "People you are ignoring:");
      bprintln (output, draw_line (ch, "-=", 0));
      for (pos = 0; pos < MAX_IGNORE; pos++)
	{
	  if (NullStr (ch->pcdata->ignore[pos]))
	    break;
	  found = true;
	  bprintlnf (output, "[%02d] %-12s", pos + 1,
		     ch->pcdata->ignore[pos]);
	}
      if (!found)
	bprintln (output, "No one.");
      found = false;
      pos = 0;
      bprintln (output, NULL);
      bprintln (output, "People online who are ignoring you:");
      bprintln (output, draw_line (ch, "-=", 0));
      for (wch = player_first; wch != NULL; wch = wch->next_player)
	{
	  if (!can_see (ch, wch) || !is_ignoring (wch, ch->name, 0))
	    continue;
	  pos++;
	  found = true;
	  bprintlnf (output, "[%02d] %s", pos, wch->name);
	}
      if (!found)
	bprintln (output, "No one.");
      bprintln (output, NULL);
      bprintlnf
	(output,
	 "Use '%s list' to show possible flags, use '%s <name> <flag>' to set a flags.",
	 n_fun, n_fun);
      sendpage (ch, buf_string (output));
      free_buf (output);
      return;
    }

  if (NullStr (argument))
    {
      if (!str_cmp (arg, "list"))
	{
	  show_flags (ch, ignore_flags);
	  return;
	}
      found = false;

      for (pos = 0; pos < MAX_IGNORE; pos++)
	{
	  if (NullStr (ch->pcdata->ignore[pos]))
	    break;

	  if (found)
	    {
	      replace_str (&ch->pcdata->ignore[pos - 1],
			   ch->pcdata->ignore[pos]);
	      free_string (ch->pcdata->ignore[pos]);
	      ch->pcdata->ignore[pos] = NULL;
	      ch->pcdata->ignore_flags[pos - 1] =
		ch->pcdata->ignore_flags[pos];
	      continue;
	    }

	  if (!str_cmp (arg, ch->pcdata->ignore[pos]))
	    {
	      free_string (ch->pcdata->ignore[pos]);
	      ch->pcdata->ignore[pos] = NULL;
	      ch->pcdata->ignore_flags[pos] = 0;
	      found = true;
	    }
	}
      if (found)
	{
	  chprintlnf (ch, "You stop ignoring %s.", capitalize (arg));
	  return;
	}
    }
  else
    {
      for (pos = 0; pos < MAX_IGNORE; pos++)
	{
	  if (NullStr (ch->pcdata->ignore[pos]))
	    break;

	  if (!str_cmp (arg, ch->pcdata->ignore[pos]))
	    {
	      found = true;
	      break;
	    }
	}
      if (!found)
	{
	  chprintln (ch, "They are not on your ignore list.");
	  return;
	}
    }

  if (pos >= MAX_IGNORE)
    {
      chprintln (ch, "You can't ignore anymore people");
      return;
    }

  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      chprintln (ch, "That character isn't online.");
      return;
    }
  else
    {
      if (IsNPC (victim))
	{
	  chprintln (ch, "Ignore a mob?  I don't think so.");
	  return;
	}

      if (ch == victim)
	{
	  chprintln (ch, "I don't think you really want to ignore yourself.");
	  return;
	}

      if (!is_exact_name (victim->name, arg))
	{
	  chprintln (ch, "You must spell out their entire name.");
	  return;
	}

      if (IsImmortal (victim))
	{
	  chprintln (ch, "You're not going to ignore us that easily!");
	  return;
	}
    }
  if (NullStr (argument))
    {
      replace_str (&ch->pcdata->ignore[pos], capitalize (arg));
      ch->pcdata->ignore_flags[pos] = IGNORE_CHANNELS;
      chprintlnf (ch, "You now ignore %s.", capitalize (arg));
      chprintlnf
	(ch,
	 "Use '%s list' to show possible flags, use '%s <name> <flag>' to set a flags.",
	 n_fun, n_fun);
    }
  else if ((iValue = flag_value (ignore_flags, argument)) != NO_FLAG)
    {
      set_on_off (ch, &ch->pcdata->ignore_flags[pos], iValue,
		  FORMATF ("%s ignore flag set for %s.",
			   flag_string (ignore_flags, iValue),
			   ch->pcdata->ignore[pos]),
		  FORMATF ("%s ignore flag removed for %s.",
			   flag_string (ignore_flags, iValue),
			   ch->pcdata->ignore[pos]));
      return;
    }
  else
    {
      chprintlnf (ch, "Valid flags for %s are:", arg);
      print_all_on_off (ch, ignore_flags, ch->pcdata->ignore_flags[pos]);
    }
  return;

}