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"


RoomIndex *
get_random_room (CharData * ch)
{
  RoomIndex *room;

  for (;;)
    {
      room = get_room_index (number_range (0, 65535));
      if (room != NULL)
	if (can_see_room (ch, room) && !room_is_private (room) &&
	    !IsSet (room->room_flags, ROOM_PRIVATE) &&
	    !IsSet (room->room_flags, ROOM_SOLITARY) &&
	    !IsSet (room->area->area_flags, AREA_CLOSED) &&
	    !IsSet (room->room_flags, ROOM_ARENA) &&
	    !IsSet (room->room_flags, ROOM_SAFE) && (IsNPC (ch) ||
						     IsSet (ch->act,
							    ACT_AGGRESSIVE)
						     ||
						     !IsSet
						     (room->room_flags,
						      ROOM_LAW)))
	  break;
    }

  return room;
}


Do_Fun (do_enter)
{
  RoomIndex *location;

  if (ch->fighting != NULL)
    return;


  if (!NullStr (argument))
    {
      RoomIndex *old_room;
      ObjData *portal;
      CharData *fch, *fch_next;

      old_room = ch->in_room;

      portal = get_obj_list (ch, argument, ch->in_room->content_first);

      if (portal == NULL)
	{
	  chprintln (ch, "You don't see that here.");
	  return;
	}

      if (portal->item_type != ITEM_PORTAL ||
	  (IsSet (portal->value[1], EX_CLOSED) && !IsTrusted (ch, ANGEL)))
	{
	  chprintln (ch, "You can't seem to find a way in.");
	  return;
	}

      if (!IsTrusted (ch, ANGEL) &&
	  !IsSet (portal->value[2], GATE_NOCURSE) &&
	  (IsAffected (ch, AFF_CURSE) ||
	   IsSet (old_room->room_flags, ROOM_NO_RECALL)))
	{
	  chprintln (ch, "Something prevents you from leaving...");
	  return;
	}

      if (IsSet (portal->value[2], GATE_RANDOM) || portal->value[3] == -1)
	{
	  location = get_random_room (ch);
	  portal->value[3] = location->vnum;
	}
      else if (IsSet (portal->value[2], GATE_BUGGY)
	       && (number_percent () < 5))
	location = get_random_room (ch);
      else
	location = get_room_index (portal->value[3]);

      if (location == NULL || location == old_room ||
	  !can_see_room (ch, location) || (room_is_private (location)
					   && !IsTrusted (ch, IMPLEMENTOR)))
	{
	  act ("$p doesn't seem to go anywhere.", ch, portal, NULL, TO_CHAR);
	  return;
	}

      if (IsNPC (ch) && IsSet (ch->act, ACT_AGGRESSIVE) &&
	  IsSet (location->room_flags, ROOM_LAW))
	{
	  chprintln (ch, "Something prevents you from leaving...");
	  return;
	}

      act ("$n steps into $p.", ch, portal, NULL, TO_ROOM);

      if (IsSet (portal->value[2], GATE_NORMAL_EXIT))
	act ("You enter $p.", ch, portal, NULL, TO_CHAR);
      else
	act ("You walk through $p and find yourself somewhere else...",
	     ch, portal, NULL, TO_CHAR);

      char_from_room (ch);
      char_to_room (ch, location);

      if (IsSet (portal->value[2], GATE_GOWITH))
	{
	  obj_from_room (portal);
	  obj_to_room (portal, location);
	}

      if (IsSet (portal->value[2], GATE_NORMAL_EXIT))
	act ("$n has arrived.", ch, portal, NULL, TO_ROOM);
      else
	act ("$n has arrived through $p.", ch, portal, NULL, TO_ROOM);

      do_function (ch, &do_look, "auto");


      if (portal->value[0] > 0)
	{
	  portal->value[0]--;
	  if (portal->value[0] == 0)
	    portal->value[0] = -1;
	}


      if (old_room == location)
	return;

      for (fch = old_room->person_first; fch != NULL; fch = fch_next)
	{
	  fch_next = fch->next_in_room;

	  if (portal == NULL || portal->value[0] == -1)

	    continue;

	  if (fch->master == ch && IsAffected (fch, AFF_CHARM) &&
	      fch->position < POS_STANDING)
	    do_function (fch, &do_stand, "");

	  if (fch->master == ch && fch->position == POS_STANDING)
	    {

	      if (IsSet (ch->in_room->room_flags, ROOM_LAW) &&
		  (IsNPC (fch) && IsSet (fch->act, ACT_AGGRESSIVE)))
		{
		  act ("You can't bring $N into the city.",
		       ch, NULL, fch, TO_CHAR);
		  act ("You aren't allowed in the city.",
		       fch, NULL, NULL, TO_CHAR);
		  continue;
		}

	      act ("You follow $N.", fch, NULL, ch, TO_CHAR);
	      do_function (fch, &do_enter, argument);
	    }
	}

      if (portal != NULL && portal->value[0] == -1)
	{
	  act ("$p fades out of existence.", ch, portal, NULL, TO_CHAR);
	  if (ch->in_room == old_room)
	    act ("$p fades out of existence.", ch, portal, NULL, TO_ROOM);
	  else if (old_room->person_first != NULL)
	    {
	      act ("$p fades out of existence.",
		   old_room->person_first, portal, NULL, TO_CHAR);
	      act ("$p fades out of existence.",
		   old_room->person_first, portal, NULL, TO_ROOM);
	    }
	  extract_obj (portal);
	}


      if (IsNPC (ch) && HasTriggerMob (ch, TRIG_ENTRY))
	p_percent_trigger (ch, NULL, NULL, NULL, NULL, NULL, TRIG_ENTRY);
      if (!IsNPC (ch))
	{
	  p_greet_trigger (ch, PRG_MPROG);
	  p_greet_trigger (ch, PRG_OPROG);
	  p_greet_trigger (ch, PRG_RPROG);
	}

      return;
    }

  chprintln (ch, "Nope, can't do it.");
  return;
}

