legend/
legend/area/
legend/player/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments 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          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
/***************************************************************************
 *  God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock        *
 *  									   *
 *  Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
 *  This mud is NOT to be copied in whole or in part, or to be run without *
 *  the permission of Matthew Little. Nobody else has permission to        *
 *  authorise the use of this code.                                        *
 ***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "garou.h"

extern bool nosafe;
/*
 * Local functions.
 */
NCLANS_DATA *nclans_table;
void adv_spell_damage args ((CHAR_DATA * ch, OBJ_DATA * book,
			     OBJ_DATA * page, char *argument));
void adv_spell_affect args ((CHAR_DATA * ch, OBJ_DATA * book,
			     OBJ_DATA * page, char *argument));
void adv_spell_action args ((CHAR_DATA * ch, OBJ_DATA * book,
			     OBJ_DATA * page, char *argument));
void birth_write args ((CHAR_DATA * ch, char *argument));
bool birth_ok args ((CHAR_DATA * ch, char *argument));



/* Need to get rid of those flames somehow - KaVir */
void do_smother (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];

   one_argument (argument, arg);
   if (IS_NPC (ch))
      return;

   if (arg[0] == '\0')
   {
      send_to_char ("Smother whom?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char
	 ("You cannot smother yourself.\n\rUse 'rolldirt' instead.\n\r", ch);
      return;
   }

   if (!IS_AFFECTED (victim, AFF_FLAMING))
   {
      send_to_char ("But they are not on fire!\n\r", ch);
      return;
   }

   if (number_percent () > (ch->level * 2))
   {
      act ("You try to smother the flames around $N but fail!", ch, NULL,
	   victim, TO_CHAR);
      act ("$n tries to smother the flames around you but fails!", ch, NULL,
	   victim, TO_VICT);
      act ("$n tries to smother the flames around $N but fails!", ch, NULL,
	   victim, TO_NOTVICT);
      if (number_percent () > 98 && !IS_AFFECTED (ch, AFF_FLAMING) && !WORN_ARTIFACT (ch, ARTI_DEMONS_HEART))
      {
	 act ("A spark of flame from $N's body sets you on fire!", ch, NULL,
	      victim, TO_CHAR);
	 act ("A spark of flame from your body sets $n on fire!", ch, NULL,
	      victim, TO_VICT);
	 act ("A spark of flame from $N's body sets $n on fire!", ch, NULL,
	      victim, TO_NOTVICT);
	 SET_BIT (ch->affected_by, AFF_FLAMING);
	 do_humanity (ch, "");
      }
      return;
   }

   act ("You manage to smother the flames around $M!", ch, NULL, victim,
	TO_CHAR);
   act ("$n manages to smother the flames around you!", ch, NULL, victim,
	TO_VICT);
   act ("$n manages to smother the flames around $N!", ch, NULL, victim,
	TO_NOTVICT);
   REMOVE_BIT (victim->affected_by, AFF_FLAMING);
   do_humanity (ch, "");
   return;
}

DO_COM (do_rolldirt)
{
   CHAR_DATA *vch;
   bool set_fire = FALSE;

   if (!IS_AFFECTED (ch, AFF_FLAMING))
   {
      send_to_char ("You are not on fire.\n\r", ch);
      return;
   }

   act ("$n rolls about in the dirt.", ch, NULL, NULL, TO_ROOM);
   send_to_char ("You roll about in the dirt.\n\r", ch);

   if (IS_AFFECTED (ch, AFF_FLAMING) && number_percent () > 80
       && ch->in_room != NULL)
   {
      set_fire = TRUE;
      for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room)
      {
	 if (number_percent () < 65)
	    continue;
	 if (!IS_HERO (vch))
	    continue;
	 if (IS_IMMORTAL (vch))
	    continue;
	 if (IS_AFFECTED (vch, AFF_FLAMING))
	    continue;
         if (WORN_ARTIFACT (vch, ARTI_DEMONS_HEART))
            continue;
         act ("A spark leaps from $n's body and sets you on fire!", ch, NULL,
	      vch, TO_VICT);
	 act ("A spark leaps from your body and sets $N on fire!", ch, NULL,
	      vch, TO_CHAR);
	 act ("A sprak leaps from $n's body and sets $N on fire!", ch, NULL,
	      vch, TO_NOTVICT);
	 SET_BIT (vch->affected_by, AFF_FLAMING);
      }
   }

   if (set_fire)
      return;

   if (number_percent () < 25)
   {
      send_to_char ("The flames around your body die out.\n\r", ch);
      act ("The flames around $n's body die out.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->affected_by, AFF_FLAMING);
   }
   return;
}

/* Loads of Vampire powers follow.  KaVir */

void do_fangs (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_FANGS))
      {
	 send_to_char ("You haven't been granted the gift of fangs.\n\r", ch);
	 return;
      }
   }
   else if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
   {
      send_to_char ("Your beast won't let you retract your fangs.\n\r", ch);
      return;
   }

   if (IS_VAMPAFF (ch, VAM_FANGS))
   {
      send_to_char ("Your fangs slide back into your gums.\n\r", ch);
      act ("$n's fangs slide back into $s gums.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
      return;
   }
   send_to_char ("Your fangs extend out of your gums.\n\r", ch);
   act ("A pair of razor sharp fangs extend from $n's mouth.", ch, NULL, NULL,
	TO_ROOM);
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
   return;
}

void do_shift (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   int toform = 0;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char
	 ("You can shift between the following forms: Homid, Glabro, Crinos, Hispo, Lupus.\n\r",
	  ch);
      return;
   }
   if (!str_cmp (arg, "homid"))
      toform = 1;
   else if (!str_cmp (arg, "glabro"))
      toform = 2;
   else if (!str_cmp (arg, "crinos"))
      toform = 3;
   else if (!str_cmp (arg, "hispo"))
      toform = 4;
   else if (!str_cmp (arg, "lupus"))
      toform = 5;
   else
   {
      send_to_char
	 ("You can shift between the following forms: Homid, Glabro, Crinos, Hispo, Lupus.\n\r",
	  ch);
      return;
   }
   if (ch->pcdata->stats[UNI_FORM0] < 1 || ch->pcdata->stats[UNI_FORM0] > 5)
      ch->pcdata->stats[UNI_FORM0] = 1;
   if (ch->pcdata->stats[UNI_FORM0] == toform)
   {
      send_to_char ("You are already in that form.\n\r", ch);
      return;
   }
   ch->pcdata->stats[UNI_FORM1] = toform;
   return;
}

void do_claws (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_CLAWS))
      {
	 send_to_char ("You haven't been granted the gift of claws.\n\r", ch);
	 return;
      }
   }

   else if (IS_CLASS (ch, CLASS_NINJA))
   {
      if (ch->pcdata->powers[NPOWER_NINGENNO] < 1)
      {
	 send_to_char
	    ("You have not learned the Ningenno principle to 1.\n\r", ch);
	 return;
      }
      if (ch->move < 500)
      {
	 send_to_char ("You don't have enough movement points!\n\r", ch);
	 return;
      }
   }
   else if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_DRAGON)
	    && !IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_PROT) < 2)
   {
      send_to_char ("You need level 2 protean first.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
   {
      send_to_char ("Your beast won't let you retract your claws.\n\r", ch);
      return;
   }

   if (IS_VAMPAFF (ch, VAM_CLAWS))
   {
      if (IS_CLASS (ch, CLASS_VAMPIRE))
      {
	 send_to_char ("Your claws slide back under your nails.\n\r", ch);
	 act ("$n's claws slide back under $s nails.", ch, NULL, NULL,
	      TO_ROOM);
      }
      else if (IS_CLASS (ch, CLASS_NINJA)
	       && ch->pcdata->powers[NPOWER_NINGENNO] > 0)
      {
	 send_to_char ("You shove your iron claws up your sleeves.\n\r", ch);
	 act ("$n shoves $s iron claws up $e sleeves.", ch, NULL, NULL,
	      TO_ROOM);
      }
      else
      {
	 send_to_char ("Your talons slide back into your fingers.\n\r", ch);
	 act ("$n's talons slide back into $s fingers.", ch, NULL, NULL,
	      TO_ROOM);
      }
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Sharp claws extend from under your finger nails.\n\r",
		    ch);
      act ("Sharp claws extend from under $n's finger nails.", ch, NULL, NULL,
	   TO_ROOM);
   }
   else if (IS_CLASS (ch, CLASS_NINJA)
	    && ch->pcdata->powers[NPOWER_NINGENNO] > 0)
   {
      send_to_char ("Iron claws come sliding from your sleeves.\n\r", ch);
      act ("Iron claws come sliding from under $n's sleeves.", ch, NULL, NULL,
	   TO_ROOM);
      ch->move -= 500;
   }
   else
   {
      send_to_char ("Razor sharp talons extend from your fingers.\n\r", ch);
      act ("Razor sharp talons extend from $n's fingers.", ch, NULL, NULL,
	   TO_ROOM);
   }
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
   return;
}

void do_nightsight (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DEMON)
       && !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS (ch, CLASS_WEREWOLF)
       && !IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_DRAGON)
       && !IS_SET (ch->special, SPC_CHAMPION))
   {
      do_rand_typo (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      if (!IS_DEMPOWER (ch, HPOWER_NIGHTSIGHT))
      {
	 stc ("You have not gained the power of vision.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_EYES))
      {
	 send_to_char ("You haven't been granted the gift of nightsight.\n\r",
		       ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_DRAGON)
       && !IS_SET (ch->pcdata->dragonaff, DRA_TRUESIGHT))
   {
      send_to_char ("You don't have sight beyond sight yet.\n\r", ch);
      return;
   }
   else if (IS_CLASS (ch, CLASS_WEREWOLF))
   {
      if (ch->gifts[METIS] < 3)
      {
	 do_rand_typo (ch);
	 return;
      }
   }
   else if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_PROT) < 1
            && get_disc(ch, VAM_OBTE) < 3)
   {
      send_to_char ("You need level 1 protean first.\n\r", ch);
      return;
   }
   else if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 1)
   {
      stc ("You must obtain a level one knowledge of Awareness first.\n\r",
	   ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
   {
      send_to_char ("Not while your beast is in control.\n\r", ch);
      return;
   }

   if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
   {
      send_to_char ("The red glow in your eyes fades.\n\r", ch);
      act ("The red glow in $n's eyes fades.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
      return;
   }
   send_to_char ("Your eyes start glowing red.\n\r", ch);
   act ("$n's eyes start glowing red.", ch, NULL, NULL, TO_ROOM);
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
   return;
}

void do_anarch (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (strlen (ch->clan) > 1)
   {
      send_to_char ("But you are already in a clan!\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_INCONNU))
   {
      send_to_char ("But you are already an Inconnu!\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_ANARCH))
   {
      send_to_char ("You are no longer an Anarch.\n\r", ch);
      sprintf (buf, "%s is no longer an Anarch!", ch->name);
      class_info (buf, ch);
      REMOVE_BIT (ch->special, SPC_ANARCH);
      return;
   }
   send_to_char ("You are now an Anarch.\n\r", ch);
   sprintf (buf, "%s is now an Anarch!", ch->name);
   class_info (buf, ch);
   SET_BIT (ch->special, SPC_ANARCH);
   return;
}
void do_rogue (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DEMON))
   {
      do_rand_typo (ch);
      return;
   }

   if (strlen (ch->clan) > 1)
   {
      send_to_char ("But you are already in a clan!\n\r", ch);
      return;
   }


   if (IS_SET (ch->special, SPC_ANARCH))
   {
      send_to_char ("You are no longer a Rogue.\n\r", ch);
      REMOVE_BIT (ch->special, SPC_ANARCH);
      sprintf (buf, "%s is no longer a Rogue.", ch->name);
      class_info (buf, ch);
      return;
   }
   send_to_char ("You are now an Rogue.\n\r", ch);
   SET_BIT (ch->special, SPC_ANARCH);
   sprintf (buf, "%s is now a Demon Rogue.", ch->name);
   class_info (buf, ch);
   return;
}
void do_ronin (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }

   if (strlen (ch->clan) > 1)
   {
      send_to_char ("But you are already in a clan!\n\r", ch);
      return;
   }


   if (IS_SET (ch->special, SPC_ANARCH))
   {
      send_to_char ("You are no longer a Ronin.\n\r", ch);
      REMOVE_BIT (ch->special, SPC_ANARCH);
      sprintf (buf, "%s is no longer a Ronin.", ch->name);
      class_info (buf, ch);
      return;
   }
   send_to_char ("You are now an Ronin.\n\r", ch);
   SET_BIT (ch->special, SPC_ANARCH);
   sprintf (buf, "%s is now a Ronin.", ch->name);
   class_info (buf, ch);
   return;
}

void do_inconnu (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }
 
   if (strlen (ch->clan) > 1 && ch->pcdata->stats[UNI_GEN] < 3)
   {
      send_to_char ("You cannot abandon your clan!\n\r", ch);
      return;
   }

   if (ch->pcdata->rank < AGE_ELDER && ch->pcdata->stats[UNI_GEN] > 2)
   {
      send_to_char ("You must be at least an Elder to become an Inconnu.\n\r",
		    ch);
      return;
   }

   if (IS_SET (ch->special, SPC_INCONNU))
   {
      send_to_char ("But you are already an Inconnu!\n\r", ch);
      return;
   }

   if (ch->exp < 1000000)
   {
      send_to_char ("It costs 1000000 exp to become an Inconnu.\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_ANARCH))
      REMOVE_BIT (ch->special, SPC_ANARCH);
   free_string (ch->clan);
   ch->clan = str_dup ("");
   ch->exp -= 1000000;
   send_to_char ("You are now an Inconnu.\n\r", ch);
   sprintf (buf, "%s is now an Inconnu!", ch->name);
   class_info (buf, ch);
   SET_BIT (ch->special, SPC_INCONNU);
   return;
}

void do_shadowsight (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_SHADOWSIGHT))
      {
	 send_to_char
	    ("You haven't been granted the gift of shadowsight.\n\r", ch);
	 return;
      }
   }
   else if (!IS_CLASS (ch, CLASS_WEREWOLF))
   {
      if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_MONK))
      {
	 do_rand_typo (ch);
	 return;
      }
      if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBTE) < 2)
      {
	 send_to_char
	    ("You are not trained in the Obtenebration discipline.\n\r", ch);
	 return;
      }
      if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 2)
      {
	 stc ("You must obtain a level two knowledge of Awareness first.\n\r",
	      ch);
	 return;
      }
   }

   if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
   {
      send_to_char ("You can no longer see between planes.\n\r", ch);
      REMOVE_BIT (ch->affected_by, AFF_SHADOWSIGHT);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE)
       && ch->pcdata->condition[COND_THIRST] < 10)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE))
      ch->pcdata->condition[COND_THIRST] -= number_range (5, 10);
   send_to_char ("You can now see between planes.\n\r", ch);
   SET_BIT (ch->affected_by, AFF_SHADOWSIGHT);
   return;
}

void do_bite (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   int clancount;
   bool can_sire = FALSE;
   bool outcast = FALSE;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->pcdata->stats[UNI_CURRENT] == -1)
      ch->pcdata->stats[UNI_CURRENT] = ch->pcdata->stats[UNI_AFF];

   can_sire = FALSE;

   if (ch->pcdata->stats[UNI_GEN] <= 6)
      can_sire = TRUE;

   if (!can_sire)
   {
      send_to_char ("You are not able to create any childer.\n\r", ch);
      return;
   }

   clancount = 0;
   if (IS_VAMPPASS (ch, VAM_VICISSITUDE))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_PROTEAN))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_CELERITY))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_FORTITUDE))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_POTENCE))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_OBFUSCATE))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_OBTENEBRATION))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_SERPENTIS))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_AUSPEX))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_DOMINATE))
      clancount = clancount + 1;
   if (IS_VAMPPASS (ch, VAM_PRESENCE))
      clancount = clancount + 1;

   if (arg[0] == '\0')
   {
      send_to_char ("Bite whom?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim))
   {
      send_to_char ("Not on Immortal's.\n\r", ch);
      return;
   }

   if (victim->max_hit < 3000)
   {
      stc ("You need 3000hps before you can be classed\n\r", victim);
      stc ("They need 3000hps before they can be classed\n\r", ch);
      return;
   }
   if (ch == victim)
   {
      send_to_char ("You cannot bite yourself.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MAGE))
   {
      send_to_char ("You cannot bite mages.\n\r", ch);
      return;
   }

   if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
   {
      send_to_char ("You can only bite avatars.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DROW))
   {
      send_to_char (" Not on a drow!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MONK))
   {
      send_to_char ("You cannot bite monks.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_WEREWOLF))
   {
      send_to_char ("You are unable to create werevamps!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_VAMPIRE) && ch->beast != 100)
   {
      send_to_char ("But they are already a vampire!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DROW))
   {
      send_to_char ("Not on drows!\n\r", ch);
      return;
   }


   if (IS_CLASS (victim, CLASS_NINJA))
   {
      send_to_char ("You cannot bite ninjas.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DEMON)
       || IS_SET (victim->special, SPC_CHAMPION))
   {
      send_to_char ("But they have no soul!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_HIGHLANDER))
   {
      send_to_char ("You cannot turn highlanders into vampires.\n\r", ch);
      return;
   }

   if (!IS_IMMUNE (victim, IMM_VAMPIRE) && ch->beast != 100)
   {
      send_to_char ("You cannot bite an unwilling person.\n\r", ch);
      return;
   }

   if (!IS_VAMPAFF (ch, VAM_FANGS) && ch->beast != 100)
   {
      send_to_char ("First you better get your fangs out!\n\r", ch);
      return;
   }

   if (IS_VAMPAFF (ch, VAM_DISGUISED) && ch->beast != 100)
   {
      send_to_char ("You must reveal your true nature to bite someone.\n\r",
		    ch);
      return;
   }

   if (ch->exp < 1000 && ch->beast != 100)
   {
      send_to_char ("You cannot afford the 1000 exp to create a childe.\n\r",
		    ch);
      return;
   }

   if (ch->beast == 100 || ch->pcdata->stats[UNI_RAGE] > 0)
   {
      if (!IS_VAMPAFF (ch, VAM_FANGS))
	 do_fangs (ch, "");
      act ("Your jaw opens wide and you leap hungrily at $N.", ch, NULL,
	   victim, TO_CHAR);
      act ("$n's jaw opens wide and $e leaps hungrily at $N.", ch, NULL,
	   victim, TO_NOTVICT);
      act ("$n's jaw opens wide and $e leaps hungrily at you.", ch, NULL,
	   victim, TO_VICT);
      one_hit (ch, victim, -1, 0);
      return;
   }

   if (ch->beast > 0)
      ch->beast += 1;
   ch->exp = ch->exp - 1000;
   act ("You sink your teeth into $N.", ch, NULL, victim, TO_CHAR);
   act ("$n sinks $s teeth into $N.", ch, NULL, victim, TO_NOTVICT);
   act ("$n sinks $s teeth into your neck.", ch, NULL, victim, TO_VICT);
   victim->class = CLASS_VAMPIRE;

   if (victim->pcdata->stats[UNI_GEN] != 0)
   {
      save_char_obj (ch);
      save_char_obj (victim);
      send_to_char ("Your vampiric status has been restored.\n\r", victim);
      return;
   }

   if (IS_SET (ch->special, SPC_SIRE) || ch->pcdata->stats[UNI_GEN] < 3
       || IS_SET (ch->special, SPC_PRINCE))
   {
      if (IS_SET (ch->special, SPC_SIRE))
	 REMOVE_BIT (ch->special, SPC_SIRE);
      if (IS_SET (ch->special, SPC_ANARCH) && strlen (ch->clan) < 2)
	 outcast = TRUE;
   }
   else
      outcast = TRUE;
   send_to_char ("You are now a vampire.\n\r", victim);
   victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
   free_string (victim->lord);
   if (ch->pcdata->stats[UNI_GEN] == 1)
      victim->lord = str_dup (ch->name);
   else
   {
      sprintf (buf, "%s %s", ch->lord, ch->name);
      victim->lord = str_dup (buf);
   }
   if (ch->pcdata->stats[UNI_GEN] != 1)
   {
      if (victim->pcdata->stats[UNI_CURRENT] == -1)
	 victim->pcdata->stats[UNI_CURRENT] = victim->pcdata->stats[UNI_AFF];

      /* Remove hp bonus from fortitude */
      if (IS_VAMPPASS (victim, VAM_FORTITUDE)
	  && !IS_VAMPAFF (victim, VAM_FORTITUDE))
      {
	 victim->max_hit = victim->max_hit - 50;
	 victim->hit = victim->hit - 50;
	 if (victim->hit < 1)
	    victim->hit = 1;
      }

      /* Remove any old powers they might have */
      if (IS_VAMPPASS (victim, VAM_PROTEAN))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PROTEAN);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_PROTEAN);
      }
      if (IS_VAMPPASS (victim, VAM_VICISSITUDE))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_VICISSITUDE);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_VICISSITUDE);
      }
      if (IS_VAMPPASS (victim, VAM_CELERITY))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_CELERITY);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_CELERITY);
      }
      if (IS_VAMPPASS (victim, VAM_FORTITUDE))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_FORTITUDE);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_FORTITUDE);
      }
      if (IS_VAMPPASS (victim, VAM_POTENCE))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_POTENCE);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_POTENCE);
      }
      if (IS_VAMPPASS (victim, VAM_OBFUSCATE))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBFUSCATE);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBFUSCATE);
      }
      if (IS_VAMPPASS (victim, VAM_OBTENEBRATION))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBTENEBRATION);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBTENEBRATION);
      }
      if (IS_VAMPPASS (victim, VAM_SERPENTIS))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_SERPENTIS);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_SERPENTIS);
      }
      if (IS_VAMPPASS (victim, VAM_AUSPEX))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_AUSPEX);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_AUSPEX);
      }
      if (IS_VAMPPASS (victim, VAM_DOMINATE))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_DOMINATE);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_DOMINATE);
      }
      if (IS_VAMPPASS (victim, VAM_PRESENCE))
      {
	 REMOVE_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PRESENCE);
	 REMOVE_BIT (victim->pcdata->stats[UNI_AFF], VAM_PRESENCE);
      }
      /* Give the vampire the base powers of their sire */
      if (IS_VAMPPASS (ch, VAM_FORTITUDE)
	  && !IS_VAMPAFF (victim, VAM_FORTITUDE))
      {
	 victim->max_hit = victim->max_hit + 50;
	 victim->hit = victim->hit + 50;
      }
      if (IS_VAMPPASS (ch, VAM_PROTEAN))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PROTEAN);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_PROTEAN);
      }
      if (IS_VAMPPASS (ch, VAM_VICISSITUDE))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_VICISSITUDE);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_VICISSITUDE);
      }
      if (IS_VAMPPASS (ch, VAM_CELERITY))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_CELERITY);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_CELERITY);
      }
      if (IS_VAMPPASS (ch, VAM_FORTITUDE))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_FORTITUDE);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_FORTITUDE);
      }
      if (IS_VAMPPASS (ch, VAM_POTENCE))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_POTENCE);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_POTENCE);
      }
      if (IS_VAMPPASS (ch, VAM_OBFUSCATE))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBFUSCATE);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBFUSCATE);
      }
      if (IS_VAMPPASS (ch, VAM_OBTENEBRATION))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_OBTENEBRATION);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_OBTENEBRATION);
      }
      if (IS_VAMPPASS (ch, VAM_SERPENTIS))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_SERPENTIS);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_SERPENTIS);
      }
      if (IS_VAMPPASS (ch, VAM_AUSPEX))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_AUSPEX);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_AUSPEX);
      }
      if (IS_VAMPPASS (ch, VAM_DOMINATE))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_DOMINATE);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_DOMINATE);
      }
      if (IS_VAMPPASS (ch, VAM_PRESENCE))
      {
	 SET_BIT (victim->pcdata->stats[UNI_CURRENT], VAM_PRESENCE);
	 SET_BIT (victim->pcdata->stats[UNI_AFF], VAM_PRESENCE);
      }
   }
   save_char_obj (ch);
   save_char_obj (victim);
   return;
}