Do_Fun (do_worship)
{
  CharData *priest;
  DeityData *i;

  if (NullStr (argument))
    {
      cmd_syntax (ch, NULL, n_fun, "<deity>", "list", NULL);
      return;
    }

  if (!str_cmp (argument, "list"))
    {
      int e;

      for (e = ETHOS_LAWFUL_GOOD; e != ETHOS_CHAOTIC_EVIL; e--)
	{
	  for (i = deity_first; i; i = i->next)
	    {
	      if (i->ethos != (ethos_t) e)
		continue;

	      chprintlnf (ch, "\t%-12s (%s): %s", i->name,
			  flag_string (ethos_types, i->ethos), i->desc);
	    }
	}
      return;
    }

  for (priest = ch->in_room->person_first; priest != NULL;
       priest = priest->next_in_room)
    if (IsNPC (priest) && IsSet (priest->act, ACT_IS_HEALER))
      break;

  if (priest == NULL)
    {
      chprintln (ch, "There is no priest here!");
      return;
    }

  if (ch->pcdata->quest.points < 250)
    {
      chprintln (ch, "You need 250 questpoints to change your deity.");
      return;
    }

  i = deity_lookup (argument);

  if (i == NULL)
    {
      chprintln (ch, "That deity doesn't exist.");
      return;
    }

  ch->deity = i;
  chprintlnf (ch, "You now worship %s.", i->name);
  ch->pcdata->quest.points -= 250;
  return;
}


Do_Fun (do_heel)
{
  if (ch->pet == NULL)
    {
      chprintln (ch, "You don't have a pet!");
      return;
    }
  if (IsSet (ch->in_room->room_flags, ROOM_ARENA))
    {
      act ("$N can't hear your whistle with all the screaming.", ch, NULL,
	   ch->pet, TO_CHAR);
      return;
    }
  char_from_room (ch->pet);
  char_to_room (ch->pet, ch->in_room);
  act ("$n lets out a loud whistle and $N comes running.", ch, NULL,
       ch->pet, TO_ROOM);
  act ("You let out a loud whistle and $N comes running.", ch, NULL,
       ch->pet, TO_CHAR);
}