void do_claw (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   bool can_sire = FALSE;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF) || (ch->pcdata->stats[UNI_GEN] < 1))
   {
      do_claws (ch, "");
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] <= 3)
      can_sire = TRUE;

   if (!can_sire)
   {
      send_to_char ("You are unable to spread your gift.\n\r", ch);
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] == 1 && ch->pcdata->stats[UNI_AFF] >= 4)
   {
      send_to_char ("You have already created 4 tribal leaders.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Claw whom?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim))
   {
      send_to_char ("Not on Immortal's.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("You cannot claw yourself.\n\r", ch);
      return;
   }
   if (victim->max_hit < 3000)
   {
      stc ("You need 3000hps before you can be classed\n\r", ch);
      stc ("They need 3000hps before they can be classed\n\r", victim);
      return;
   }
   if (IS_CLASS (victim, CLASS_MONK))
   {
      send_to_char ("You cannot claw monks.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MAGE))
   {
      send_to_char ("You cannot bite mages.\n\r", ch);
      return;
   }

   if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
   {
      send_to_char ("You can only claw avatars.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DROW))
   {
      send_to_char ("Not on a drow!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_VAMPIRE)
       || IS_SET (victim->pcdata->stats[UNI_AFF], VAM_MORTAL))
   {
      send_to_char ("You are unable to create werevamps!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DEMON)
       || IS_SET (victim->special, SPC_CHAMPION))
   {
      send_to_char ("But they have no soul!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_HIGHLANDER))
   {
      send_to_char ("You cannot turn highlanders into werewolves.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_NINJA))
   {
      send_to_char ("You cannot turn ninjas into werewolves.\n\r", ch);
      return;
   }


   if (IS_CLASS (victim, CLASS_WEREWOLF))
   {
      send_to_char ("But they are already a werewolf!\n\r", ch);
      return;
   }

   if (!IS_IMMUNE (victim, IMM_VAMPIRE))
   {
      send_to_char ("You cannot claw an unwilling person.\n\r", ch);
      return;
   }

   if (!IS_VAMPAFF (ch, VAM_CLAWS))
   {
      send_to_char ("First you better get your claws out!\n\r", ch);
      return;
   }

   if (ch->exp < 10000)
   {
      send_to_char
	 ("You cannot afford the 10000 exp to pass on the gift.\n\r", ch);
      return;
   }

   ch->exp = ch->exp - 10000;
   if (ch->pcdata->stats[UNI_CURRENT] < 1)
      ch->pcdata->stats[UNI_CURRENT] = 1;
   else
      ch->pcdata->stats[UNI_CURRENT] += 1;
   if (IS_SET (ch->special, SPC_SIRE))
      REMOVE_BIT (ch->special, SPC_SIRE);
   act ("You plunge your claws into $N.", ch, NULL, victim, TO_CHAR);
   act ("$n plunges $s claws into $N.", ch, NULL, victim, TO_NOTVICT);
   act ("$n plunges $s claws into your chest.", ch, NULL, victim, TO_VICT);
   victim->class = CLASS_WEREWOLF;
   send_to_char ("You are now a werewolf.\n\r", victim);
   victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
   free_string (victim->lord);
   if (ch->pcdata->stats[UNI_GEN] == 1)
      victim->lord = str_dup (ch->name);
   else
   {
      sprintf (buf, "%s %s", ch->lord, ch->name);
      victim->lord = str_dup (buf);
   }
   victim->pcdata->stats[UNI_AFF] = 0;
   victim->pcdata->stats[UNI_CURRENT] = 0;
   save_char_obj (ch);
   save_char_obj (victim);
   return;
}


void do_demonform (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_DEMON))
   {
      do_rand_typo (ch);
      return;
   }


   if (!IS_DEMPOWER (ch, DEM_FORM) && IS_CLASS (ch, CLASS_DEMON))
   {
      send_to_char ("You haven't been granted the gift of demonform.\n\r",
		    ch);
      return;
   }


   if (IS_POLYAFF (ch, POLY_ZULO))
   {
      REMOVE_BIT (ch->polyaff, POLY_ZULO);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cant demon form when changed.\n\r", ch);
      return;
   }

   if (ch->stance[0] != -1)
      do_stance (ch, "");
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   act ("You transform into a huge demon.", ch, NULL, NULL, TO_CHAR);
   act ("$n's body grows and distorts into a huge demon.", ch, NULL, NULL,
	TO_ROOM);

   SET_BIT (ch->polyaff, POLY_ZULO);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   switch(ch->pcdata->stats[UNI_GEN])
   {
      case 1:
      sprintf(buf, "%s the pit lord", ch->name);
      break;
      case 2:
      sprintf(buf, "%s the pit fiend", ch->name);
      break;
      case 3:
      sprintf(buf, "%s the gelugon", ch->name);
      break;
      case 4:
      sprintf(buf, "%s the cornugon", ch->name);
      break;
      case 5:
      sprintf(buf, "%s the amnizu", ch->name);
      break;
      case 6:
      sprintf(buf, "%s the erinyes", ch->name);
      break;
      case 7:
      sprintf(buf, "%s the hamatula", ch->name);
      break;
      case 8:
      sprintf(buf, "%s the osyluth", ch->name);
      break;
      case 9:
      sprintf(buf, "%s the abishai", ch->name);
      break;
      case 10:
      sprintf(buf, "%s the barbazu", ch->name);
      break;
      case 11:
      sprintf(buf, "%s the spinagon", ch->name);
      break;
      case 12:
      sprintf(buf, "%s the nupperibo", ch->name);
      break;
      default:
      sprintf(buf, "%s the lemure", ch->name);
      break;
   }
//   sprintf (buf, "%s the great demonic beast", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   return;
}





void do_zuloform (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (get_disc(ch, VAM_VICI) < 2)
   {
      send_to_char
	 ("You must obtain at least level 2 in Vicissitude to use Zuloform.\n\r",
	  ch);
      return;
   }

   if (IS_EXTRA (ch, EXTRA_DRAGON))
   {
      send_to_char ("You cannot unzulo while a dragon.\n\r", ch);
      return;
   }
   if (IS_POLYAFF (ch, POLY_ZULO))
   {
      REMOVE_BIT (ch->polyaff, POLY_ZULO);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n's shrinks back into human form.", ch, NULL, NULL, TO_ROOM);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cant zulo when changed.\n\r", ch);
      return;
   }



   if (ch->stance[0] != -1)
      do_stance (ch, "");
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   act ("You transform into large beast.", ch, NULL, NULL, TO_CHAR);
   act ("$n's body grows and distorts into a large beast.", ch, NULL, NULL,
	TO_ROOM);

   SET_BIT (ch->polyaff, POLY_ZULO);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   sprintf (buf, "%s the big black monster", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   return;
}

DO_COM (do_clanname)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   argument = one_argument (argument, arg);
   if (IS_NPC (ch))
      return;

   if (arg[0] == '\0')
   {
      send_to_char ("Who's clan do you wish to change or name?\n\r", ch);
      return;
   }

   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (IS_NPC (victim))
      return;

   smash_tilde (argument);
   if (strlen (argument) < 0 || strlen (argument) > 26)
   {
      send_to_char ("Clan name should be between 0 and 26 letters long.\n\r",
		    ch);
      send_to_char ("Leave a blank to remove clan.\n\r", ch);
      return;
   }
   free_string (victim->clan);
   victim->clan = str_dup (argument);
   send_to_char ("Clan set.\n\r", ch);
   if (ch != victim)
      send_to_char ("Clan set.\n\r", victim);
   return;
}


void do_stake (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *stake;
   char arg[MAX_INPUT_LENGTH];
   int blood;

   argument = one_argument (argument, arg);
   if (IS_NPC (ch))
      return;

   if (arg[0] == '\0')
   {
      send_to_char ("Stake whom?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   stake = get_eq_char (ch, WEAR_HOLD);
   if (stake == NULL || stake->item_type != ITEM_STAKE)
   {
      stake = get_eq_char (ch, WEAR_WIELD);
      if (stake == NULL || stake->item_type != ITEM_STAKE)
      {
	 send_to_char
	    ("How can you stake someone down without holding a stake?\n\r",
	     ch);
	 return;
      }
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("You cannot stake yourself.\n\r", ch);
      return;
   }

   if (!IS_CLASS (victim, CLASS_VAMPIRE))
   {
      send_to_char ("You can only stake vampires.\n\r", ch);
      return;
   }

   if (victim->position > POS_MORTAL)
   {
      send_to_char
	 ("You can only stake down a vampire who is mortally wounded.\n\r",
	  ch);
      return;
   }

   act ("You plunge $p into $N's heart.", ch, stake, victim, TO_CHAR);
   act ("$n plunges $p into $N's heart.", ch, stake, victim, TO_NOTVICT);
   send_to_char ("You feel a stake plunged through your heart.\n\r", victim);
   if (IS_IMMUNE (victim, IMM_STAKE))
      return;

   /* Have to make sure they have enough blood to change back */
   blood = victim->pcdata->condition[COND_THIRST];
   victim->pcdata->condition[COND_THIRST] = 666;

   /* To take care of vampires who have powers in affect. */
   if (IS_VAMPAFF (victim, VAM_DISGUISED))
      do_mask (victim, "self");
   if (IS_IMMUNE (victim, IMM_SHIELDED))
      do_shield (victim, "");
   if (IS_AFFECTED (victim, AFF_SHADOWPLANE))
      do_shadowplane (victim, "");
   if (IS_VAMPAFF (victim, VAM_FANGS))
      do_fangs (victim, "");
   if (IS_VAMPAFF (victim, VAM_CLAWS))
      do_claws (victim, "");
   if (IS_VAMPAFF (victim, VAM_NIGHTSIGHT))
      do_nightsight (victim, "");
   if (IS_AFFECTED (victim, AFF_SHADOWSIGHT))
      do_shadowsight (victim, "");
   if (IS_SET (victim->act, PLR_HOLYLIGHT))
      do_truesight (victim, "");
   if (IS_VAMPAFF (victim, VAM_CHANGED))
      do_change (victim, "human");
   if (IS_POLYAFF (victim, POLY_SERPENT))
      do_serpent (victim, "");
   victim->pcdata->stats[UNI_RAGE] = 0;
   victim->pcdata->condition[COND_THIRST] = blood;
   obj_from_char (stake);
   obj_to_char (stake, victim);
   ch->exp = ch->exp + 1000;
   return;
}

void do_mask (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_DRAGON))
   {
      do_rand_typo (ch);
      return;
   }
   if (get_disc(ch, VAM_OBFU) < 3 && IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("You need level 4 obfuscate first.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_DRAGON)
       && !IS_SET (ch->pcdata->dragonaff, DRA_MASK))
   {
      send_to_char ("You haven't gained the power to mask people yet.\n\r",
		    ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Change to look like whom?\n\r", ch);
      return;
   }

   if (!str_cmp (arg, "Tijer"))
   {
      send_to_char ("You failed!\r\n", ch);
      return;
   }
   if (IS_AFFECTED (ch, AFF_POLYMORPH) && !IS_VAMPAFF (ch, VAM_DISGUISED))
   {
      send_to_char ("Not while polymorphed.\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim) && victim != ch)
   {
      send_to_char ("You can only mask avatars or lower.\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 40
       && IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   ch->pcdata->condition[COND_THIRST] -= number_range (30, 40);

   if (ch == victim)
   {
      if (!IS_AFFECTED (ch, AFF_POLYMORPH) && !IS_VAMPAFF (ch, VAM_DISGUISED))
      {
	 send_to_char ("You already look like yourself!\n\r", ch);
	 return;
      }
      sprintf (buf, "Your form shimmers and transforms into %s.", ch->name);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "%s's form shimmers and transforms into %s.", ch->morph,
	       ch->name);
      act (buf, ch, NULL, victim, TO_ROOM);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   if (IS_VAMPAFF (ch, VAM_DISGUISED))
   {
      sprintf (buf, "Your form shimmers and transforms into a clone of %s.",
	       victim->name);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "%s's form shimmers and transforms into a clone of %s.",
	       ch->morph, victim->name);
      act (buf, ch, NULL, victim, TO_NOTVICT);
      sprintf (buf, "%s's form shimmers and transforms into a clone of you!",
	       ch->morph);
      act (buf, ch, NULL, victim, TO_VICT);
      free_string (ch->morph);
      ch->morph = str_dup (victim->name);
      return;
   }
   sprintf (buf, "Your form shimmers and transforms into a clone of %s.",
	    victim->name);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf, "%s's form shimmers and transforms into a clone of %s.",
	    ch->name, victim->name);
   act (buf, ch, NULL, victim, TO_NOTVICT);
   sprintf (buf, "%s's form shimmers and transforms into a clone of you!",
	    ch->name);
   act (buf, ch, NULL, victim, TO_VICT);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
   free_string (ch->morph);
   ch->morph = str_dup (victim->name);
   return;
}

void do_change (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }


   if (get_disc(ch, VAM_PROT) < 3)
   {
      send_to_char ("You are not trained in the Protean discipline.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char
	 ("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r",
	  ch);
      return;
   }

   if (!str_cmp (arg, "bat"))
   {
      if (IS_AFFECTED (ch, AFF_POLYMORPH))
      {
	 send_to_char ("You can only polymorph from human form.\n\r", ch);
	 return;
      }
      if (ch->pcdata->condition[COND_THIRST] < 50)
      {
	 send_to_char ("You have insufficient blood.\n\r", ch);
	 return;
      }
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      if (ch->mounted == IS_RIDING)
	 do_dismount (ch, "");
      ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
      clear_stats (ch);
      act ("You transform into bat form.", ch, NULL, NULL, TO_CHAR);
      act ("$n transforms into a bat.", ch, NULL, NULL, TO_ROOM);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FLYING);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_SONIC);
      SET_BIT (ch->polyaff, POLY_BAT);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
      SET_BIT (ch->affected_by, AFF_POLYMORPH);
      sprintf (buf, "%s the vampire bat", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
   else if (!str_cmp (arg, "wolf"))
   {
      if (IS_AFFECTED (ch, AFF_POLYMORPH))
      {
	 send_to_char ("You can only polymorph from human form.\n\r", ch);
	 return;
      }
      if (ch->pcdata->condition[COND_THIRST] < 50)
      {
	 send_to_char ("You have insufficient blood.\n\r", ch);
	 return;
      }
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      if (ch->mounted == IS_RIDING)
	 do_dismount (ch, "");
      ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
      act ("You transform into wolf form.", ch, NULL, NULL, TO_CHAR);
      act ("$n transforms into a dire wolf.", ch, NULL, NULL, TO_ROOM);
      clear_stats (ch);
      if (ch->wpn[0] > 0)
      {
	 ch->hitroll += (ch->wpn[0]);
	 ch->damroll += (ch->wpn[0]);
	 ch->armor -= (ch->wpn[0] * 3);
      }
      ch->pcdata->mod_str = 10;
      SET_BIT (ch->polyaff, POLY_WOLF);
      SET_BIT (ch->affected_by, AFF_POLYMORPH);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
      ch->max_hit = ch->max_hit + 500;
      ch->hit = ch->hit + 500;
      sprintf (buf, "%s the dire wolf", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
   else if (!str_cmp (arg, "mist"))
   {
      if (IS_AFFECTED (ch, AFF_POLYMORPH))
      {
	 send_to_char ("You can only polymorph from human form.\n\r", ch);
	 return;
      }
      if (ch->pcdata->condition[COND_THIRST] < 50)
      {
	 send_to_char ("You have insufficient blood.\n\r", ch);
	 return;
      }
      if (ch->stance[0] != -1)
	 do_stance (ch, "");
      if (ch->mounted == IS_RIDING)
	 do_dismount (ch, "");
      ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
      act ("You transform into mist form.", ch, NULL, NULL, TO_CHAR);
      act ("$n transforms into a white mist.", ch, NULL, NULL, TO_ROOM);
      if (IS_EXTRA (ch, TIED_UP))
      {
	 act ("The ropes binding you fall through your ethereal form.", ch,
	      NULL, NULL, TO_CHAR);
	 act ("The ropes binding $n fall through $s ethereal form.", ch, NULL,
	      NULL, TO_ROOM);
	 REMOVE_BIT (ch->extra, TIED_UP);
	 REMOVE_BIT (ch->extra, GAGGED);
	 REMOVE_BIT (ch->extra, BLINDFOLDED);
      }
      if (is_affected (ch, gsn_web))
      {
	 act ("The webbing entrapping $n falls through $s ethereal form.", ch,
	      NULL, NULL, TO_ROOM);
	 send_to_char
	    ("The webbing entrapping you falls through your ethereal form.\n\r",
	     ch);
	 affect_strip (ch, gsn_web);
      }
      clear_stats (ch);
      SET_BIT (ch->polyaff, POLY_MIST);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
      SET_BIT (ch->affected_by, AFF_POLYMORPH);
      SET_BIT (ch->affected_by, AFF_ETHEREAL);
      sprintf (buf, "%s the white mist", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
   else if (!str_cmp (arg, "human"))
   {
      if (!IS_AFFECTED (ch, AFF_POLYMORPH))
      {
	 send_to_char ("You are already in human form.\n\r", ch);
	 return;
      }
      if (IS_VAMPAFF (ch, VAM_CHANGED) && IS_POLYAFF (ch, POLY_BAT))
      {
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FLYING);
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_SONIC);
	 REMOVE_BIT (ch->polyaff, POLY_BAT);
      }
      else if (IS_VAMPAFF (ch, VAM_CHANGED) && IS_POLYAFF (ch, POLY_WOLF))
      {
	 REMOVE_BIT (ch->polyaff, POLY_WOLF);
	 ch->max_hit = ch->max_hit - 500;
	 ch->hit = ch->hit - 500;
	 if (ch->hit < 1)
	    ch->hit = 1;
      }
      else if (IS_VAMPAFF (ch, VAM_CHANGED) && IS_POLYAFF (ch, POLY_MIST))
      {
	 REMOVE_BIT (ch->polyaff, POLY_MIST);
	 REMOVE_BIT (ch->affected_by, AFF_ETHEREAL);
      }
      else
      {
	 /* In case they try to change to human from a non-vamp form */
	 send_to_char ("You seem to be stuck in this form.\n\r", ch);
	 return;
      }
      act ("You transform into human form.", ch, NULL, NULL, TO_CHAR);
      act ("$n transforms into human form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CHANGED);
      clear_stats (ch);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      return;
   }
   else
      send_to_char
	 ("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r",
	  ch);
   return;
}


void do_stat (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char lin[MAX_STRING_LENGTH];
   char age[MAX_STRING_LENGTH];
   int blood;
   int bloodpool;

   if (IS_CLASS (ch, CLASS_FAE))
   {
      centre_text
	 ("-------------------------==| Changeling Arts |==----------------------",
	  ch);
      sprintf (buf, "%-14.14s [%d] %-14.14s [%d] %-14.14s [%d]", "Chicanery",
	       ch->pcdata->powers[FAE_CHIC], "Legerdemain",
	       ch->pcdata->powers[FAE_LEGE], "Primal",
	       ch->pcdata->powers[FAE_PRIM]);

      centre_text (buf, ch);

      sprintf (buf, "%-14.14s [%d] %-14.14s [%d] %-14.14s [%d]",
	       "Soothsay", ch->pcdata->powers[FAE_SOOT],
	       "Sovereign", ch->pcdata->powers[FAE_SOVE],
	       "Wayfare", ch->pcdata->powers[FAE_WAYF]);

      centre_text (buf, ch);
      stc ("  Arts <ART> Improve  - Learn new arts\n\r", ch);
      divide_to_char (ch);
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] <= 0)
      ch->pcdata->stats[UNI_GEN] = 13;

   {
      int chargen = ch->pcdata->stats[UNI_GEN];


switch (chargen)
      {
         default:
            bloodpool = 100;
            break;
         case 1:
            bloodpool= 5000;
         case 2:
            bloodpool= 2000;
            break;
         case 3:
            bloodpool = 1000;
            break;
         case 4:
           bloodpool= 500;
            break;
         case 5:
            bloodpool= 400;
            break;
         case 6:
            bloodpool= 300;
            break;
         case 7:
            bloodpool= 200;
            break;
         case 8:
            bloodpool= 150;
            break;
         case 9:
            bloodpool= 140;
            break;
         case 10:
            bloodpool= 130;
            break;
         case 11:
            bloodpool = 120;
            break;
         case 12:
            bloodpool= 110; 
            break;
         case 13:
            bloodpool = 100;
            break;
      }
   }
   blood = ch->pcdata->condition[COND_THIRST];
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
      return;
   if (ch->pcdata->rank == AGE_ANCILLA)
      sprintf (age, "Ancilla");
   else if (ch->pcdata->rank == AGE_CHILDE)
      sprintf (age, "Childe");
   else if (ch->pcdata->rank == AGE_NEONATE)
      sprintf (age, "Neonate");
   else if (ch->pcdata->rank == AGE_ELDER)
      sprintf (age, "Elder");
   else if (ch->pcdata->rank == AGE_METHUSELAH)
      sprintf (age, "Methuselah");
   sprintf (lin,
	    "---------------------------------------------------------------------------\n\r");
   send_to_char (lin, ch);
   send_to_char ("                              Vampire Status\n\r", ch);
   send_to_char (lin, ch);
   sprintf (buf,
	    "Generation: %d  Bloodpool:%d  Age:%s  Blood:%d\n\r",
	    ch->pcdata->stats[UNI_GEN], bloodpool, age, blood);
   send_to_char (buf, ch);
   send_to_char (lin, ch);
   send_to_char ("                              Disciplines\n\r", ch);
   send_to_char (lin, ch);
   sprintf (buf,
	    "Animalism:    [%d]             Celerity:   [%d]        Fortitude:   [%d]\n\r",
            get_disc(ch, VAM_ANIM), get_disc(ch, VAM_CELE),
            get_disc(ch, VAM_FORT));
   send_to_char (buf, ch);
   sprintf (buf,
	    "Obtenebration:[%d]             Presence:   [%d]        Quietus:     [%d]\n\r",
            get_disc(ch, VAM_OBTE), get_disc(ch, VAM_PRES),
            get_disc(ch, VAM_QUIE));
   send_to_char (buf, ch);
   sprintf (buf,
	    "Thaumaturgy:  [%d]             Auspex:     [%d]        Dominate:    [%d]\n\r",
            get_disc(ch, VAM_THAU), get_disc(ch, VAM_AUSP),
            get_disc(ch, VAM_DOMI));
   send_to_char (buf, ch);
   sprintf (buf,
	    "Obfuscate:    [%d]             Potence:    [%d]        Protean:     [%d]\n\r",
            get_disc(ch, VAM_OBFU), get_disc(ch, VAM_POTE),
            get_disc(ch, VAM_PROT));
   send_to_char (buf, ch);
   sprintf (buf,
	    "Serpentis:    [%d]             Vicissitude:[%d]        Daimoinon:   [%d]\n\r",
            get_disc(ch, VAM_SERP), get_disc(ch, VAM_VICI),
            get_disc(ch, VAM_DAIM));
   send_to_char (buf, ch);
   sprintf (buf,
	    "Chimerstry:   [%d]             Obeah:      [%d]        Melpominee:  [%d]\n\r",
            get_disc(ch, VAM_CHIM), get_disc(ch, VAM_OBEA),
            get_disc(ch, VAM_MELP));
   send_to_char (buf, ch);
   sprintf (buf,
	    "Necromancy:   [%d]                                    Thanatosis:  [%d]\n\r",
            get_disc(ch, VAM_NECR), get_disc(ch, VAM_THAN));
   stc (buf, ch);
   send_to_char (lin, ch);

   return;
}


void do_clandisc (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (arg1[0] == '\0' && arg2[0] == '\0')
   {
      do_stat (ch, "");
      return;
   }
   if (arg2[0] == '\0')
   {
      if (!str_cmp (arg1, "animalism"))
      {
	 send_to_char ("Animalism: The discipline of nature control.\n\r",
		       ch);
         if (get_disc(ch, VAM_ANIM) < 1)
	    send_to_char ("You have none of the Animalism powers.\n\r", ch);
         if (get_disc(ch, VAM_ANIM) > 0)
	    send_to_char
               ("Serenity: You can soothe the most aggressive soul (Golconda Required).\n\r",
		ch);
	 return;
      }
      else if (!str_cmp (arg1, "auspex"))
      {
	 send_to_char
	    ("Auspex: The discipline of extrasensory awareness.\n\r", ch);
         if (get_disc(ch, VAM_AUSP) < 1)
	    send_to_char
	       ("You have none of the Auspex discipline powers.\n\r", ch);
         if (get_disc(ch, VAM_AUSP) > 0)
	    send_to_char
	       ("Truesight: The user can see everything, including invis.\n\r",
		ch);
         if (get_disc(ch, VAM_AUSP) > 1)
	    send_to_char
	       ("Scry: Allows you to view the room the specified target is in.\n\r",
		ch);
         if (get_disc(ch, VAM_AUSP) > 3)
	    send_to_char
	       ("Readaura: Gives you detained information about a creature or object.\n\r",
		ch);
	 return;
      }
      else if (!str_cmp (arg1, "celerity"))
      {
	 send_to_char ("Celerity: The discipline of superior speed.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "chimerstry"))
      {
	 send_to_char ("chimerstry: The discipline of illusion.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "daimoinon"))
      {
	 send_to_char ("Daimoinon: The discipline of dark corruption.\n\r",
		       ch);
         if (get_disc(ch, VAM_DAIM) < 1)
	    send_to_char
	       ("You have none of the Daimoinon discipline powers.\n\r", ch);
	 return;
      }

      else if (!str_cmp (arg1, "dominate"))
      {
	 send_to_char ("Dominate: The discipline of control.\n\r", ch);
         if (get_disc(ch, VAM_DOMI) < 1)
	    send_to_char
	       ("You have none of the Dominate discipline powers.\n\r", ch);
         if (get_disc(ch, VAM_DOMI) > 0)
	    send_to_char
	       ("Command: You can plant suggestions in the mind of others.\n\r",
		ch);
         if (get_disc(ch, VAM_DOMI) > 1)
	    send_to_char
	       ("Shield: You are able to shield your mind from scrying and aura-reading.\n\r",
		ch);
         if (get_disc(ch, VAM_DOMI) > 3)
	    send_to_char
	       ("Possession: You can take control of mobs by feeding them blood.\n\r",
		ch);
	 return;
      }
      else if (!str_cmp (arg1, "fortitude"))
      {
	 send_to_char
	    ("Fortitude: The discipline of supernatural toughness and vigor.\n\r",
	     ch);
         if (get_disc(ch, VAM_FORT) < 1)
	    send_to_char ("You have no fortitude.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "obfuscate"))
      {
	 send_to_char ("Obfuscate: The discipline of stealth.\n\r", ch);
         if (get_disc(ch, VAM_OBFU) < 1)
	    send_to_char
	       ("You have none of the Obfuscate discipline powers.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "obtenebration"))
      {
	 send_to_char
	    ("Obtenebration: The discipline of darkness manipulation.\n\r",
	     ch);
         if (get_disc(ch, VAM_OBTE) < 1)
	    send_to_char
	       ("You have none of the Obtenebration discipline powers.\n\r",
		ch);
	 return;
      }
      else if (!str_cmp (arg1, "potence"))
      {
	 send_to_char ("Potence: The discipline of superior strength.\n\r",
		       ch);
	 return;
      }
      else if (!str_cmp (arg1, "presence"))
      {
	 send_to_char
	    ("Presence: The discipline of appeal and attractiveness.\n\r",
	     ch);
         if (get_disc(ch, VAM_PRES) < 1)
	    send_to_char
	       ("You have none of the Presence discipline powers.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "protean"))
      {
	 send_to_char
	    ("Protean: The discipline of neutral transformation.\n\r", ch);
         if (get_disc(ch, VAM_PROT) < 1)
	    send_to_char
	       ("You have none of the Protean discipline powers.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "quietus"))
      {
	 send_to_char ("Quietus: The discipline of death.\n\r", ch);
         if (get_disc(ch, VAM_QUIE) < 1)
	    send_to_char
	       ("You have none of the Quietus discipline powers.\n\r", ch);
         if (get_disc(ch, VAM_QUIE) > 3)
	    send_to_char
	       ("Spit: You can project your deadly spit at a foe\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "serpentis"))
      {
	 send_to_char
	    ("Serpentis: The discipline of temptation and corruption.\n\r",
	     ch);
         if (get_disc(ch, VAM_SERP) < 1)
	    send_to_char
	       ("You have none of the Serpentis discipline powers.\n\r", ch);
	 return;
      }
      else if (!str_cmp (arg1, "thaumaturgy"))
      {
	 send_to_char ("Thaumaturgy: The discipline of blood magic.\n\r", ch);
         if (get_disc(ch, VAM_THAU) < 1)
	    send_to_char
	       ("You have none of the Thaumaturgy discipline powers.\n\r",
		ch);
         if (get_disc(ch, VAM_THAU) > 0)
	    send_to_char
	       ("Theft: You can take from the blood pool of other players.\n\r",
		ch);

	 return;
      }
      else if (!str_cmp (arg1, "vicissitude"))
      {
	 send_to_char
	    ("Vicissitude: The discipline of evil body control.\n\r", ch);
         if (get_disc(ch, VAM_VICI) < 1)
	    send_to_char
	       ("You have none of the Vicissitude discipline powers.\n\r",
		ch);
         if (get_disc(ch, VAM_VICI) > 3)
	    send_to_char
	       ("Zuloform: Transformation into a powerfull being.\n\r", ch);

	 return;
      }
      do_stat (ch, "");
      return;

   }
   if (!str_cmp (arg2, "improve"))
   {
      int improve;
      int cost;
      int max;
      int maxlevel = 5;
/*
	if (ch->[UNI_GEN] == 13)
          maxlevel=5;
         else if (ch->[UNI_GEN] == 12)
          maxlevel=5;
         else if (ch->[UNI_GEN] == 11)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 10)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 9)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 8)
          maxlevel=5;
          else if (ch->[UNI_GEN] == 7)
          maxlevel=5;
        else if (ch->[UNI_GEN] == 6)
          maxlevel=5;
	else if (ch->[UNI_GEN] == 5)
	  maxlevel=5;
	else if (ch->[UNI_GEN]  == 4)
          maxlevel=5;
        else
         maxlevel=5;
*/
      if (!str_cmp (arg1, "animalism"))
      {
	 improve = VAM_ANIM;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "auspex"))
      {
	 improve = VAM_AUSP;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "celerity"))
      {
	 improve = VAM_CELE;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "chimerstry"))
      {
	 improve = VAM_CHIM;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "dominate"))
      {
	 improve = VAM_DOMI;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "daimoinon"))
      {
	 improve = VAM_DAIM;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "fortitude"))
      {
	 improve = VAM_FORT;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "obfuscate"))
      {
	 improve = VAM_OBFU;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "obtenebration"))
      {
	 improve = VAM_OBTE;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "potence"))
      {
	 improve = VAM_POTE;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "presence"))
      {
	 improve = VAM_PRES;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "protean"))
      {
	 improve = VAM_PROT;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "quietus"))
      {
	 improve = VAM_QUIE;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "serpentis"))
      {
	 improve = VAM_SERP;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "thaumaturgy"))
      {
	 improve = VAM_THAU;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "vicissitude"))
      {
	 improve = VAM_VICI;
	 max = maxlevel;
      }
      else if (!str_cmp (arg1, "obeah"))
      {
	 improve = VAM_OBEA;
	 max = 5;
      }
      else if (!str_cmp (arg1, "melpominee"))
      {
	 improve = VAM_MELP;
	 max = 5;
      }
      else if (!str_cmp (arg1, "necromancy"))
      {
	 improve = VAM_NECR;
	 max = 5;
      }
      else if (!str_cmp (arg1, "thanatosis"))
      {
	 improve = VAM_THAN;
	 max = 5;
      }
      else
      {
	 send_to_char ("You can improve:\n\r", ch);
	 send_to_char
	    ("   Animalism, Auspex, Celerity, Dominate, Fortitude, Obfuscate,\n\r",
	     ch);
	 send_to_char
	    ("   Obtenebration, Potence, Presence, Protean, Quietus, Serpentis,\n\r",
	     ch);
	 send_to_char
	    ("   Thaumaturgy, Vicissitude, Melpominee, Necormancy or Thanatosis.\n\r",
	     ch);
	 return;
      }
      cost = (ch->pcdata->powers[improve] + 1) * 10;
      arg1[0] = UPPER (arg1[0]);
      if (ch->pcdata->powers[improve] >= max
	  && ch->pcdata->rank == AGE_METHUSELAH)
      {
	 sprintf (buf,
		  "You have already gained all the powers of the %s discipline.\n\r",
		  arg1);
	 send_to_char (buf, ch);
	 return;
      }
      if (ch->pcdata->powers[improve] >= max)
      {
	 sprintf (buf, "You have already maxed %s.\n\r", arg1);
	 send_to_char (buf, ch);
	 return;
      }
      if (cost > ch->practice)
      {
	 sprintf (buf,
		  "It costs you %d primal to improve your %s discipline.\n\r",
		  cost, arg1);
	 send_to_char (buf, ch);
	 return;
      }
      ch->pcdata->powers[improve] += 1;
      ch->practice -= cost;
      sprintf (buf, "You improve your ability in the %s discipline.\n\r",
	       arg1);
      send_to_char (buf, ch);
   }
   else
      send_to_char
	 ("To improve a discipline, type: Clandisc <discipline type> improve.\n\r",
	  ch);
   return;
}

void do_defences (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_IMMUNE (ch, IMM_VAMPIRE))
   {
      send_to_char ("You lower your defences!.\n\r", ch);
      SET_BIT (ch->immune, IMM_VAMPIRE);
      return;
   }
   send_to_char ("You raise your defences!\n\r", ch);
   REMOVE_BIT (ch->immune, IMM_VAMPIRE);
   return;
}

void do_shadowplane (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;


   if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[SILENTSTRIDERS] < 5)
   {
      stc ("You must obtain the fifth gift of the Silent Striders to Reach the Umbra.\n\r", ch);
      return;
   }
   else if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBTE) < 3)
   {
      send_to_char
	 ("You are not trained in the Obtenebration discipline.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE)
       && ch->pcdata->condition[COND_THIRST] < 75)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE))
      ch->pcdata->condition[COND_THIRST] -= number_range (65, 75);

   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while you're in the arena.\n\r", ch);
      return;
   }
   if (IS_SET (ch->war, WARRING))
   {
      stc ("Not while in a war!\n\r", ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      stc ("Not with a fight timer!\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      if (!IS_AFFECTED (ch, AFF_SHADOWPLANE))
      {
	 send_to_char ("You fade into the plane of shadows.\n\r", ch);
	 act ("The shadows flicker and swallow up $n.", ch, NULL, NULL,
	      TO_ROOM);
	 SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
	 do_look (ch, "auto");
	 return;
      }
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
      send_to_char ("You fade back into the real world.\n\r", ch);
      act ("The shadows flicker and $n fades into existance.", ch, NULL, NULL,
	   TO_ROOM);
      do_look (ch, "auto");
      return;
   }

   if ((obj = get_obj_here (ch, arg)) == NULL)
   {
      send_to_char ("What do you wish to toss into the shadow plane?\n\r",
		    ch);
      return;
   }

   if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
      send_to_char ("You toss it to the ground and it vanishes.\n\r", ch);
   else
      send_to_char ("You toss it into a shadow and it vanishes.\n\r", ch);
   return;
}


void do_introduce (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->pcdata->stats[UNI_GEN] > 0
       && ch->pcdata->stats[UNI_GEN] < 13)
      do_tradition (ch, ch->lord);
   else if (IS_CLASS (ch, CLASS_WEREWOLF) && IS_HERO (ch) &&
	    ch->pcdata->stats[UNI_GEN] > 0 && ch->pcdata->stats[UNI_GEN] < 5)
      do_bloodline (ch, ch->lord);
   else if (IS_CLASS (ch, CLASS_DEMON) && IS_HERO (ch))
      do_demonintro (ch, "");
   else if (IS_CLASS (ch, CLASS_MAGE) && IS_HERO (ch))
      do_mageintro (ch, "");
   else
      do_rand_typo (ch);
   return;
}

void do_demonintro (CHAR_DATA * ch, char *argument)
{
   char arg1[MIL];
   char arg2[MIL];
   char arg3[MIL];
   char buf[MSL];
   argument = one_argument (argument, arg1);
   argument = one_argument (argument, arg2);
   argument = one_argument (argument, arg3);

   if (IS_NPC (ch))
      return;

   if (arg1 != '\0')
      arg1[0] = UPPER (arg1[0]);
   if (arg2 != '\0')
      arg2[0] = UPPER (arg2[0]);
   if (arg3 != '\0')
      arg3[0] = UPPER (arg3[0]);

   if (!str_cmp (ch->clan, ""))
   {
      sprintf (buf, "In the name of Satan i spread my corruption.");
      do_say (ch, buf);
      sprintf (buf, "I am %s, demon of no clan.", ch->name);
      do_say (ch, buf);
      sprintf (buf, "Worship Satan in all that he is.");
      do_say (ch, buf);
   }

   else if (IS_SET (ch->special, SPC_DEMON_LORD))
   {
      sprintf (buf, "In the name of Satan i spread my corruption.");
      do_say (ch, buf);
      sprintf (buf, "I am %s Demon Lord of the %s Clan.", ch->name, ch->clan);
      do_say (ch, buf);
      sprintf (buf, "Worhip Satan in all that he is.");
      do_say (ch, buf);
   }
   else
   {
      sprintf (buf, "In the name of Satan i spread my corruption.");
      do_say (ch, buf);
      sprintf (buf, "I am %s Demon of the %s Clan.", ch->name, ch->clan);
      do_say (ch, buf);
      sprintf (buf, "Worship Satan in all that he is.");
      do_say (ch, buf);
   }
   return;
}
void do_mageintro (CHAR_DATA * ch, char *argument)
{
   char arg1[MIL];
   char arg2[MIL];
   char arg3[MIL];
   char buf[MSL];
   argument = one_argument (argument, arg1);
   argument = one_argument (argument, arg2);
   argument = one_argument (argument, arg3);

   if (IS_NPC (ch))
      return;

   if (arg1 != '\0')
      arg1[0] = UPPER (arg1[0]);
   if (arg2 != '\0')
      arg2[0] = UPPER (arg2[0]);
   if (arg3 != '\0')
      arg3[0] = UPPER (arg3[0]);

   if (!str_cmp (ch->clan, ""))
   {
      sprintf (buf,
	       "In the name of Lilith i announce my knowledge of magick");
      do_say (ch, buf);
      sprintf (buf, "I am %s, Rogue mage", ch->name);
      do_say (ch, buf);
      sprintf (buf, "Magick is the power, do not be afraid to learn it.");
      do_say (ch, buf);
   }

   else if (ch->level == LEVEL_ARCHMAGE)
   {
      sprintf (buf,
	       "In the name of Lilith, i announce my knowledge of magick.");
      do_say (ch, buf);
      sprintf (buf, "I am %s Oracle %s .", ch->name, ch->clan);
      do_say (ch, buf);
      sprintf (buf, "Magick is the power, do not be afraid to use it.");
      do_say (ch, buf);
   }
   else if (ch->level == LEVEL_MAGE)
   {
      sprintf (buf,
	       "In the name of Lilith, i announce my knowledge of magick.");
      do_say (ch, buf);
      sprintf (buf, "I am %s Adept of %s.", ch->name, ch->clan);
      do_say (ch, buf);
      sprintf (buf, "Magick is the power, do not be afraid to use it.");
      do_say (ch, buf);
   }
   else
   {
      sprintf (buf,
	       "In the name of Lilith i announce my knowledge of magic.");
      do_say (ch, buf);
      sprintf (buf, "I am %s Disciple of %s.", ch->name, ch->clan);
      do_say (ch, buf);
      sprintf (buf, "Magick is the power, do not be afraid to use it.");
      do_say (ch, buf);
   }
   return;
}
void do_bloodline (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char arg3[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   char buf2[MAX_STRING_LENGTH];

   argument = one_argument (argument, arg1);
   argument = one_argument (argument, arg2);
   argument = one_argument (argument, arg3);

   if (IS_NPC (ch))
      return;

   if (arg1 != '\0')
      arg1[0] = UPPER (arg1[0]);
   if (arg2 != '\0')
      arg2[0] = UPPER (arg2[0]);
   if (arg3 != '\0')
      arg3[0] = UPPER (arg3[0]);

   if (!str_cmp (arg1, "kavir"))
      strcpy (arg1, "KaVir");

   if (!str_cmp (ch->clan, "") && ch->pcdata->stats[UNI_GEN] != 1)
   {
      strcpy (buf, "In the name of Gaia, I announce my Garou heritage.");
      do_say (ch, buf);
      sprintf (buf, "My name is %s, I am a Ronin of no tribe.", ch->name);
      do_say (ch, buf);
      return;
   }
   if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
        strcpy(buf,"In the name of the Wyrm, I renounce my Garou heritage.");
    else 
   strcpy (buf, "In the name of Gaia, I announce my Garou heritage.");
   do_say (ch, buf);
   if (ch->pcdata->stats[UNI_GEN] != 1)
   {
      if (ch->pcdata->stats[UNI_GEN] == 4)
	 sprintf (buf2, "%s", arg3);
      else if (ch->pcdata->stats[UNI_GEN] == 3)
	 sprintf (buf2, "%s", arg2);
      else if (ch->pcdata->stats[UNI_GEN] == 2)
	 sprintf (buf2, "%s", arg1);
      if (ch->pcdata->stats[UNI_GEN] == 1)
      {
   if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
      sprintf(buf,"My name is %s, chosen Champion of the Wyrm.", ch->name);
            else
	 sprintf (buf, "My name is %s, chosen Champion of Gaia.", ch->name);
      }
      if (ch->pcdata->stats[UNI_GEN] == 2)
	 sprintf (buf, "My name is %s, Chieftain of the %s tribe, pup of %s.",
		  ch->name, ch->clan, buf2);
      else
	 sprintf (buf, "My name is %s, of the %s tribe, pup of %s.", ch->name,
		  ch->clan, buf2);
      do_say (ch, buf);
   }
   if (arg3[0] != '\0')
   {
      sprintf (buf, "My name is %s, of the %s tribe, pup of %s.",
	       arg3, ch->clan, arg2);
      do_say (ch, buf);
   }
   if (arg2[0] != '\0')
   {
      if (arg1[0] != '\0')
	 sprintf (buf, "My name is %s, Chieftain of the %s tribe, pup of %s.",
		  arg2, ch->clan, arg1);
      else
	 sprintf (buf, "My name is %s, of the %s tribe, pup of %s.", arg2,
		  ch->clan, arg1);
      do_say (ch, buf);
   }
   if (ch->pcdata->stats[UNI_GEN] == 1)
   {
        if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
            sprintf(buf,"My name is %s, chosen Champion of the Wyrm.", ch->name);
        else 
            sprintf(buf,"My name is %s, chosen Champion of Gaia.", ch->name);
    }
    else
    {
        if ( !str_cmp(ch->clan, "Black Spiral Dancers"))
            sprintf(buf,"My name is %s, chosen Champion of the Wyrm.", arg1);
        else
            sprintf(buf,"My name is %s, chosen Champion of Gaia.", arg1);
    }
    do_say(ch,buf);
   return;
}
void do_tradition (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char arg3[MAX_INPUT_LENGTH];
   char arg4[MAX_INPUT_LENGTH];
   char arg5[MAX_INPUT_LENGTH];
   char arg6[MAX_INPUT_LENGTH];
   char arg7[MAX_INPUT_LENGTH];
   char arg8[MAX_INPUT_LENGTH];
   char arg9[MAX_INPUT_LENGTH];
   char arg10[MAX_INPUT_LENGTH];
   char arg11[MAX_INPUT_LENGTH];
   char arg12[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   char buf2[MAX_INPUT_LENGTH];
   char buf3[MAX_INPUT_LENGTH];
   int vampgen = 1;

   argument = one_argument (argument, arg1);
   argument = one_argument (argument, arg2);
   argument = one_argument (argument, arg3);
   argument = one_argument (argument, arg4);
   argument = one_argument (argument, arg5);
   argument = one_argument (argument, arg6);
   argument = one_argument (argument, arg7);
   argument = one_argument (argument, arg8);
   argument = one_argument (argument, arg9);
   argument = one_argument (argument, arg10);
   argument = one_argument (argument, arg11);
   argument = one_argument (argument, arg12);

   if (IS_NPC (ch))
      return;

   if (arg1[0] != '\0')
   {
      arg1[0] = UPPER (arg1[0]);
      vampgen = 1;
   }
   if (arg1[0] != '\0')
   {
      arg1[0] = UPPER (arg1[0]);
      vampgen = 2;
   }
   if (arg2[0] != '\0')
   {
      arg2[0] = UPPER (arg2[0]);
      vampgen = 3;
   }
   if (arg3[0] != '\0')
   {
      arg3[0] = UPPER (arg3[0]);
      vampgen = 4;
   }
   if (arg4[0] != '\0')
   {
      arg4[0] = UPPER (arg4[0]);
      vampgen = 5;
   }
   if (arg5[0] != '\0')
   {
      arg5[0] = UPPER (arg5[0]);
      vampgen = 6;
   }
   if (arg6[0] != '\0')
   {
      arg6[0] = UPPER (arg6[0]);
      vampgen = 7;
   }
   if (arg7[0] != '\0')
   {
      arg7[0] = UPPER (arg7[0]);
      vampgen = 8;
   }
   if (arg8[0] != '\0')
   {
      arg8[0] = UPPER (arg8[0]);
      vampgen = 9;
   }
   if (arg9[0] != '\0')
   {
      arg9[0] = UPPER (arg9[0]);
      vampgen = 10;
   }
   if (arg10[0] != '\0')
   {
      arg10[0] = UPPER (arg10[0]);
      vampgen = 11;
   }
   if (arg11[0] != '\0')
   {
      arg11[0] = UPPER (arg11[0]);
      vampgen = 12;
   }
   if (arg12[0] != '\0')
   {
      arg12[0] = UPPER (arg12[0]);
      vampgen = 13;
   }

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1)
       || (ch->pcdata->stats[UNI_GEN] > 13))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
/*
   if (strlen (ch->clan) < 2)
   {
      sprintf (buf, "My name is %s.", ch->name);
      do_say (ch, buf);
      sprintf (buf, "I am Caitiff.");
      do_say (ch, buf);
      sprintf (buf, "I have no lineage.");
      do_say (ch, buf);
      return;
   }
*/
   switch (ch->pcdata->stats[UNI_GEN])
   {
   default:
      sprintf (buf3, "Childe");
      break;
   case 1:
   case 2:
   case 3:
      sprintf (buf3, "Antediluvian");
      break;
   case 4:
   case 5:
      sprintf (buf3, "Methuselah");
      break;
   case 6:
   case 7:
   case 8:
      sprintf (buf3, "Elder");
      break;
   case 9:
   case 10:
      sprintf (buf3, "Ancilla");
      break;
   case 11:
   case 12:
   case 13:
      sprintf (buf3, "Neonate");
      break;
   }

   if (ch->pcdata->stats[UNI_GEN] == 13)
      sprintf (buf2, "Thirteenth");
   else if (ch->pcdata->stats[UNI_GEN] == 12)
      sprintf (buf2, "Twelfth");
   else if (ch->pcdata->stats[UNI_GEN] == 11)
      sprintf (buf2, "Eleventh");
   else if (ch->pcdata->stats[UNI_GEN] == 10)
      sprintf (buf2, "Tenth");
   else if (ch->pcdata->stats[UNI_GEN] == 9)
      sprintf (buf2, "Ninth");
   else if (ch->pcdata->stats[UNI_GEN] == 8)
      sprintf (buf2, "Eighth");
   else if (ch->pcdata->stats[UNI_GEN] == 7)
      sprintf (buf2, "Seventh");
   else if (ch->pcdata->stats[UNI_GEN] == 6)
      sprintf (buf2, "Sixth");
   else if (ch->pcdata->stats[UNI_GEN] == 5)
      sprintf (buf2, "Fifth");
   else if (ch->pcdata->stats[UNI_GEN] == 4)
      sprintf (buf2, "Fourth");
   else if (ch->pcdata->stats[UNI_GEN] == 3)
      sprintf (buf2, "Third");
   else if (ch->pcdata->stats[UNI_GEN] == 2)
      sprintf (buf2, "Second");
   if (vampgen == 1)
      sprintf (buf,
	       "As is the tradition, I recite the lineage of %s, Sire of all Kindred.",
	       ch->name);
   else
   {
      sprintf (buf, "As is the tradition, I recite the lineage of %s.",
	       ch->name);
      do_say (ch, buf);
      sprintf (buf, "I am %s, %s of the %s Generation.", ch->name, buf3,
	       buf2);
   }
   do_say (ch, buf);
   if (vampgen != 1)
   {
      if (vampgen == 13)
	 sprintf (buf2, "%s", arg12);
      else if (vampgen == 12)
	 sprintf (buf2, "%s", arg11);
      else if (vampgen == 11)
	 sprintf (buf2, "%s", arg10);
      else if (vampgen == 10)
	 sprintf (buf2, "%s", arg9);
      else if (vampgen == 9)
	 sprintf (buf2, "%s", arg8);
      else if (vampgen == 8)
	 sprintf (buf2, "%s", arg7);
      else if (vampgen == 7)
	 sprintf (buf2, "%s", arg6);
      else if (vampgen == 6)
	 sprintf (buf2, "%s", arg5);
      else if (vampgen == 5)
	 sprintf (buf2, "%s", arg4);
      else if (vampgen == 4)
	 sprintf (buf2, "%s", arg3);
      else if (vampgen == 3)
	 sprintf (buf2, "%s", arg2);
      else if (vampgen == 2)
	 sprintf (buf2, "%s", arg1);

      if (ch->pcdata->stats[UNI_GEN] == 2)
	 sprintf (buf,
		  "My name is %s.  I am an Antediluvian.  My sire is %s.",
		  ch->name, buf2);
      else if (ch->pcdata->stats[UNI_GEN] == 3
	       || (arg2[0] != '\0' && arg3[0] == '\0'))
	 sprintf (buf,
		  "My name is %s.  I am %s.  The Antedilivian of my line is %s.",
		  ch->name, ch->clan, buf2);
      else
	 sprintf (buf, "My name is %s.  I am %s.  My sire is %s.", ch->name,
		  ch->clan, buf2);
      do_say (ch, buf);
   }
   if (arg12[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg12, ch->clan, arg11);
      do_say (ch, buf);
   }
   if (arg11[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg11, ch->clan, arg10);
      do_say (ch, buf);
   }
   if (arg10[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg10, ch->clan, arg9);
      do_say (ch, buf);
   }
   if (arg9[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg9, ch->clan, arg8);
      do_say (ch, buf);
   }
   if (arg8[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg8, ch->clan, arg7);
      do_say (ch, buf);
   }
   if (arg7[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg7, ch->clan, arg6);
      do_say (ch, buf);
   }
   if (arg6[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg6, ch->clan, arg5);
      do_say (ch, buf);
   }
   if (arg5[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am %s.  My sire is %s.",
	       arg5, ch->clan, arg4);
      do_say (ch, buf);
   }
   if (arg4[0] != '\0')
   {
      sprintf (buf, "My name is %s.  My sire is %s.", arg4, arg3);
      do_say (ch, buf);
   }
   if (arg3[0] != '\0')
   {
      sprintf (buf,
	       "My name is %s.  I am %s.  The Antediluvian of my line is %s.",
	       arg3, ch->clan, arg2);
      do_say (ch, buf);
   }

   if (arg2[0] != '\0')
   {
      sprintf (buf, "My name is %s.  I am an Antediluvian.  My sire is %s.",
	       arg2, arg1);
      do_say (ch, buf);
   }

   if (vampgen == 1)
   {
      sprintf (buf,
	       "I am %s, cursed by God to drink only blood and eat only ashes.",
	       ch->name);
      //sprintf(buf,"My name is %s.  I am he who sired all those of the Blood.",ch->name);
   }
   else
      sprintf (buf, "My name is %s.  All Kindred are my childer.", arg1);
   do_say (ch, buf);
   return;
}
void do_otradition (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char arg3[MAX_INPUT_LENGTH];
   char arg4[MAX_INPUT_LENGTH];
   char arg5[MAX_INPUT_LENGTH];
   char arg6[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   char buf2[MAX_INPUT_LENGTH];
   char buf3[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg1);
   argument = one_argument (argument, arg2);
   argument = one_argument (argument, arg3);
   argument = one_argument (argument, arg4);
   argument = one_argument (argument, arg5);
   argument = one_argument (argument, arg6);

   if (IS_NPC (ch))
      return;

   if (arg1 != '\0')
      arg1[0] = UPPER (arg1[0]);
   if (arg2 != '\0')
      arg2[0] = UPPER (arg2[0]);
   if (arg3 != '\0')
      arg3[0] = UPPER (arg3[0]);
   if (arg4 != '\0')
      arg4[0] = UPPER (arg4[0]);
   if (arg5 != '\0')
      arg5[0] = UPPER (arg5[0]);
   if (arg6 != '\0')
      arg6[0] = UPPER (arg6[0]);

   if (!str_cmp (arg1, "kavir"))
      strcpy (arg1, "KaVir");

   if (!IS_CLASS (ch, CLASS_VAMPIRE) || (ch->pcdata->stats[UNI_GEN] < 1)
       || (ch->pcdata->stats[UNI_GEN] > 13))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] == 2)
      sprintf (buf3, "Antediluvian");
   else if (ch->pcdata->rank == AGE_NEONATE)
      sprintf (buf3, "Neonate");
   else if (ch->pcdata->rank == AGE_ANCILLA)
      sprintf (buf3, "Ancilla");
   else if (ch->pcdata->rank == AGE_ELDER)
      sprintf (buf3, "Elder");
   else if (ch->pcdata->rank == AGE_METHUSELAH)
      sprintf (buf3, "Methuselah");
   else
      sprintf (buf3, "Childe");

   if (ch->pcdata->stats[UNI_GEN] == 7)
      sprintf (buf2, "Seventh");
   else if (ch->pcdata->stats[UNI_GEN] == 6)
      sprintf (buf2, "Sixth");
   else if (ch->pcdata->stats[UNI_GEN] == 5)
      sprintf (buf2, "Fifth");
   else if (ch->pcdata->stats[UNI_GEN] == 4)
      sprintf (buf2, "Fourth");
   else if (ch->pcdata->stats[UNI_GEN] == 3)
      sprintf (buf2, "Third");
   else if (ch->pcdata->stats[UNI_GEN] == 2)
      sprintf (buf2, "Second");
   if (ch->pcdata->stats[UNI_GEN] == 1)
      sprintf (buf,
	       "As is the tradition, I recite the lineage of %s, Sire of all Kindred.",
	       ch->name);
   else
      sprintf (buf,
	       "As is the tradition, I recite the lineage of %s, %s of the %s Generation.",
	       ch->name, buf3, buf2);
   do_say (ch, buf);
   if (ch->pcdata->stats[UNI_GEN] != 1)
   {
      if (ch->pcdata->stats[UNI_GEN] == 7)
	 sprintf (buf2, "%s", arg6);
      else if (ch->pcdata->stats[UNI_GEN] == 6)
	 sprintf (buf2, "%s", arg5);
      else if (ch->pcdata->stats[UNI_GEN] == 5)
	 sprintf (buf2, "%s", arg4);
      else if (ch->pcdata->stats[UNI_GEN] == 4)
	 sprintf (buf2, "%s", arg3);
      else if (ch->pcdata->stats[UNI_GEN] == 3)
	 sprintf (buf2, "%s", arg2);
      else if (ch->pcdata->stats[UNI_GEN] == 2)
	 sprintf (buf2, "%s", arg1);

      if (IS_SET (ch->special, SPC_ANARCH) || strlen (ch->clan) < 2)
	 sprintf (buf, "My name is %s.  I am of no clan.  My sire is %s.",
		  ch->name, buf2);
      else if (ch->pcdata->stats[UNI_GEN] == 2)
	 sprintf (buf, "My name is %s. I founded %s.  My sire is %s.",
		  ch->name, ch->clan, buf2);
      else
	 sprintf (buf, "My name is %s.  I am of %s.  My sire is %s.",
		  ch->name, ch->clan, buf2);
      do_say (ch, buf);
   }
   if (arg6[0] != '\0')
   {
      sprintf (buf, "My name is %s.  My sire is %s.", arg6, arg5);
      do_say (ch, buf);
   }
   if (arg5[0] != '\0')
   {
      sprintf (buf, "My name is %s.  My sire is %s.", arg5, arg4);
      do_say (ch, buf);
   }
   if (arg4[0] != '\0')
   {
      sprintf (buf, "My name is %s.  My sire is %s.", arg4, arg3);
      do_say (ch, buf);
   }
   if (arg3[0] != '\0')
   {
      sprintf (buf, "My name is %s.  My sire is %s.", arg3, arg2);
      do_say (ch, buf);
   }
   if (arg2[0] != '\0')
   {
      sprintf (buf, "My name is %s.  My sire is %s.", arg2, arg1);
      do_say (ch, buf);
   }
   if (ch->pcdata->stats[UNI_GEN] == 1)
      sprintf (buf, "My name is %s.  All Kindred are my childer.", ch->name);
   else
      sprintf (buf, "My name is %s.  All Kindred are my childer.", arg1);
   do_say (ch, buf);
   if (ch->pcdata->stats[UNI_GEN] == 7)
      sprintf (buf,
	       "My name is %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",
	       ch->name, arg6, arg5, arg4, arg3, arg2, arg1);
   if (ch->pcdata->stats[UNI_GEN] == 6)
      sprintf (buf,
	       "My name is %s, childe of %s, childe of %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",
	       ch->name, arg5, arg4, arg3, arg2, arg1);
   if (ch->pcdata->stats[UNI_GEN] == 5)
      sprintf (buf,
	       "My name is %s, childe of %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",
	       ch->name, arg4, arg3, arg2, arg1);
   if (ch->pcdata->stats[UNI_GEN] == 4)
      sprintf (buf,
	       "My name is %s, childe of %s, childe of %s, childe of %s.  Recognize my lineage.",
	       ch->name, arg3, arg2, arg1);
   if (ch->pcdata->stats[UNI_GEN] == 3)
      sprintf (buf,
	       "My name is %s, childe of %s, childe of %s.  Recognize my lineage.",
	       ch->name, arg2, arg1);
   if (ch->pcdata->stats[UNI_GEN] == 2)
      sprintf (buf, "My name is %s, childe of %s.  Recognize my lineage.",
	       ch->name, arg1);
   if (ch->pcdata->stats[UNI_GEN] == 1)
      sprintf (buf, "My name is %s.  Recognize my lineage.", ch->name);
   do_say (ch, buf);
   return;
}

void do_darkheart (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }
   if (get_disc(ch, VAM_SERP) < 1)
   {
      send_to_char ("You need level 1 serpent first.\n\r", ch);
      return;
   }
   if (IS_IMMUNE (ch, IMM_STAKE))
   {
      send_to_char ("But you've already torn your heart out!\n\r", ch);
      return;
   }
   if (ch->pcdata->condition[COND_THIRST] < 100)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   ch->pcdata->condition[COND_THIRST] -= 100;
   send_to_char
      ("You rip your heart from your body and toss it to the ground.\n\r",
       ch);
   act ("$n rips $s heart out and tosses it to the ground.", ch, NULL, NULL,
	TO_ROOM);
   make_part (ch, "heart");
   ch->hit = ch->hit - number_range (10, 20);
   update_pos (ch);
   if (ch->position == POS_DEAD && !IS_HERO (ch))
   {
      send_to_char ("You have been KILLED!!\n\r\n\r", ch);
      raw_kill (ch, ch);
      ch->form = 2;
      return;
   }
   SET_BIT (ch->immune, IMM_STAKE);
   return;
}

void do_truesight (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_HIGHLANDER)
       && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DEMON)
       && !IS_CLASS (ch, CLASS_DRAGON) && !IS_CLASS (ch, CLASS_WRAITH))
   {
      do_rand_typo (ch);
      return;
   }
    if (IS_CLASS(ch, CLASS_WRAITH) && ( ch->arcanoi[WLIFE] < 4 ))
    {
        stc("You have not obtained this power yet.\n\r",ch);
        return;
    }
   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_TRUESIGHT))
      {
	 send_to_char ("You haven't been granted the gift of truesight.\n\r",
		       ch);
	 return;
      }
   }

   if (IS_CLASS (ch, CLASS_DRAGON)
       && !IS_SET (ch->pcdata->dragonaff, DRA_TRUESIGHT))
   {
      send_to_char ("You don't have sight beyond sight yet.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      if (!IS_DEMPOWER (ch, HPOWER_VISION))
      {
	 stc ("You have not gained the power of vision.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 1)
   {
      send_to_char
	 ("You need level 1 auspex before you can use truesight.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 3)
   {
      stc ("You must obtain level 3 Awareness to use Truesight.\n\r", ch);
      return;
   }

   if (IS_SET (ch->act, PLR_HOLYLIGHT))
   {
      REMOVE_BIT (ch->act, PLR_HOLYLIGHT);
      send_to_char ("Your senses return to normal.\n\r", ch);
   }
   else
   {
      SET_BIT (ch->act, PLR_HOLYLIGHT);
      send_to_char ("Your senses increase to incredible proportions.\n\r",
		    ch);
   }

   return;
}

void do_scry (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   ROOM_INDEX_DATA *chroom;
   ROOM_INDEX_DATA *victimroom;
   DESCRIPTOR_DATA *d;
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   bool found = FALSE;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 4)
   {
      stc ("You must obtain level 4 Awareness to use scry.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      if (!IS_DEMPOWER (ch, HPOWER_SCRY))
      {
	 stc ("You have not gained the power of scry.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_DROW))
   {
      if (!IS_SET (ch->pcdata->powers[1], DPOWER_DROWSCRY))
      {
	 stc ("You must be granted the power of divination.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_DRAGON)
       && !IS_SET (ch->pcdata->dragonaff, DRA_SCRY))
   {
      send_to_char ("You can't see people who are far away yet.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 2)
   {
      stc ("You must obtain level 2 Auspex to scry.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_FAE) && ch->pcdata->powers[FAE_SOOT] < 3)
   {
      stc ("You must obtain the third Art of Soothsay to use tattletale.\n\r",
	   ch);
      return;
   }
   else if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_SCRY))
      {
	 send_to_char ("You haven't been granted the gift of scry.\n\r", ch);
	 return;
      }
   }
   else if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[PHILODOX] < 3)
   {
      stc ("You need level 3 philodox to use scry.\n\r", ch);
      return;
   }
   else if (IS_CLASS (ch, CLASS_MAGE) && ch->spheres[MCOR] < 2)
   {
      stc ("You must obtain level two Correspondence to use Scry.\n\r", ch);
      return;
   }
   else if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_ITEMAFF (ch, ITEMA_VISION)
	    && !IS_CLASS (ch, CLASS_NINJA) && !IS_CLASS (ch, CLASS_MAGE)
	    && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_WEREWOLF)
	    && !IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_HIGHLANDER)
	    && !IS_CLASS (ch, CLASS_DRAGON) && !IS_CLASS (ch, CLASS_FAE))
   {
      do_rand_typo (ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_SORA] < 1)
   {
      send_to_char ("You have not learned the Sora principle to 1.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_NINJA) && ch->move < 600)
   {
      send_to_char
	 ("You don't have enough movement points to scry someone.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char
	 ("You close your eyes and mentally survey the surrounding area.\n\r",
	  ch);
      act ("$n closes $s eyes and a look of concentration crosses $s face.",
	   ch, NULL, NULL, TO_ROOM);
      for (d = first_descriptor; d != NULL; d = d->next)
      {
	 if (d->connected != CON_PLAYING)
	    continue;
	 if ((victim = d->character) == NULL)
	    continue;
	 if (IS_NPC (victim) || victim->in_room == NULL)
	    continue;
	 if (victim == ch)
	    continue;
	 if (IS_IMMORTAL (victim))
	    continue;
	 if (!can_see (ch, victim))
	    continue;
	 if (IS_AFFECTED (victim, AFF_POLYMORPH))
	    sprintf (buf, "%s: ", victim->morph);
	 else
	    sprintf (buf, "%s: ", victim->name);
	 send_to_char (buf, ch);
	 if (victim->fight_timer > 0)
	    sprintf (buf, "%s.\n\r", victim->in_room->name);

	 else if (nosafe)
	    sprintf (buf, "%s.\n\r", victim->in_room->name);

	 else if (!IS_IMMUNE (victim, IMM_SHIELDED))
	    sprintf (buf, "%s.\n\r", victim->in_room->name);
         else if (WORN_ARTIFACT(ch, ARTI_MAIDENS_BREATH))
	    sprintf (buf, "%s.\n\r", victim->in_room->name);
	 else
	    sprintf (buf, "(shielded).\n\r");
	 send_to_char (buf, ch);
	 found = TRUE;
      }
      if (!found)
	 send_to_char ("You cannot seem to locate anyone.\n\r", ch);
      return;
   }

   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (IS_SUPER_NPC (victim))
   {
      send_to_char ("You are unable to locate them.\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim))
   {
      stc ("You Failed.\n\r", ch);
      return;
   }
   if (!IS_CLASS (ch, CLASS_DEMON) && !IS_SET (ch->special, SPC_CHAMPION) &&
       ch->pcdata->condition[COND_THIRST] < 25
       && !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
       && !IS_CLASS (ch, CLASS_MAGE) && !IS_CLASS (ch, CLASS_HIGHLANDER)
       && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_WEREWOLF)
       && !IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_DRAGON)
       && !IS_CLASS (ch, CLASS_FAE) )
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   if (!IS_ITEMAFF (ch, ITEMA_VISION) && IS_CLASS (ch, CLASS_VAMPIRE))
      ch->pcdata->condition[COND_THIRST] -= number_range (15, 25);

   if (IS_SET (victim->flag2, AFF2_SPIRITGUARD))
   {
      act ("Your spirit guardian sends you a message:", ch, NULL, victim,
	   TO_VICT);
      act ("\"$n is scrying you.\"", ch, NULL, victim, TO_VICT);
   }

   if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED) ||
			    (IS_CLASS (victim, CLASS_DROW)
			     && IS_SET (ch->pcdata->powers[1],
					DPOWER_DROWSHIELD)))
       && !IS_ITEMAFF (ch, ITEMA_VISION) && victim->fight_timer == 0
       && !nosafe && !WORN_ARTIFACT(ch, ARTI_MAIDENS_BREATH))
   {
      send_to_char ("You are unable to locate them.\n\r", ch);
      return;
   }

   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You are unable to locate them.\n\r", ch);
      return;
   }
   chroom = ch->in_room;
   victimroom = victim->in_room;

   char_from_room (ch);
   char_to_room (ch, victimroom);
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE)
       && (!IS_AFFECTED (victim, AFF_SHADOWPLANE)))
   {
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
   }
   else if (!IS_AFFECTED (ch, AFF_SHADOWPLANE)
	    && (IS_AFFECTED (victim, AFF_SHADOWPLANE)))
   {
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
   }
   else
      do_look (ch, "auto");
   char_from_room (ch);
   char_to_room (ch, chroom);
   return;

}

void do_readaura (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_ITEMAFF (ch, ITEMA_VISION)
       && !IS_CLASS (ch, CLASS_NINJA) && !IS_CLASS (ch, CLASS_MONK)
       && !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS(ch, CLASS_WRAITH))
   {
      do_rand_typo (ch);
      return;
   }
    if (IS_CLASS( ch, CLASS_WRAITH ) && ch->arcanoi[WLIFE] < 2 )
        {
         send_to_char("You do not have the power to do this.\n\r", ch );
         return;
        }
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      if (!IS_DEMPOWER (ch, HPOWER_READAURA))
      {
	 stc ("You have not gained that power.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_SORA] < 2)
   {
      send_to_char ("You have not learned the Sora principle to 2.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_NINJA) && ch->move < 600)
   {
      send_to_char ("You don't have enough movement points to readaura.\n\r",
		    ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[SPIRIT] < 2)
   {
      send_to_char ("You have not learned that ability.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 4
       && !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
       && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS(ch, CLASS_WRAITH))
   {
      send_to_char ("You need level 4 auspex first.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Read the aura on what?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      if ((obj = get_obj_carry (ch, arg)) == NULL)
      {
	 send_to_char ("Read the aura on what?\n\r", ch);
	 return;
      }
      if (ch->pcdata->condition[COND_THIRST] < 50
	  && !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
	  && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_HIGHLANDER)  && !IS_CLASS(ch, CLASS_WRAITH))
      {
	 send_to_char ("You have insufficient blood.\n\r", ch);
	 return;
      }
      if (!IS_ITEMAFF (ch, ITEMA_VISION))
	 ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
      act ("$n examines $p intently.", ch, obj, NULL, TO_ROOM);
      spell_identify (skill_lookup ("identify"), ch->level, ch, obj);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 50
       && !IS_ITEMAFF (ch, ITEMA_VISION) && !IS_CLASS (ch, CLASS_NINJA)
       && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS(ch, CLASS_WRAITH))
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   if (!IS_ITEMAFF (ch, ITEMA_VISION))
      ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
   if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED)
			    || (IS_CLASS (victim, CLASS_DROW)
				&& IS_SET (victim->pcdata->powers[1],
					   DPOWER_DROWSHIELD)))
       && !IS_ITEMAFF (ch, ITEMA_VISION))
   {
      send_to_char ("You are unable to read their aura.\n\r", ch);
      return;
   }
   if (IS_SUPER_NPC (victim))
   {
      act ("You are unable to read $S aura.", ch, NULL, victim, TO_CHAR);
      return;
   }

   act ("$n examines $N intently.", ch, NULL, victim, TO_NOTVICT);
   act ("$n examines you intently.", ch, NULL, victim, TO_VICT);
   if (IS_NPC (victim))
      sprintf (buf, "%s is an NPC.\n\r", victim->short_descr);
   else
   {
      if (victim->level == 12)
	 sprintf (buf, "%s is an Implementor.\n\r", victim->name);
      else if (victim->level == 11)
	 sprintf (buf, "%s is a High Judge.\n\r", victim->name);
      else if (victim->level == 10)
	 sprintf (buf, "%s is a Judge.\n\r", victim->name);
      else if (victim->level == 9)
	 sprintf (buf, "%s is an Enforcer.\n\r", victim->name);
      else if (victim->level == 8)
	 sprintf (buf, "%s is a Quest Maker.\n\r", victim->name);
      else if (victim->level == 7)
	 sprintf (buf, "%s is a Builder.\n\r", victim->name);
      else if (victim->level >= 3)
	 sprintf (buf, "%s is an Avatar.\n\r", victim->name);
      else
	 sprintf (buf, "%s is a Mortal.\n\r", victim->name);
   }
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
   {
      sprintf (buf, "Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",
	       get_curr_str (victim), get_curr_int (victim),
	       get_curr_wis (victim), get_curr_dex (victim),
	       get_curr_con (victim));
      send_to_char (buf, ch);
   }
   sprintf (buf, "Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r", victim->hit,
	    victim->max_hit, victim->mana, victim->max_mana, victim->move,
	    victim->max_move);
   send_to_char (buf, ch);
   sprintf (buf, "Hitroll:%d, Damroll:%d, AC:%d.\n\r",
	    char_hitroll (victim), char_damroll (victim), char_ac (victim));
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
   {
      sprintf (buf, "Status:%d, ", victim->race);
      send_to_char (buf, ch);
      if (IS_CLASS (victim, CLASS_VAMPIRE))
      {
	 sprintf (buf, "Blood:%d, ", victim->pcdata->condition[COND_THIRST]);
	 send_to_char (buf, ch);
      }
   }
   sprintf (buf, "Alignment:%d.\n\r", victim->alignment);
   send_to_char (buf, ch);
   if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_PREGNANT))
      act ("$N is pregnant.", ch, NULL, victim, TO_CHAR);
   if (IS_CLASS (ch, CLASS_NINJA))
   {
      ch->move -= 600;
      return;
   }
   return;
}

void do_mortal (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   int blood;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (get_disc(ch, VAM_OBFU) < 4)
   {
      send_to_char ("You need level 4 obfuscate first.\n\r", ch);
      return;
   }

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_VAMPAFF (ch, VAM_MORTAL))
   {
      do_rand_typo (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      if (ch->pcdata->condition[COND_THIRST] < 100)
      {
	 send_to_char ("You must be at full blood to use this power.\n\r",
		       ch);
	 return;
      }
      blood = ch->pcdata->condition[COND_THIRST];
      ch->pcdata->condition[COND_THIRST] = 666;

      if (IS_VAMPAFF (ch, VAM_DISGUISED))
	 do_mask (ch, "self");
      if (IS_IMMUNE (ch, IMM_SHIELDED))
	 do_shield (ch, "");
      if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
	 do_shadowplane (ch, "");
      if (IS_VAMPAFF (ch, VAM_FANGS))
	 do_fangs (ch, "");
      if (IS_VAMPAFF (ch, VAM_CLAWS))
	 do_claws (ch, "");
      if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
	 do_nightsight (ch, "");
      if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
	 do_shadowsight (ch, "");
      if (IS_SET (ch->act, PLR_HOLYLIGHT))
	 do_truesight (ch, "");
      if (IS_VAMPAFF (ch, VAM_CHANGED))
	 do_change (ch, "human");
      if (IS_POLYAFF (ch, POLY_SERPENT))
	 do_serpent (ch, "");
      ch->pcdata->stats[UNI_RAGE] = 0;
      ch->pcdata->condition[COND_THIRST] = blood;

      send_to_char
	 ("Colour returns to your skin and you warm up a little.\n\r", ch);
      act ("Colour returns to $n's skin.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->class, CLASS_VAMPIRE);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
      return;
   }
   send_to_char ("You skin pales and cools.\n\r", ch);
   act ("$n's skin pales slightly.", ch, NULL, NULL, TO_ROOM);
   ch->class = CLASS_VAMPIRE;
   REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
   return;
}

void do_mortalvamp (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   int blood;
   int pos = ch->position;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      ch->position = POS_STANDING;
      /* Have to make sure they have enough blood to change back */
      blood = ch->pcdata->condition[COND_THIRST];
      ch->pcdata->condition[COND_THIRST] = 666;

      /* Remove physical vampire attributes when you take mortal form */
      if (IS_VAMPAFF (ch, VAM_DISGUISED))
	 do_mask (ch, "self");
      if (IS_IMMUNE (ch, IMM_SHIELDED))
	 do_shield (ch, "");
      if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
	 do_shadowplane (ch, "");
      if (IS_VAMPAFF (ch, VAM_FANGS))
	 do_fangs (ch, "");
      if (IS_VAMPAFF (ch, VAM_CLAWS))
	 do_claws (ch, "");
      if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
	 do_nightsight (ch, "");
      if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
	 do_shadowsight (ch, "");
      if (IS_SET (ch->act, PLR_HOLYLIGHT))
	 do_truesight (ch, "");
      if (IS_VAMPAFF (ch, VAM_CHANGED))
	 do_change (ch, "human");
      if (IS_POLYAFF (ch, POLY_SERPENT))
	 do_serpent (ch, "");
      if (IS_EXTRA (ch, EXTRA_DRAGON))
	 do_dragonform (ch, "");
      if (IS_POLYAFF (ch, POLY_ZULO))
	 do_zuloform (ch, "");
      ch->position = pos;
      ch->pcdata->stats[UNI_RAGE] = 0;
      ch->pcdata->condition[COND_THIRST] = blood;

      send_to_char ("You lose your vampire powers.\n\r", ch);

      REMOVE_BIT (ch->class, CLASS_VAMPIRE);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
      return;
   }
   send_to_char ("You regain your vampire powers.\n\r", ch);
   ch->class = CLASS_VAMPIRE;
   REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_MORTAL);
   return;
}

void do_shield (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;


   if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_VAMPIRE)
       && !IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_DEMON)
       && !IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS (ch, CLASS_MAGE)
       && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS(ch, CLASS_WRAITH))
   {
      do_rand_typo (ch);
      return;
   }

    if (IS_CLASS( ch, CLASS_WRAITH) && (ch->arcanoi[WLIFE] < 1 ) )
        {
         stc("You do not know how to use this.\n\r",ch);
         return;
        }
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      if (!IS_DEMPOWER (ch, HPOWER_SHIELD))
      {
	 stc ("You have not gained the power of shield.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[SILVERFANGS] < 4)
   {
      stc ("You need level 5 Silver Fangs first!\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MONK) && ch->monkab[AWARE] < 5)
   {
      stc ("You must obtain level 5 Awareness to use shield.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_DROW)
       && !IS_SET (ch->pcdata->powers[1], DPOWER_DROWSHIELD))
   {
      send_to_char ("You don't have that power.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBFU) < 2)
   {
      send_to_char ("You need level 2 obfuscate first.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      if (!IS_DEMPOWER (ch, DEM_SHIELD))
      {
	 send_to_char ("You haven't been granted the gift of shielding.\n\r",
		       ch);
	 return;
      }
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE)
       && ch->pcdata->condition[COND_THIRST] < 60)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MAGE)
       && (ch->spheres[MCOR] < 2 && ch->spheres[MMIN] < 1))
   {
      stc ("You must obtain level two Correspondence to Shield your being.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE))
      ch->pcdata->condition[COND_THIRST] -= number_range (50, 60);
   if (!IS_IMMUNE (ch, IMM_SHIELDED))
   {
      if (IS_CLASS(ch, CLASS_WRAITH))
        stc("You cut a strand connecting you to the mortal world, shielding your aura.\n\r",ch);
      else
        send_to_char ("You shield your aura from those around you.\n\r", ch);
      SET_BIT (ch->immune, IMM_SHIELDED);
      return;
   }
   if (IS_CLASS(ch,CLASS_WRAITH))
         stc("You re-tie a link to the mortal world.\n\r",ch);
   else
         send_to_char ("You stop shielding your aura.\n\r", ch);
   REMOVE_BIT (ch->immune, IMM_SHIELDED);
   return;
}

void do_serpent (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (get_disc(ch, VAM_SERP) < 2)
   {
      send_to_char ("You need level 2 serpent first.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      if (!IS_POLYAFF (ch, POLY_SERPENT))
      {
	 send_to_char ("You cannot polymorph from this form.\n\r", ch);
	 return;
      }
      act ("You transform back into human.", ch, NULL, NULL, TO_CHAR);
      act ("$n transform into human form.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->polyaff, POLY_SERPENT);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      clear_stats (ch);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      ch->max_hit = ch->max_hit - 250;
      ch->hit = ch->hit - 250;
      if (ch->hit < 1)
	 ch->hit = 1;
      ch->max_mana = ch->max_mana + 50;
      return;
   }
   if (ch->pcdata->condition[COND_THIRST] < 50)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   ch->pcdata->condition[COND_THIRST] -= number_range (40, 50);
   clear_stats (ch);
   if (ch->wpn[0] > 0)
   {
      ch->hitroll += ch->wpn[0] * 0.75;
      ch->damroll += ch->wpn[0] * 0.75;
      ch->armor -= ch->wpn[0] * 3;
   }
   if (ch->stance[0] != -1)
      do_stance (ch, "");
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   ch->pcdata->mod_str = 10;
   act ("You transform into a huge serpent.", ch, NULL, NULL, TO_CHAR);
   act ("$n transforms into a huge serpent.", ch, NULL, NULL, TO_ROOM);
   SET_BIT (ch->polyaff, POLY_SERPENT);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   sprintf (buf, "%s the huge serpent", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   ch->max_hit = ch->max_hit + 250;
   ch->hit = ch->hit + 250;
   ch->max_mana = ch->max_mana - 50;
   return;
}
void do_regenerate (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->pcdata->stats[UNI_RAGE] > 0)
   {
      send_to_char
	 ("You cannot control your regenerative powers while the beast is so strong.\n\r",
	  ch);
      return;
   }

   if (ch->position == POS_FIGHTING)
   {
      send_to_char ("You cannot regenerate while fighting.\n\r", ch);
      return;
   }

   if (ch->hit >= ch->max_hit && ch->mana >= ch->max_mana
       && ch->move >= ch->max_move)
   {
      send_to_char ("But you are already completely regenerated!\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 10)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   ch->pcdata->condition[COND_THIRST] -= number_range (5, 10);
   if (ch->hit >= ch->max_hit && ch->mana >= ch->max_mana
       && ch->move >= ch->max_move)
   {
      send_to_char ("Your body has completely regenerated.\n\r", ch);
      act ("$n's body completely regenerates itself.", ch, NULL, NULL,
	   TO_ROOM);
   }
   else
      send_to_char ("Your body slowly regenerates itself.\n\r", ch);
   if (ch->hit < 1)
   {
      ch->hit += number_range (1, 3);
      update_pos (ch);
      WAIT_STATE (ch, 24);
   }
   else
   {
      int conamount = (get_curr_con (ch) + 1);
      int intamount = (get_curr_int (ch) + 1);
      int dexamount = (get_curr_dex (ch) + 1);
      int a = ch->max_hit / 400;
      int b = ch->max_mana / 400;
      int c = ch->max_move / 400;

      if (a < 1)
	 a = 1;
      if (b < 1)
	 b = 1;
      if (c < 1)
	 c = 1;

      a *= number_range(1,5);
      b *= number_range(1,5);
      c *= number_range(1,5);

      if (a < 5)
         a = 5;
      if (b < 5)
         b = 5;
      if (c < 5)
         c = 5;

      a += ((conamount - (conamount % 10)) * dice (3, 25));
      b += ((intamount - (intamount % 10)) * dice (3, 25));
      c += ((dexamount - (dexamount % 10)) * dice (3, 25));

      if (IS_AFFECTED (ch, AFF_FLAMING))
      {
         a /= 4;
         b /= 4;
         c /= 4;
      }

      if (ch->fight_timer > 0)
      {
         a /= 4;
         b /= 4;
         c /= 4;
      }

      if ((a + ch->hit) > ch->max_hit)
         a = (ch->max_hit - ch->hit);
      if ((b + ch->mana) > ch->max_mana)
         b = (ch->max_mana - ch->mana);
      if ((c + ch->move) > ch->max_move)
         c = (ch->max_move - ch->move);

      ch->hit += a;
      ch->mana += b;
      ch->move += c;
      update_pos (ch);
      if (IS_SET (ch->more, PLR_SEE_REGEN))
      {
         if (a > 0)
            stcf (ch,
                  "#wYour body repairs the damage you have suffered. #g[ #c+%d hp #g]#n\n\r",
                  a);
         if (b > 0)
            stcf (ch,
                  "#wYour mind harnesses nearby latent energy. #g[ #c+%d mana #g]#n\n\r",
                  b);
         if (c > 0)
            stcf (ch,
                  "#wYou slowly regain your stamina. #g[ #c+%d move #g]#n\n\r",
                  c);
      }
   }
   WAIT_STATE (ch, 12);
   return;
}

void reg_mend (CHAR_DATA * ch)
{
   int ribs = 0;
   int teeth = 0;

   if (IS_BODY (ch, BROKEN_RIBS_1))
      ribs += 1;
   if (IS_BODY (ch, BROKEN_RIBS_2))
      ribs += 2;
   if (IS_BODY (ch, BROKEN_RIBS_4))
      ribs += 4;
   if (IS_BODY (ch, BROKEN_RIBS_8))
      ribs += 8;
   if (IS_BODY (ch, BROKEN_RIBS_16))
      ribs += 16;
   if (IS_HEAD (ch, LOST_TOOTH_1))
      teeth += 1;
   if (IS_HEAD (ch, LOST_TOOTH_2))
      teeth += 2;
   if (IS_HEAD (ch, LOST_TOOTH_4))
      teeth += 4;
   if (IS_HEAD (ch, LOST_TOOTH_8))
      teeth += 8;
   if (IS_HEAD (ch, LOST_TOOTH_16))
      teeth += 16;

   if (ribs > 0)
   {
      if (IS_BODY (ch, BROKEN_RIBS_1))
	 REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_1);
      if (IS_BODY (ch, BROKEN_RIBS_2))
	 REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_2);
      if (IS_BODY (ch, BROKEN_RIBS_4))
	 REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_4);
      if (IS_BODY (ch, BROKEN_RIBS_8))
	 REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_8);
      if (IS_BODY (ch, BROKEN_RIBS_16))
	 REMOVE_BIT (ch->loc_hp[1], BROKEN_RIBS_16);
      ribs -= 1;
      if (ribs >= 16)
      {
	 ribs -= 16;
	 SET_BIT (ch->loc_hp[1], BROKEN_RIBS_16);
      }
      if (ribs >= 8)
      {
	 ribs -= 8;
	 SET_BIT (ch->loc_hp[1], BROKEN_RIBS_8);
      }
      if (ribs >= 4)
      {
	 ribs -= 4;
	 SET_BIT (ch->loc_hp[1], BROKEN_RIBS_4);
      }
      if (ribs >= 2)
      {
	 ribs -= 2;
	 SET_BIT (ch->loc_hp[1], BROKEN_RIBS_2);
      }
      if (ribs >= 1)
      {
	 ribs -= 1;
	 SET_BIT (ch->loc_hp[1], BROKEN_RIBS_1);
      }
      act ("One of $n's ribs snap back into place.", ch, NULL, NULL, TO_ROOM);
      act ("One of your ribs snap back into place.", ch, NULL, NULL, TO_CHAR);
   }
   else if (IS_HEAD (ch, LOST_EYE_L))
   {
      act ("An eyeball appears in $n's left eye socket.", ch, NULL, NULL,
	   TO_ROOM);
      act ("An eyeball appears in your left eye socket.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EYE_L);
   }
   else if (IS_HEAD (ch, LOST_EYE_R))
   {
      act ("An eyeball appears in $n's right eye socket.", ch, NULL, NULL,
	   TO_ROOM);
      act ("An eyeball appears in your right eye socket.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EYE_R);
   }
   else if (IS_HEAD (ch, LOST_EAR_L))
   {
      act ("An ear grows on the left side of $n's head.", ch, NULL, NULL,
	   TO_ROOM);
      act ("An ear grows on the left side of your head.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EAR_L);
   }
   else if (IS_HEAD (ch, LOST_EAR_R))
   {
      act ("An ear grows on the right side of $n's head.", ch, NULL, NULL,
	   TO_ROOM);
      act ("An ear grows on the right side of your head.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_EAR_R);
   }
   else if (IS_HEAD (ch, LOST_NOSE))
   {
      act ("A nose grows on the front of $n's face.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A nose grows on the front of your face.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_NOSE);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_NOSE);
   }
   else if (teeth > 0)
   {
      if (IS_HEAD (ch, LOST_TOOTH_1))
	 REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_1);
      if (IS_HEAD (ch, LOST_TOOTH_2))
	 REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_2);
      if (IS_HEAD (ch, LOST_TOOTH_4))
	 REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_4);
      if (IS_HEAD (ch, LOST_TOOTH_8))
	 REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_8);
      if (IS_HEAD (ch, LOST_TOOTH_16))
	 REMOVE_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_16);
      teeth -= 1;
      if (teeth >= 16)
      {
	 teeth -= 16;
	 SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_16);
      }
      if (teeth >= 8)
      {
	 teeth -= 8;
	 SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_8);
      }
      if (teeth >= 4)
      {
	 teeth -= 4;
	 SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_4);
      }
      if (teeth >= 2)
      {
	 teeth -= 2;
	 SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_2);
      }
      if (teeth >= 1)
      {
	 teeth -= 1;
	 SET_BIT (ch->loc_hp[LOC_HEAD], LOST_TOOTH_1);
      }
      act ("A missing tooth grows in your mouth.", ch, NULL, NULL, TO_CHAR);
      act ("A missing tooth grows in $n's mouth.", ch, NULL, NULL, TO_ROOM);
   }
   else if (IS_HEAD (ch, BROKEN_NOSE))
   {
      act ("$n's nose snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your nose snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_NOSE);
   }
   else if (IS_HEAD (ch, BROKEN_JAW))
   {
      act ("$n's jaw snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your jaw snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_JAW);
   }
   else if (IS_HEAD (ch, BROKEN_SKULL))
   {
      act ("$n's skull knits itself back together.", ch, NULL, NULL, TO_ROOM);
      act ("Your skull knits itself back together.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_HEAD], BROKEN_SKULL);
   }
   else if (IS_BODY (ch, BROKEN_SPINE))
   {
      act ("$n's spine knits itself back together.", ch, NULL, NULL, TO_ROOM);
      act ("Your spine knits itself back together.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_BODY], BROKEN_SPINE);
   }
   else if (IS_BODY (ch, BROKEN_NECK))
   {
      act ("$n's neck snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your neck snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_BODY], BROKEN_NECK);
   }
   else if (IS_ARM_L (ch, LOST_ARM))
   {
      act ("An arm grows from the stump of $n's left shoulder.", ch, NULL,
	   NULL, TO_ROOM);
      act ("An arm grows from the stump of your left shoulder.", ch, NULL,
	   NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_ARM);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_ARM);
      SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_HAND);
   }
   else if (IS_ARM_R (ch, LOST_ARM))
   {
      act ("An arm grows from the stump of $n's right shoulder.", ch, NULL,
	   NULL, TO_ROOM);
      act ("An arm grows from the stump of your right shoulder.", ch, NULL,
	   NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_ARM);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_ARM);
      SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_HAND);
   }
   else if (IS_LEG_L (ch, LOST_LEG))
   {
      act ("A leg grows from the stump of $n's left hip.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A leg grows from the stump of your left hip.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_L], LOST_LEG);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_L], BROKEN_LEG);
      SET_BIT (ch->loc_hp[LOC_LEG_L], LOST_FOOT);
   }
   else if (IS_LEG_R (ch, LOST_LEG))
   {
      act ("A leg grows from the stump of $n's right hip.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A leg grows from the stump of your right hip.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_R], LOST_LEG);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_R], BROKEN_LEG);
      SET_BIT (ch->loc_hp[LOC_LEG_R], LOST_FOOT);
   }
   else if (IS_ARM_L (ch, BROKEN_ARM))
   {
      act ("$n's left arm snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your left arm snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_ARM);
   }
   else if (IS_ARM_R (ch, BROKEN_ARM))
   {
      act ("$n's right arm snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your right arm snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_ARM);
   }
   else if (IS_LEG_L (ch, BROKEN_LEG))
   {
      act ("$n's left leg snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your left leg snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_L], BROKEN_LEG);
   }
   else if (IS_LEG_R (ch, BROKEN_LEG))
   {
      act ("$n's right leg snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your right leg snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_R], BROKEN_LEG);
   }
   else if (IS_ARM_L (ch, LOST_HAND))
   {
      act ("A hand grows from the stump of $n's left wrist.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A hand grows from the stump of your left wrist.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_HAND);
      SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_THUMB);
      SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_I);
      SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_M);
      SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_R);
      SET_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_L);
   }
   else if (IS_ARM_R (ch, LOST_HAND))
   {
      act ("A hand grows from the stump of $n's right wrist.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A hand grows from the stump of your right wrist.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_HAND);
      SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_THUMB);
      SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_I);
      SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_M);
      SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_R);
      SET_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_L);
   }
   else if (IS_LEG_L (ch, LOST_FOOT))
   {
      act ("A foot grows from the stump of $n's left ankle.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A foot grows from the stump of your left ankle.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_L], LOST_FOOT);
   }
   else if (IS_LEG_R (ch, LOST_FOOT))
   {
      act ("A foot grows from the stump of $n's right ankle.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A foot grows from the stump of your right ankle.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_LEG_R], LOST_FOOT);
   }
   else if (IS_ARM_L (ch, LOST_THUMB))
   {
      act ("A thumb slides out of $n's left hand.", ch, NULL, NULL, TO_ROOM);
      act ("A thumb slides out of your left hand.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_THUMB);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_THUMB);
   }
   else if (IS_ARM_L (ch, BROKEN_THUMB))
   {
      act ("$n's left thumb snaps back into place.", ch, NULL, NULL, TO_ROOM);
      act ("Your left thumb snaps back into place.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_THUMB);
   }
   else if (IS_ARM_L (ch, LOST_FINGER_I))
   {
      act ("An index finger slides out of $n's left hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("An index finger slides out of your left hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_I);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_I);
   }
   else if (IS_ARM_L (ch, BROKEN_FINGER_I))
   {
      act ("$n's left index finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your left index finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_I);
   }
   else if (IS_ARM_L (ch, LOST_FINGER_M))
   {
      act ("A middle finger slides out of $n's left hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A middle finger slides out of your left hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_M);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_M);
   }
   else if (IS_ARM_L (ch, BROKEN_FINGER_M))
   {
      act ("$n's left middle finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your left middle finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_M);
   }
   else if (IS_ARM_L (ch, LOST_FINGER_R))
   {
      act ("A ring finger slides out of $n's left hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A ring finger slides out of your left hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_R);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_R);
   }
   else if (IS_ARM_L (ch, BROKEN_FINGER_R))
   {
      act ("$n's left ring finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your left ring finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_R);
   }
   else if (IS_ARM_L (ch, LOST_FINGER_L))
   {
      act ("A little finger slides out of $n's left hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A little finger slides out of your left hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], LOST_FINGER_L);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_L);
   }
   else if (IS_ARM_L (ch, BROKEN_FINGER_L))
   {
      act ("$n's left little finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your left little finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_L);
   }
   else if (IS_ARM_R (ch, LOST_THUMB))
   {
      act ("A thumb slides out of $n's right hand.", ch, NULL, NULL, TO_ROOM);
      act ("A thumb slides out of your right hand.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_THUMB);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_THUMB);
   }
   else if (IS_ARM_R (ch, BROKEN_THUMB))
   {
      act ("$n's right thumb snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your right thumb snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_THUMB);
   }
   else if (IS_ARM_R (ch, LOST_FINGER_I))
   {
      act ("An index finger slides out of $n's right hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("An index finger slides out of your right hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_I);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_I);
   }
   else if (IS_ARM_R (ch, BROKEN_FINGER_I))
   {
      act ("$n's right index finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your right index finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_I);
   }
   else if (IS_ARM_R (ch, LOST_FINGER_M))
   {
      act ("A middle finger slides out of $n's right hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A middle finger slides out of your right hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_M);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_M);
   }
   else if (IS_ARM_R (ch, BROKEN_FINGER_M))
   {
      act ("$n's right middle finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your right middle finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_M);
   }
   else if (IS_ARM_R (ch, LOST_FINGER_R))
   {
      act ("A ring finger slides out of $n's right hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A ring finger slides out of your right hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_R);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_R);
   }
   else if (IS_ARM_R (ch, BROKEN_FINGER_R))
   {
      act ("$n's right ring finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your right ring finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_R);
   }
   else if (IS_ARM_R (ch, LOST_FINGER_L))
   {
      act ("A little finger slides out of $n's right hand.", ch, NULL, NULL,
	   TO_ROOM);
      act ("A little finger slides out of your right hand.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], LOST_FINGER_L);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_L);
   }
   else if (IS_ARM_R (ch, BROKEN_FINGER_L))
   {
      act ("$n's right little finger snaps back into place.", ch, NULL, NULL,
	   TO_ROOM);
      act ("Your right little finger snaps back into place.", ch, NULL, NULL,
	   TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_L);
   }
   else if (IS_BODY (ch, CUT_THROAT))
   {
      if (IS_SET (ch->loc_hp[6], BLEEDING_THROAT))
	 return;
      act ("The wound in $n's throat closes up.", ch, NULL, NULL, TO_ROOM);
      act ("The wound in your throat closes up.", ch, NULL, NULL, TO_CHAR);
      REMOVE_BIT (ch->loc_hp[LOC_BODY], CUT_THROAT);
   }
   return;
}

void vamp_rage (CHAR_DATA * ch)
{
   if (IS_NPC (ch))
      return;

   send_to_char ("You scream with rage as the beast within consumes you!\n\r",
		 ch);
   act ("$n screams with rage as $s inner beast consumes $m!.", ch, NULL,
	NULL, TO_ROOM);
   do_beastlike (ch, "");
   do_rage (ch, "");
   return;
}

void do_humanity (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && ch->beast > 0
       && ch->beast < 100 && number_range (1, 500) <= ch->beast)
   {
      if (ch->beast == 1)
      {
	 send_to_char ("You have attained Golconda!\n\r", ch);
	 if (!IS_SET (ch->more, GOT_GOLCONDA))
	    ch->exp += 1000000;

	 SET_BIT (ch->more, GOT_GOLCONDA);
	 if (!IS_IMMUNE (ch, IMM_SUNLIGHT))
	    SET_BIT (ch->immune, IMM_SUNLIGHT);
      }
      else
	 send_to_char ("You feel slightly more in control of your beast.\n\r",
		       ch);
      ch->beast -= 1;
   }
   return;
}

//Temp Till i add Diablerie - Mac
void do_gainbeast (CHAR_DATA * ch, char *argument)
{
   int cost = 1000000;

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->beast > 0)
   {
      stc ("Your beast is already started to take control\n\r", ch);
      return;
   }

   if (ch->exp < cost)
   {
      stcprintf (ch, "You need %d exp to gain a beast point\n\r", cost);
      return;
   }
   ch->exp -= cost;
   ch->beast += 1;
   stc ("You feel your beast take more control over your actions.\n\r", ch);
   return;
}

void do_beastlike (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   int blood;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && ch->beast < 100
       && ch->beast > 0 && number_range (1, 500) <= ch->beast)
   {
      if (ch->beast < 99)
	 send_to_char
	    ("You feel your beast take more control over your actions.\n\r",
	     ch);
      else
	 send_to_char
	    ("Your beast has fully taken over control of your actions!\n\r",
	     ch);
      ch->beast += 1;
      blood = ch->pcdata->condition[COND_THIRST];
      ch->pcdata->condition[COND_THIRST] = 666;
      if ((IS_VAMPAFF (ch, VAM_PROTEAN)
	   || (IS_VAMPAFF (ch, VAM_OBTENEBRATION)))
	  && !IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
	 do_nightsight (ch, "");
      if (!IS_VAMPAFF (ch, VAM_FANGS))
	 do_fangs (ch, "");
      if (IS_VAMPAFF (ch, VAM_PROTEAN) && !IS_VAMPAFF (ch, VAM_CLAWS))
	 do_claws (ch, "");
      ch->pcdata->condition[COND_THIRST] = blood;
   }
   return;
}

void do_feed (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   char bufch[MAX_INPUT_LENGTH];
   char bufvi[MAX_INPUT_LENGTH];
   int blood;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }
   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }
   if (!IS_CLASS (victim, CLASS_VAMPIRE))
   {
      send_to_char ("Blood does them no good at all.\n\r", ch);
      return;
   }
   if (!IS_IMMUNE (victim, IMM_VAMPIRE))
   {
      send_to_char ("They refuse to drink your blood.\n\r", ch);
      return;
   }
   if (ch->pcdata->condition[COND_THIRST] < 20)
   {
      send_to_char ("You don't have enough blood.\n\r", ch);
      return;
   }

   blood = number_range (5, 10);
   ch->pcdata->condition[COND_THIRST] -= (blood * 2);
   victim->pcdata->condition[COND_THIRST] += blood;

   if (IS_AFFECTED (ch, AFF_POLYMORPH))
      sprintf (bufch, ch->morph);
   else
      sprintf (bufch, ch->name);
   if (IS_AFFECTED (victim, AFF_POLYMORPH))
      sprintf (bufvi, victim->morph);
   else
      sprintf (bufvi, victim->name);
   sprintf (buf, "You cut open your wrist and feed some blood to %s.", bufvi);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf, "%s cuts open $s wrist and feeds some blood to %s.", bufch,
	    bufvi);
   act (buf, ch, NULL, victim, TO_NOTVICT);
   if (victim->position < POS_RESTING)
      send_to_char ("You feel some blood poured down your throat.\n\r",
		    victim);
   else
   {
      sprintf (buf, "%s cuts open $s wrist and feeds you some blood.", bufch);
      act (buf, ch, NULL, victim, TO_VICT);
   }
   return;
}

void do_upkeep (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   char buf2[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      hlupkeep (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_MAGE))
   {
      do_mageupkeep (ch, "");
      return;
   }
   if (IS_CLASS (ch, CLASS_WEREWOLF))
   {
      wwupkeep (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_DROW))
   {
      drowupkeep (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_MONK))
   {
      monkupkeep (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("[< Fae upkeep >]\n\r\n\r", ch);
   if (IS_SET (ch->newbits, NEW_MONKFLAME))
      send_to_char ("Your hands are engulfed by flames!\n\r", ch);
   if (IS_SET (ch->flag2, AFF2_SPIRITGUARD))
      send_to_char ("Your spirit guardian has been awakened.\n\r", ch);
   if (IS_SET (ch->garou1, WW_GRANITE))
      send_to_char ("You have a wall of power protecting you.\n\r", ch);
   if (IS_SET (ch->extra2, EXTRA2_FAESPEED))
      send_to_char ("You move faster than the eye can follow.\n\r", ch);
   if (IS_IMMUNE (ch, IMM_SHIELDED))
      send_to_char ("You aura is shielded.\n\r", ch);
   if (IS_SET (ch->extra2, EXTRA2_WYRM))
      send_to_char ("You are in the elder form.\n\r", ch);
   if (IS_SET (ch->special, SPC_SEEMING))
      send_to_char ("You are in your seeming form.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION))
   {
      send_to_char
	 ("--------------------------------------------------------------------------------\n\r",
	  ch);
      send_to_char ("                              -= Demonic powers =-\n\r",
		    ch);
      send_to_char
	 ("--------------------------------------------------------------------------------\n\r",
	  ch);

      if (ch->pcdata->powers[DPOWER_FLAGS] < 1)
	 send_to_char ("You have no demonic powers.\n\r", ch);
      if (IS_DEMPOWER (ch, DEM_FANGS))
      {
	 if (IS_VAMPAFF (ch, VAM_FANGS))
	    send_to_char
	       ("You have a pair of long pointed fangs extending from your gums.\n\r",
		ch);
	 else
	    send_to_char
	       ("You have a pair of long pointed fangs, but they are not currently extended.\n\r",
		ch);
      }
      if (IS_DEMPOWER (ch, DEM_CLAWS))
      {
	 if (IS_VAMPAFF (ch, VAM_CLAWS))
	    send_to_char
	       ("You have a pair of razor sharp claws extending from your fingers.\n\r",
		ch);
	 else
	    send_to_char
	       ("You have a pair of razor sharp claws, but they are not currently extended.\n\r",
		ch);
      }
      if (IS_DEMPOWER (ch, DEM_HORNS))
      {
	 if (IS_DEMAFF (ch, DEM_HORNS))
	    send_to_char
	       ("You have a pair of curved horns extending from your forehead.\n\r",
		ch);
	 else
	    send_to_char
	       ("You have a pair of curved horns, but they are not currently extended.\n\r",
		ch);
      }
      if (IS_DEMPOWER (ch, DEM_TAIL))
      {
	 if (IS_DEMAFF (ch, DEM_TAIL))
	    send_to_char
	       ("You have a long tail extended from you back side.\n\r", ch);
	 else
	    send_to_char ("You have a tail, but it is not being used.\n\r",
			  ch);
      }
      if (IS_DEMPOWER (ch, DEM_HOOVES))
      {
	 if (IS_DEMAFF (ch, DEM_HOOVES))
	    send_to_char ("You have hooves instead of feet.\n\r", ch);
	 else
	    send_to_char
	       ("You are able to transform your feet into hooves at will.\n\r",
		ch);
      }
      if (IS_DEMPOWER (ch, DEM_EYES))
      {
	 if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
	    send_to_char
	       ("Your eyes are glowing bright red, allowing you to see in the dark.\n\r",
		ch);
	 else
	    send_to_char
	       ("You are able to see in the dark, although that power is not currently activated.\n\r",
		ch);
      }
      if (IS_DEMPOWER (ch, DEM_WINGS))
      {
	 if (!IS_DEMAFF (ch, DEM_WINGS))
	    send_to_char
	       ("You have the ability to extend wings from your back.\n\r",
		ch);
	 else if (IS_DEMAFF (ch, DEM_UNFOLDED))
	    send_to_char
	       ("You have a pair of large leathery wings unfolded behind your back.\n\r",
		ch);
	 else
	    send_to_char
	       ("You have a pair of large leathery wings folded behind your back.\n\r",
		ch);
      }
      if (IS_DEMPOWER (ch, DEM_MIGHT))
	 send_to_char ("Your muscles ripple with supernatural strength.\n\r",
		       ch);
      if (IS_DEMPOWER (ch, DEM_TOUGH))
	 send_to_char
	    ("Your skin reflects blows with supernatural toughness.\n\r", ch);
      if (IS_DEMPOWER (ch, DEM_SPEED))
	 send_to_char ("You move with supernatural speed and grace.\n\r", ch);
      if (IS_DEMPOWER (ch, DEM_TRAVEL))
	 send_to_char ("You are able to travel to other demons at will.\n\r",
		       ch);
      if (IS_DEMPOWER (ch, DEM_SCRY))
	 send_to_char
	    ("You are able to scry over great distances at will.\n\r", ch);
      if (IS_DEMPOWER (ch, DEM_SHADOWSIGHT))
      {
	 if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
	    send_to_char ("You are able see things in the shadowplane.\n\r",
			  ch);
	 else
	    send_to_char
	       ("You are able to view the shadowplane, although you are not currently doing so.\n\r",
		ch);
      }
   }

   else if (IS_CLASS (ch, CLASS_VAMPIRE))
   {

      send_to_char
	 ("--------------------------------------------------------------------------------\n\r",
	  ch);
      send_to_char ("                              -= Vampire upkeep =-\n\r",
		    ch);

      send_to_char
	 ("--------------------------------------------------------------------------------\n\r",
	  ch);
      send_to_char ("Staying alive...upkeep 1.\n\r", ch);

      if (IS_SET (ch->newbits, NEW_NOPAIN))
      {
	 send_to_char ("You are oblivious to pain.\n\r", ch);
      }

      if (IS_VAMPAFF (ch, VAM_DISGUISED))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You are disguised as %s...no upkeep.\n\r",
		     ch->morph);
	 else if (ch->beast == 100)
	    sprintf (buf, "You are disguised as %s...upkeep 10-20.\n\r",
		     ch->morph);
	 else
	    sprintf (buf, "You are disguised as %s...upkeep 5-10.\n\r",
		     ch->morph);
	 send_to_char (buf, ch);
      }
      if (IS_IMMUNE (ch, IMM_SHIELDED))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You are shielded...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You are shielded...upkeep 2-6.\n\r");
	 else
	    sprintf (buf, "You are shielded...upkeep 1-3.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You are in the shadowplane...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You are in the shadowplane...no upkeep.\n\r");
	 else
	    sprintf (buf, "You are in the shadowplane...no upkeep.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_VAMPAFF (ch, VAM_FANGS))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You have your fangs out...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You have your fangs out...upkeep 2.\n\r");
	 else
	    sprintf (buf, "You have your fangs out...upkeep 1.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_VAMPAFF (ch, VAM_CLAWS))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You have your claws out...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You have your claws out...upkeep 2-6.\n\r");
	 else
	    sprintf (buf, "You have your claws out...upkeep 1-3.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You have nightsight...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You have nightsight...upkeep 2.\n\r");
	 else
	    sprintf (buf, "You have nightsight...upkeep 1.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_AFFECTED (ch, AFF_SHADOWSIGHT))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You have shadowsight...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You are shadowsight...upkeep 2-6.\n\r");
	 else
	    sprintf (buf, "You are shadowsight...upkeep 1-3.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_SET (ch->act, PLR_HOLYLIGHT))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You have truesight...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You have truesight...upkeep 2-10.\n\r");
	 else
	    sprintf (buf, "You have truesight...upkeep 1-5.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_VAMPAFF (ch, VAM_CHANGED))
      {
	 if (IS_POLYAFF (ch, POLY_BAT))
	    sprintf (buf2, "bat");
	 else if (IS_POLYAFF (ch, POLY_WOLF))
	    sprintf (buf2, "wolf");
	 else
	    sprintf (buf2, "mist");
	 if (ch->beast == 0)
	    sprintf (buf, "You have changed into %s form...no upkeep.\n\r",
		     buf2);
	 else if (ch->beast == 100)
	    sprintf (buf, "You have changed into %s form...upkeep 10-20.\n\r",
		     buf2);
	 else
	    sprintf (buf, "You have changed into %s form...upkeep 5-10.\n\r",
		     buf2);
	 send_to_char (buf, ch);
      }
      if (IS_POLYAFF (ch, POLY_SERPENT))
      {
	 if (ch->beast == 0)
	    sprintf (buf, "You are in serpent form...no upkeep.\n\r");
	 else if (ch->beast == 100)
	    sprintf (buf, "You are in serpent form...upkeep 6-8.\n\r");
	 else
	    sprintf (buf, "You are in serpent form...upkeep 1-3.\n\r");
	 send_to_char (buf, ch);
      }
      if (IS_POLYAFF (ch, POLY_ZULO))
	 send_to_char ("You are in Zuloform.\n\r", ch);
      if (IS_EXTRA (ch, EXTRA_DRAGON))
	 send_to_char ("You are a huge dragon.\n\r", ch);
      if (IS_EXTRA (ch, EXTRA_AWE))
	 send_to_char ("You are awe inspiring.\n\r", ch);
      if (IS_AFFECTED (ch, AFF_STEELSHIELD))
	 send_to_char ("Your majesty is up.\n\r", ch);
      if (IS_SET (ch->newbits, NEW_MONKFLAME))
	 send_to_char ("Your hands and weapon are engulfed in flames.\n\r",
		       ch);
      if (IS_EXTRA (ch, EXTRA_PLASMA))
	 send_to_char ("You are in plasmaform.\n\r", ch);
      if (get_disc(ch, VAM_PROT) > 8)
	 send_to_char ("Your flesh is as hard as marble.\n\r", ch);
      if (ch->pcdata->stats[UNI_RAGE] > 0)
	 send_to_char ("You are in frenzy.\n\r", ch);
      if (IS_SET (ch->act, PLR_WIZINVIS))
	 send_to_char ("You are blended with the Shade.\n\r", ch);
      if (IS_EXTRA (ch, EXTRA_POTENCY))
	 send_to_char ("Your blood is more potent then usual.\n\r", ch);
      if (IS_VAMPAFF (ch, VAM_HEAD))
	 send_to_char ("You have the head of a lion.\n\r", ch);
      if (IS_VAMPAFF (ch, VAM_TAIL))
	 send_to_char ("A long tail protrudes from your backside.\n\r", ch);
      if (IS_VAMPAFF (ch, VAM_EXOSKELETON))
	 send_to_char ("Your body is covered by a bony exoskeleton.\n\r", ch);
      if (IS_VAMPAFF (ch, VAM_HORNS))
	 send_to_char ("Large horns protrude from your head.\n\r", ch);
      if (IS_VAMPAFF (ch, VAM_WINGS))
	 send_to_char ("Large wings protrude from your back.\n\r", ch);
   }
   else
   {
      do_rand_typo (ch);
      return;
   }
   send_to_char
      ("--------------------------------------------------------------------------------\n\r",
       ch);
   return;
}

void do_vclan (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *gch;
   char clan[MSL];

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      do_rand_typo (ch);
      return;
   }


   sprintf (buf, "The Kindred:\n\r");
   send_to_char (buf, ch);
   send_to_char
      ("[      Name      ] [ Clan            ] [ Hits   % ] [ Mana   % ] [ Move   % ] [   Exp    ] [Blood]\n\r",
       ch);
   for (gch = char_list; gch != NULL; gch = gch->next)
   {
      if (IS_NPC (gch))
	 continue;
      if (!IS_CLASS (gch, CLASS_VAMPIRE))
	 continue;
      if (IS_IMMORTAL (gch) && !can_see (ch, gch))
	 continue;

      if (gch->clannum > 0)
          sprintf(clan, "%s", nclans_table[gch->clannum].name);

                else if (gch->pcdata->stats[UNI_GEN] == 1)
                        sprintf(clan,"All");
                else
                        sprintf(clan,"Caitiff");
      sprintf (buf,
               "[%-16s] [%-17s] [%-7d%3d] [%-7d%3d] [%-7d%3d] [%10lli] [ %3d ]\n\r",
	       capitalize (gch->name),clan,
	       gch->hit, (gch->hit * 100 / gch->max_hit),
	       gch->mana, (gch->mana * 100 / gch->max_mana),
	       gch->move, (gch->move * 100 / gch->max_move),
	       gch->exp, gch->pcdata->condition[COND_THIRST]);
      send_to_char (buf, ch);
   }
   return;
}

void do_tribe (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *gch;
   char clan[MSL];
   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }
   if (!str_cmp(ch->clan, "Black Spiral Dancers"))
    {
        send_to_char("You need no tribe, foul spawn of the wyrm.\n\r",ch);
        return;
    }
   stc ("The Garou:\n\r", ch);
   send_to_char
      ("[      Name      ] [ Tribe           ] [ Hits   % ] [ Mana   % ] [ Move   % ] [   Exp    ]\n\r",
       ch);
   for (gch = char_list; gch != NULL; gch = gch->next)
   {
      if (IS_NPC (gch))
	 continue;
      if (!IS_CLASS (gch, CLASS_WEREWOLF))
	 continue;
      if ( !str_cmp(gch->clan,"Black Spiral Dancers")) continue;
      if (IS_IMMORTAL (gch) && !can_see (ch, gch))
	 continue;

      if (gch->clannum > 0)
          sprintf(clan, "%s", nclans_table[gch->clannum].name);
                else if (gch->pcdata->stats[UNI_GEN] == 1)
                        sprintf(clan,"All");
                else
                        sprintf(clan,"None");
      sprintf (buf,
               "[%-16s] [%-17s] [%-7d%3d] [%-7d%3d] [%-7d%3d] [%10lli]\n\r",
	       capitalize (gch->name),clan,
	       gch->hit, (gch->hit * 100 / gch->max_hit),
	       gch->mana, (gch->mana * 100 / gch->max_mana),
	       gch->move, (gch->move * 100 / gch->max_move), gch->exp);
      send_to_char (buf, ch);
   }
   return;
}


void do_werewolf (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_INPUT_LENGTH];
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *vch;
   CHAR_DATA *vch_next;
   int number_hit = 0;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_WEREWOLF))
      return;
   if (IS_SET (ch->special, SPC_WOLFMAN))
      return;
   SET_BIT (ch->special, SPC_WOLFMAN);

   ch->beast_timer = 15;

   send_to_char ("You throw back your head and howl with rage!\n\r", ch);
   act ("$n throws back $s head and howls with rage!.", ch, NULL, NULL,
	TO_ROOM);
   send_to_char ("Coarse dark hair sprouts from your body.\n\r", ch);
   act ("Coarse dark hair sprouts from $n's body.", ch, NULL, NULL, TO_ROOM);
   if (!IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
   {
      send_to_char ("Your eyes start glowing red.\n\r", ch);
      act ("$n's eyes start glowing red.", ch, NULL, NULL, TO_ROOM);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
   }
   if (!IS_VAMPAFF (ch, VAM_FANGS))
   {
      send_to_char ("A pair of long fangs extend from your mouth.\n\r", ch);
      act ("A pair of long fangs extend from $n's mouth.", ch, NULL, NULL,
	   TO_ROOM);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
   }
   if (!IS_VAMPAFF (ch, VAM_CLAWS))
   {
      send_to_char ("Razor sharp talons extend from your fingers.\n\r", ch);
      act ("Razor sharp talons extend from $n's fingers.", ch, NULL, NULL,
	   TO_ROOM);
      SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
   }
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
   sprintf (buf, "%s the huge werewolf", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   ch->pcdata->stats[UNI_RAGE] += 75;
   if (ch->pcdata->powers[WPOWER_WOLF] > 3)
      ch->pcdata->stats[UNI_RAGE] += 100;
   if (ch->pcdata->stats[UNI_RAGE] > 300)
      ch->pcdata->stats[UNI_RAGE] = 300;

   for (vch = char_list; vch != NULL; vch = vch_next)
   {
      vch_next = vch->next;
      if (vch->in_room == NULL)
	 continue;

      if (ch == vch)
      {
	 act ("You throw back your head and howl with rage!", ch, NULL, NULL,
	      TO_CHAR);
	 continue;
      }
      if (!IS_NPC (vch) && vch->pcdata->chobj != NULL)
	 continue;
      if (!IS_NPC (vch))
      {
	 if (vch->in_room == ch->in_room)
	    act ("$n throws back $s head and howls with rage!", ch, NULL, vch,
		 TO_VICT);
	 else if (vch->in_room->area == ch->in_room->area)
	    send_to_char ("You hear a fearsome howl close by!\n\r", vch);
	 else if (!CAN_PK (vch))
	    continue;
      }
      if (vch->in_room == ch->in_room && can_see (ch, vch))
      {
	 number_hit++;
	 if (number_hit > 15) continue;
	 multi_hit (ch, vch, TYPE_UNDEFINED);
	 if (vch == NULL || vch->position <= POS_STUNNED)
	    continue;
	 multi_hit (ch, vch, TYPE_UNDEFINED);
	 if (vch == NULL || vch->position <= POS_STUNNED)
	    continue;
	 multi_hit (ch, vch, TYPE_UNDEFINED);
      }

   }
   return;
}

void do_unwerewolf (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_WEREWOLF))
      return;
   if (!IS_SET (ch->special, SPC_WOLFMAN))
      return;
   REMOVE_BIT (ch->special, SPC_WOLFMAN);
   REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
   REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_DISGUISED);
   free_string (ch->morph);
   ch->morph = str_dup ("");
   if (IS_VAMPAFF (ch, VAM_CLAWS))
   {
      send_to_char ("Your talons slide back into your fingers.\n\r", ch);
      act ("$n's talons slide back into $s fingers.", ch, NULL, NULL,
	   TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
   }
   if (IS_VAMPAFF (ch, VAM_FANGS))
   {
      send_to_char ("Your fangs slide back into your mouth.\n\r", ch);
      act ("$n's fangs slide back into $s mouth.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_FANGS);
   }
   if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
   {
      send_to_char ("The red glow in your eyes fades.\n\r", ch);
      act ("The red glow in $n's eyes fades.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
   }
   send_to_char ("Your coarse hair shrinks back into your body.\n\r", ch);
   act ("$n's coarse hair shrinks back into $s body.", ch, NULL, NULL,
	TO_ROOM);
   ch->pcdata->stats[UNI_RAGE] -= 75;
   while (ch->pcdata->stats[UNI_RAGE] > 100) ch->pcdata->stats[UNI_RAGE] -= 75;
   if (ch->pcdata->stats[UNI_RAGE] < 0)
      ch->pcdata->stats[UNI_RAGE] = 0;
   return;
}

void do_favour (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];

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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_WEREWOLF))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (arg1[0] == '\0' || arg2[0] == '\0')
   {
      send_to_char ("Syntax is: favour <target> <favour>\n\r", ch);
      if (ch->pcdata->stats[UNI_GEN] == 2)
      {
	 if (IS_CLASS (ch, CLASS_WEREWOLF))
	    send_to_char
	       ("Favours you can grant: Induct Outcast Sire Shaman.\n\r", ch);
	 else
	    send_to_char
	       ("Favours you can grant: Induct Outcast Sire Prince.\n\r", ch);
      }
      else if (IS_SET (ch->special, SPC_PRINCE))
	 send_to_char ("Favours you can grant: Induct Outcast Sire.\n\r", ch);
      else
	 send_to_char ("None.\n\r", ch);
      return;
   }

   if ((victim = get_char_world (ch, arg1)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("Not on yourself!\n\r", ch);
      return;
   }

   if (ch->class != victim->class)
   {
      send_to_char ("You cannot do that, fool!\n\r", ch);
      return;
   }
   if (str_cmp (victim->clan, ch->clan) && str_cmp (arg2, "induct"))
   {
      send_to_char
	 ("You can only grant your favour to someone in your clan.\n\r", ch);
      return;
   }
   if (!str_cmp (arg2, "sire"))
   {
      if (ch->pcdata->stats[UNI_GEN] != 2
	  && !IS_SET (ch->special, SPC_PRINCE))
      {
	 send_to_char ("You are unable to grant this sort of favour.\n\r",
		       ch);
	 return;
      }
      if (IS_SET (victim->special, SPC_SIRE))
      {
	 if (IS_CLASS (ch, CLASS_WEREWOLF))
	 {
	    act ("You remove $N's permission to claw a pup!", ch, NULL,
		 victim, TO_CHAR);
	    act ("$n has removed $N's permission to claw a pup!", ch, NULL,
		 victim, TO_NOTVICT);
	    act ("$n has remove your permission to claw a pup!", ch, NULL,
		 victim, TO_VICT);
	 }
	 else
	 {
	    act ("You remove $N's permission to sire a childe!", ch, NULL,
		 victim, TO_CHAR);
	    act ("$n has removed $N's permission to sire a childe!", ch, NULL,
		 victim, TO_NOTVICT);
	    act ("$n has remove your permission to sire a childe!", ch, NULL,
		 victim, TO_VICT);
	 }
	 REMOVE_BIT (victim->special, SPC_SIRE);
	 return;
      }
      if (IS_CLASS (ch, CLASS_WEREWOLF))
      {
	 act ("You grant $N permission to claw a pup!", ch, NULL, victim,
	      TO_CHAR);
	 act ("$n has granted $N permission to claw a pup!", ch, NULL, victim,
	      TO_NOTVICT);
	 act ("$n has granted you permission to claw a pup!", ch, NULL,
	      victim, TO_VICT);
      }
      else
      {
	 act ("You grant $N permission to sire a childe!", ch, NULL, victim,
	      TO_CHAR);
	 act ("$n has granted $N permission to sire a childe!", ch, NULL,
	      victim, TO_NOTVICT);
	 act ("$n has granted you permission to sire a childe!", ch, NULL,
	      victim, TO_VICT);
      }
      SET_BIT (victim->special, SPC_SIRE);
      return;
   }
   else if (!str_cmp (arg2, "prince") && IS_CLASS (ch, CLASS_VAMPIRE))
   {
      if (ch->pcdata->stats[UNI_GEN] != 2)
      {
	 send_to_char ("You are unable to grant this sort of favour.\n\r",
		       ch);
	 return;
      }
      if (IS_SET (victim->special, SPC_PRINCE))
      {
	 act ("You remove $N's Prince status!", ch, NULL, victim, TO_CHAR);
	 act ("$n has removed $N's Prince status!", ch, NULL, victim,
	      TO_NOTVICT);
	 act ("$n has removed your Prince status!", ch, NULL, victim,
	      TO_VICT);
	 REMOVE_BIT (victim->special, SPC_PRINCE);
	 return;
      }
      act ("You grant $N Prince status!", ch, NULL, victim, TO_CHAR);
      act ("$n has granted $N Prince status!", ch, NULL, victim, TO_NOTVICT);
      act ("$n has granted you Prince status!", ch, NULL, victim, TO_VICT);
      SET_BIT (victim->special, SPC_PRINCE);
      return;
   }
   else if (!str_cmp (arg2, "shaman") && IS_CLASS (ch, CLASS_WEREWOLF))
   {
      if (ch->pcdata->stats[UNI_GEN] != 2)
      {
	 send_to_char ("You are unable to grant this sort of favour.\n\r",
		       ch);
	 return;
      }
      if (IS_SET (victim->special, SPC_PRINCE))
      {
	 act ("You remove $N's Shaman status!", ch, NULL, victim, TO_CHAR);
	 act ("$n has removed $N's Shaman status!", ch, NULL, victim,
	      TO_NOTVICT);
	 act ("$n has removed your Shaman status!", ch, NULL, victim,
	      TO_VICT);
	 REMOVE_BIT (victim->special, SPC_PRINCE);
	 return;
      }
      act ("You grant $N Shaman status!", ch, NULL, victim, TO_CHAR);
      act ("$n has granted $N Shaman status!", ch, NULL, victim, TO_NOTVICT);
      act ("$n has granted you Shaman status!", ch, NULL, victim, TO_VICT);
      SET_BIT (victim->special, SPC_PRINCE);
      return;
   }
   else if (!str_cmp (arg2, "induct") && victim->pcdata->stats[UNI_GEN] > 2 &&
	    ch->pcdata->stats[UNI_GEN] == 2 && strlen (victim->clan) < 2)
   {
      if (IS_SET (victim->special, SPC_ANARCH))
      {
	 send_to_char ("You cannot induct an Anarch!\n\r", ch);
	 return;
      }
      if (!IS_IMMUNE (victim, IMM_VAMPIRE))
      {
	 send_to_char ("You cannot induct an unwilling person.\n\r", ch);
	 return;
      }
      if (ch->pcdata->stats[UNI_GEN] >= victim->pcdata->stats[UNI_GEN])
      {
	 if (IS_CLASS (ch, CLASS_WEREWOLF))
	    send_to_char
	       ("You can only induct those of weaker heritage than yourself.\n\r",
		ch);
	 else
	    send_to_char
	       ("You can only induct those of higher generation than yourself.\n\r",
		ch);
	 return;
      }
      if (IS_CLASS (ch, CLASS_WEREWOLF))
      {
	 act ("You induct $N into your tribe!", ch, NULL, victim, TO_CHAR);
	 act ("$n inducts $N into $s tribe!", ch, NULL, victim, TO_NOTVICT);
	 act ("$n inducts you into $s tribe!", ch, NULL, victim, TO_VICT);
      }
      else
      {
	 act ("You induct $N into your clan!", ch, NULL, victim, TO_CHAR);
	 act ("$n inducts $N into $s clan!", ch, NULL, victim, TO_NOTVICT);
	 act ("$n inducts you into $s clan!", ch, NULL, victim, TO_VICT);
      }
      free_string (victim->clan);
      victim->clan = str_dup (ch->clan);
      return;
   }
   else if (!str_cmp (arg2, "outcast"))
   {
      if (ch->pcdata->stats[UNI_GEN] != 2
	  && !IS_SET (ch->special, SPC_PRINCE))
      {
	 send_to_char ("You are unable to grant this sort of favour.\n\r",
		       ch);
	 return;
      }
      if (IS_SET (victim->special, SPC_PRINCE)
	  && ch->pcdata->stats[UNI_GEN] != 2)
      {
	 if (IS_CLASS (ch, CLASS_WEREWOLF))
	    send_to_char ("You cannot outcast another Shaman.\n\r", ch);
	 else
	    send_to_char ("You cannot outcast another Prince.\n\r", ch);
	 return;
      }
      if (ch->pcdata->stats[UNI_GEN] >= victim->pcdata->stats[UNI_GEN])
      {
	 if (IS_CLASS (ch, CLASS_WEREWOLF))
	    send_to_char
	       ("You can only outcast those of weaker heritage than yourself.\n\r",
		ch);
	 else
	    send_to_char
	       ("You can only outcast those of higher generation than yourself.\n\r",
		ch);
	 return;
      }
      if (IS_CLASS (ch, CLASS_WEREWOLF))
      {
	 act ("You outcast $N from your tribe!", ch, NULL, victim, TO_CHAR);
	 act ("$n outcasts $N from $s tribe!", ch, NULL, victim, TO_NOTVICT);
	 act ("$n outcasts you from $s tribe!", ch, NULL, victim, TO_VICT);
      }
      else
      {
	 act ("You outcast $N from your clan!", ch, NULL, victim, TO_CHAR);
	 act ("$n outcasts $N from $s clan!", ch, NULL, victim, TO_NOTVICT);
	 act ("$n outcasts you from $s clan!", ch, NULL, victim, TO_VICT);
      }
      free_string (victim->clan);
      victim->clan = str_dup ("");
      REMOVE_BIT (victim->special, SPC_SIRE);
      REMOVE_BIT (victim->special, SPC_PRINCE);
      return;
   }
   else
      send_to_char ("You are unable to grant that sort of favour.\n\r", ch);
   return;
}
void do_ghoul (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   CHAR_DATA *familiar;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {

      do_rand_typo (ch);
      return;
   }
   if (!IS_VAMPAFF (ch, VAM_DOMINATE))
   {
      send_to_char ("You are not trained in the Dominate discipline.\n\r",
		    ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
   {
      sprintf (buf, "You break your hold over %s.\n\r",
	       familiar->short_descr);
      send_to_char (buf, ch);
      familiar->wizard = NULL;
      ch->pcdata->familiar = NULL;
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("What do you wish to make your ghoul?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("Become your own ghoul?\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      send_to_char ("Not on players.\n\r", ch);
      return;
   }

   if (victim->wizard != NULL)
   {
      send_to_char ("You are unable to make them a ghoul.\n\r", ch);
      return;
   }

   if (victim->level > (ch->spl[RED_MAGIC] * 0.25))
   {
      send_to_char ("They are too powerful.\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 50)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   ch->pcdata->condition[COND_THIRST] -= 50;
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You cut open your wrist and feed $N some blood.", ch, NULL, victim,
	TO_CHAR);
   act ("$n cuts open $s wrist and feeds you some blood.", ch, NULL, victim,
	TO_VICT);
   act ("$n cuts open $s wrist and feeds $N some blood.", ch, NULL, victim,
	TO_NOTVICT);
   return;
}

void do_familiar (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   CHAR_DATA *familiar;
   char arg[MAX_INPUT_LENGTH];

   one_argument (argument, arg);

   return;

   if (arg[0] == '\0')
   {
      send_to_char ("What do you wish to make your familiar?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("Become your own familiar?\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      send_to_char ("Not on players.\n\r", ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
      familiar->wizard = NULL;
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   send_to_char ("Ok.\n\r", ch);

   return;
}

void do_fcommand (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && ch->level < LEVEL_APPRENTICE)
   {
      if (!IS_CLASS (ch, CLASS_DEMON) && !IS_CLASS (ch, CLASS_FAE)
	  && !IS_CLASS (ch, CLASS_WRAITH))
      {
	 send_to_char ("Huh?\n\r", ch);
	 return;
      }
   }

   if ((victim = ch->pcdata->familiar) == NULL)
   {
      if (IS_CLASS (ch, CLASS_VAMPIRE))
	 send_to_char ("Huh?\n\r", ch);
      else if (ch->level >= LEVEL_APPRENTICE)
	 send_to_char ("But you don't have a familiar!\n\r", ch);
      else
	 send_to_char ("But you don't have an eye spy!\n\r", ch);
      return;
   }

   if (argument[0] == '\0')
   {
      if (ch->level >= LEVEL_APPRENTICE)
	 send_to_char ("What do you wish to make your familiar do?\n\r", ch);

      else
	 send_to_char ("What do you wish to make your eye spy do?\n\r", ch);
      return;
   }
   if (is_in (argument, "|kill*kick*"))
      return;

   interpret (victim, argument);

   if (is_in (argument, "|kick*"))
      WAIT_STATE (ch, 8);
   return;
}
void do_vanish (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_VAMPIRE)
       && !IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      do_rand_typo (ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      if (!IS_DEMPOWER (ch, HPOWER_VANISH))
      {
	 stc ("You have not gained the power of vanish.\n\r", ch);
	 return;
      }
   }
   if (IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[RAGABASH] < 1)
   {
      send_to_char ("You must obtain level one Ragabash to use Vanish.\n\r",
		    ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBFU) < 1)
   {
      send_to_char ("you need level 1 in obfuscate first.\n\r", ch);
      return;
   }

   if (IS_SET (ch->act, PLR_WIZINVIS))
   {
      REMOVE_BIT (ch->act, PLR_WIZINVIS);
      send_to_char ("You slowly fade into existance.\n\r", ch);
      act ("$n slowly fades into existance.", ch, NULL, NULL, TO_ROOM);
   }
   else
   {
      send_to_char ("You slowly fade out of existance.\n\r", ch);
      act ("$n slowly fades out of existance.", ch, NULL, NULL, TO_ROOM);
      SET_BIT (ch->act, PLR_WIZINVIS);
   }
   return;
}

void do_flex (CHAR_DATA * ch, char *argument)
{
   act ("You flex your bulging muscles.", ch, NULL, NULL, TO_CHAR);
   act ("$n flexes $s bulging muscles.", ch, NULL, NULL, TO_ROOM);
   if (IS_NPC (ch))
      return;

   if (IS_EXTRA (ch, TIED_UP) && (dice(1,100) < 95 ) )
   {
      act ("The ropes restraining you snap.", ch, NULL, NULL, TO_CHAR);
      act ("The ropes restraining $n snap.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->extra, TIED_UP);
   }
    if ( (dice(1,100) < 85 ) )
   {
   if (is_affected (ch, gsn_web) )
   {
      act ("The webbing entrapping $n breaks away.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("The webbing entrapping you breaks away.\n\r", ch);
      affect_strip (ch, gsn_web);
   }
   if (IS_AFFECTED (ch, AFF_WEBBED))
   {
      act ("The webbing entrapping $n breaks away.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("The webbing entrapping you breaks away.\n\r", ch);
      REMOVE_BIT (ch->affected_by, AFF_WEBBED);
   }
   }
    if ( (dice(1,100) < 75 ) )
    {
   if (IS_SET (ch->mflags, MAGE_EMBRACED2))
   {
      act ("The earth surrounding $n starts to crack.", ch, NULL, NULL,
	   TO_ROOM);
      stc ("The earth surrounding you starts to crack.\n\r", ch);
      REMOVE_BIT (ch->mflags, MAGE_EMBRACED2);
      SET_BIT (ch->mflags, MAGE_EMBRACED1);
   }
   else if (IS_SET (ch->mflags, MAGE_EMBRACED1))
   {
      act ("The earth surrounding $n crumbles to dust.", ch, NULL, NULL,
	   TO_ROOM);
      stc ("The earth surrounding you crumbles to dust.\n\r", ch);
      REMOVE_BIT (ch->mflags, MAGE_EMBRACED1);
   }
   }
    if ( (dice(1,100) < 85 ) )
    {
   if (is_affected (ch, gsn_entrails))
   {
      act ("The entrails entrapping $n fall to the ground.", ch, NULL, NULL,
	   TO_ROOM);
      send_to_char ("The entrails entrapping you fall to the ground.\n\r",
		    ch);
      affect_strip (ch, gsn_entrails);
   }
   if (IS_SET (ch->affected_by, AFF_ENTRAILS))
   {
      act ("The entrails entrapping $n fall to the ground.", ch, NULL, NULL,
	   TO_ROOM);
      send_to_char ("The entrails entrapping you fall to the ground.\n\r",
		    ch);
      REMOVE_BIT (ch->affected_by, AFF_ENTRAILS);
   }
   }
    if ( (dice(1,100) < 85 ) )
    {
   if ( IS_SET( ch->flag2, AFF2_TENDRILS )  )
   {
	act( "You shatter the bonds of darkness restraining you.\n\r", ch, NULL, NULL, TO_CHAR );
	act( "$n shatters the bonds of darkness restraining $m.\n\r", ch, NULL, NULL, TO_ROOM );
	REMOVE_BIT ( ch->flag2, AFF2_TENDRILS );
   }
   }
   WAIT_STATE (ch, 12);
   return;
}

void do_rage (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!is_garou (ch))
      return;

   if (ch->beast_timer > 0)
   { 
      char buf[MSL];
      sprintf(buf,"You cannot beast for another %d ticks.\n\r",ch->beast_timer);
      stc(buf,ch);
      return;
   }
   if (!IS_SET (ch->special, SPC_WOLFMAN))
   {
      send_to_char ("You start snarling angrilly.\n\r", ch);
      act ("$n starts snarling angrilly.", ch, NULL, NULL, TO_ROOM);
      ch->pcdata->stats[UNI_RAGE] += number_range (10, 20);
      if (ch->pcdata->stats[UNI_RAGE] >= 100)
	 do_werewolf (ch, "");
      WAIT_STATE (ch, 12);
      return;
   }
   send_to_char ("But you are already in a rage!\n\r", ch);
   return;
}

void do_calm (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (IS_CLASS (ch, CLASS_VAMPIRE) && ch->beast < 1)
   {
      if (ch->pcdata->stats[UNI_RAGE] < 1)
      {
	 send_to_char ("Your beast doesn't control your actions.\n\r", ch);
	 return;
      }
      send_to_char
	 ("You take a deep breath and force back your inner beast.\n\r", ch);
      act ("$n takes a deep breath and forces back $s inner beast.", ch, NULL,
	   NULL, TO_ROOM);
      ch->pcdata->stats[UNI_RAGE] = 0;
      if (IS_VAMPAFF (ch, VAM_NIGHTSIGHT))
	 do_nightsight (ch, "");
      if (IS_VAMPAFF (ch, VAM_FANGS))
	 do_fangs (ch, "");
      if (IS_VAMPAFF (ch, VAM_CLAWS))
	 do_claws (ch, "");
      WAIT_STATE (ch, 12);
      return;
   }

   if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->stats[UNI_RAGE] > 0)
   {
      send_to_char ("You control you actions and calm down.\n\r", ch);
      ch->pcdata->stats[UNI_RAGE] = 0;
      return;
   }
   else if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->stats[UNI_RAGE] == 0)
   {
      send_to_char ("You are not in the state of michi.\n\r", ch);
      return;
   }

   if (IS_SET (ch->special, SPC_WOLFMAN))
   {
      send_to_char ("You take a deep breath and calm yourself.\n\r", ch);
      act ("$n takes a deep breath and tries to calm $mself.", ch, NULL, NULL,
	   TO_ROOM);
      if (ch->gifts[CHILDREN] > 0)
	 ch->pcdata->stats[UNI_RAGE] = 0;
      else
	 ch->pcdata->stats[UNI_RAGE] -= number_range (10, 20);
      if (ch->pcdata->stats[UNI_RAGE] < 100)
	 do_unwerewolf (ch, "");
      WAIT_STATE (ch, 12);
      return;
   }
   send_to_char ("But you are not in crinos form!\n\r", ch);
   return;
}

void do_web (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   int sn;
   int level;
   int spelltype;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_DROW)
       && !IS_CLASS (ch, CLASS_NINJA))
   {
      do_rand_typo (ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_DROW)
       && !IS_SET (ch->pcdata->powers[1], DPOWER_WEB))
   {
      send_to_char ("You don't have that power yet.\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_NINJA) && (ch->pcdata->powers[NPOWER_CHIKYU] < 7))
   {
      stc ("You need to get the Chikyu principle to 7 first\n\r", ch);
      return;
   }
   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("You cannot web yourself.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (victim, AFF_ETHEREAL))
   {
      send_to_char ("You cannot web an ethereal person.\n\r", ch);
      return;
   }

   if ((sn = skill_lookup ("web")) < 0)
      return;
   spelltype = skill_table[sn].target;
   level = ch->spl[spelltype] * 0.25;
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   return;
}

void do_birth (CHAR_DATA * ch, char *argument)
{
   char buf2[MAX_STRING_LENGTH];

   if (IS_NPC (ch))
      return;

   if (!IS_EXTRA (ch, EXTRA_PREGNANT))
   {
      send_to_char ("But you are not even pregnant!\n\r", ch);
      return;
   }

   if (!IS_EXTRA (ch, EXTRA_LABOUR))
   {
      send_to_char ("You're not ready to give birth yet.\n\r", ch);
      return;
   }

   if (argument[0] == '\0')
   {
      if (ch->pcdata->genes[4] == SEX_MALE)
	 send_to_char ("What do you wish to name your little boy?\n\r", ch);
      else if (ch->pcdata->genes[4] == SEX_FEMALE)
	 send_to_char ("What do you wish to name your little girl?\n\r", ch);
      else
	 send_to_char ("What do you wish to name your baby it?\n\r", ch);
      return;
   }

   if (!check_parse_name (argument))
   {
      send_to_char ("Thats an illegal name.\n\r", ch);
      return;
   }

   if (char_exists (FALSE, argument))
   {
      send_to_char ("That player already exists.\n\r", ch);
      return;
   }

   strcpy (buf2, ch->pcdata->cparents);
   strcat (buf2, " ");
   strcat (buf2, argument);
   if (!birth_ok (ch, buf2))
   {
      send_to_char ("Bug - please inform KaVir.\n\r", ch);
      return;
   }
   argument[0] = UPPER (argument[0]);
   birth_write (ch, argument);
   ch->pcdata->genes[9] += 1;
   REMOVE_BIT (ch->extra, EXTRA_PREGNANT);
   REMOVE_BIT (ch->extra, EXTRA_LABOUR);
   save_char_obj (ch);
   return;
}

bool birth_ok (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   char mum[MAX_INPUT_LENGTH];
   char dad[MAX_INPUT_LENGTH];
   char child[MAX_INPUT_LENGTH];

   argument = one_argument (argument, mum);
   argument = one_argument (argument, dad);
   argument = one_argument (argument, child);

   if (dad[0] == '\0')
   {
      strcpy (dad, "An Unknown Party");
   }
   if (child[0] == '\0')
   {
      send_to_char ("You are unable to give birth - please inform KaVir.\n\r",
		    ch);
      return FALSE;
   }
   dad[0] = UPPER (dad[0]);
   if (!str_cmp (dad, "Kavir"))
      strcpy (dad, "KaVir");
   child[0] = UPPER (child[0]);
   if (ch->pcdata->genes[4] == SEX_MALE)
   {
      send_to_char ("You give birth to a little boy!\n\r", ch);
      sprintf (buf, "%s has given birth to %s's son, named %s!", ch->name,
	       dad, child);
      do_info (ch, buf);
      return TRUE;
   }
   else if (ch->pcdata->genes[4] == SEX_FEMALE)
   {
      send_to_char ("You give birth to a little girl!\n\r", ch);
      sprintf (buf, "%s has given birth to %s's daughter, named %s!",
	       ch->name, dad, child);
      do_info (ch, buf);
      return TRUE;
   }
   return FALSE;
}


bool char_exists (bool backup, char *argument)
{
   FILE *fp;
   char buf[MAX_STRING_LENGTH];
   bool found = FALSE;

   fclose (fpReserve);

   sprintf (buf, "%s%s", PLAYER_DIR, capitalize (argument));

   if ((fp = fopen (buf, "r")) != NULL)
   {
      found = TRUE;
      fclose (fp);
   }
   fpReserve = fopen (NULL_FILE, "r");
   return found;
}

void birth_write (CHAR_DATA * ch, char *argument)
{
   FILE *fp;
   char buf[MAX_STRING_LENGTH];
   char *strtime;

   strtime = new_date (current_time);
   //strtime[strlen (strtime) - 1] = '\0';

   sprintf (buf, "%s%s", PLAYER_DIR, capitalize (argument));
   if ((fp = fopen (buf, "w")) != NULL)
   {
      fprintf (fp, "#PLAYER\n");
      fprintf (fp, "Name         %s~\n", capitalize (argument));
      fprintf (fp, "ShortDescr   ~\n");
      fprintf (fp, "LongDescr    ~\n");
      fprintf (fp, "Description  ~\n");
      fprintf (fp, "Lord         ~\n");
      fprintf (fp, "Clan         ~\n");
      fprintf (fp, "Morph        ~\n");
      fprintf (fp, "Createtime   %s~\n", str_dup (strtime));
      fprintf (fp, "Lasttime     ~\n");
      fprintf (fp, "Lasthost     ~\n");
      fprintf (fp, "Poweraction  ~\n");
      fprintf (fp, "Powertype    ~\n");
      fprintf (fp, "Prompt       ~\n");
      fprintf (fp, "Cprompt      ~\n");
      fprintf (fp, "Sex          %d\n", ch->pcdata->genes[4]);
      fprintf (fp, "Race         0\n");
      fprintf (fp, "Immune       %d\n", ch->pcdata->genes[3]);
      fprintf (fp, "Polyaff      0\n");
      fprintf (fp, "Itemaffect   0\n");
      fprintf (fp, "Form         32767\n");
      fprintf (fp, "Beast        15\n");
      fprintf (fp, "Spectype     0\n");
      fprintf (fp, "Specpower    0\n");
      fprintf (fp, "Home         3001\n");
      fprintf (fp, "Level        2\n");
      fprintf (fp, "Trust        0\n");
      fprintf (fp, "Played       0\n");
      fprintf (fp, "Room         3054\n");
      fprintf (fp, "PkPdMkMd     0 0 5 0\n");
      fprintf (fp, "Weapons      0 0 0 0 0 0 0 0 0 0 0 0 0\n");
      fprintf (fp, "Spells       4 4 4 4 4\n");
      fprintf (fp, "Combat       0 0 0 0 0 0 0 0\n");
      fprintf (fp, "Stance       0 0 0 0 0 0 0 0 0 0 0 0\n");
      fprintf (fp, "Locationhp   0 0 0 0 0 0 0\n");
      fprintf (fp, "HpManaMove   %d %d %d %d %d %d\n",
	       ch->pcdata->genes[0], ch->pcdata->genes[0],
	       ch->pcdata->genes[1], ch->pcdata->genes[1],
	       ch->pcdata->genes[2], ch->pcdata->genes[2]);
      fprintf (fp, "Gold         0\n");
      fprintf (fp, "Exp          0\n");
      fprintf (fp, "Act          1600\n");
      fprintf (fp, "Extra        32768\n");
      fprintf (fp, "AffectedBy   0\n");
      fprintf (fp, "Position     7\n");
      fprintf (fp, "Practice     0\n");
      fprintf (fp, "SavingThrow  0\n");
      fprintf (fp, "Alignment    0\n");
      fprintf (fp, "Hitroll      0\n");
      fprintf (fp, "Damroll      0\n");
      fprintf (fp, "Armor        100\n");
      fprintf (fp, "Wimpy        0\n");
      fprintf (fp, "Deaf         0\n");
      fprintf (fp, "Password     %s~\n", ch->pcdata->pwd);
      fprintf (fp, "Bamfin       ~\n");
      fprintf (fp, "Bamfout      ~\n");
      fprintf (fp, "Title         the mortal~\n");
      fprintf (fp, "Conception   ~\n");
      fprintf (fp, "Parents      %s~\n", ch->pcdata->cparents);
      fprintf (fp, "Cparents     ~\n");
      fprintf (fp, "AttrPerm     %d %d %d %d %d\n",
	       ch->pcdata->perm_str,
	       ch->pcdata->perm_int,
	       ch->pcdata->perm_wis,
	       ch->pcdata->perm_dex, ch->pcdata->perm_con);
      fprintf (fp, "AttrMod      0 0 0 0 0\n");
      fprintf (fp, "Quest        0\n");
      fprintf (fp, "Rank         0\n");
      fprintf (fp, "Stage        0 0 0\n");
      fprintf (fp, "Disc         0 0 0 0 0 0 0 0 0 0 0\n");
      fprintf (fp, "Genes        0 0 0 0 0 0 0 0 0 0\n");
      fprintf (fp, "Power        0 0\n");
      fprintf (fp, "FakeCon      0 0 0 0 0 0 0 0\n");
      fprintf (fp, "Condition    0 48 48\n");
      fprintf (fp, "End\n\n");
      fprintf (fp, "#END\n");
      fclose (fp);
   }
   return;
}

void do_teach (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_MAGE))
   {
      do_rand_typo (ch);
      return;
   }


   if (ch->level == LEVEL_APPRENTICE)
   {
      send_to_char ("You don't know enough to teach another.\n\r", ch);
      return;
   }


   if (arg[0] == '\0')
   {
      send_to_char ("Teach whom?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim))
   {
      send_to_char ("Not on Immortals's.\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("You cannot teach yourself.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MAGE))
   {
      send_to_char ("They are already a mage.\n\r", ch);
      return;
   }

   if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL (victim))
   {
      send_to_char ("You can only teach avatars.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_VAMPIRE)
       || IS_SET (victim->pcdata->stats[UNI_AFF], VAM_MORTAL))
   {
      send_to_char ("You are unable to teach vampires!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_MONK))
   {
      send_to_char ("You are unable to teach monks.\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_NINJA))
   {
      send_to_char ("You are unable to teach ninjas\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DROW))
   {
      send_to_char ("Not on a drow!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_WEREWOLF))
   {
      send_to_char ("You are unable to teach werewolves!\n\r", ch);
      return;
   }

   if (IS_CLASS (victim, CLASS_DEMON)
       || IS_SET (victim->special, SPC_CHAMPION))
   {
      send_to_char ("You are unable to teach demons!\n\r", ch);
      return;
   }


   if (IS_CLASS (victim, CLASS_HIGHLANDER))
   {
      send_to_char ("You are unable to teach highlanders.\n\r", ch);
      return;
   }

   if (!IS_IMMUNE (victim, IMM_VAMPIRE))
   {
      send_to_char ("You cannot teach an unwilling person.\n\r", ch);
      return;
   }

   if (ch->exp < 1000000)
   {
      send_to_char
	 ("You cannot afford the 1000000 exp required to teach them.\n\r",
	  ch);
      return;
   }

   if (victim->exp < 1000000)
   {
      send_to_char
	 ("They cannot afford the 1000000 exp required to learn from you.\n\r",
	  ch);
      return;
   }

   if (victim->spl[0] < 150 || victim->spl[1] < 150 || victim->spl[2] < 150
       || victim->spl[3] < 150 || victim->spl[4] < 150)
   {
      send_to_char
	 ("They need atleast 150 in all spells to become a disciple.\n\r",
	  ch);
      send_to_char
	 ("You need atleast 150 in all spells to become a disciple.\n\r",
	  victim);
      return;
   }

   ch->exp -= 1000000;
   victim->exp -= 1000000;

   act ("You teach $N the basics of magic.", ch, NULL, victim, TO_CHAR);
   act ("$n teaches $N the basics of magic.", ch, NULL, victim, TO_NOTVICT);
   act ("$n teaches you the basics of magic.", ch, NULL, victim, TO_VICT);
   victim->level = LEVEL_APPRENTICE;
   victim->trust = LEVEL_APPRENTICE;
   send_to_char ("You are now an apprentice.\n\r", victim);
   free_string (victim->lord);
   victim->lord = str_dup (ch->name);
   victim->pcdata->powers[MPOWER_RUNE0] = ch->pcdata->powers[MPOWER_RUNE0];
   victim->class = CLASS_MAGE;
   save_char_obj (ch);
   save_char_obj (victim);
   return;
}


void do_gaia (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->pcdata->powers[WPOWER_GAIA] < 1)
   {
      send_to_char ("You have not learned the Gaia protection totem.\n\r",
		    ch);
      return;
   }

   if (ch->position == POS_FIGHTING)
   {
      send_to_char ("Not while fighting!\n\r", ch);
      return;
   }

/* Remove gaia in handler.c */

   if (IS_AFFECTED (ch, AFF_SAFE))
   {
      REMOVE_BIT (ch->affected_by, AFF_SAFE);
      send_to_char ("Gaia's protection disappears.\n\r", ch);
   }
   else
   {
      send_to_char ("You feel safe under Gaia's protection\n\r", ch);
      SET_BIT (ch->affected_by, AFF_SAFE);
   }
   return;
}

void do_klaive (CHAR_DATA * ch, char *argument)
{
   OBJ_INDEX_DATA *pObjIndex;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   int vnum = 0;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_rand_typo (ch);
      return;
   }

/* Practice is the amount of primal you have */
   if (ch->practice < 60)
   {
      send_to_char ("You need 60 primal to make a klaive.\n\r", ch);
      return;
   }
   else if (ch->pcdata->quest < 100)
   {
      send_to_char ("You need 100 quest points to make a klaive.\n\r", ch);
      return;
   }
   else
      (vnum = 29696);

   if (vnum == 0 || (pObjIndex = get_obj_index (vnum)) == NULL)
   {
      send_to_char ("Missing object, please inform KaVir.\n\r", ch);
      return;
   }
   ch->practice -= 60;
   ch->pcdata->quest -= 100;
   obj = create_object (pObjIndex, 50);
   free_string (obj->questowner);
   obj->questowner = str_dup (ch->name);

   SET_BIT (obj->spectype, SITEM_WOLF);

   obj_to_char (obj, ch);
   if (ch->pcdata->stats[UNI_RAGE] > 0)
   {
      act ("$p appears in your claws in a great explosion.", ch, obj, NULL,
	   TO_CHAR);
      act ("$p appears in $n's claws in a great explosion.", ch, obj, NULL,
	   TO_ROOM);
   }
   else
   {
      act ("$p appears in your hands in a great explosion.", ch, obj, NULL,
	   TO_CHAR);
      act ("$p appears in $n's hands in a great explosion.", ch, obj, NULL,
	   TO_ROOM);
   }
   return;
}


void do_mitsukeru (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   ROOM_INDEX_DATA *chroom;
   ROOM_INDEX_DATA *victimroom;
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_NINJA) || ch->pcdata->powers[NPOWER_SORA] < 1)
   {
      do_rand_typo (ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Scry on whom?\n\r", ch);
      return;
   }

   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   chroom = ch->in_room;
   victimroom = victim->in_room;

   char_from_room (ch);
   char_to_room (ch, victimroom);
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE)
       && (!IS_AFFECTED (victim, AFF_SHADOWPLANE)))
   {
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
   }
   else if (!IS_AFFECTED (ch, AFF_SHADOWPLANE)
	    && (IS_AFFECTED (victim, AFF_SHADOWPLANE)))
   {
      SET_BIT (ch->affected_by, AFF_SHADOWPLANE);
      do_look (ch, "auto");
      REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
   }
   else
      do_look (ch, "auto");
   char_from_room (ch);
   char_to_room (ch, chroom);
   ch->fight_timer = 10;
   return;
}

void do_koryou (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_NINJA) || ch->pcdata->powers[NPOWER_SORA] < 2)
   {
      do_rand_typo (ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Read the aura on what?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      if ((obj = get_obj_carry (ch, arg)) == NULL)
      {
	 send_to_char ("Read the aura on what?\n\r", ch);
	 return;
      }
      act ("$n examines $p intently.", ch, obj, NULL, TO_ROOM);
      spell_identify (skill_lookup ("identify"), ch->level, ch, obj);
      return;
   }

   if (!IS_NPC (victim) && (IS_IMMUNE (victim, IMM_SHIELDED)
			    || (IS_CLASS (victim, CLASS_DROW)
				&& IS_SET (victim->pcdata->powers[1],
					   DPOWER_DROWSHIELD)))
       && !IS_ITEMAFF (ch, ITEMA_VISION))
   {
      send_to_char ("You are unable to read their aura.\n\r", ch);
      return;
   }

   act ("$n examines $N intently.", ch, NULL, victim, TO_NOTVICT);
   act ("$n examines you intently.", ch, NULL, victim, TO_VICT);
   if (IS_NPC (victim))
      sprintf (buf, "%s is an NPC.\n\r", victim->short_descr);
   else
   {
      if (victim->level == 12)
	 sprintf (buf, "%s is an Implementor.\n\r", victim->name);
      else if (victim->level == 11)
	 sprintf (buf, "%s is a High Judge.\n\r", victim->name);
      else if (victim->level == 10)
	 sprintf (buf, "%s is a Judge.\n\r", victim->name);
      else if (victim->level == 9)
	 sprintf (buf, "%s is an Enforcer.\n\r", victim->name);
      else if (victim->level == 8)
	 sprintf (buf, "%s is a Quest Maker.\n\r", victim->name);
      else if (victim->level == 7)
	 sprintf (buf, "%s is a Builder.\n\r", victim->name);
      else if (victim->level >= 3)
	 sprintf (buf, "%s is an Avatar.\n\r", victim->name);
      else
	 sprintf (buf, "%s is a Mortal.\n\r", victim->name);
   }
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
   {
      sprintf (buf, "Str:%d, Int:%d, Wis:%d, Dex:%d, Con:%d.\n\r",
	       get_curr_str (victim), get_curr_int (victim),
	       get_curr_wis (victim), get_curr_dex (victim),
	       get_curr_con (victim));
      send_to_char (buf, ch);
   }
   sprintf (buf, "Hp:%d/%d, Mana:%d/%d, Move:%d/%d.\n\r", victim->hit,
	    victim->max_hit, victim->mana, victim->max_mana, victim->move,
	    victim->max_move);
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
      sprintf (buf, "Hitroll:%d, Damroll:%d, AC:%d.\n\r",
	       char_hitroll (victim), char_damroll (victim),
	       char_ac (victim));
   else
      sprintf (buf, "AC:%d.\n\r", char_ac (victim));
   send_to_char (buf, ch);
   if (!IS_NPC (victim))
   {
      sprintf (buf, "Status:%d, ", victim->race);
      send_to_char (buf, ch);
      if (IS_CLASS (victim, CLASS_VAMPIRE))
      {
	 sprintf (buf, "Blood:%d, ", victim->pcdata->condition[COND_THIRST]);
	 send_to_char (buf, ch);
      }
   }
   sprintf (buf, "Alignment:%d.\n\r", victim->alignment);
   send_to_char (buf, ch);
   if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_PREGNANT))
      act ("$N is pregnant.", ch, NULL, victim, TO_CHAR);
   return;
}

void do_confusion (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;

   if (IS_NPC (ch))
      return;

   if (!WORN_ARTIFACT (ch, ARTI_EMPERORS_BLADE))
   {
      if (IS_CLASS (ch, CLASS_DROW))
      {
         do_confuse(ch,argument);
         return;
      }
      do_rand_typo (ch);
      return;
   }

   if ((victim = get_char_room (ch, argument)) == NULL)
   {
      if (ch->fighting == NULL)
      {
	 send_to_char ("They aren't here.\n\r", ch);
	 return;
      }
      else
	 victim = ch->fighting;
   }

   if (is_safe(ch, victim)) return;

   if (ch->mana < 10000)
   {
      send_to_char ("You need 10000 mana to throw your opponent into confusion.\n\r", ch);
      return;
   }

   act ("$n attempts to bewilder you.", ch, NULL, victim, TO_VICT);
   act ("You attempt to bewilder $N.", ch, NULL, victim, TO_CHAR);
   act ("$n attempts to bewilder $N.", ch, NULL, victim, TO_NOTVICT);

   ch->mana -= 10000;

   if (victim->confusion > 0)
   { stc("They are bewildered already!\n\r",ch); return; }

   send_to_char ("You start to feel a bit confused!\n\r", victim);
   act ("$n is confused!", victim, NULL,
        NULL, TO_ROOM);
   victim->confusion = 60;
   WAIT_STATE (ch, skill_table[gsn_kick].beats * 2);
   return;
}