legend/
legend/area/
legend/player/
/***************************************************************************
 *  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"

void set_fighting args ((CHAR_DATA * ch, CHAR_DATA * victim));

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

   if (get_disc(ch, VAM_ANIM) == 0)
   {
      stc ("      Animalism: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_ANIM) >= 1)
      stc ("      Animalism:  Beckon", ch);
   if (get_disc(ch, VAM_ANIM) >= 2)
      stc (" Serenity", ch);
   if (get_disc(ch, VAM_ANIM) >= 3)
      stc (" Pigeon", ch);
   if (get_disc(ch, VAM_ANIM) >= 4)
      stc (" Share", ch);
   if (get_disc(ch, VAM_ANIM) >= 5)
      stc (" Frenzy", ch);
   stc ("\n\r", ch);
   return;
}

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

   if (get_disc(ch, VAM_OBTE) == 0)
   {
      stc ("  Obtenebration: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_OBTE) >= 1)
      stc ("  Obtenebration:  Shroud", ch);
   if (get_disc(ch, VAM_OBTE) >= 2)
      stc (" ShadowSight", ch);
   if (get_disc(ch, VAM_OBTE) >= 3)
      stc (" NightSight", ch);
   if (get_disc(ch, VAM_OBTE) >= 4)
      stc (" Shadowstep", ch);
   if (get_disc(ch, VAM_OBTE) >= 5)
      stc (" Lamprey", ch);
   stc ("\n\r", ch);
   return;
}

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

   if (get_disc(ch, VAM_THAU) == 0)
   {
      stc ("    Thaumaturgy: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_THAU) >= 1)
      stc ("    Thaumaturgy:  Taste", ch);
   if (get_disc(ch, VAM_THAU) >= 2)
      stc (" Cauldron", ch);
   if (get_disc(ch, VAM_THAU) >= 3)
      stc (" Potency", ch);
   if (get_disc(ch, VAM_THAU) >= 4)
      stc (" Theft", ch);
   if (get_disc(ch, VAM_THAU) >= 5)
      stc (" Tide", ch);
   stc ("\n\r", ch);
   return;
}

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

   if (get_disc(ch, VAM_OBFU) == 0)
   {
      stc ("      Obfuscate: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_OBFU) >= 1)
      stc ("      Obfuscate:  Vanish", ch);
   if (get_disc(ch, VAM_OBFU) >= 2)
      stc (" Shield", ch);
   if (get_disc(ch, VAM_OBFU) >= 3)
      stc (" Mask", ch);
   if (get_disc(ch, VAM_OBFU) >= 4)
      stc (" Mortal", ch);
   if (get_disc(ch, VAM_OBFU) >= 5)
      stc (" Conceal", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_SERP) == 0)
   {
      stc ("      Serpentis: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_SERP) >= 1)
      stc ("      Serpentis:  Darkheart", ch);
   if (get_disc(ch, VAM_SERP) >= 2)
      stc (" SerpentForm", ch);
   if (get_disc(ch, VAM_SERP) >= 3)
      stc (" Poison", ch);
   if (get_disc(ch, VAM_SERP) >= 4)
      stc (" Tendrils", ch);
   if (get_disc(ch, VAM_SERP) >= 5)
      stc (" Tongue", ch);
   stc ("\n\r", ch);
   return;
}



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

   if (get_disc(ch, VAM_CHIM) == 0)
   {
      stc ("     Chimerstry: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_CHIM) >= 1)
      stc ("     Chimerstry:  Mirror", ch);
   if (get_disc(ch, VAM_CHIM) >= 2)
      stc (" Formillusion", ch);
   if (get_disc(ch, VAM_CHIM) >= 3)
      stc (" Clone", ch);
   if (get_disc(ch, VAM_CHIM) >= 4)
      stc (" Control", ch);
   if (get_disc(ch, VAM_CHIM) >= 5)
      stc (" Objectmask", ch);
   stc ("\n\r", ch);
   return;
}




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

   if (get_disc(ch, VAM_NECR) == 0)
   {
      stc ("     Necromancy: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_NECR) >= 1)
      stc ("     Necromancy:  BloodWater", ch);
   if (get_disc(ch, VAM_NECR) >= 2)
      stc (" Preserve", ch);
   if (get_disc(ch, VAM_NECR) >= 3)
      stc (" Spiritgate", ch);
   if (get_disc(ch, VAM_NECR) >= 4)
      stc (" SpiritGuardian", ch);
   if (get_disc(ch, VAM_NECR) >= 5)
      stc (" Zombie", ch);
   stc ("\n\r", ch);
   return;
}



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

   if (get_disc(ch, VAM_CELE) == 0)
   {
      stc ("       Celerity: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_CELE) >= 1)
      stc ("       Celerity:  1", ch);
   if (get_disc(ch, VAM_CELE) >= 2)
      stc (" 2", ch);
   if (get_disc(ch, VAM_CELE) >= 3)
      stc (" 3", ch);
   if (get_disc(ch, VAM_CELE) >= 4)
      stc (" 4", ch);
   if (get_disc(ch, VAM_CELE) >= 5)
      stc (" 5", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_PRES) == 0)
   {
      stc ("       Presence: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_PRES) >= 1)
      stc ("       Presence:  Awe", ch);
   if (get_disc(ch, VAM_PRES) >= 2)
      stc (" Mindblast", ch);
   if (get_disc(ch, VAM_PRES) >= 3)
      stc (" Entrance", ch);
   if (get_disc(ch, VAM_PRES) >= 4)
      stc (" Summoning", ch);
   if (get_disc(ch, VAM_PRES) >= 5)
      stc (" Majesty", ch);
   stc ("\n\r", ch);
   return;
}



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

   if (get_disc(ch, VAM_AUSP) == 0)
   {
      stc ("         Auspex: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_AUSP) >= 1)
      stc ("         Auspex:  Truesight", ch);
   if (get_disc(ch, VAM_AUSP) >= 2)
      stc (" Scry", ch);
   if (get_disc(ch, VAM_AUSP) >= 3)
      stc (" Unveil", ch);
   if (get_disc(ch, VAM_AUSP) >= 4)
      stc (" AstralWalk", ch);
   if (get_disc(ch, VAM_AUSP) >= 5)
      stc (" Readaura", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_POTE) == 0)
   {
      stc ("        Potence: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_POTE) >= 1)
      stc ("        Potence:  1", ch);
   if (get_disc(ch, VAM_POTE) >= 2)
      stc (" 2", ch);
   if (get_disc(ch, VAM_POTE) >= 3)
      stc (" 3", ch);
   if (get_disc(ch, VAM_POTE) >= 4)
      stc (" 4", ch);
   if (get_disc(ch, VAM_POTE) >= 5)
      stc (" 5", ch);
   stc ("\n\r", ch);
   return;
}



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

   if (get_disc(ch, VAM_VICI) == 0)
   {
      stc ("    Vicissitude: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_VICI) >= 1)
      stc ("    Vicissitude:  Zuloform", ch);
   if (get_disc(ch, VAM_VICI) >= 2)
      stc (" Fleshcraft", ch);
   if (get_disc(ch, VAM_VICI) >= 3)
      stc (" Bonemod", ch);
   if (get_disc(ch, VAM_VICI) >= 4)
      stc (" DragonForm", ch);
   if (get_disc(ch, VAM_VICI) >= 5)
      stc (" Plasma", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_OBEA) == 0)
   {
      stc ("          Obeah: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_OBEA) >= 1)
      stc ("          Obeah:  Obeah", ch);
   if (get_disc(ch, VAM_OBEA) >= 2)
      stc (" Panacea", ch);
   if (get_disc(ch, VAM_OBEA) >= 3)
      stc (" Anesthetic", ch);
/*
   if (get_disc(ch, VAM_OBEA) >= 4)
      stc (" not in", ch);
*/
   if (get_disc(ch, VAM_OBEA) >= 5)
      stc (" Renew", ch);
   stc ("\n\r", ch);
   return;
}



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

   if (get_disc(ch, VAM_FORT) == 0)
   {
      stc ("      Fortitude: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_FORT) >= 1)
      stc ("      Fortitude:  1", ch);
   if (get_disc(ch, VAM_FORT) >= 2)
      stc (" 2", ch);
   if (get_disc(ch, VAM_FORT) >= 3)
      stc (" 3", ch);
   if (get_disc(ch, VAM_FORT) >= 4)
      stc (" 4", ch);
   if (get_disc(ch, VAM_FORT) >= 5)
      stc (" 5", ch);
   stc ("\n\r", ch);
   return;
}



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

   if (get_disc(ch, VAM_QUIE) == 0)
   {
      stc ("        Quietus: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_QUIE) >= 1)
      stc ("        Quietus:  Spit", ch);
   if (get_disc(ch, VAM_QUIE) >= 2)
      stc (" Infirmity", ch);
   if (get_disc(ch, VAM_QUIE) >= 3)
      stc (" Bloodagony", ch);
   if (get_disc(ch, VAM_QUIE) >= 4)
      stc (" Assassinate", ch);
   if (get_disc(ch, VAM_QUIE) >= 5)
      stc (" Vsilence", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_DOMI) == 0)
   {
      stc ("       Dominate: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_DOMI) >= 1)
      stc ("       Dominate:  Command", ch);
   if (get_disc(ch, VAM_DOMI) >= 2)
      stc (" Mesmerise", ch);
   if (get_disc(ch, VAM_DOMI) >= 3)
      stc (" Possession", ch);
   if (get_disc(ch, VAM_DOMI) >= 4)
      stc (" Acid", ch);
   if (get_disc(ch, VAM_DOMI) >= 5)
      stc (" Coil", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_PROT) == 0)
   {
      stc ("        Protean: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_PROT) >= 1)
      stc ("        Protean:  Umbravision", ch);
   if (get_disc(ch, VAM_PROT) >= 2)
      stc (" Claws", ch);
   if (get_disc(ch, VAM_PROT) >= 3)
      stc (" Change", ch);
   if (get_disc(ch, VAM_PROT) >= 4)
      stc (" Earthmeld", ch);
   if (get_disc(ch, VAM_PROT) >= 5)
      stc (" Flamehands", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_DAIM) == 0)
   {
      stc ("      Daimoinon: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_DAIM) >= 1)
      stc ("      Daimoinon:  Guardian", ch);
   if (get_disc(ch, VAM_DAIM) >= 2)
      stc (" BloodWall", ch);
   if (get_disc(ch, VAM_DAIM) >= 3)
      stc (" Gate", ch);
   if (get_disc(ch, VAM_DAIM) >= 4)
      stc (" Vtwist", ch);
   if (get_disc(ch, VAM_DAIM) >= 5)
      stc (" Fear", ch);
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_MELP) == 0)
   {
      stc ("     Melpominee: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_MELP) >= 1)
      stc ("     Melpominee:  Scream", ch);
   if (get_disc(ch, VAM_MELP) >= 2)
      stc (" Gourge", ch);
   if (get_disc(ch, VAM_MELP) >= 3)
      stc (" Sharpen", ch);
/*
   if (get_disc(ch, VAM_MELP) >= 4)
      stc (" not in", ch);
   if (get_disc(ch, VAM_MELP) >= 5)
      stc (" not in", ch);
*/
   stc ("\n\r", ch);
   return;
}


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

   if (get_disc(ch, VAM_THAN) == 0)
   {
      stc ("     Thanatosis: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_THAN) >= 1)
      stc ("     Thanatosis:  Hagswrinkles", ch);
   if (get_disc(ch, VAM_THAN) >= 2)
      stc (" Putrefaction", ch);
   if (get_disc(ch, VAM_THAN) >= 3)
      stc (" Ashes", ch);
   if (get_disc(ch, VAM_THAN) >= 4)
      stc (" Wither", ch);
   if (get_disc(ch, VAM_THAN) >= 5)
      stc (" Drain", ch);
   stc ("\n\r", ch);
   return;
}

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

   stc ("Maiden's Breath: Moonhunt.\n\r", ch);
   return;
}

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

   if (get_disc(ch, VAM_PRES) == 0)
   {
      stc ("Ring of Aurelius: None.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_PRES) >= 1)
      stc ("Ring of Aurelius:  Awe", ch);
   if (get_disc(ch, VAM_PRES) >= 2)
      stc (" Mindblast", ch);
   if (get_disc(ch, VAM_PRES) >= 3)
      stc (" Entrance", ch);
   if (get_disc(ch, VAM_PRES) >= 4)
      stc (" Summon", ch);
   if (get_disc(ch, VAM_PRES) >= 5)
      stc (" Majesty", ch);
   stc ("\n\r", ch);
   return;
}

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

   stc ("Greenleaf Cloak: Leafwalk.\n\r", ch);
   return;
}

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

   stc ("Emperor's Blade: Confusion.\n\r", ch);
   return;
}

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

   stc ("Cloak of the ArchMagi: CloakChant.\n\r", ch);
   return;
}

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

   stc ("Bracers of Storm's Fury: Swordcraft.\n\r", ch);
   return;
}

void do_vampire (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 will now allow vampires to bite you.\n\r", ch);
      SET_BIT (ch->immune, IMM_VAMPIRE);
      return;
   }
   send_to_char ("You will no longer allow vampires to bite you.\n\r", ch);
   REMOVE_BIT (ch->immune, IMM_VAMPIRE);
   return;
}


void do_racepower (CHAR_DATA * ch, char *argument)
{


   if (IS_NPC (ch))
      return;

   if (WORN_ARTIFACT (ch, ARTI_MAIDENS_BREATH))
   {
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      cent_to_char
	 ("#P>#p>#G>#g Powers of the Artifacts of Today #g<#p<#P<#n", ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      maiden_disc (ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r\n\r", ch);
   }

   if (WORN_ARTIFACT (ch, ARTI_RING_AURELIUS))
   {
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      cent_to_char
	 ("#P>#p>#G>#g Powers of the Artifacts of Today #g<#p<#P<#n", ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      aurelius_disc (ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r\n\r", ch);
   }

   if (WORN_ARTIFACT (ch, ARTI_GREENLEAF_CLOAK))
   {
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      cent_to_char
	 ("#P>#p>#G>#g Powers of the Artifacts of Today #g<#p<#P<#n", ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      greenleaf_disc (ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r\n\r", ch);
   }

   if (WORN_ARTIFACT (ch, ARTI_EMPERORS_BLADE))
   {
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      cent_to_char
	 ("#P>#p>#G>#g Powers of the Artifacts of Today #g<#p<#P<#n", ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      emperor_disc (ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r\n\r", ch);
   }

   if (IS_CLASS (ch, CLASS_MAGE) && ch->level >= LEVEL_APPRENTICE
       && ch->trust >= LEVEL_APPRENTICE && WORN_ARTIFACT(ch, ARTI_CLOAK_OF_THE_ARCHMAGI))
   {
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      cent_to_char
	 ("#P>#p>#G>#g Powers of the Artifacts of Today #g<#p<#P<#n", ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      archmagi_disc (ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r\n\r", ch);
   }

   if (WORN_ARTIFACT (ch, ARTI_BRACERS_OF_STORMS_FURY))
   {
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      cent_to_char
	 ("#P>#p>#G>#g Powers of the Artifacts of Today #g<#p<#P<#n", ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r", ch);
      stormsfury_disc (ch);
      stc ("#B.-*''*-._#b.-*''*-._#C.-*''*-._#c.-*''*-._#w.-*''*-._#c.-*''*-._#C.-*''*-._#b.-*''*-._#B.-*''*-.#n\n\r\n\r", ch);
   }

   if (IS_CLASS (ch, CLASS_FAE))
   {
      do_faepowers (ch, argument);
      return;
   }
   else if (IS_CLASS (ch, CLASS_WEREWOLF))
   {
      do_wwpowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_NINJA))
   {
      do_ninjapowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_DRAGON))
   {
      do_dragonpowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_WRAITH))
   {
      do_wraithpowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_DEMON))
   {
      do_dempowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_MAGE))
   {
      do_magepowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_MONK))
   {
      do_monkpowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_DROW))
   {
      do_drowpowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_HIGHLANDER))
   {
      do_highlanderpowers (ch, "");
      return;
   }
   else if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      stc ("#r<<============================================================================>>#n\n\r", ch);
      cent_to_char ("#w-[ Vampire Powers ]-#n", ch);
      stc ("#r<<============================================================================>>#n\n\r", ch);
      animalism_disc (ch);
      obtenebration_disc (ch);
      thaumaturgy_disc (ch);
      obfuscate_disc (ch);
      serpentis_disc (ch);
      chimerstry_disc (ch);
      necromancy_disc (ch);
      celerity_disc (ch);
      presence_disc (ch);
      auspex_disc (ch);
      potence_disc (ch);
      vicissitude_disc (ch);
      obeah_disc (ch);
      fortitude_disc (ch);
      quietus_disc (ch);
      dominate_disc (ch);
      protean_disc (ch);
      daimoinon_disc (ch);
      melpominee_disc (ch);
      thanatosis_disc (ch);
      stc ("#r<<============================================================================>>#n\n\r", ch);
      return;
   }
   else if (ch->class == 0)
   {
      send_to_char ("You have no class, so there is no power listing\n\r",
		    ch);
      return;
   }
   else
   {
      stc ("No POWERS command for your class yet!\n\r", ch);
      return;
   }
   return;
}

void do_embrace(CHAR_DATA *ch, char *argument  )
{
    char arg[MAX_INPUT_LENGTH]; 
    CHAR_DATA *victim;
//    char buf[MAX_STRING_LENGTH];
    int chargen, maxblood;
    one_argument( argument, arg );
        
       chargen = ch->pcdata->stats[UNI_GEN];
switch (chargen)
    {
        default:
            maxblood = 100; 
            break;
        case 1:
            maxblood = 5000;
        case 2:
            maxblood = 2000;
            break;
        case 3:
            maxblood = 1000;
            break;
        case 4:
            maxblood = 500;
            break;
        case 5:
            maxblood = 400;
            break;
        case 6:
            maxblood = 300;
            break;
        case 7:
            maxblood = 200;
            break;
        case 8:
            maxblood = 150;
            break;
        case 9:
            maxblood = 140;
            break;
        case 10:
            maxblood = 130;
            break;
        case 11:
            maxblood = 120; 
            break;
        case 12:
            maxblood = 110; 
            break;
        case 13:
            maxblood = 100;
            break;
            
   }
            
    if (IS_NPC(ch)) return;
    if (!IS_CLASS(ch,CLASS_VAMPIRE))
    {
    send_to_char("Huh?\n\r",ch);
    return;
    }
            
if (ch->embracing != NULL)
{
    if ((victim=ch->embracing) != NULL)
    {
    send_to_char("You retract your fangs.",ch);
    act("$N retracts his fangs.",ch,NULL,NULL,TO_ROOM);
    stop_embrace(ch,victim);
    return;
    }
}
    if ( arg[0] == '\0' )  
    {
        send_to_char( "Who do you wish to embrace?\n\r", ch );
        return;
    }
    if ((victim = get_char_room( ch, arg)) == NULL)
    {
    send_to_char("They arent here.\n\r",ch);
    return;
    }
            
    if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_VAMPIRE))
    {
        do_diablerise(ch, arg);
        return;
    }

        if (IS_NPC(victim) && IS_SET(victim->act, ACT_NOAUTOKILL)) {
        send_to_char("You can't do that to them.\n\r", ch);
        return;}
            
       if (IS_SET(victim->in_room->room_flags, ROOM_SAFE))
        {   
        send_to_char("You cannot embrace them here.\n\r",ch);
        return;
        }

    if (!IS_NPC( victim ) )
    {
	if ( ( victim->position > POS_MORTAL )
	  && ( victim->class > 0 )
	  && ( !IS_CLASS( victim, CLASS_VAMPIRE ) ) )
	{
	    stc( "They dodge your embrace.\n\r", ch );
	    return;
	}
	if ( ( victim->position > POS_STUNNED )
	  && ( IS_CLASS( victim, CLASS_VAMPIRE ) ) )
	{
	    stc( "They are too alert for you to feed on them.\n\r", ch );
	    return;
	}
    }
    send_to_char("\n\r",ch);
    
    act("You step towards $N, with your arms outstretched.",ch,NULL,victim,TO_CHAR);
    act("$n step towards you, with $s arms outstretched.",ch,NULL,victim,TO_VICT);
    act("$n step towards $N, with $s arms outstretched.",ch,NULL,victim,TO_NOTVICT);
     
    WAIT_STATE(ch, 15);
    
if (IS_AFFECTED(victim, AFF_CHARM) && victim->master != NULL &&
        victim->master == ch)
        send_to_char( "You stand helpless before your master.\n\r", victim );
    else if (IS_IMMUNE(victim, IMM_VAMPIRE))
        act("You stand defenceless before $m",ch,NULL,victim,TO_VICT);
    else if (victim->position < POS_MEDITATING)
        act("You leap onto $S defenseless body.",ch,NULL,victim,TO_CHAR);
    else   
    {
        act("$N leaps out of your reach!",ch,NULL,victim,TO_CHAR);
        act("You leap out of $s reach!",ch,NULL,victim,TO_VICT);
        act("$N leap out of $n's reach!",ch,NULL,victim,TO_NOTVICT);
        return; 
    }       
    
    act("You grab hold of $N in a close embrace.",ch,NULL,victim,TO_CHAR);
    act("$n grabs hold of you in a close embrace.",ch,NULL,victim,TO_VICT);
    act("$n grabs hold of $N in a close embrace.",ch,NULL,victim,TO_NOTVICT);
    if (ch->position < POS_STANDING) return;
       
    if (!IS_VAMPAFF(ch, VAM_FANGS)) do_fangs (ch,"");
        
    act("You sink your fangs into $N's neck.",ch,NULL,victim,TO_CHAR);
    act("$n sinks $s fangs into your neck.",ch,NULL,victim,TO_VICT);
    act("$n sinks $s fangs into $N's neck.",ch,NULL,victim,TO_NOTVICT);
    
    
    
   victim->embraced = ch;
   ch->embracing = victim;
   if (IS_NPC (victim))
   {
      (victim->practice = victim->level);
      //(victim->practice *= 8);
   }
    return;
}


void do_theft (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   int bloodpool, maxblood;
   int chargen;
   int blpr;			/* Blood sucked storage variable. Shakti */

   argument = one_argument (argument, arg);

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

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

      if (IS_SET (ch->newbits, NEW_TIDE))
         chargen -=1;

switch (chargen)
    {
        default:
            maxblood = 100;
            break;
        case 1:
            maxblood = 5000;
        case 2:
            maxblood = 2000;
            break;
        case 3: 
            maxblood = 1000;
            break;
        case 4:
            maxblood = 500;
            break;
        case 5:
            maxblood = 400;
            break;
        case 6:
            maxblood = 300;
            break;
        case 7:
            maxblood = 200;
            break;
        case 8:
            maxblood = 150;
            break;
        case 9:
            maxblood = 140;
            break;
        case 10:
            maxblood = 130;
            break;
        case 11:
            maxblood = 120;
            break;
        case 12:
            maxblood = 110; 
            break;
        case 13:
            maxblood = 100;
            break;
    }
      bloodpool = maxblood;
   }

   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_THAU) < 4)
   {
      send_to_char
	 ("You must obtain at least level 4 in Thaumaturgy to use Theft of Vitae.\n\r",
	  ch);
      return;
   }


   if (arg[0] == '\0')
   {
      send_to_char ("Steal blood from whom?\n\r", 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 = ch->fighting) == NULL)
   {
      if ((victim = get_char_room (ch, arg)) == NULL)
      {
	 send_to_char ("They aren't here.\n\r", ch);
	 return;
      }
   }

   if (IS_NPC (victim) && IS_SET (victim->act, ACT_NOAUTOKILL))
   {
      send_to_char ("You can't do that to them.\n\r", ch);
      return;
   }

   /* Shaktis check for level */

   if (victim->level > 75)
   {
      send_to_char ("They are too powerful to theft!\n\r", ch);
      return;
   }


   if (!IS_NPC (victim) && victim->pcdata->condition[COND_THIRST] <= 0)
   {
      send_to_char ("There isn't enough blood to steal.\n\r", ch);
      return;
   }
   if (!IS_NPC (victim) && IS_IMMORTAL (victim) && victim != ch)
   {
      send_to_char ("You can only steal blood from Avatar's or lower.\n\r",
		    ch);
      return;
   }
   if (IS_SUPER_NPC (victim))
   {
      if (victim->position == POS_STANDING)
	 multi_hit (victim, ch, TYPE_UNDEFINED);
      WAIT_STATE (ch, 24);
      return;
   }

   if (is_safe (ch, victim) == TRUE)
      return;

   if (!IS_NPC (victim))
   {
      sprintf (buf, "A stream of blood shoots from %s into your body.",
	       victim->name);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "A stream of blood shoots from %s into %s.", victim->name,
	       ch->name);
      act (buf, ch, NULL, victim, TO_ROOM);
      sprintf (buf, "A stream of blood shoots from your body into %s.",
	       ch->name);
      act (buf, ch, NULL, victim, TO_VICT);
   }
   else
   {
      sprintf (buf, "A stream of blood shoots from %s into your body.",
	       victim->short_descr);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "A stream of blood shoots from %s into %s.",
	       victim->short_descr, ch->name);
      act (buf, ch, NULL, victim, TO_ROOM);
      sprintf (buf, "A stream of blood shoots from your body into %s.",
	       ch->name);
      act (buf, ch, NULL, victim, TO_VICT);


   }
   ch->pcdata->condition[COND_THIRST] += number_range (20, 25);


   if (IS_NPC (victim))
   {
/* Raw-killing it from one theft is stupid. Im going to use the primal */
/* stat on the mobs for blood its quick, effective, and straightford, AND */
/* no new fields have to be added to the mob.Shakti 09/07/98 */
      (blpr = number_range (30, 40));
      (victim->practice -= (blpr / 2));
      (ch->pcdata->condition[COND_THIRST] += blpr);
      if (victim->practice < 0)
      {
	 sprintf (buf, "%s falls over dead.", victim->short_descr);
	 act (buf, ch, NULL, victim, TO_ROOM);
	 act (buf, ch, NULL, victim, TO_CHAR);
	 raw_kill (victim, ch);
      }

      if (ch->pcdata->condition[COND_THIRST] >= bloodpool)
      {
	 ch->pcdata->condition[COND_THIRST] = bloodpool;
      }
      if (ch->fighting == NULL)
	 set_fighting (ch, victim);

      return;
   }

   if (is_garou (victim) && victim->gifts[GETOFFENRIS] >= 4)
   {
      stc ("Their blood is a deadly venom!\n\r", ch);
      ch->hit -= number_range (400, 500);
      victim->pcdata->condition[COND_THIRST] -= 30;
      return;
   }

   if (IS_SET (victim->act, PLR_ACID))
   {
      send_to_char ("Their blood is a deadly acid!\n\r", ch);
      ch->hit -= 300;
      victim->pcdata->condition[COND_THIRST] -= 30;
      return;
   }

   if (!IS_NPC (victim))
   {
      victim->pcdata->condition[COND_THIRST] -= number_range (30, 40);
   }
   if (ch->pcdata->condition[COND_THIRST] >=
       bloodpool / ch->pcdata->stats[UNI_GEN])
   {
      ch->pcdata->condition[COND_THIRST] =
	 bloodpool / ch->pcdata->stats[UNI_GEN];
   }

   if (victim->pcdata->condition[COND_THIRST] <= 0)
   {
      victim->pcdata->condition[COND_THIRST] = 0;
   }
   if (ch->fighting == NULL)
      set_fighting (ch, victim);

   return;
}

/* bugged version */

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

   if (IS_NPC (ch))
      return;

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

   if (arg[0] == '\0' && ch->embracing == NULL)
   {
      send_to_char ("Who do you wish to embrace?\n\r", ch);
      return;
   }

   if (ch->embracing != NULL)
   {
      if ((victim = ch->embracing) != NULL)
      {
	 send_to_char ("You retract your fangs.", ch);
	 act ("$N retracts his fangs.", ch, NULL, NULL, TO_ROOM);
	 stop_embrace (ch, victim);
	 return;
      }
   }

   if ((victim = get_char_room (ch, arg)) == NULL && ch->embracing == NULL)
   {
      send_to_char ("They arent here.\n\r", ch);
      return;
   }


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

   if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING))
   {
      stc ("Leave people in the war alone!\n\r", ch);
      return;
   }
   if (IS_SET (ch->war, WARRING))
   {
      stc ("Not while in a war!\n\r", ch);
      return;
   }

   if (is_inarena (ch))
      return;

   if (ch == victim)
   {
      send_to_char ("That might be a bit tricky...\n\r", ch);
      return;
   }

   if (ch->pcdata->pkill_timer > 0)
   {
      stc ("You are unable to steal their generation with a safe timer\n\r",
	   ch);
      return;
   }

   if (victim->pcdata->pkill_timer > 0)
   {
      stc ("You are unable to steal their generation.\n\r", ch);
      return;
   }

   if (IS_NEWBIE (victim) && !IS_SET (victim->extra2, PKREADY))
   {
      stc ("You are unable to steal newbies generations.\n\r", ch);
      return;
   }

   if (!CAN_PK (ch))
   {
      send_to_char ("You must be an avatar to steal someones generation.\n\r",
		    ch);
      return;
   }

   if (!CAN_PK (victim))
   {
      send_to_char ("You can only steal generations from other avatars.\n\r",
		    ch);
      return;
   }

   if (victim->position > POS_STUNNED)
   {
      send_to_char ("You can only embrace mortally wounded vampires.\n\r",
		    ch);
      return;
   }

   if (is_safe(ch, victim)) return;

   if (victim->pcdata->stats[UNI_GEN] == 1)
   {
      stc ("They are too powerful!\n\r", ch);
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] == 2)
   {
      stc ("You have the lowest possible gen!\n\r", ch);
      return;
   }

   if (ch->pcdata->stats[UNI_GEN] < victim->pcdata->stats[UNI_GEN])
   {
      stc ("Your generation is lower than theirs already!\n\r", ch);
      return;
   }

   if (victim->pcdata->stats[UNI_GEN] == 13)
   {
      stc ("Their generation is worthless to you!\n\r", ch);
      return;
   }

   sprintf (buf, "%s leaps toward %s baring his fangs.", ch->name,
	    victim->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   sprintf (buf, "You leap toward %s baring your fangs.\n\r", victim->name);
   send_to_char (buf, ch);
   WAIT_STATE (ch, 15);

   sprintf (buf, "You sink your teeth into their throat.\n\r");
   send_to_char (buf, ch);
   sprintf (buf, "%s sinks their teeth into %s's throat.", ch->name,
	    victim->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   sprintf (buf, "%s sinks their teeth into your throat.\n\r", ch->name);
   send_to_char (buf, victim);
   victim->embraced = ch;
   ch->embracing = victim;

   return;
}

void do_preserve (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_VAMPIRE))
   {
      stc ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_NECR) < 2)
   {
      stc ("You must obtain level 2 Necromancy to use Preserve.\n\r", ch);
      return;
   }

   if ((obj = get_obj_carry (ch, arg)) == NULL)
   {
      stc ("You do not have that item.\n\r", ch);
      return;
   }
/*
    if ( obj->item_type == ITEM_HEAD )
    {
      stc("You cannot preserve that item.\n\r",ch);
      return;
    }
*/
   if (obj->timer <= 0)
   {
      stc ("That object has no timer.\n\r", ch);
      return;
   }

   obj->timer = -1;
   act ("You place your hands on $p and concentrate on it.", ch, obj, NULL,
	TO_CHAR);
   act ("$n places $s hands on $p and it glows brightly.", ch, obj, NULL,
	TO_ROOM);
   return;
}

void do_spiritguard (CHAR_DATA * ch, char *argument)
{

   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_NECR) < 4)
   {
      stc ("You must obtain level 4 Necromancy to use Spirit Guardian.\n\r",
	   ch);
      return;
   }

   if (!IS_SET (ch->flag2, AFF2_SPIRITGUARD))
   {
      stc ("You awaken your spirit guardian.\n\r", ch);
      SET_BIT (ch->flag2, AFF2_SPIRITGUARD);
      return;
   }

   else
   {
      stc ("You dismiss your spirit guardian.\n\r", ch);
      REMOVE_BIT (ch->flag2, AFF2_SPIRITGUARD);
      return;
   }
   return;
}

void do_spiritgate (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_VAMPIRE))
   {
      stc ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_NECR) < 3)
   {
      stc ("You must obtain level 3 Necromancy to use SpiritGate.\n\r", ch);
      return;
   }

   if ((obj = get_obj_world (ch, arg)) == NULL)
   {
      stc ("You cannot find that object.\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 65)
   {
      stc ("You do not have enough blood.\n\r", ch);
      return;
   }

   if (obj->in_room == NULL)
   {
      stc ("You cannot locate that object.\n\r", ch);
      return;
   }

   if (obj->carried_by != NULL)
   {
      stc ("That corpse is being carried by someone!\n\r", ch);
      return;
   }

   if (IS_SET (obj->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if (IS_SET (obj->in_room->room_flags, ROOM_CCHAMBER))
   {
      stc ("You failed.\n\r", ch);
      return;
   }

   if (obj->item_type != ITEM_CORPSE_PC && obj->item_type != ITEM_CORPSE_NPC)
   {
      stc ("That's not even a corpse!\n\r", ch);
      return;
   }

   if (obj->in_room->vnum == ch->in_room->vnum)
   {
      stc ("You're already there!\n\r", ch);
      return;
   }

   act ("$n steps into a spirit gate and vanishes.", ch, NULL, NULL, TO_ROOM);
   char_from_room (ch);
   char_to_room (ch, get_room_index (obj->in_room->vnum));
   act ("You step through a spirit gate and appear before $p.", ch, obj, NULL,
	TO_CHAR);
   act ("$n steps out of a spirit gate in front of $p.", ch, obj, NULL,
	TO_ROOM);
   do_look (ch, "auto");
   ch->pcdata->condition[COND_THIRST] -= 65;
   return;
}

void do_scream (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *vch;
   CHAR_DATA *vch_next;
   CHAR_DATA *mount;
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_MELP) < 1)
   {
      stc ("You must obtain level 1 Melpominee to use Scream.\n\r", ch);
      return;
   }

   if (IS_SET (ch->in_room->room_flags, ROOM_SAFE))
   {
      stc ("Your screams will have no effect here.\n\r", ch);
      return;
   }

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

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

      if (vch->in_room == NULL)
	 continue;
      if (!IS_NPC (vch) && vch->pcdata->chobj != NULL)
	 continue;
      if (IS_IMMORTAL (vch))
	 continue;
      if (ch == vch)
	 continue;
      if (vch->in_room == ch->in_room)
      {
	 if ((mount = ch->mount) != NULL)
	 {
	    if (mount == vch)
	       continue;
	 }
	 if (can_see (ch, vch))
	 {
            if (number_range (1, (7 - get_disc(ch, VAM_MELP))) == 2)
	    {
	       act ("$n lets out an ear-popping scream!", ch, NULL, vch,
		    TO_ROOM);
	       stc ("You fall to the ground, clutching your ears.\n\r", vch);
	       vch->position = POS_STUNNED;
	       act ("$n falls to the ground, stunned.", vch, NULL, vch,
		    TO_NOTVICT);
	       return;
	    }
	    else
	    {
	       act ("$n lets out an ear-popping scream!", ch, NULL, vch,
		    TO_ROOM);
	       return;
	    }
	 }
	 else
	    continue;

	 return;
      }
   }

   return;
}


void do_zombie (CHAR_DATA * ch, char *argument)
{
   char buf2[MAX_STRING_LENGTH];
   char buf[MAX_INPUT_LENGTH];
   char arg[MAX_STRING_LENGTH];
   CHAR_DATA *victim;
   AFFECT_DATA af;
   OBJ_DATA *obj;
   one_argument (argument, arg);
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_MAGE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Zombie what corpse?\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_NECR) < 5)
   {
      send_to_char ("You require level 5 Necromancy to create a zombie.\n\r",
		    ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MAGE) && ch->spheres[MSPI] < 3)
   {
      stc ("You must obtain level 3 Spirit to Awaken the Inanimate.\n\r", ch);
      return;
   }

   if (ch->pcdata->followers > 1)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }
   if ((obj = get_obj_carry (ch, arg)) == NULL)
   {
      send_to_char ("You dont have that corpse.", ch);
      return;
   }
   if (obj->item_type != ITEM_CORPSE_NPC || IS_SET (obj->quest, QUEST_ZOMBIE))
   {
      send_to_char ("You can only Zombie original corpses.\n\r", ch);
      return;
   }


   ch->pcdata->followers++;


   victim = create_mobile (get_mob_index (obj->value[2]));

   if (victim->level > 200)
      victim->level = 200;
   victim->hitroll = victim->level;
   victim->damroll = victim->level;

   sprintf (buf, "the zombie of %s", victim->short_descr);
   sprintf (buf2, "the zombie of %s is here.\n\r", victim->short_descr);
   free_string (victim->short_descr);
   victim->short_descr = str_dup (buf);
   free_string (victim->name);
   victim->name = str_dup (buf);
   free_string (victim->long_descr);
   victim->long_descr = str_dup (buf2);
   SET_BIT (victim->extra, EXTRA_ZOMBIE);
   victim->spec_fun = NULL;
   strcpy (buf, "Rise corpse, and bow before me!");
   do_say (ch, buf);
   sprintf (buf, "%s clambers back up to its feet.\n\r", obj->short_descr);
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char (buf, ch);


   char_to_room (victim, ch->in_room);

   if (victim->level < 100)
   {
      add_follower (victim, ch);
      af.duration = 666;
      af.location = APPLY_NONE;
      af.modifier = 0;
      af.bitvector = AFF_CHARM;
      affect_to_char (victim, &af);
   }
   WAIT_STATE (ch, 10);
   extract_obj (obj);
   return;
}

void do_fleshcraft (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))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_VICI) < 2)
   {
      send_to_char ("You need Vicissitude 2 to fleshcraft.\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) && ch != victim)
   {
      send_to_char ("Not on Players.\n\r", ch);
      return;
   }


   if (ch->pcdata->condition[COND_THIRST] < 40)
   {
      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 flesh molds and transforms into %s.", ch->name);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "%s's flesh molds 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 flesh molds and transforms into a clone of %s.",
	       victim->short_descr);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "%s's flesh molds and transforms into a clone of %s.",
	       ch->morph, victim->short_descr);
      act (buf, ch, NULL, victim, TO_NOTVICT);
      sprintf (buf, "%s's flesh mols 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->short_descr);
      return;
   }
   sprintf (buf, "Your flesh molds and transforms into a clone of %s.",
	    victim->short_descr);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf, "%s's flesh molds and transforms into a clone of %s.",
	    ch->name, victim->short_descr);
   act (buf, ch, NULL, victim, TO_NOTVICT);
   sprintf (buf, "%s's flesh molds 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->short_descr);
   return;
}

void do_bonemod (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];

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


   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_VICI) < 3)
   {
      send_to_char ("You need level 3 Vicissitude to use this power.\n\r",
		    ch);
      return;
   }

   if (arg1[0] == '\0')
   {
      send_to_char ("Syntax: bonemod <modification>\n\r", ch);
      send_to_char ("Horns, Wings, Head, Exoskeleton, Tail\n\r", ch);
      return;
   }


   /*
    * Set something.
    */
   if (!str_cmp (arg1, "horns"))
   {

      if (!IS_VAMPAFF (ch, VAM_HORNS))
      {
	 SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_HORNS);
	 send_to_char ("You pull a set of horns out of your head.\n\r", ch);
	 act ("$n pulls a set of horns from his head!\n\r", ch, NULL, NULL,
	      TO_ROOM);
	 return;
      }

      if (IS_VAMPAFF (ch, VAM_HORNS))
      {
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_HORNS);
	 send_to_char ("You push your horns back into your head.\n\r", ch);
	 act ("$n pushes $n's horns back into $n head.\n\r", ch, NULL, NULL,
	      TO_ROOM);
	 return;

      }
   }

   if (!str_cmp (arg1, "wings"))
   {

      if (!IS_VAMPAFF (ch, VAM_WINGS))
      {
	 SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_WINGS);
	 send_to_char
	    ("You pull a pair of leathery wings from your back.\n\r", ch);
	 act ("$n pulls a pair of leathery wings from $s back!\n\r", ch, NULL,
	      NULL, TO_ROOM);
	 return;
      }

      if (IS_VAMPAFF (ch, VAM_WINGS))
      {
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_WINGS);
	 send_to_char ("You push your wings into your back.\n\r", ch);
	 act ("$n pushes $s wings into $s back.\n\r", ch, NULL, NULL,
	      TO_ROOM);
	 return;

      }
   }

   if (!str_cmp (arg1, "exoskeleton"))
   {

      if (!IS_VAMPAFF (ch, VAM_EXOSKELETON))
      {
	 SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_EXOSKELETON);
	 send_to_char ("Your skin is covered by a hard exoskeleton.\n\r", ch);
	 act ("$n's skin is covered by a hard exoskeleton!\n\r", ch, NULL,
	      NULL, TO_ROOM);
	 return;
      }

      if (IS_VAMPAFF (ch, VAM_EXOSKELETON))
      {
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_EXOSKELETON);
	 send_to_char
	    ("Your exoskeleton slowly disappears under your skin.\n\r", ch);
	 act ("$n's hard exoskeleton disappears under $s skin.\n\r", ch, NULL,
	      NULL, TO_ROOM);
	 return;

      }
   }

   if (!str_cmp (arg1, "tail"))
   {

      if (!IS_VAMPAFF (ch, VAM_TAIL))
      {
	 SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_TAIL);
	 send_to_char
	    ("Your spine extends out into a long, pointed tail.\n\r", ch);
	 act ("$n's spine extends to form a long pointed tail!\n\r", ch, NULL,
	      NULL, TO_ROOM);
	 return;
      }

      if (IS_VAMPAFF (ch, VAM_TAIL))
      {
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_TAIL);
	 send_to_char ("Your tail slowly retracts into your spine.\n\r", ch);
	 act ("$n's tail shrinks and vanishes into $s spine.\n\r", ch, NULL,
	      NULL, TO_ROOM);
	 return;

      }
   }

   if (!str_cmp (arg1, "head"))
   {

      if (!IS_VAMPAFF (ch, VAM_HEAD))
      {
	 SET_BIT (ch->pcdata->stats[UNI_AFF], VAM_HEAD);
	 send_to_char ("Your head transforms into that of a fierce lion.\n\r",
		       ch);
	 act ("$n's head transforms into that of a fierce lion!\n\r", ch,
	      NULL, NULL, TO_ROOM);
	 return;
      }

      if (IS_VAMPAFF (ch, VAM_HEAD))
      {
	 REMOVE_BIT (ch->pcdata->stats[UNI_AFF], VAM_HEAD);
	 send_to_char ("Your head slowly resumes it's normal form.\n\r", ch);
	 act ("$n's head resumes its normal form.\n\r", ch, NULL, NULL,
	      TO_ROOM);
	 return;

      }
   }




   /*
    * Generate usage message.
    */
   do_bonemod (ch, "");
   return;
}


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

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

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_ANIM) < 3)
   {
      send_to_char ("You require Animalism level 3 to pigeon.\n\r", ch);
      return;
   }
   if (arg1[0] == '\0')
   {
      send_to_char ("Pigeon which object?\n\r", ch);
      return;
   }

   if (arg2[0] == '\0')
   {
      send_to_char ("Pigeon what to whom?\n\r", ch);
      return;
   }
   if ((obj = get_obj_carry (ch, arg1)) == NULL)
   {
      send_to_char ("You are not carrying that item.\n\r", ch);
      return;
   }
   victim = get_char_world (ch, arg2);
   if ((victim = get_char_world (ch, arg2)) == NULL)
   {
      send_to_char ("They arent here.\n\r", ch);
      return;
   }

   if (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_TRANSPORT))
   {
      send_to_char ("They dont want anything transported to them.\n\r", ch);
      return;
   }
   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You are unable to transport anything to them.\n\r", ch);
      return;
   }
   if (IS_SET (obj->quest, QUEST_ARTIFACT))
   {
      stc ("That item is too heavy!\n\r", ch);
      return;

   }

   act ("You place $p in a pigeon's beak and it flies away.", ch, obj, NULL,
	TO_CHAR);
   act ("$n places $p in a pigeon's beak and it flies away.", ch, obj, NULL,
	TO_ROOM);
   obj_from_char (obj);
   obj_to_char (obj, victim);
   act ("A pigeon lands on your shoulders and flies away after handing you $p.", victim, obj, NULL, TO_CHAR);
   act ("A pigeon lands on $n's shoulders and flies away after handing him $p.", victim, obj, NULL, TO_ROOM);
   do_autosave (ch, "");
   do_autosave (victim, "");
   return;
}


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

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_ANIM) < 1)
   {
      send_to_char ("You require level 1 animalism to beckon the wild.\n\r",
		    ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("You can beckon a frog, a raven, a cat or a dog.\n\r",
		    ch);
      return;
   }

   if (ch->pcdata->followers > 5)
   {
      send_to_char ("Nothing happened.\n\r", ch);
      return;
   }

   if (!str_cmp (argument, "frog"))
   {
      victim = create_mobile (get_mob_index (MOB_VNUM_FROG));
      if (victim == NULL)
      {
	 send_to_char ("Error - please inform Infidel.\n\r", ch);
	 return;
      }
   }
   else if (!str_cmp (argument, "raven"))
   {
      victim = create_mobile (get_mob_index (MOB_VNUM_RAVEN));
      if (victim == NULL)
      {
	 send_to_char ("Error - please inform Infidel.\n\r", ch);
	 return;
      }
   }
   else if (!str_cmp (argument, "cat"))
   {
      victim = create_mobile (get_mob_index (MOB_VNUM_CAT));
      if (victim == NULL)
      {
	 send_to_char ("Error - please inform Infidel.\n\r", ch);
	 return;
      }
   }
   else if (!str_cmp (argument, "dog"))
   {
      victim = create_mobile (get_mob_index (MOB_VNUM_DOG));
      if (victim == NULL)
      {
	 send_to_char ("Error - please inform Infidel.\n\r", ch);
	 return;
      }
   }
   else
   {
      send_to_char ("Your can beckon a frog, a raven, a cat or a dog.\n\r",
		    ch);
      return;
   }

   act ("You whistle loudly and $N walks in.", ch, NULL, victim, TO_CHAR);
   act ("$n whistles loudly and $N walks in.", ch, NULL, victim, TO_ROOM);
   char_to_room (victim, ch->in_room);
   ch->pcdata->followers += 1;
   SET_BIT (victim->act, ACT_NOEXP);
   return;
}

void do_share (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))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_ANIM) < 4)
   {
      send_to_char
	 ("You must obtain at least level 4 in Animalism to use Share Spirits.\n\r",
	  ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
   {
      sprintf (buf, "You release %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 Share spirits with?\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 ("What an intelligent idea!\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 Share Spirits them.\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] < 25)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   ch->pcdata->condition[COND_THIRST] -= 25;
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You share your being with $N.", ch, NULL, victim, TO_CHAR);
   act ("$n is staring at you!", ch, NULL, victim, TO_VICT);
   act ("$n starts staring at $N", ch, NULL, victim, TO_NOTVICT);
   return;
}

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

    argument = one_argument (argument, arg);
*/

   if (IS_NPC (ch))
      return;


   if (get_disc(ch, VAM_ANIM) < 5)
   {
      send_to_char ("You need level 5 Animalism to use Frenzy.\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_CLASS(victim, CLASS_VAMPIRE) && arg[0] != '\0')
    {
	if ( victim->rage >= 25 )
	{
	    send_to_char("Their beast is already controlling them!\n\r",ch);
	    return;
	}

      if (number_percent ( )  <= 50)
	{
	    send_to_char("They shake off your attempt.\n\r",ch);
	    act("You shake off $n's attempt to frenzy you.\n\r",ch,NULL,victim,TO_VICT);
	    act("$N shakes off $n's attempt to frenzy $m.\n\r",ch,NULL,victim,TO_ROOM);
          return;
      }

      if (victim->beast == 0 )
	{
	  send_to_char("They are too calm to frenzy!\n\r",ch);
	  return;
	}

	if (!IS_VAMPAFF(victim, VAM_NIGHTSIGHT)) do_nightsight(victim,"");
	if (!IS_VAMPAFF(victim, VAM_FANGS)) do_fangs(victim,"");
	if (!IS_VAMPAFF(victim, VAM_CLAWS)) do_claws(victim,"");
      act("$n sends you into a frenzied rage!",ch,NULL,victim,TO_VICT);
	act("You excite the beast within $n!",victim,NULL,NULL,TO_CHAR);
	act("$n bares $s fangs and growls as $s inner beast consumes $m.",ch,NULL,NULL,TO_ROOM);
	ch->pcdata->stats[UNI_RAGE] += number_range(10,20);
	if (victim->beast > 0) do_beastlike(victim,"");
	WAIT_STATE(ch,12);
	return;
    }
   
    send_to_char("But they are already in a rage!\n\r",ch);
    return;
*/

   if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      if (ch->beast >= 20)
      {
	 if (ch->pcdata->stats[UNI_RAGE] >= ch->beast)
	 {
	    send_to_char ("Your beast is already controlling you.\n\r", ch);
	    return;
	 }
      }
      if (ch->beast <= 19)
      {
	 if (ch->pcdata->stats[UNI_RAGE] >= 20)
	 {
	    send_to_char ("Your beast is already controlling you.\n\r", ch);
	    return;
	 }
      }

/*
        if (ch->beast == 0)
	{
	   send_to_char("You are too calm to use frenzy.\n\r",ch);
	   return;
	}

*/

      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, "");
      send_to_char
	 ("You bare your fangs and growl as your inner beast consumes you.\n\r",
	  ch);
      act ("$n bares $s fangs and growls as $s inner beast consumes $m.", ch,
	   NULL, NULL, TO_ROOM);
      ch->pcdata->stats[UNI_RAGE] += number_range (20, 30);
      if (ch->beast > 0)
	 do_beastlike (ch, "");
      WAIT_STATE (ch, 12);
      return;
   }

   send_to_char ("But you are already in a rage!\n\r", ch);
   return;
}

void do_serenity (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("huh?.\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_ANIM) < 2)
   {
      send_to_char
	 ("You must obtain at least level 2 in Animalism to use Song of Serenity.\n\r",
	  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 chant a soft tune and pacify your inner beast.\n\r",
		    ch);
      act ("$n chants a soft tune and pacifies their 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;
   }
   else
   {
      send_to_char
	 ("Only those who achieve Golconda can sing the Song of Serenity.\n\r",
	  ch);
      return;
   }
}

void do_sharpen (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_STRING_LENGTH];
   OBJ_DATA *obj;
   argument = one_argument (argument, arg);
   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_MELP) < 3)
   {
      send_to_char ("You need Melpominee 3 to sharpen.\n\r", ch);
      return;
   }

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

   if ((obj = get_obj_carry (ch, arg)) == NULL)
   {
      send_to_char ("You dont have that weapon.\n\r", ch);
      return;
   }

   if (IS_SET (obj->quest, QUEST_ARTIFACT) || obj->item_type != ITEM_WEAPON)
   {
      send_to_char ("You cant sharpen that item.\n\r", ch);
      return;
   }

   if (obj->value[0] == 18000)
   {
      send_to_char ("This item is already Sharp!\n\r", ch);
      return;
   }

   if (obj->value[0] != 0)
   {
      send_to_char (" This weapon already has a power.\n\r", ch);
      return;
   }

   obj->value[0] = 18000;
   obj->value[1] = 20;
   obj->value[2] = 30;

   /*mite as well recycle the arg string */
   sprintf (arg, "You grind away at %s until it is razor sharp!\n\r",
	    obj->short_descr);
   send_to_char (arg, ch);
   sprintf (arg, "%s grinds away at %s until it is razor sharp!\n\r",
	    ch->name, obj->short_descr);
   act (arg, ch, NULL, NULL, TO_ROOM);
   return;
}


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

   char buf[MAX_STRING_LENGTH];
   char arg[MIL];
   int dam = 0;
   int bloodpool;
//       int chargen = ch->pcdata->stats[UNI_GEN];
//         int maxblood;

   argument = one_argument (argument, arg);
/*         
         if (chargen > 12)
            chargen = 12;
         maxblood = (13 - chargen) * 100;
         if (ch->pcdata->condition[COND_THIRST] >= maxblood)
            send_to_char ("Your blood thirst is sated.\n\r", ch);
*/
   if (ch->pcdata->stats[UNI_GEN] <= 0)
      ch->pcdata->stats[UNI_GEN] = 4;

   {
      if (IS_SET (ch->newbits, NEW_TIDE))
	 bloodpool = (3000 / ch->pcdata->stats[UNI_GEN]);
      else
	 bloodpool = (2000 / ch->pcdata->stats[UNI_GEN]);
   }

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_OBTE) < 5)
   {
      send_to_char ("You need level 5 Obtenebration to Lamprey.\n\r", ch);
      return;
   }

   if (arg[0] == '\0' && ch->fighting == NULL)
   {
      send_to_char ("Who do you wish to Call the Lamprey on?\n\r", ch);
      return;
   }

   if ((victim = ch->fighting) == NULL)
   {
      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 ("That would not be a good idea.\n\r", ch);
      return;
   }

/*
   if ((victim = ch->fighting) == NULL)
   {
      send_to_char ("You aren't fighting anyone.\n\r", ch);
      return;

   }
*/
   WAIT_STATE (ch, 5);


   if (!IS_NPC (victim))
   {
      dam = get_disc(ch, VAM_OBTE) * 20;
   }
   else if (IS_NPC (victim))
   {
      dam = get_disc(ch, VAM_OBTE) * 100;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   dam += number_range (1, 30);
   if (dam <= 0)
      dam = 1;


   sprintf (buf,
	    "Your tendrils of darkness hits $N incredibly hard! [%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf,
	    "$n's tendrils of darkness hits you incredibly hard![%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_VICT);
   sprintf (buf, "$n's tendrils of darkness hits $N incredibly hard![%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_NOTVICT);



   send_to_char ("\n\r", ch);
   victim->hit -= dam;

   if (!IS_NPC(victim))
   {
      if (is_garou (victim) && victim->gifts[GETOFFENRIS] >= 4)
      {
         stc ("Their blood is a deadly venom!\n\r", ch);
         ch->hit -= number_range (400, 500);
         return;
      }
      else if (IS_SET (victim->act, PLR_ACID))
      {
         send_to_char ("Their blood is a deadly acid!\n\r", ch);
         ch->hit -= 300;
         return;
      }
   }

   ch->pcdata->condition[COND_THIRST] += number_range (40, 50);
   if (ch->pcdata->condition[COND_THIRST] > bloodpool)
   {
      send_to_char ("Your bloodlust is sated.\n\r", ch);
      ch->pcdata->condition[COND_THIRST] = bloodpool;
   }
   return;
}


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

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


   if (get_disc(ch, VAM_OBTE) < 1)
   {
      send_to_char ("You need level 1 Obtenebration to use this power.\n\r",
		    ch);
      return;
   }

   if (IS_SET (ch->act, PLR_WIZINVIS))
   {
      REMOVE_BIT (ch->act, PLR_WIZINVIS);
      send_to_char ("You step out from the shadows.\n\r", ch);
      act ("$n emerges from the shadows.", ch, NULL, NULL, TO_ROOM);
   }
   else
   {
      send_to_char ("You slowly blend with the shadows.\n\r", ch);
      act ("$n blends in with the shadows and disappears.", ch, NULL, NULL,
	   TO_ROOM);
      SET_BIT (ch->act, PLR_WIZINVIS);
   }
   return;
}

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

   if (IS_NPC (ch))
      return;

   argument = one_argument (argument, arg);

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

   if (get_disc(ch, VAM_OBTE) < 4)
   {
      send_to_char
	 ("You must obtain at least level 4 in Obtenebration to use this power.\n\r",
	  ch);
      return;
   }

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


   if (arg[0] == '\0')
   {
      send_to_char ("Shadowstep to who?\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) && !IS_IMMUNE (victim, IMM_SUMMON))
   {
      send_to_char ("He doesnt want you near him!\n\r", ch);
      return;
   }

   if (ch == victim)
   {
      send_to_char ("But you're already at yourself!\n\r", ch);
      return;
   }

   if (IS_NPC (victim) && (!room_is_dark (victim->in_room)))
   {
      send_to_char ("You can't find a shadow in his room.\n\r", ch);
      return;
   }
   if (IS_SET (victim->in_room->room_flags, ROOM_CCHAMBER))
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You failed.\n\r", ch);
      return;
   }
   if (victim->in_room == ch->in_room)
   {
      send_to_char ("But you're already there!\n\r", ch);
      return;
   }

   char_from_room (ch);
   char_to_room (ch, victim->in_room);
   act ("You step into the shadows and appear before $N.", ch, NULL, victim,
	TO_CHAR);
   act ("$n appears out of the shadows before $N.", ch, NULL, victim,
	TO_NOTVICT);
   act ("$n appears from the shadows in front of you.", ch, NULL, victim,
	TO_VICT);
   do_look (ch, "auto");
   return;
}


void do_cauldron (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   int value;
   int dam;

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

   value = is_number (arg2) ? atoi (arg2) : -1;

   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_THAU) < 2)
   {
      send_to_char
	 ("You need at least level 2 Thaumaturgy to use this power.\n\r", ch);
      return;
   }


   if (arg1[0] == '\0')
   {
      send_to_char ("Whose blood do you wish to boil?\n\r", ch);
      return;
   }

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

   if (arg2[0] == '\0')
   {
      send_to_char ("How much blood do you want to use?\n\r", ch);
      return;
   }

   if (value > 200)
   {
      stc ("You can only use 200 blood on this power.\n\r", ch);
      return;
   }


   if (ch->pcdata->condition[COND_THIRST] < value)
   {
      send_to_char ("You don't have that much blood!\n\r", ch);
      return;
   }

   if (is_safe (ch, victim) == TRUE)
      return;

   if (IS_NPC (victim))
   {
      dam = (value * 4);
//        victim->hit = (victim->hit - dam);
      hurt_person (ch, victim, dam);

      ch->pcdata->condition[COND_THIRST] =
	 ch->pcdata->condition[COND_THIRST] - value;
      act ("$N screams in agony as $m blood begins to boil.", ch, NULL,
	   victim, TO_CHAR);
      act ("$N screams in agony as $n causes his blood to boil.", ch, NULL,
	   victim, TO_NOTVICT);
      act ("You scream in agony as $n causes your blood to boil.", ch, NULL,
	   victim, TO_VICT);
      WAIT_STATE (ch, 12);
      return;
   }

   if (!IS_NPC (victim))
   {
      dam = value * 1.5;
      hurt_person (ch, victim, dam);

//        victim->hit = (victim->hit - dam);
      if (victim->pcdata->condition[COND_THIRST] < value)
	 victim->pcdata->condition[COND_THIRST] = 1;
      victim->pcdata->condition[COND_THIRST] =
	 victim->pcdata->condition[COND_THIRST] - value;
      ch->pcdata->condition[COND_THIRST] =
	 ch->pcdata->condition[COND_THIRST] - value;
      act ("$N screams in agony as $m blood begins to boil.", ch, NULL,
	   victim, TO_CHAR);
      act ("$N screams in agony as $n causes his blood to boil.", ch, NULL,
	   victim, TO_NOTVICT);
      act ("You scream in agony as $n causes your blood to boil.", ch, NULL,
	   victim, TO_VICT);
      WAIT_STATE (ch, 12);
      return;
   }


}


void do_taste (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char buf[MAX_STRING_LENGTH];
   char age[MAX_STRING_LENGTH];
   char lin[MAX_STRING_LENGTH];
   char lord[MAX_STRING_LENGTH];
   char arg[MAX_INPUT_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_THAU) < 1)
   {
      send_to_char
	 ("You must obtain at least level 1 in Thaumaturgy to use Taste of Blood.\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_CLASS (victim, CLASS_VAMPIRE))
   {
      send_to_char ("Only useful on vampire targets.\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      send_to_char ("Only useful on vampire targets.\n\r", ch);
      return;
   }

   sprintf (buf, "You examine $N's blood carefully.\n\r");
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf, "$n examines your blood carefully.\n\r");
   act (buf, ch, NULL, victim, TO_VICT);
   sprintf (buf, "$n examines $N's blood carefully.\n\r");
   act (buf, ch, NULL, victim, TO_NOTVICT);


   send_to_char ("\n\r", ch);
   send_to_char ("\n\r", victim);


   if (victim->pcdata->rank == AGE_ANCILLA)
      sprintf (age, "Ancilla");
   else if (victim->pcdata->rank == AGE_CHILDE)
      sprintf (age, "Childe");
   else if (victim->pcdata->rank == AGE_NEONATE)
      sprintf (age, "Neonate");
   else if (victim->pcdata->rank == AGE_ELDER)
      sprintf (age, "Elder");
   else if (victim->pcdata->rank == AGE_METHUSELAH)
      sprintf (age, "Methuselah");
   if (victim->lord == NULL)
      sprintf (lord, "None");
   else
      sprintf (lord, "%s", victim->lord);
   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  Lord:%s\n\r",
	    victim->pcdata->stats[UNI_GEN],
	    victim->pcdata->condition[COND_THIRST], age, lord);
   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",
	    victim->pcdata->powers[VAM_ANIM],
	    victim->pcdata->powers[VAM_CELE],
	    victim->pcdata->powers[VAM_FORT]);
   send_to_char (buf, ch);
   sprintf (buf,
	    "Obtenebration:[%d]             Presence:   [%d]             Quietus: [%d]\n\r",
	    victim->pcdata->powers[VAM_OBTE],
	    victim->pcdata->powers[VAM_PRES],
	    victim->pcdata->powers[VAM_QUIE]);
   send_to_char (buf, ch);
   sprintf (buf,
	    "Thaumaturgy:  [%d]             Auspex:     [%d]             Dominate: [%d]\n\r",
	    victim->pcdata->powers[VAM_THAU],
	    victim->pcdata->powers[VAM_AUSP],
	    victim->pcdata->powers[VAM_DOMI]);
   send_to_char (buf, ch);
   sprintf (buf,
	    "Obfuscate:    [%d]             Potence:    [%d]             Protean: [%d]\n\r",
	    victim->pcdata->powers[VAM_OBFU],
	    victim->pcdata->powers[VAM_POTE],
	    victim->pcdata->powers[VAM_PROT]);
   send_to_char (buf, ch);
   sprintf (buf,
	    "Serpentis:    [%d]             Vicissitude:[%d]             Daimoinon: [%d]\n\r",
	    victim->pcdata->powers[VAM_SERP],
	    victim->pcdata->powers[VAM_VICI],
	    victim->pcdata->powers[VAM_DAIM]);
   send_to_char (buf, ch);
   sprintf (buf,
	    "Chimerstry:   [%d]             Obeah:      [%d]             Melpominee: [%d]\n\r",
	    victim->pcdata->powers[VAM_CHIM],
	    victim->pcdata->powers[VAM_OBEA],
	    victim->pcdata->powers[VAM_MELP]);
   send_to_char (buf, ch);
   sprintf (buf,
	    "Necromancy:   [%d]                                         Thanatosis: [%d]\n\r",
	    victim->pcdata->powers[VAM_NECR],
	    victim->pcdata->powers[VAM_THAN]);
   stc (buf, ch);
   send_to_char (lin, ch);

   return;
}

void do_tide (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_THAU) < 5)
   {
      send_to_char
	 ("You require level 5 Thaumaturgy to use Tide of Vitae.\n\r", ch);
      return;
   }

   if (ch->practice < 10)
   {
      send_to_char
	 ("You require at least 10 primal to use Tide of Vitae.\n\r", ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_TIDE))
   {
      send_to_char ("The tide is already with you.\n\r", ch);
      return;
   }
   SET_BIT (ch->newbits, NEW_TIDE);
   ch->practice -= 10;
   send_to_char ("You feel a tide of vitae rush over you.\n\r", ch);


}

void do_potency (CHAR_DATA * ch, char *argument)
{

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
/*
     if ( ch->pcdata->stats[UNI_GEN] >= 3 )
     {
	send_to_char("you are at your max generation!\n\r", ch);
	return;
}
*/
   if (get_disc(ch, VAM_THAU) < 3)
   {
      send_to_char
	 ("You must obtain at least level 3 in Thaumaturgy to use Blood Potency.\n\r",
	  ch);
      return;
   }
   if (IS_EXTRA (ch, EXTRA_POTENCY))
   {
      send_to_char ("Your blood is already potent.\n\r", ch);
      return;
   }
   if (ch->pcdata->condition[COND_THIRST] < 300)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   if (ch->pcdata->stats[UNI_GEN] <= 3)
   {
      send_to_char ("Your blood is as potent as it can get.\n\r", ch);
      return;
   }

   ch->pcdata->condition[COND_THIRST] =
      ch->pcdata->condition[COND_THIRST] - 300;
   ch->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] - 1;
   SET_BIT (ch->extra, EXTRA_POTENCY);
   send_to_char ("You feel your blood become more potent.\n\r", ch);
   return;

}

void do_conceal (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_STRING_LENGTH];
   char buf[MAX_STRING_LENGTH];
   OBJ_DATA *obj;
   one_argument (argument, arg);
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_OBFU) < 5)
   {
      send_to_char ("You need obfuscate 5 to conceal items.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Syntax: Conceal (item).\n\r", ch);
      return;
   }
   if ((obj = get_obj_carry (ch, arg)) == NULL)
   {
      send_to_char ("You dont have that item.\n\r", ch);
      return;
   }

   if (IS_SET (obj->quest, QUEST_ARTIFACT)
       || IS_SET (obj->quest, QUEST_RELIC))
   {
      stc ("Not on that object!!\n\r", ch);
      return;
   }

   if (IS_SET (obj->extra_flags, ITEM_INVIS))
   {
      sprintf (buf, "%s fades into existance.", obj->short_descr);
      send_to_char (buf, ch);
      act (buf, ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (obj->extra_flags, ITEM_INVIS);
      return;
   }
   if (!IS_SET (obj->extra_flags, ITEM_INVIS))
   {
      sprintf (buf, "%s fades out of existance.", obj->short_descr);
      send_to_char (buf, ch);
      act (buf, ch, NULL, NULL, TO_ROOM);
      SET_BIT (obj->extra_flags, ITEM_INVIS);
      return;
   }

   return;
}

void do_tendrils (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_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_SERP) < 4)
   {
      send_to_char
	 ("you need level 4 serpentis to use Arms of the Abyss.\n\r", ch);
      return;
   }

   if ((victim = ch->fighting) == NULL)
   {
      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 use Arms of the Abyss on yourself.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (victim, AFF_ETHEREAL))
   {
      send_to_char ("You cannot Arms of Abyss an ethereal person.\n\r", ch);
      return;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   if ((sn = skill_lookup ("tendrils")) < 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_tongue (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;

   char buf[MAX_STRING_LENGTH];

   int dam =0;
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_SERP) < 5)
   {
      send_to_char ("You need level 5 Serpentis to tongue.\n\r", ch);
      return;

      send_to_char ("You need level 5 Serpentis to tongue.\n\r", ch);
      return;
   }


   if ((victim = ch->fighting) == NULL)
   {
      send_to_char ("You aren't fighting anyone.\n\r", ch);
      return;

   }
   WAIT_STATE (ch, skill_table[gsn_kick].beats);

   if (!IS_NPC (victim))
   {
      dam = get_disc(ch, VAM_SERP) * 25;
   }
   else if (IS_NPC (victim))
   {
      dam = get_disc(ch, VAM_SERP) * 125;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   dam += number_range (1, 30);
   dam += char_damroll (ch);
   dam += number_range(ch->damcap[0]/6, ch->damcap[0]/3);
   if (dam <= 0)
      dam = 1;
   sprintf (buf,
	    "Your tongue of the serpent hits $N incredibly hard! [%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf,
	    "$n's tongue of the serpent hits you incredibly hard! [%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_VICT);
   sprintf (buf,
	    "$n's tongue of the serpent hits $N incredibly hard! [%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_NOTVICT);


   send_to_char ("\n\r", ch);
   //victim->hit -= dam;
   hurt_person (ch, victim, dam);
   return;
}


void do_poison (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_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_SERP) < 3)
   {
      send_to_char
	 ("You must obtain at least level 3 in Serpentis to use Poison.\n\r",
	  ch);
      return;
   }

   if (((obj = get_eq_char (ch, WEAR_WIELD)) == NULL)
       && ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL)
       && ((obj = get_eq_char (ch, WEAR_DUAL)) == NULL))
   {
      send_to_char ("You must wield the weapon you wish to poison.\n\r", ch);
      return;
   }

   if (obj->value[0] != 0)
   {
      send_to_char ("This weapon cannot be poisoned.\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 15)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   ch->pcdata->condition[COND_THIRST] -= number_range (5, 15);
   act ("You run your tongue along $p, poisoning it.", ch, obj, NULL,
	TO_CHAR);
   act ("$n runs $s tongue along $p, poisoning it.", ch, obj, NULL, TO_ROOM);
   obj->value[0] = 53;
   obj->timer = number_range (10, 20);

   return;
}

void do_objmask (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;
   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_VAMPIRE))
   {
      stc ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_CHIM) < 5)
   {
      stc ("You must obtain level 5 Chimerstry to Mask an Object.\n\r", ch);
      return;
   }

   if (IS_VAMPAFF (ch, VAM_CHANGED))
   {
      send_to_char ("You can't objectmask while changed.\n\r", ch);
      return;
   }
   if (IS_POLYAFF (ch, POLY_SERPENT))
   {
      send_to_char ("You cannot objectmask from this form.\n\r", ch);
      return;
   }

   if (IS_SET (ch->flag2, VAMP_OBJMASK))
   {
      stc ("You return to your normal form.\n\r", ch);
      sprintf (buf, "%s transforms back into %s.\n\r", ch->morph, ch->name);
      act (buf, ch, NULL, NULL, TO_ROOM);
      ch->morph = str_dup ("");
      ch->objdesc = str_dup ("");
      ch->long_descr = str_dup ("");
      ch->short_descr = str_dup (ch->name);
      REMOVE_BIT (ch->flag2, VAMP_OBJMASK);
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      return;
   }

   if (has_timer (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] -= number_range (40, 50);

   if (arg[0] == '\0')
   {
      stc ("What object do you wish to mask yourself as?\n\r", ch);
      return;
   }

   if ((obj = get_obj_here (ch, arg)) == NULL)
   {
      send_to_char ("That object is not here.\n\r", ch);
      return;
   }

   SET_BIT (ch->flag2, VAMP_OBJMASK);
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   act ("You mask yourself as $p.", ch, obj, NULL, TO_CHAR);

   sprintf (buf, "%s masks themself as %s.\n\r", ch->name, obj->short_descr);
   act (buf, ch, NULL, NULL, TO_ROOM);
   free_string (ch->morph);
   sprintf (buf, "(%s) %s", ch->name, obj->short_descr);
   ch->morph = str_dup (buf);
//    ch->morph = str_dup(obj->short_descr);
   free_string (ch->objdesc);
   ch->objdesc = str_dup (obj->description);
   ch->long_descr = str_dup ("");
   return;
}

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

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      stc ("Huh?\n\r", ch);
      return;
   }
   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while you're in the arena.\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_CHIM) < 1)
   {
      stc ("You must obtain level 1 Chimersty to use Mirror Image.\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 20)
   {
      stc ("You do not have enough blood to create a Mirror Image of yourself.\n\r", ch);
      return;
   }

   if (ch->pcdata->followers > 4)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }

   ch->pcdata->followers++;


   victim = create_mobile (get_mob_index (30000));
   victim->short_descr = str_dup (ch->name);
   sprintf (buf, "%s is hovering here.\n\r", ch->name);
   victim->long_descr = str_dup (buf);
   victim->name = str_dup (ch->name);
   victim->level = 20;
   victim->max_hit = 2000;
   victim->hit = 2000;
   victim->mana = 2000;
   victim->max_mana = 2000;
   victim->max_move = 2000;
   victim->move = 2000;
   SET_BIT (victim->flag2, VAMP_CLONE);
   SET_BIT (victim->act, ACT_NOEXP);
   ch->pcdata->condition[COND_THIRST] -= 20;
   char_to_room (victim, ch->in_room);
   act ("You concentrate your powers and form a mirror image ofyourself.", ch,
	NULL, victim, TO_CHAR);
   act ("$n waves $s hands and a mirror image of $mself appears.", ch, NULL,
	victim, TO_ROOM);
   return;

}

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

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS( ch, CLASS_MAGE) )
   {
      stc ("Huh?\n\r", ch);
      return;
   }
   else if (!IS_CLASS (ch, CLASS_VAMPIRE) && IS_CLASS (ch, CLASS_MAGE) )
      do_controlweather(ch, argument);

   one_argument (argument, arg);

   if (get_disc(ch, VAM_CHIM) < 4)
   {
      stc ("You must obtain level 4 Chimerstry to use Control the Clone.\n\r",
	   ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Which clone do you wish to control?\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))
   {
      stc ("Not on players.\n\r", ch);
      return;
   }

   if (!IS_SET (victim->flag2, VAMP_CLONE))
   {
      stc ("That is not a clone.\n\r", ch);
      return;
   }

   if ((familiar = ch->pcdata->familiar) != NULL)
      familiar->wizard = NULL;
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You take control of $N's mind.", ch, NULL, victim, TO_CHAR);
   act ("$n takes control of $N's mind.", ch, NULL, victim, TO_ROOM);

   return;
}


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

   if (IS_NPC (ch))
      return;

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

   if (is_inarena (ch))
   {
      stc ("Not while in the arena!\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_CHIM) < 2)
   {
      stc ("You must obtain level 3 Chimersty to Form an Illusion of yourself.\n\r", ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 30)
   {
      stc ("You do not have enough blood to Form an Illusion of yourself.\n\r", ch);
      return;
   }

   if (ch->pcdata->followers > 4)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }

   ch->pcdata->followers++;


   victim = create_mobile (get_mob_index (30000));
   char short_rename_buf[5000];
    sprintf (short_rename_buf, "a shadow of %s", ch->name);
   victim->short_descr = str_dup (short_rename_buf);
   sprintf (buf, "%s is hovering here.\n\r", short_rename_buf);
   victim->long_descr = str_dup (buf);
   sprintf(short_rename_buf, "%s shadow", ch->name);
   victim->name = str_dup (short_rename_buf);
   victim->level = 200;
   victim->max_hit = ch->max_hit;
   victim->hit = victim->max_hit;
   victim->max_mana = ch->max_mana;
   victim->mana = victim->max_mana;
   victim->max_move = ch->max_move;
   victim->move = victim->max_move;
   victim->hitroll = ch->hitroll;
   victim->damroll = ch->damroll;
   SET_BIT (victim->flag2, VAMP_CLONE);
   SET_BIT (victim->act, ACT_NOEXP);
   victim->spec_fun = 0;
   char_to_room (victim, ch->in_room);
   ch->pcdata->condition[COND_THIRST] -= 30;
   act ("You concentrate your powers and form an illusion of yourself.", ch,
	NULL, victim, TO_CHAR);
   act ("$n waves $s hands and splits in two.", ch, NULL, victim, TO_ROOM);
   return;

}

void do_clone (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   OBJ_INDEX_DATA *pObjIndex;
   OBJ_DATA *obj;
   OBJ_DATA *obj2;
   AFFECT_DATA *paf;
   AFFECT_DATA *paf2;

   argument = one_argument (argument, arg1);
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_FAE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_CHIM) < 3 && IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("You need Chimeristry 3 to clone objects.\n\r", ch);
      return;
   }
   else if (get_disc(ch, FAE_LEGE) < 3 && IS_CLASS(ch, CLASS_FAE))
   {
      stc ("You need Legerdemain 3 to use Effigy.\n\r", ch);
      return;
   }



   if (arg1[0] == '\0')
   {
      send_to_char ("Make a clone of what object?\n\r", ch);
      return;
   }

   if ((obj = get_obj_carry (ch, arg1)) == NULL)
   {
      send_to_char ("You dont have that item.\n\r", ch);
      return;
   }

   if (obj->points > 0
       || IS_SET (obj->quest, QUEST_ARTIFACT)
       || IS_SET (obj->quest, QUEST_RELIC)
       || IS_SET (obj->quest, ITEM_EQUEST)
       || obj->item_ver > IV_NORMAL
       || (obj->chobj) != NULL
       || obj->item_type == ITEM_QUEST
       || obj->item_type == ITEM_PIECE
       || obj->item_type == ITEM_QUESTCARD
       || obj->item_type == ITEM_ETOKEN
       || obj->item_type == ITEM_AMMO
       || obj->item_type == ITEM_STOKEN
       || IS_SET (obj->spectype, SITEM_TRANSPORTER)
       || IS_SET (obj->spectype, SITEM_TELEPORTER))

   {

      send_to_char ("You cant clone that object.\n\r", ch);
      return;
   }

   if (IS_SET (obj->quest, QUEST_CLONED))
   {
      stc ("You are unable to make clones of clones\n\r", ch);
      return;
   }

   pObjIndex = get_obj_index (obj->pIndexData->vnum);
   obj2 = create_object (pObjIndex, obj->level);
   /* Copy any changed parts of the object. */
   free_string (obj2->name);
   obj2->name = str_dup (obj->name);
   free_string (obj2->short_descr);
   obj2->short_descr = str_dup (obj->short_descr);
   free_string (obj2->description);
   obj2->description = str_dup (obj->description);

   if (obj->questmaker != NULL && strlen (obj->questmaker) > 1)
   {
      free_string (obj2->questmaker);
      obj2->questmaker = str_dup (obj->questmaker);
   }

   if (obj->chpoweron != NULL)
   {
      free_string (obj2->chpoweron);
      obj2->chpoweron = str_dup (obj->chpoweron);
   }
   if (obj->chpoweroff != NULL)
   {
      free_string (obj2->chpoweroff);
      obj2->chpoweroff = str_dup (obj->chpoweroff);
   }
   if (obj->chpoweruse != NULL)
   {
      free_string (obj2->chpoweruse);
      obj2->chpoweruse = str_dup (obj->chpoweruse);
   }
   if (obj->victpoweron != NULL)
   {
      free_string (obj2->victpoweron);
      obj2->victpoweron = str_dup (obj->victpoweron);
   }
   if (obj->victpoweroff != NULL)
   {
      free_string (obj2->victpoweroff);
      obj2->victpoweroff = str_dup (obj->victpoweroff);
   }
   if (obj->victpoweruse != NULL)
   {
      free_string (obj2->victpoweruse);
      obj2->victpoweruse = str_dup (obj->victpoweruse);
   }
   SET_BIT (obj2->extra_flags, ITEM_VAMPCLONE);
   obj2->item_type = obj->item_type;
   obj2->extra_flags = obj->extra_flags;
   obj2->wear_flags = obj->wear_flags;
   obj2->weight = obj->weight;
   obj2->spectype = obj->spectype;
   obj2->specpower = obj->specpower;
   obj2->condition = obj->condition;
   obj2->toughness = obj->toughness;
   obj2->resistance = obj->resistance;
   obj2->quest = obj->quest;
   obj2->points = obj->points;
   obj2->cost = obj->cost;
   obj2->value[0] = obj->value[0];
   obj2->value[1] = obj->value[1];
   obj2->value[2] = obj->value[2];
   obj2->value[3] = obj->value[3];
    /*****************************************/
   obj_to_char (obj2, ch);

   if (obj->affected != NULL)
   {
      for (paf = obj->affected; paf != NULL; paf = paf->next)
      {
	 if (affect_free == NULL)
	    paf2 = alloc_perm (sizeof (*paf));
	 else
	 {
	    paf2 = affect_free;
	    affect_free = affect_free->next;
	 }
	 paf2->type = 0;
	 paf2->duration = paf->duration;
	 paf2->location = paf->location;
	 paf2->modifier = paf->modifier;
	 paf2->bitvector = 0;
	 paf2->next = obj2->affected;
	 obj2->affected = paf2;
      }
   }
   obj2->timer = get_disc(ch, VAM_CHIM) * 2;
   SET_BIT (obj2->quest, QUEST_CLONED);
   act ("A clone of $p appears in your hands in a flash of light.", ch, obj,
	NULL, TO_CHAR);
   act ("A clone of $p appears in $n's hands in a flash of light.", ch, obj,
	NULL, TO_ROOM);
   if (obj->questmaker != NULL)
      free_string (obj->questmaker);
   obj->questmaker = str_dup (ch->name);
   WAIT_STATE (ch, 16);
   return;
}

void do_bloodwater (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg1[MAX_INPUT_LENGTH];
   int dam = 0;

   argument = one_argument (argument, arg1);


   if (IS_NPC (ch))
      return;


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

   if (IS_AFFECTED (ch, AFF_STEELSHIELD))
      do_majesty (ch, "");
   if (get_disc(ch, VAM_NECR) < 1)
   {
      send_to_char
	 ("You need at least level 1 Necromancy to use Blood Water.\n\r", ch);
      return;
   }


   if (arg1[0] == '\0')
   {
      send_to_char ("Whose blood do you wish to turn to water?\n\r", ch);
      return;
   }

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

   if (victim->hit <= -10)
   {
      stc ("They are already mortally wounded!\n\r", ch);
      return;
   }
   if (IS_NPC (victim) && victim->position == POS_STANDING)
      multi_hit (victim, ch, TYPE_UNDEFINED);

   if (is_safe (ch, victim) == TRUE)
      return;
   if (IS_NPC (victim))
      dam = 2500;
   if (!IS_NPC (victim))
      dam = 1000;
   if (!IS_CLASS (victim, CLASS_VAMPIRE))
      hurt_person (ch, victim, dam);
//     victim->hit -= dam;
//   if (dam > victim->hit)
//   {
//      victim->hit = -10;
//      update_pos (victim);
//   }
   act ("$N screams in agony as you turn his blood to water.", ch, NULL,
	victim, TO_CHAR);
   act ("$N screams in agony as $n turns his blood to water.", ch, NULL,
	victim, TO_NOTVICT);
   act ("You scream in agony as $n turns your blood to water.", ch, NULL,
	victim, TO_VICT);

   if (!IS_CLASS (victim, CLASS_VAMPIRE))
      WAIT_STATE (ch, 12);

   if (IS_CLASS (victim, CLASS_VAMPIRE))
   {
      WAIT_STATE (ch, 6);
      victim->pcdata->condition[COND_THIRST] -= 150;
   }
   return;
}

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

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE)
       && (!WORN_ARTIFACT (ch, ARTI_RING_AURELIUS)))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_PRES) < 2)
   {
      send_to_char ("You require presence 2 to Mindblast.\n\r", ch);
      return;
   }

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

   if ((victim = ch->fighting) == NULL)
   {
      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 Mindblast yourself!\n\r", ch);
      return;
   }
   if (IS_SET (victim->in_room->room_flags, ROOM_SAFE))
   {
      send_to_char ("You cannot attack them here.\n\r", ch);
      return;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   if (victim->hit < victim->max_hit)
   {
      send_to_char ("They are hurt and alert.\n\r", ch);
      return;
   }


   act ("You close your eyes and concentrate on $N.", ch, NULL, victim,
	TO_CHAR);
   act ("$n closes $s eyes and concentrates on you.", ch, NULL, victim,
	TO_VICT);
   act ("$n closes $s eyes and concentrates on $N.", ch, NULL, victim,
	TO_NOTVICT);
   WAIT_STATE (ch, 12);
   if (number_percent () < 50)
      dam = number_range (1, 4);
   else
   {
      dam = 0;
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   dam += char_damroll (ch);
   if (dam == 0)
      dam = 1;
   if (!IS_AWAKE (victim))
      dam *= 2;

   if (dam <= 0)
      dam = 1;
   victim->hit -= dam;

   act ("You clutch your head in agony!", victim, NULL, NULL, TO_CHAR);
   act ("$n clutches his head in agony!", victim, NULL, NULL, TO_ROOM);
   victim->position = POS_STUNNED;
   if (IS_NPC (victim) && victim->hit < 0)
   {
      raw_kill (victim, ch);
      return;
   }
   if (!IS_NPC (victim) && victim->hit < -2)
      update_pos (ch);
   return;
}


void do_entrance (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   int sn;
   int level;
   int spelltype;
   char buf[MAX_STRING_LENGTH];
   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE)
       && (!WORN_ARTIFACT (ch, ARTI_RING_AURELIUS)))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_PRES) < 3)
   {
      send_to_char ("You need presence 3 to entrance.\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 entrance yourself.\n\r", ch);
      return;
   }

   if (IS_AFFECTED (victim, AFF_ETHEREAL))
   {
      send_to_char ("You cannot entrance an ethereal person.\n\r", ch);
      return;
   }
   if (is_safe (ch, victim) == TRUE)
      return;
   sprintf (buf, "A look of concentration crosses your face.");
   act (buf, ch, NULL, NULL, TO_CHAR);
   sprintf (buf, "A look of concentration crosses over $n's face.\n\r");
   act (buf, ch, NULL, victim, TO_ROOM);

   if ((sn = skill_lookup ("charm")) < 0)
      return;
   spelltype = skill_table[sn].target;
   level = get_disc(ch, VAM_PRES) * 40;
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   return;
}


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

   argument = one_argument (argument, arg);

   if (arg[0] == '\0')
   {
      send_to_char ("Summon whom?\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_CLASS (ch, CLASS_VAMPIRE)
       && (!WORN_ARTIFACT (ch, ARTI_RING_AURELIUS)))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (victim == ch
       || victim->in_room == NULL
       || IS_SET (victim->in_room->room_flags, ROOM_SAFE)
       || IS_SET (victim->in_room->room_flags, ROOM_PRIVATE)
       || IS_SET (victim->in_room->room_flags, ROOM_SOLITARY)
       || IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL)
       || victim->level >= ch->level + 5
       || victim->fighting != NULL
       || (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON)))

   {
      send_to_char ("You cannot locate them.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_PRES) < 4)
   {
      send_to_char ("You need level 4 in Presence to use this.\n\r", ch);
      return;
   }
   WAIT_STATE (ch, 10);
   act ("$n disappears suddenly.", victim, NULL, NULL, TO_ROOM);
   char_from_room (victim);
   char_to_room (victim, ch->in_room);
   act ("$n arrives suddenly.", victim, NULL, NULL, TO_ROOM);
   act ("$N has summoned you!", victim, NULL, ch, TO_CHAR);
   do_look (victim, "auto");
   if ((mount = victim->mount) == NULL)
      return;
   char_from_room (mount);
   char_to_room (mount, get_room_index (victim->in_room->vnum));
   do_look (mount, "auto");
   return;
}

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

   if (!IS_CLASS (ch, CLASS_VAMPIRE)
       && (!WORN_ARTIFACT (ch, ARTI_RING_AURELIUS)))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_PRES) < 1)
   {
      send_to_char
	 ("You must obtain at least level 1 in Presence to use Awe.\n\r", ch);
      return;
   }
   if (IS_EXTRA (ch, EXTRA_AWE))
   {
      REMOVE_BIT (ch->extra, EXTRA_AWE);
      send_to_char ("You are no longer Awe Inspiring.\n\r", ch);
      act ("$n is no longer awe inspiring.", ch, NULL, NULL, TO_ROOM);
      return;
   }
   SET_BIT (ch->extra, EXTRA_AWE);
   send_to_char ("You are now Awe Inspiring.\n\r", ch);
   act ("$n is now awe inspiring", ch, NULL, NULL, TO_ROOM);
   return;


}

void do_majesty (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MSL];
   smash_tilde (argument);
   argument = one_argument (argument, arg1);
   strcpy (arg2, argument);

   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_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 (!IS_CLASS (ch, CLASS_VAMPIRE)
       && (!WORN_ARTIFACT (ch, ARTI_RING_AURELIUS)))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_PRES) < 5)
   {
      send_to_char
	 ("You must obtain at least level 5 in Presence to use Majesty.\n\r",
	  ch);
      return;
   }

   if (has_timer (ch))
      return;

   if (IS_AFFECTED (ch, AFF_STEELSHIELD))
   {
      REMOVE_BIT (ch->affected_by, AFF_STEELSHIELD);
      act ("You lower your majesty.", ch, NULL, NULL, TO_CHAR);
      act ("$n looks less imposing.", ch, NULL, NULL, TO_NOTVICT);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      if (ch->pcdata->condition[COND_THIRST] < 45)
      {
	 send_to_char ("You have insufficient blood.\n\r", ch);
	 return;
      }

      ch->pcdata->condition[COND_THIRST] -= number_range (35, 45);
   }

   if (ch->pcdata->majesty > 0)
   {
      if (ch->pcdata->majesty > 1)
	 sprintf (buf,
		  "You cannot raise your Majesty for another %d seconds.\n\r",
		  ch->pcdata->majesty);
      else
	 sprintf (buf,
		  "You cannot raise your Majesty for another 1 second.\n\r");
      send_to_char (buf, ch);
      return;
   }

   SET_BIT (ch->affected_by, AFF_STEELSHIELD);
   act ("You raise your majesty.", ch, NULL, NULL, TO_CHAR);
   act ("$n suddenly looks very imposing.", ch, NULL, NULL, TO_NOTVICT);
   ch->pcdata->majesty = 60;
   return;
}

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

   one_argument (argument, arg);

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && !IS_CLASS (ch, CLASS_MAGE) && !IS_CLASS( ch, CLASS_WRAITH))
   {
      stc ("Huh?\n\r", ch);
      return;
   }
 
    if ( IS_CLASS( ch, CLASS_WRAITH) &&  ch->arcanoi[WLIFE] < 3 )
    {
        stc("You do not have that power yet.\n\r", ch );
        return;
    }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_AUSP) < 3)
   {
      stc ("You must obtain level 3 Auspex to use Unveil the Shrouded Mind.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MAGE) && ch->spheres[MMIN] < 3)
   {
      stc ("You must obtain level three Mind to use Probe Thoughts.\n\r", ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Whose mind do you wish to Unveil?\n\r", ch);
      return;
   }

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

   if (victim == ch)
   {
      stc ("Why would you want to unveil your own mind?\n\r", ch);
      return;
   }

   if (victim->level > ch->level)
   {
      stc ("Their mind is far too powerful for you to Unveil.\n\r", ch);
      return;
   }

   if (victim->spl[BLUE_MAGIC] > ch->spl[BLUE_MAGIC] / 2)
   {
      stc ("Their mind is far too powerful for you to Unveil.\n\r", ch);
      return;
   }

   victim->unveil = ch;
   act ("You gaze deeply into $N's eyes.\n\rYou have unveiled $S mind.\n\r",
	ch, NULL, victim, TO_CHAR);
   return;
}

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

   if (IS_NPC (ch))
      return;

   argument = one_argument (argument, arg);

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

   if (get_disc(ch, VAM_AUSP) < 4)
   {
      send_to_char ("You must obtain level 4 Auspex to use Astral Walk.\n\r",
		    ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Astral Walk to who?\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }
   if ((victim = get_char_world (ch, arg)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }

   if (victim == ch
       || (IS_NPC (victim) && victim->level > 150)
       || (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON))
       || victim->in_room == NULL
       || IS_SET (victim->in_room->room_flags, ROOM_GOD)
       || victim->in_room == ch->in_room)
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   if (IS_SET (victim->in_room->room_flags, ROOM_CCHAMBER))
   {
      stc ("You failed\n\r", ch);
      return;
   }
   if (IS_NPC (victim) && IS_SET (victim->in_room->area->aflags, AFLAG_HQ))
   {
      stc ("You failed.\n\r", ch);
      return;
   }

   char_from_room (ch);
   char_to_room (ch, victim->in_room);
   act ("You step through a rift in the Astral plane.\n\rYou leap out of the Astral Plane before $N.", ch, NULL, victim, TO_CHAR);
   act ("$n leaps out of a rift in the Astral Plane.", ch, NULL, victim,
	TO_NOTVICT);
   act ("$n leaps out of a rift in the Astral Plane.", ch, NULL, victim,
	TO_VICT);
   do_look (ch, "auto");
   return;
}

void do_dragonform (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))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_VICI) < 4)
   {
      send_to_char
	 ("You must obtain at least level 4 in Vicissitude to use Dragonform\n\r",
	  ch);
      return;
   }


   if (!IS_POLYAFF (ch, POLY_ZULO))
   {
      send_to_char ("You can only Dragonform while in Zuloform.\n\r", ch);
      return;
   }

   if (IS_EXTRA (ch, EXTRA_DRAGON))
   {
      REMOVE_BIT (ch->extra, EXTRA_DRAGON);
      act ("You transform back into zuloform.", ch, NULL, NULL, TO_CHAR);
      act ("$n shrinks back into a big black monster.", ch, NULL, NULL,
	   TO_ROOM);
      ch->max_hit = ch->max_hit - 500;
      ch->hit = ch->hit - 500;
      ch->damroll -= 200;
      ch->hitroll -= 200;
      if (ch->hit < 1)
	 ch->hit = 1;
      sprintf (buf, "%s the huge black monster", ch->name);
      free_string (ch->morph);
      ch->morph = str_dup (buf);
      return;
   }
   /*

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

   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
//ch->pcdata->condition[COND_THIRST] -= number_range(200,400);
   act ("You transform into a large dragon!", ch, NULL, NULL, TO_CHAR);
   act ("$n's body grows and distorts into a large dragon.", ch, NULL,
	NULL, TO_ROOM);
   SET_BIT (ch->extra, EXTRA_DRAGON);
   sprintf (buf, "%s the huge rabid dragon", ch->name);
   free_string (ch->morph);
   ch->morph = str_dup (buf);
   ch->max_hit = ch->max_hit + 500;
   ch->hit = ch->hit + 500;
//ch->damroll = ch->damroll * 1.2;
//ch->hitroll = ch->hitroll * 1.2;
   ch->damroll += 200;
   ch->hitroll += 200;
   return;
}

/*
void do_plasma( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    
     if ( IS_NPC(ch) )
	return;
 
	if (ch->fight_timer >0) {
        send_to_char("Not until your fight timer expires.\n\r", ch );
        return;}

    if (ch->in_room->area->owned > 0 && ch->in_room->area->owned != ch->pcdata->kingdom) 
    {
        stc("Not in someone elses HQ\n\r", ch);
        return;
    }
    if (!IS_CLASS(ch, CLASS_VAMPIRE)) 
    {
	send_to_char("Huh?\n\r", ch);
	return;
    }

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

  if ((obj = create_object(get_obj_index( 30007),60)) == NULL)
    {
        send_to_char( "Error - Please inform Maser.\n\r", ch);
	return;
    }

    if ( IS_EXTRA(ch, EXTRA_PLASMA) )
    {
      ch->pcdata->obj_vnum = 0;
      REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
      REMOVE_BIT(ch->extra, EXTRA_PLASMA);
      ch->pcdata->chobj = NULL;
      obj->chobj = NULL;
      free_string(ch->morph);
      ch->morph = str_dup("");
      act("$p transforms into $n.",ch,obj,NULL,TO_ROOM);
      act("You reform your human body.",ch,obj,NULL,TO_CHAR);
      extract_obj( obj );
      return;
                
    }
    
    if ( IS_AFFECTED(ch, AFF_POLYMORPH) )
    {
	send_to_char( "Not while polymorphed.\n\r", ch );
	return;
    }
    act("$n transforms into $p and splashes to the ground.",ch,obj,NULL,TO_ROOM);
    act("You transform into $p and splashes to the ground.",ch,obj,NULL,TO_CHAR);
    ch->pcdata->obj_vnum = ch->pcdata->powers[VPOWER_OBJ_VNUM];
    obj->chobj = ch;
    ch->pcdata->chobj = obj;
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->extra, EXTRA_OSWITCH);
    SET_BIT(ch->extra, EXTRA_PLASMA);
    free_string(ch->morph);
    ch->morph = str_dup("a pool of blood");
    obj_to_room(obj,ch->in_room);
    return;
}
*/
void do_plasma (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) || IS_HEAD (ch, LOST_HEAD))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }
   if (ch->in_room->vnum == ROOM_VNUM_ALTAR)
   {
      stc ("Not in this room sorry!\n\r", ch);
      return;
   }
   if (ch->in_room->area->owned > 0
       && ch->in_room->area->owned != ch->pcdata->kingdom)
   {
      stc ("Not in someone elses HQ\n\r", ch);
      return;
   }
   if (IS_SET (ch->war, WARRING))
   {
      stc ("Not while in a war!\n\r", ch);
      return;
   }
   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while you're in the arena.\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_VICI) < 5)
   {
      send_to_char
	 ("You require level 5 Vicissitude to change into Plasma Form.\n\r",
	  ch);
      return;
   }

   if (!IS_SET (ch->extra, EXTRA_PLASMA) && IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("Not from this form.\n\r", ch);
      return;
   }

   if ((obj = ch->pcdata->chobj) != NULL && IS_EXTRA (ch, EXTRA_OSWITCH))
   {
      ch->pcdata->obj_vnum = 0;
      obj->chobj = NULL;
      ch->pcdata->chobj = NULL;
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT (ch->extra, EXTRA_OSWITCH);
      REMOVE_BIT (ch->extra, EXTRA_PLASMA);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      act ("$p transforms into $n.", ch, obj, NULL, TO_ROOM);
      act ("You reform your human body.", ch, obj, NULL, TO_CHAR);
      extract_obj (obj);
      if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
      {
	 char_from_room (ch);
	 char_to_room (ch, get_room_index (ROOM_VNUM_HELL));
      }
      return;
   }
   if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cannot do this while polymorphed.\n\r", ch);
      return;
   }
   if ((obj = create_object (get_obj_index (OBJ_VNUM_SPILT_BLOOD), 0)) ==
       NULL)
   {
      send_to_char ("Bug - please inform KaVir.\n\r", ch);
      return;
   }
   ch->stimer = 60;
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   obj_to_room (obj, ch->in_room);
   act ("$n transforms into $p and splashes to the ground.", ch, obj, NULL,
	TO_ROOM);
   act ("You transform into $p and splash to the ground.", ch, obj, NULL,
	TO_CHAR);
   if (IS_EXTRA (ch, TIED_UP))
   {
      act ("The ropes binding you fall through your liquid form.", ch, NULL,
	   NULL, TO_CHAR);
      act ("The ropes binding $n fall through $s liquid form.", ch, NULL,
	   NULL, TO_ROOM);
      REMOVE_BIT (ch->extra, TIED_UP);
      REMOVE_BIT (ch->extra, GAGGED);
      REMOVE_BIT (ch->extra, BLINDFOLDED);
   }
   ch->pcdata->obj_vnum = OBJ_VNUM_SPILT_BLOOD;
   obj->chobj = ch;
   ch->pcdata->chobj = obj;
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   SET_BIT (ch->extra, EXTRA_OSWITCH);
   SET_BIT (ch->extra, EXTRA_PLASMA);
   free_string (ch->morph);
   ch->morph = str_dup (obj->short_descr);
   return;
}
void do_bloodagony (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_STRING_LENGTH];
   int value;
   int pcost;
   OBJ_DATA *obj;
   one_argument (argument, arg);


   value = get_disc(ch, VAM_QUIE);
   pcost = get_disc(ch, VAM_QUIE) * 60;

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_QUIE) < 3)
   {
      send_to_char ("You need level 3 Quietus to use bloodagony.\n\r", ch);
      return;
   }

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

   if ((obj = get_obj_carry (ch, arg)) == NULL)
   {
      send_to_char ("You dont have that weapon.\n\r", ch);
      return;
   }


   if (obj->item_type != ITEM_WEAPON
       || IS_SET (obj->quest, QUEST_ARTIFACT)
       || obj->chobj != NULL || IS_SET (obj->quest, QUEST_BLOODA))
   {
      send_to_char ("You are unable to bloodagony this weapon.\n\r", ch);
      return;
   }
   ch->pcdata->quest += pcost;
   obj->points -= pcost;
   oset_affect (ch, obj, value, APPLY_DAMROLL, TRUE);
   oset_affect (ch, obj, value, APPLY_HITROLL, TRUE);
   SET_BIT (obj->quest, QUEST_BLOODA);

   act ("You cut your wrist and smear your blood on $p.", ch, obj,
	NULL, TO_CHAR);
   act ("$n cuts his wrist and smears blood on $p.", ch, obj, NULL, TO_ROOM);
   return;
}


void do_spit (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
//    char buf[MAX_STRING_LENGTH];
   int dam;

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_QUIE) < 1)
   {
      send_to_char ("You need level 1 Quietus to spit.\n\r", ch);
      return;
   }
   if (IS_AFFECTED (ch, AFF_STEELSHIELD))
      do_majesty (ch, "");

   if (arg[0] == '\0' && ch->fighting == NULL)
   {
      send_to_char ("Who do you wish to use Taste of Death on?\n\r", ch);
      return;
   }

   if ((victim = ch->fighting) == NULL)
   {
      if ((victim = get_char_room (ch, arg)) == NULL)
      {
	 send_to_char ("They aren't here.\n\r", ch);
	 return;
      }
   }
   if (ch == victim)
   {
      stc ("Phatooey\n\r", ch);
      return;
   }
   WAIT_STATE (ch, skill_table[gsn_kick].beats);

   dam = number_range (10, 20);
   dam += char_damroll (ch);
   dam += number_range(ch->damcap[0]/4, ch->damcap[0]/2);
   if (dam == 0)
      dam = 1;
   if (!IS_AWAKE (victim))
      dam *= 2;
   if (!IS_NPC (ch) && (get_disc(ch, VAM_POTE)) > 0)
      dam += dam * (get_disc(ch, VAM_POTE)) * 0.5;
   else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DEMON) &&
	    IS_DEMPOWER (ch, DEM_MIGHT))
      dam *= 1.5;
   dam += number_range (1, 30);

   if (dam <= 0)
      dam = 1;
   damage (ch, victim, dam, gsn_spit);
   return;
}

/*
void do_assassinate( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    char buf[MAX_STRING_LENGTH];
    int dam;
    argument = one_argument( argument, arg );
 
 
    if(!IS_CLASS(ch,CLASS_VAMPIRE))
    {
    send_to_char("Huh?\n\r",ch);
    return;
    }
    if (get_disc(ch, VAM_QUIE) < 4)
    {
    send_to_char("You need Quietus level 4 to Assassinate.\n\r",ch);
    return;
    }
    
    if (!IS_NPC(ch) && IS_AFFECTED(ch, AFF_STEELSHIELD) )
    {
        send_to_char( "You cannot attack while in majesty.\n\r", ch );
        return;
    } 

    if ( arg[0] == '\0' )
    {
        send_to_char( "Assassinate 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 ( victim == ch )
    {
        send_to_char( "How can you assassinate yourself?\n\r", ch );
	return;
    }
 

    if (is_safe(ch,victim) == TRUE) return;
 
    if ( victim->fighting != NULL )
    {
        send_to_char( "You can't assassinate a fighting person.\n\r", ch);
	return;
    }
 
    if ( victim->hit < victim->max_hit )
    {
	act( "$N is hurt and suspicious ... you can't sneak up.",
	    ch, NULL, victim, TO_CHAR );
	return;
    }
    if (!IS_AFFECTED(ch, AFF_HIDE))
    {
    send_to_char("You must be hidden to assassinate!\n\r",ch);
    return;
    }
    WAIT_STATE(ch,15);
    if (!IS_NPC(victim) && number_percent( ) < 2)
    {
    sprintf(buf,"%s has been assassinated by %s.",victim->name,ch->name);
    do_info(ch,buf);
    victim->hit = 1;
    ch->fighting = victim;
    send_to_char("You spin around and throw a headbutt to finish them.\n\r",ch);
    damage(ch,victim,11,gsn_headbutt);

    return;
    }

    if (!IS_NPC(victim)) dam = get_disc(ch, VAM_QUIE) * 200;
    if (IS_NPC(victim)) dam = get_disc(ch, VAM_QUIE) * 400;
    dam += number_range(1,20);
    sprintf(buf,"Your assassination hits $N incredibly hard! [%d]",dam);
    act(buf,ch,NULL,victim,TO_CHAR);
    sprintf(buf,"$n's assassination hits you incredibly hard! [%d]\n\r",dam);
    act(buf,ch,NULL,victim,TO_VICT);
sprintf(buf,"$n's assassination hits $N incredibly hard! [%d]\n\r",dam);
act(buf,ch,NULL,victim,TO_NOTVICT);
 
if (dam > victim->hit) dam = victim->hit-1;
victim->hit -= dam;
ch->fighting = victim;
victim->fighting = ch;
if (victim->hit <= 1)
{
victim->hit = 1;
send_to_char("You spin around and throw a headbutt to finish
him.\n\r",ch);
ch->fighting=victim;
damage(ch,victim,11,gsn_headbutt);

}

   return;
}
*/
void do_assassinate (CHAR_DATA * ch, char *argument)
{
   char arg[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   char buf[MAX_STRING_LENGTH];
   int dam=0, chance = 5;
   argument = one_argument (argument, arg);


   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_QUIE) < 4)
   {
      send_to_char ("You need Quietus level 4 to Assassinate.\n\r", ch);
      return;
   }
   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while you're in the arena.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Assassinate whom?\n\r", ch);
      return;
   }


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

   if (victim->position == POS_SLEEPING)
      chance *= 2;

   if (victim == ch)
   {
      send_to_char ("How can you assassinate yourself?\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
      chance = 5;

   if (is_safe (ch, victim) == TRUE)
      return;

   if (victim->fighting != NULL)
   {
      send_to_char ("You can't assassinate a fighting person.\n\r", ch);
      return;
   }

   if (victim->hit < victim->max_hit)
   {
      act ("$N is hurt and suspicious ... you can't sneak up.", ch, NULL,
	   victim, TO_CHAR);
      return;
   }
   if (!IS_AFFECTED (ch, AFF_HIDE))
   {
      send_to_char ("You must be hidden to assassinate!\n\r", ch);
      return;
   }
   WAIT_STATE (ch, 15);
   if (number_percent () < chance)
   {
      if (!IS_NPC (victim))
      {
	 one_hit (ch, victim, gsn_garotte, 1);
	 one_hit (ch, victim, gsn_garotte, 1);
	 one_hit (ch, victim, gsn_garotte, 1);
	 one_hit (ch, victim, gsn_garotte, 1);
      }
      else
      {
	 victim->hit = 1;
	 ch->fighting = victim;
	 send_to_char
	    ("You spin around and throw a headbutt to finish him.\n\r", ch);
	 damage (ch, victim, 11, gsn_headbutt);
	 return;
      }
   }
   if (!IS_NPC (victim))
      dam = get_disc(ch, VAM_QUIE) * 200;
   if (IS_NPC (victim))
      dam = get_disc(ch, VAM_QUIE) * 400;
   dam += number_range (1, 20);
   set_fighting (ch, victim);

   sprintf (buf, "Your assassination hits $N incredibly hard! [%d]", dam);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf, "$n's assassination hits you incredibly hard! [%d]\n\r",
	    dam);
   act (buf, ch, NULL, victim, TO_VICT);
   sprintf (buf, "$n's assassination hits $N incredibly hard! [%d]\n\r", dam);
   act (buf, ch, NULL, victim, TO_NOTVICT);

   if (dam > victim->hit)
      dam = victim->hit - 1;
   hurt_person (ch, victim, dam);
   return;
}

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

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;


   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_QUIE) < 2)
   {
      send_to_char ("You need level 2 Quietus to use this power.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to use Infirmity on?\n\r", ch);
      return;
   }


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

   if (is_safe (ch, victim) == TRUE)
      return;
   if ((sn = skill_lookup ("infirmity")) < 0)
   {
      sprintf (buf, "Yep, sn is bieng set to %d.", sn);
      send_to_char (buf, ch);
      return;

   }

   spelltype = skill_table[sn].target;
   level = get_disc(ch, VAM_QUIE);
   (*skill_table[sn].spell_fun) (sn, level, ch, victim);
   WAIT_STATE (ch, 12);
   return;
}


void do_death (CHAR_DATA * ch, char *argument)
{
   char buf[MAX_STRING_LENGTH];
   ROOM_INDEX_DATA *inroom;
   inroom = ch->in_room;

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_QUIE) < 5)
   {
      send_to_char
	 ("You require level 5 Quietus to use Silence of Death.\n\r", ch);
      return;
   }
   if (IS_SET (ch->in_room->added_flags, ROOM2_SILENCE))
   {
      sprintf (buf, "The silence leaves the room.\n\r");
      act (buf, ch, NULL, NULL, TO_ROOM);
      send_to_char ("The silence leaves the room.\n\r", ch);
      REMOVE_BIT (ch->in_room->added_flags, ROOM2_SILENCE);
      REMOVE_BIT (ch->newbits, NEW_SILENCE);
      return;
   }
   if (ch->pcdata->condition[COND_THIRST] < 300)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }
   ch->pcdata->condition[COND_THIRST] -= 300;
   SET_BIT (ch->in_room->added_flags, ROOM2_SILENCE);
   SET_BIT (ch->newbits, NEW_SILENCE);
   sprintf (buf, "A look of concentration passes over %s's face.\n\r",
	    ch->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char ("A look of concentration passes over your face.\n\r", ch);
   sprintf (buf, "An eerie silence fills the room.\n\r");
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char (buf, ch);
   return;
}


void do_command (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   char action[MIL];
   char buffy[MAX_STRING_LENGTH];
   CHAR_DATA *victim;
   int awe;


   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_MAGE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_DOMI) < 1)
   {
      send_to_char
	 ("You must obtain at least level 1 in Dominate to use Command.\n\r",
	  ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MAGE) && ch->spheres[MMIN] < 2)
   {
      stc ("You must obtain level two Mind to use Control Impulses.\n\r", ch);
      return;
   }

   if (ch->spl[RED_MAGIC] < 1)
   {
      send_to_char ("Your mind is too weak.\n\r", ch);
      return;
   }

   if (arg1[0] == '\0' || arg2[0] == '\0')
   {
      send_to_char ("Command whom to do what?\n\r", ch);
      return;
   }


   strcpy (action, arg2);

   if (is_in
       (action,
	"|quit*escape*leave *giveclan*rem*drop*gift*claim*consent*propose*vampi*ma *donate*maj*reca*/*train*token*sacrifice*sac*note*decap*decapitate*tear*quit*home*clearwarp*kick*arenaagree*challenge*kill*k*"))
   {
      send_to_char ("I think not.\n\r", ch);
      return;
   }

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

   if (victim == ch)
   {
      send_to_char ("How can you command yourself??\n\r", ch);
      return;
   }
   if (is_safe (ch, victim))
      return;


   if (!IS_NPC (victim) && get_hours (victim) < 10)
   {
      stc ("Not on a newbie!\n\r", ch);
      return;
   }
   if (IS_CLASS (ch, CLASS_VAMPIRE))
   {
      if (get_disc(ch, VAM_DOMI) > 2)
	 awe = 50;
      else if (get_disc(ch, VAM_DOMI) > 3)
	 awe = 75;
      else if (get_disc(ch, VAM_DOMI) > 4)
	 awe = 100;
      else
	 awe = 25;
   }
   else
      awe = ch->spheres[MMIN] * 20;

   if (IS_EXTRA (ch, EXTRA_AWE))
   {
      awe += 75;
   }

   if (!IS_NPC (victim) && victim->level != 3)
   {
      send_to_char ("You can only command other avatars.\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_DOMI) > 1)
   {
      sprintf (buffy, "%s %s", arg2, argument);
      if (IS_NPC (victim))
	 sprintf (buf, "I think %s wants to %s", victim->short_descr, buffy);
      else if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_POLYMORPH))
	 sprintf (buf, "I think %s wants to %s", victim->morph, buffy);
      else
	 sprintf (buf, "I think %s wants to %s", victim->name, buffy);
      do_say (ch, buf);
   }
   else
   {
      if (IS_NPC (victim))
	 sprintf (buf, "I think %s wants to %s", victim->short_descr, arg2);
      else if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_POLYMORPH))
	 sprintf (buf, "I think %s wants to %s", victim->morph, arg2);
      else
	 sprintf (buf, "I think %s wants to %s", victim->name, arg2);
      do_say (ch, buf);
   }

   if (IS_NPC (victim) && victim->level >= awe)
   {
      act ("You shake off $N's suggestion.", victim, NULL, ch, TO_CHAR);
      act ("$n shakes off $N's suggestion.", victim, NULL, ch, TO_NOTVICT);
      act ("$n shakes off your suggestion.", victim, NULL, ch, TO_VICT);
      act ("$s mind is too strong to overcome.", victim, NULL, ch, TO_VICT);
      return;
   }

   else if (victim->spl[BLUE_MAGIC] >= (ch->spl[RED_MAGIC] / 2))
   {
      act ("You shake off $N's suggestion.", victim, NULL, ch, TO_CHAR);
      act ("$n shakes off $N's suggestion.", victim, NULL, ch, TO_NOTVICT);
      act ("$n shakes off your suggestion.", victim, NULL, ch, TO_VICT);
      act ("$s mind is too strong to overcome.", victim, NULL, ch, TO_VICT);
      return;
   }
   if (!str_cmp ("give", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("dro", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("drop", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("clearwarp", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("gif", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("giv", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("gi", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("gift", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("giveclan", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("decap", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("decaptitate", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("tear", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("c", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("ca", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("cas", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("cast", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("k", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("ki", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("kil", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("kill", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("home", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("train", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("quit", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("arenaagree", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("challenge", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }





   if (!str_cmp ("arena", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("kic", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }
   if (!str_cmp ("kick", arg2))
   {
      send_to_char (" You Failed.\n\r", ch);
      return;
   }

   act ("You blink in confusion.", victim, NULL, NULL, TO_CHAR);
   act ("$n blinks in confusion.", victim, NULL, NULL, TO_ROOM);
   strcpy (buf, "Yes, you're right, I do...");
   do_say (victim, buf);
   if (!IS_NPC(victim)) victim->pcdata->evilchat = ch;
   if (get_disc(ch, VAM_DOMI) > 1)
      interpret (victim, buffy);
   else
      interpret (victim, arg2);
   WAIT_STATE (ch, 24);
   return;

}


void do_mesmerise (CHAR_DATA * ch, char *argument)
{
   char action[MIL];
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   char buffy[MAX_STRING_LENGTH];
   CHAR_DATA *victim;
   int awe;


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

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

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

   if (ch->spl[RED_MAGIC] < 1)
   {
      send_to_char ("Your mind is too weak.\n\r", ch);
      return;
   }

   if (arg1[0] == '\0' || arg2[0] == '\0')
   {
      send_to_char ("Command whom to do what?\n\r", ch);
      return;
   }
   strcpy (action, argument);

   if (is_in
       (action,
	"|quit*rem*drop*gift*claim*consent*propose*vampi*ma *maj*giveclan*reca*/*train*token*sacrifice*sac*note *"))
   {
      send_to_char ("I think not.\n\r", ch);
      return;
   }
   if ((victim = get_char_room (ch, arg1)) == NULL)
   {
      send_to_char ("They aren't here.\n\r", ch);
      return;
   }
   if (!IS_NPC (victim) && get_hours (victim) < 10)
   {
      stc ("Not on a newbie!\n\r", ch);
      return;
   }
   if (victim == ch)
   {
      send_to_char ("How can you command yourself??\n\r", ch);
      return;
   }

   {
      if (get_disc(ch, VAM_DOMI) > 2)
	 awe = 50;
      else if (get_disc(ch, VAM_DOMI) > 3)
	 awe = 75;
      else if (get_disc(ch, VAM_DOMI) > 4)
	 awe = 100;
      else
	 awe = 25;
   }

   if (IS_EXTRA (ch, EXTRA_AWE))
   {
      awe += 75;
   }

   if (!IS_NPC (victim) && victim->level != 3)
   {
      send_to_char ("You can only command other avatars.\n\r", ch);
      return;
   }



   if (get_disc(ch, VAM_DOMI) > 1)
   {
      sprintf (buffy, "%s %s", arg2, argument);
      if (IS_NPC (victim))
	 sprintf (buf, "I think %s wants to %s", victim->short_descr, buffy);
      else if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_POLYMORPH))
	 sprintf (buf, "I think %s wants to %s", victim->morph, buffy);
      else
	 sprintf (buf, "I think %s wants to %s", victim->name, buffy);
      do_say (ch, buf);
   }
   else
   {
      if (IS_NPC (victim))
	 sprintf (buf, "I think %s wants to %s", victim->short_descr, arg2);
      else if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_POLYMORPH))
	 sprintf (buf, "I think %s wants to %s", victim->morph, arg2);
      else
	 sprintf (buf, "I think %s wants to %s", victim->name, arg2);
      do_say (ch, buf);
   }

   if (IS_NPC (victim) && victim->level >= awe)
   {
      act ("You shake off $N's suggestion.", victim, NULL, ch, TO_CHAR);
      act ("$n shakes off $N's suggestion.", victim, NULL, ch, TO_NOTVICT);
      act ("$n shakes off your suggestion.", victim, NULL, ch, TO_VICT);
      act ("$s mind is too strong to overcome.", victim, NULL, ch, TO_VICT);
      return;
   }

   else if (victim->spl[BLUE_MAGIC] >= (ch->spl[RED_MAGIC] / 2))
   {
      act ("You shake off $N's suggestion.", victim, NULL, ch, TO_CHAR);
      act ("$n shakes off $N's suggestion.", victim, NULL, ch, TO_NOTVICT);
      act ("$n shakes off your suggestion.", victim, NULL, ch, TO_VICT);
      act ("$s mind is too strong to overcome.", victim, NULL, ch, TO_VICT);
      return;
   }

   act ("You blink in confusion.", victim, NULL, NULL, TO_CHAR);
   act ("$n blinks in confusion.", victim, NULL, NULL, TO_ROOM);
   strcpy (buf, "Yes, you're right, I do...");
   do_say (victim, buf);
   if (get_disc(ch, VAM_DOMI) > 1)
      interpret (victim, buffy);
   else
      interpret (victim, arg2);
   WAIT_STATE (ch, 24);
   return;

}


void do_acid (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_DOMI) < 4)
   {
      send_to_char ("You require level 4 dominate to use Acid Blood.\n\r",
		    ch);
      return;
   }
   //if (ch->pcdata->condition[COND_THIRST] < 500)
   //{
   //   send_to_char ("You have insufficient blood.\n\r", ch);
   //   return;
   //}
   if (IS_SET (ch->act, PLR_ACID))
   {
      send_to_char ("Your blood is already acid.\n\r", ch);
      return;
   }
   SET_BIT (ch->act, PLR_ACID);
   send_to_char ("Your blood turns to a potent acid.\n\r", ch);
   return;
}

void do_possession (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) && !IS_CLASS (ch, CLASS_MAGE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_DOMI) < 3)
   {
      send_to_char
	 ("You must obtain at least level 3 in Dominate to use Possession.\n\r",
	  ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_MAGE) && ch->spheres[MMIN] < 4)
   {
      stc ("You must obtain level four Mind to use Possession.\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 Possess?\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 ("What an intelligent idea!\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 possess them.\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 (IS_CLASS (ch, CLASS_VAMPIRE)
       && ch->pcdata->condition[COND_THIRST] < 50)
   {
      send_to_char ("You have insufficient blood.\n\r", ch);
      return;
   }

   if (IS_CLASS (ch, CLASS_VAMPIRE))
      ch->pcdata->condition[COND_THIRST] -= 50;
   ch->pcdata->familiar = victim;
   victim->wizard = ch;
   act ("You concentrate on $N.", ch, NULL, victim, TO_CHAR);
   act ("$n is staring at you!", ch, NULL, victim, TO_VICT);
   act ("$n starts staring at $N", ch, NULL, victim, TO_NOTVICT);
   return;
}


void do_coil (CHAR_DATA * ch, char *argument)
{
   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_DOMI) < 5)
   {
      send_to_char ("You require level 5 Dominate to use Body Coil.\n\r", ch);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_COIL))
   {
      send_to_char ("You prepare to coil your victims.\n\r", ch);
      SET_BIT (ch->newbits, NEW_COIL);
      return;
   }
   else if (IS_SET (ch->newbits, NEW_COIL))
   {
      send_to_char ("You stand down from your coil posture.\n\r", ch);
      REMOVE_BIT (ch->newbits, NEW_COIL);
      return;
   }
   return;
}

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

   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 (ch->in_room->area->owned > 0
       && ch->in_room->area->owned != ch->pcdata->kingdom)
   {
      stc ("Not in someone elses HQ\n\r", ch);
      return;
   }
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_PROT) < 4)
   {
      send_to_char
	 ("You must obtain at least level 4 Protean to use Earthmeld.\n\r",
	  ch);
      return;
   }


   if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("Not while polymorphed.\n\r", ch);
      return;
   }

   if (has_timer (ch))
      return;

   if (IS_NPC (ch) || IS_EXTRA (ch, EXTRA_EARTHMELD))
   {
      REMOVE_BIT (ch->extra, EXTRA_EARTHMELD);
      send_to_char ("You rise up from the ground.\n\r", ch);
      act ("$n rises up from the ground.", ch, NULL, NULL, TO_ROOM);
      return;
   }
   send_to_char ("You sink into the ground.\n\r", ch);
   act ("$n sinks into the ground.", ch, NULL, NULL, TO_ROOM);
   SET_BIT (ch->extra, EXTRA_EARTHMELD);
   return;
}

/*
    {
            REMOVE_BIT(ch->flag2, AFF2_SHIFT);
            REMOVE_BIT(ch->extra, EXTRA_EARTHMELD);
            sprintf(buf, "%s rises up from the ground",ch->name);
            act(buf,ch,NULL,NULL,TO_ROOM);

            return;

    }

    if ( (mount = ch->mount) != NULL) do_dismount(ch,"");
    SET_BIT(ch->flag2, AFF2_SHIFT);
    SET_BIT(ch->extra, EXTRA_EARTHMELD);
    SET_BIT(ch->act, PLR_WIZINVIS);
    free_string(ch->morph);
    ch->morph = str_dup("Someone");
    ch->level = 4;
    ch->trust = 4;
    send_to_char( "You sink into the ground.\n\r", ch );
    sprintf(buf, "%s sinks into the ground.",ch->name);
    act(buf,ch,NULL,NULL,TO_ROOM);
    return;
}
*/

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

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

   if (get_disc(ch, VAM_PROT) < 5)
   {
      send_to_char ("You need level 5 Protean to use flaming hands.\n\r", ch);
      return;
   }

   if (IS_SET (ch->newbits, NEW_MONKFLAME))
   {
      REMOVE_BIT (ch->newbits, NEW_MONKFLAME);
      send_to_char ("Your hands are no longer engulfed by flames.\n\r", ch);
      act ("$n's hands are no longer engulfed by flames.\n\r", ch, NULL, NULL,
	   TO_ROOM);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_MONKFLAME))
   {
      SET_BIT (ch->newbits, NEW_MONKFLAME);
      send_to_char ("Your hands are engulfed by flames!\n\r", ch);
      act ("$n's hands are engulfed by flames!\n\r", ch, NULL, NULL, TO_ROOM);
      return;
   }
}


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

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_THAN) < 5)
   {
      send_to_char
	 ("You must obtain level 5 Thanatosis to use Drain Life.\n\r", ch);
      return;
   }


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

   if ((ch->fighting) != NULL)
   {
      victim = ch->fighting;
   }

   if (arg[0] == '\0' && (ch->fighting) == NULL)
   {
      send_to_char ("Whose life do you wish to drain?\n\r", ch);
      return;
   }

   if (victim->hit < 500)
   {
      send_to_char ("They are far to hurt to do that!\n\r", ch);
      return;
   }

   if (is_safe (ch, victim))
   {
      send_to_char ("Not while in a safe room!\n\r", ch);
      return;
   }

   if (IS_NPC (victim))
   {
      dam = get_disc(ch, VAM_THAN) * 10;
      victim->hit = (victim->hit - dam);
      if (dam > 500)
	 dam = number_range (450, 550);
      ch->hit = (ch->hit + dam);
      if (ch->hit > ch->max_hit + 1000)
	 ch->hit = ch->max_hit + 1000;
      act ("You drain the lifeforce out of $N.", ch, NULL, victim, TO_CHAR);
      act ("$n drains the lifeforce out of $N.", ch, NULL, victim,
	   TO_NOTVICT);
      act ("You feel $n draining your lifeforce.", ch, NULL, victim, TO_VICT);
      WAIT_STATE (ch, 12);
      return;
   }

   if (!IS_NPC (victim))
   {
      dam = get_disc(ch, VAM_THAN) * 50;
      victim->hit = (victim->hit - dam);
      if (dam > 400)
	 dam = number_range (350, 450);
      ch->hit = (ch->hit + dam);
      if (ch->hit > ch->max_hit + 1000)
	 ch->hit = ch->max_hit + 1000;
      act ("You drain the lifeforce out of $N.", ch, NULL, victim, TO_CHAR);
      act ("$n drains the lifeforce out of $N.", ch, NULL, victim,
	   TO_NOTVICT);
      act ("You feel $n draining your lifeforce.", ch, NULL, victim, TO_VICT);
      WAIT_STATE (ch, 12);
      return;
   }


}

/*
void do_ashes( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    
     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)) 
    {
	send_to_char("Huh?\n\r", ch);
	return;
    }

    if (get_disc(ch, VAM_THAN) < 3)
    {
       send_to_char("You must obtain at least level 5 in Vicissitude to use Plasma Form.\n\r", ch);
       return;
    }
 
save_char_obj(ch);

  if ((obj = create_object(get_obj_index( 30042 ), 0)) == NULL)
    {
        send_to_char( "Error - Please inform Maser.\n\r", ch);
	return;
    }

    if ( IS_EXTRA(ch, EXTRA_ASH) )
    {
      ch->pcdata->obj_vnum = 0;
      REMOVE_BIT(ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT(ch->extra, EXTRA_OSWITCH);
      REMOVE_BIT(ch->extra, EXTRA_ASH);
      ch->pcdata->chobj = NULL;
      obj->chobj = NULL;
      free_string(ch->morph);
      ch->morph = str_dup("");
      act("$p transforms into $n.",ch,obj,NULL,TO_ROOM);
      act("You reform your human body.",ch,obj,NULL,TO_CHAR);
      extract_obj( obj );
      return;
                
    }
    
    if ( IS_AFFECTED(ch, AFF_POLYMORPH) )
    {
	send_to_char( "Not while polymorphed.\n\r", ch );
	return;
    }
    act("$n transforms into $p and falls to the
ground.",ch,obj,NULL,TO_ROOM);
    act("You transform into $p and falls to the
ground.",ch,obj,NULL,TO_CHAR);
    ch->pcdata->obj_vnum = ch->pcdata->powers[VPOWER_OBJ_VNUM];
    obj->chobj = ch;
    ch->pcdata->chobj = obj;
    SET_BIT(ch->affected_by, AFF_POLYMORPH);
    SET_BIT(ch->extra, EXTRA_OSWITCH);
    SET_BIT(ch->extra, EXTRA_ASH);
    free_string(ch->morph);
    ch->morph = str_dup("a pile of ashes");
    obj_to_room(obj,ch->in_room);
    return;
}
*/

void do_ashes (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj;
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) || IS_HEAD (ch, LOST_HEAD))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      send_to_char ("Not until your fight timer expires.\n\r", ch);
      return;
   }
   if (ch->in_room->vnum == ROOM_VNUM_ALTAR)
   {
      stc ("Not in this room sorry!\n\r", ch);
      return;
   }
   if (ch->in_room->area->owned > 0
       && ch->in_room->area->owned != ch->pcdata->kingdom)
   {
      stc ("Not in someone elses HQ\n\r", ch);
      return;
   }
   if (IS_SET (ch->war, WARRING))
   {
      stc ("Not while in a war!\n\r", ch);
      return;
   }
   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while you're in the arena.\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_THAN) < 3)
   {
      send_to_char
	 ("You require level 3 Thanatosis to change into a pile of Ashes.\n\r",
	  ch);
      return;
   }

   if (!IS_SET (ch->extra, EXTRA_ASH) && IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("Not from this form.\n\r", ch);
      return;
   }

   if ((obj = ch->pcdata->chobj) != NULL && IS_EXTRA (ch, EXTRA_OSWITCH))
   {
      ch->pcdata->obj_vnum = 0;
      obj->chobj = NULL;
      ch->pcdata->chobj = NULL;
      REMOVE_BIT (ch->affected_by, AFF_POLYMORPH);
      REMOVE_BIT (ch->extra, EXTRA_OSWITCH);
      REMOVE_BIT (ch->extra, EXTRA_ASH);
      free_string (ch->morph);
      ch->morph = str_dup ("");
      act ("$p transforms into $n.", ch, obj, NULL, TO_ROOM);
      act ("You reform your human body.", ch, obj, NULL, TO_CHAR);
      extract_obj (obj);
      if (ch->in_room->vnum == ROOM_VNUM_IN_OBJECT)
      {
	 char_from_room (ch);
	 char_to_room (ch, get_room_index (ROOM_VNUM_HELL));
      }
      return;
   }
   if (IS_AFFECTED (ch, AFF_POLYMORPH))
   {
      send_to_char ("You cannot do this while polymorphed.\n\r", ch);
      return;
   }
   if ((obj = create_object (get_obj_index (OBJ_VNUM_ASHES), 0)) == NULL)
   {
      send_to_char ("Bug - please inform KaVir.\n\r", ch);
      return;
   }
   if (ch->mounted == IS_RIDING)
      do_dismount (ch, "");
   ch->stimer = 60;
   obj_to_room (obj, ch->in_room);
   act ("$n transforms into $p and falls to the ground.", ch, obj, NULL,
	TO_ROOM);
   act ("You transform into $p and fall to the ground.", ch, obj, NULL,
	TO_CHAR);
   if (IS_EXTRA (ch, TIED_UP))
   {
      act ("The ropes binding you fall through your form.", ch, NULL, NULL,
	   TO_CHAR);
      act ("The ropes binding $n fall through $s form.", ch, NULL, NULL,
	   TO_ROOM);
      REMOVE_BIT (ch->extra, TIED_UP);
      REMOVE_BIT (ch->extra, GAGGED);
      REMOVE_BIT (ch->extra, BLINDFOLDED);
   }
   ch->pcdata->obj_vnum = OBJ_VNUM_ASHES;
   obj->chobj = ch;
   ch->pcdata->chobj = obj;
   SET_BIT (ch->affected_by, AFF_POLYMORPH);
   SET_BIT (ch->extra, EXTRA_OSWITCH);
   SET_BIT (ch->extra, EXTRA_ASH);
   free_string (ch->morph);
   ch->morph = str_dup (obj->short_descr);
   return;
}
void do_withering (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *obj;
   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) && !IS_CLASS(ch, CLASS_WRAITH))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
    if (!IS_NPC(ch) && ch->arcanoi[WMATE] < 4 && IS_CLASS(ch, CLASS_WRAITH))
    {
        stc("You do not have the required arcanoi to use this.\n\r",ch);
        return;
    }
   if (get_disc(ch, VAM_THAN) < 4 && IS_CLASS(ch, CLASS_VAMPIRE))
   {
      send_to_char
	 ("You must obtain level 4 Thanatosis to use Withering.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to wither?\n\r", ch);
      return;
   }

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

   if (IS_SET (victim->in_room->room_flags, ROOM_SAFE))
   {
      send_to_char ("You cannot attack them here.\n\r", ch);
      return;
   }

   if (is_safe (ch, victim) == TRUE)
      return;

   WAIT_STATE (ch, 35);
   sprintf (buf, "A look of concentration crosses over %s's face.", ch->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char ("A look of concentration crosses over your face.\n\r", ch);
   if (IS_ARM_R (victim, LOST_ARM) && IS_ARM_L (victim, LOST_ARM) &&
       IS_LEG_R (victim, LOST_LEG) && IS_LEG_L (victim, LOST_LEG))
   {
      send_to_char ("All of their limbs are severed already!\n\r", ch);
      return;
   }
   if (number_percent () < 15)
   {
      if (!IS_ARM_R (victim, LOST_ARM))
      {
	 SET_BIT (victim->loc_hp[3], LOST_ARM);
	 if ((obj = get_eq_char (victim, WEAR_HOLD)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_HANDS)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_WRIST_R)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_FINGER_R)) != NULL)
	    take_item (victim, obj);
	 make_part (victim, "arm");
	 sprintf (buf,
		  "A supernatural force rips %s's arm off!", victim->name);
	 act (buf, ch, NULL, NULL, TO_ROOM);
	 send_to_char (buf, ch);
	 return;
      }
      if (!IS_ARM_L (victim, LOST_ARM))
      {
	 SET_BIT (victim->loc_hp[2], LOST_ARM);
	 if ((obj = get_eq_char (victim, WEAR_HOLD)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_HANDS)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_WRIST_L)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_FINGER_L)) != NULL)
	    take_item (victim, obj);
	 make_part (victim, "arm");
	 sprintf (buf, "A supernatural force rips %s's arm off!",
		  victim->name);
	 act (buf, ch, NULL, NULL, TO_ROOM);
	 send_to_char (buf, ch);
	 return;
      }
      if (!IS_LEG_R (victim, LOST_LEG))
      {
	 SET_BIT (victim->loc_hp[5], LOST_LEG);
	 if ((obj = get_eq_char (victim, WEAR_FEET)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_LEGS)) != NULL)
	    take_item (victim, obj);
	 make_part (victim, "leg");
	 sprintf (buf,
		  "A supernatural force rips %s's leg off!", victim->name);
	 act (buf, ch, NULL, NULL, TO_ROOM);
	 send_to_char (buf, ch);
	 return;
      }
      if (!IS_LEG_L (victim, LOST_LEG))
      {
	 SET_BIT (victim->loc_hp[4], LOST_LEG);
	 if ((obj = get_eq_char (victim, WEAR_FEET)) != NULL)
	    take_item (victim, obj);
	 if ((obj = get_eq_char (victim, WEAR_LEGS)) != NULL)
	    take_item (victim, obj);
	 make_part (victim, "leg");
	 sprintf (buf,
		  "A supernatural force rips %s's leg off!", victim->name);
	 act (buf, ch, NULL, NULL, TO_ROOM);
	 send_to_char (buf, ch);
	 return;
      }
   }
   send_to_char ("You failed.\n\r", ch);

   return;
}

void do_putrefaction (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_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_THAN) < 2)
   {
      send_to_char
	 ("You must obtain at level 2 in Thanatosis to use Putrefaction.\n\r",
	  ch);
      return;
   }


   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to use Putrefaction on?\n\r", ch);
      return;
   }

   if ((victim = ch->fighting) == NULL)
   {
      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 ("Why use Putrefaction on a mob?\n\r", ch);
      return;
   }

   if (IS_IMMORTAL (victim) && victim != ch)
   {
      send_to_char ("You can only use Putrefaction on Avatar's or lower.\n\r",
		    ch);
      return;
   }

   if (is_safe (ch, victim) == TRUE)
      return;

   if (victim->hit < victim->max_hit)
   {
      send_to_char ("They are hurt and suspicious.\n\r", ch);
      return;
   }
   act ("You close your eyes and concentrate on $N.", ch, NULL, victim,
	TO_CHAR);
   act ("$n closes $s eyes and concentrates on you.", ch, NULL, victim,
	TO_VICT);
   act ("$n closes $s eyes and cencentrates on $N.", ch, NULL, victim,
	TO_NOTVICT);
   WAIT_STATE (ch, 12);
   if (number_percent () < 50)
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   act ("Your flesh begins to rot!", victim, NULL, NULL, TO_CHAR);
   act ("$n's flesh begins to rot!", victim, NULL, NULL, TO_ROOM);
   SET_BIT (victim->flag2, AFF2_ROT);
   return;
}

void do_hagswrinkles (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))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_THAN) < 1)
   {
      send_to_char
	 ("You must obtain at least level 1 in Thanatosis to use Hagswrinkles.\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 use hagswrinkles on Avatars or lower.\n\r",
		    ch);
      return;
   }

   if (ch->pcdata->condition[COND_THIRST] < 40)
   {
      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 body wrinkles and reshapes as %s.", ch->name);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "%s's body wrinkles and reshapes as %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 body wrinkles and reshapes as %s.", victim->name);
      act (buf, ch, NULL, victim, TO_CHAR);
      sprintf (buf, "%s's body wrinkles and reshapes as %s.", ch->morph,
	       victim->name);
      act (buf, ch, NULL, victim, TO_NOTVICT);
      sprintf (buf, "%s's body wrinkles and reshapes as you!", ch->morph);
      act (buf, ch, NULL, victim, TO_VICT);
      free_string (ch->morph);
      ch->morph = str_dup (victim->name);
      return;
   }
   sprintf (buf, "Your body wrinkles and reshapes as %s.", victim->name);
   act (buf, ch, NULL, victim, TO_CHAR);
   sprintf (buf, "%s's body wrinkles and reforms as%s.", ch->name,
	    victim->name);
   act (buf, ch, NULL, victim, TO_NOTVICT);
   sprintf (buf, "%s's body wrinkles and reforms as 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_fear (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   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))
   {
      stc ("Huh?\n\r", ch);
      return;
   }

   if (get_disc(ch, VAM_DAIM) < 5)
   {
      stc ("You must obtain level 5 Daimoinon to use Fear.\n\r", ch);
      return;
   }

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

   arg[0] = UPPER (arg[0]);

   if (ch->fighting == NULL)
   {
      stc ("You must be fighting to use Fear.\n\r", ch);
      return;
   }

   if (victim->fighting == NULL)
   {
      sprintf (buf, "%s is not fighting anyone.", arg);
      stc (buf, ch);
      return;
   }

   WAIT_STATE (ch, 16);

   if (IS_NPC (victim))
   {
      act ("You bare your fangs and growl at $N.", ch, NULL, victim, TO_CHAR);
      act ("$n bares $s fangs and growls at you.", ch, NULL, victim, TO_VICT);
      act ("$n bares $s fangs and growls at $N, and $N flees in terror.", ch,
	   NULL, victim, TO_NOTVICT);
      do_flee (victim, "");
      return;
   }

   if (!IS_NPC (victim))
   {
      if (get_disc(ch, VAM_DAIM) < 5)
      {
	 if (number_range (1, 4) != 2)
	 {
	    act ("You bare your fangs and growl at $N, but nothing happens.",
		 ch, NULL, victim, TO_CHAR);
	    act ("$n bares $s fangs and growls at you.", ch, NULL, victim,
		 TO_VICT);
	    act ("$n bares $s fangs and growls at $N, but nothing happens.",
		 ch, NULL, victim, TO_NOTVICT);
	    return;
	 }
      }

      act ("You bare your fangs and growl at $N.", ch, NULL, victim, TO_CHAR);
      act ("$n bares $s fangs and growls at you.", ch, NULL, victim, TO_VICT);
      act ("$n bares $s fangs and growls at $N, and $N flees in terror.", ch,
	   NULL, victim, TO_NOTVICT);
      do_flee (victim, "");
      return;
   }

   return;

}

void do_vtwist (CHAR_DATA * ch, char *argument)
{
   char arg1[MAX_STRING_LENGTH];
   char arg2[MAX_STRING_LENGTH];
   OBJ_DATA *obj;

   argument = one_argument (argument, arg1);
   strcpy (arg2, argument);
   smash_tilde (arg2);
   if (IS_NPC (ch))
      return;

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

   if (get_disc(ch, VAM_DAIM) < 4)
   {
      send_to_char ("You must obtain level 5 Daimoinon to use Twist.\n\r",
		    ch);
      return;
   }

   if (arg1 == NULL || arg2 == NULL)
   {
      send_to_char ("Syntax: Dub (item) (description)?\n\r", ch);
      return;
   }

   if ((obj = get_obj_carry (ch, arg1)) == NULL)
   {
      send_to_char ("You dont have that item.\n\r", ch);
      return;
   }

   if (!str_cmp (arg2, "Tijer"))
   {
      send_to_char ("You failed!\r\n", ch);
      return;
   }
   if (strlen (arg2) > 40 || strlen (arg2) < 3)
   {
      send_to_char ("From 3 to 40 characters please.\n\r", ch);
      return;
   }

   if (IS_SET (obj->quest, QUEST_ARTIFACT)
       || IS_SET (obj->quest, QUEST_RELIC) || obj->item_type == ITEM_PIECE)
   {
      stc ("Not on that object!!\n\r", ch);
      return;
   }

   free_string (obj->questmaker);
   obj->questmaker = str_dup (ch->name);
   free_string (obj->name);
   obj->name = str_dup (arg2);
   free_string (obj->short_descr);
   obj->short_descr = str_dup (arg2);
   send_to_char ("Ok.\n\r", ch);
   return;

}

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

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_MELP) < 2)
   {
      send_to_char ("You need Melpominee 2 to Gourge.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to gourge?\n\r", ch);
      return;
   }

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

   if (IS_NPC (victim) && IS_SET (victim->act, ACT_NOAUTOKILL))
   {
      send_to_char ("You can't do that to them.\n\r", ch);
      return;
   }

   if (!IS_NPC (victim))
   {
      send_to_char ("You cannot gourge a person.\n\r", ch);
      return;
   }
   if (victim->level > 30)
   {
      send_to_char
	 ("Only small creatures are defenceless enough to be gourged on.\n\r",
	  ch);
      return;
   }
   sprintf (buf,
	    "%s leaps toward %s baring his fangs.", ch->name, victim->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   sprintf (buf, "You leap toward %s baring your fangs.\n\r", victim->name);
   send_to_char (buf, ch);
   WAIT_STATE (ch, 15);

   send_to_char ("You rip their throat out and gourge on the blood.\n\r", ch);
   sprintf (buf,
	    "%s rips %s's throat out, gourging on all of their blood.",
	    ch->name, victim->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   ch->pcdata->condition[COND_THIRST] += number_range (100, 200);
   if (ch->pcdata->condition[COND_THIRST] >= 1000 /
       ch->pcdata->stats[UNI_GEN]);
   {
      send_to_char ("Your bloodlust is sated.\n\r", ch);
      ch->pcdata->condition[COND_THIRST] = 1000 / ch->pcdata->stats[UNI_GEN];
   }
   sprintf (buf, "%s body falls to the ground lifeless.", victim->name);
   send_to_char (buf, ch);
   act (buf, ch, NULL, NULL, TO_ROOM);
   raw_kill (victim, ch);
   return;
}


void do_bloodwall (CHAR_DATA * ch, char *argument)
{
   OBJ_DATA *obj = NULL;
   OBJ_DATA *objc;
   EXIT_DATA *pexit=NULL;
   char arg[MAX_STRING_LENGTH];
   char arg2[MAX_STRING_LENGTH];
   char wall[MAX_STRING_LENGTH];
   char buf[MAX_STRING_LENGTH];
   int duration;
   argument = one_argument (argument, arg);
   argument = one_argument (argument, arg2);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_DAIM) < 2)
   {
      send_to_char ("You need Daiminion 2 to call Blood Walls.\n\r", ch);
      return;
   }

   if (arg[0] == '\0' || (str_cmp (arg, "n") && str_cmp (arg, "north")
                          && str_cmp (arg, "s") && str_cmp (arg, "south")
                          && str_cmp (arg, "e") && str_cmp (arg, "east")
                          && str_cmp (arg, "w") && str_cmp (arg, "west")
                          && str_cmp (arg, "u") && str_cmp (arg, "up")
                          && str_cmp (arg, "d") && str_cmp (arg, "down")))
   {
      send_to_char ("You may wall n, w, s, e, d or u.\n\r", ch);
      return;
   }

   if (arg2[0] == '\0')
   {
      send_to_char ("Please supply the amount of blood to expend.\n\r", ch);
      return;
   }

   duration = is_number (arg2) ? atoi (arg2) : -1;

   if (duration > 200 || duration < 1)
   {
      send_to_char ("Please select a value between 1 and 200.\n\r", ch);
      return;
   }

   ch->pcdata->condition[COND_THIRST] -= duration;
   sprintf (buf, "A look of concentration passes over %s's face.", ch->name);
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char ("A look of concentration passes over your face.\n\r", ch);
   if (!str_cmp (arg, "n") || !str_cmp (arg, "north"))
   {
      sprintf (wall, "walln");
      pexit = ch->in_room->exit[0];
   }
   if (!str_cmp (arg, "w") || !str_cmp (arg, "west"))
   {
      sprintf (wall, "wallw");
      pexit = ch->in_room->exit[3];
   }
   if (!str_cmp (arg, "s") || !str_cmp (arg, "south"))
   {
      sprintf (wall, "walls");
      pexit = ch->in_room->exit[2];
   }
   if (!str_cmp (arg, "e") || !str_cmp (arg, "east"))
   {
      sprintf (wall, "walle");
      pexit = ch->in_room->exit[1];
   }
   if (!str_cmp (arg, "d") || !str_cmp (arg, "down"))
   {
      sprintf (wall, "walld");
      pexit = ch->in_room->exit[5];
   }
   if (!str_cmp (arg, "u") || !str_cmp (arg, "up"))
   {
      sprintf (wall, "wallu");
      pexit = ch->in_room->exit[4];
   }
   objc = get_wall_list (ch, wall, ch->in_room->contents);
   if (objc != NULL)
   {
      send_to_char ("There is already a wall blocking that direction.\n\r",
		    ch);
      return;
   }
   if (pexit == NULL)
   {
      send_to_char ("It MIGHT help if there was an exit to block there...\n\r",
		    ch);
      return;
   }
   WAIT_STATE (ch, 25);
   sprintf (buf, "A wall of blood pours out of the ground.\n\r");
   act (buf, ch, NULL, NULL, TO_ROOM);
   send_to_char (buf, ch);
   if (!str_cmp (arg, "n"))
   {
      obj = create_object (get_obj_index (30043), 0);
      sprintf (buf, "A wall of blood is here, blocking your exit north.");
      obj->description = str_dup (buf);
   }
   if (!str_cmp (arg, "s"))
   {
      obj = create_object (get_obj_index (30044), 0);
      sprintf (buf, "A wall of blood is here, blocking your exit south.");
      obj->description = str_dup (buf);
   }
   if (!str_cmp (arg, "e"))
   {
      obj = create_object (get_obj_index (30045), 0);
      sprintf (buf, "A wall of blood is here, blocking your exit east");
      obj->description = str_dup (buf);
   }
   if (!str_cmp (arg, "w"))
   {
      obj = create_object (get_obj_index (30046), 0);
      sprintf (buf, "A wall of blood is here, blocking your exit west");
      obj->description = str_dup (buf);
   }
   if (!str_cmp (arg, "d"))
   {
      obj = create_object (get_obj_index (30047), 0);
      sprintf (buf, "A wall of blood is here, blocking your exit down");
      obj->description = str_dup (buf);
   }
   if (!str_cmp (arg, "u"))
   {
      obj = create_object (get_obj_index (30048), 0);
      sprintf (buf, "A wall of blood is here, blocking your exit up.");
      obj->description = str_dup (buf);
   }

   obj_to_room (obj, ch->in_room);
   obj->timer = duration;
   obj->item_type = ITEM_WALL;
   return;

}


void do_guardian (CHAR_DATA * ch, char *argument)
{

   char buf[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   AFFECT_DATA af;
   int sn;

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

   if (IS_SET (ch->flag2, AFF2_INARENA))
   {
      stc ("Not while you're in the arena.\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_DAIM) < 1)
   {
      send_to_char ("You require level 1 Daimoinon to create a guardian.\n\r",
		    ch);
      return;
   }

   if (ch->pcdata->followers > 5)
   {
      send_to_char ("Nothing happens.\n\r", ch);
      return;
   }
   ch->pcdata->followers++;

   victim = create_mobile (get_mob_index (MOB_VNUM_GUARDIAN));
   victim->level = 200;
   victim->hit = 5000;
   victim->max_hit = 5000;
   victim->hitroll = 50;
   victim->damroll = 50;
   victim->armor = 300;
   SET_BIT (victim->act, ACT_NOEXP);

   strcpy (buf, "Come forth, creature of darkness, and do my bidding!");
   do_say (ch, buf);

   send_to_char ("A demon bursts from the ground and bows before you.\n\r",
		 ch);
   act ("$N bursts from the ground and bows before $n.", ch, NULL, victim,
	TO_ROOM);

   char_to_room (victim, ch->in_room);


   if ((sn = skill_lookup ("guardian")) < 0)
   {
      send_to_char ("Bug - please inform an imp.\n\r", ch);
      return;
   }

   add_follower (victim, ch);
   af.type = sn;
   af.duration = 6666;
   af.location = APPLY_NONE;
   af.modifier = 0;
   af.bitvector = AFF_CHARM;
   affect_to_char (victim, &af);
   return;

}
void do_gate (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   OBJ_DATA *obj;
   char arg[MAX_INPUT_LENGTH];
   int duration;

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_DAIM) < 3)
   {
      send_to_char
	 ("You require level 3 Daimoinon to create an Infernal Portal.\n\r",
	  ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to create a portal to?\n\r", ch);
      return;
   }

   victim = get_char_world (ch, arg);

   if ((victim = get_char_world (ch, arg)) == NULL
       || victim == ch
       || victim->in_room == NULL || ch->in_room == NULL || IS_NPC (victim))
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   if (!IS_IMMUNE (victim, IMM_SUMMON)
       || IS_SET (ch->in_room->room_flags, ROOM_PRIVATE)
       || IS_SET (ch->in_room->room_flags, ROOM_SOLITARY)
       || IS_SET (ch->in_room->room_flags, ROOM_NO_RECALL)
       || IS_SET (victim->in_room->room_flags, ROOM_PRIVATE)
       || IS_SET (victim->in_room->room_flags, ROOM_SOLITARY)
       || IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL)
       || victim->in_room->vnum == ch->in_room->vnum)
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }

   if (ch->fight_timer > 0)
   {
      stc ("Not with a fight timer!\n\r", ch);
      return;
   }
   duration = number_range (2, 3) * 15;

   obj = create_object (get_obj_index (OBJ_VNUM_PORTAL), 0);
   obj->value[0] = victim->in_room->vnum;
   obj->value[3] = ch->in_room->vnum;
   obj->timer = duration;
   free_string (obj->short_descr);
   obj->short_descr = str_dup ("an infernal portal");
   free_string (obj->description);
   obj->description =
      str_dup ("An infernal portal of burning flames floats here.");
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
      obj->extra_flags = ITEM_SHADOWPLANE;
   obj_to_room (obj, ch->in_room);

   obj = create_object (get_obj_index (OBJ_VNUM_PORTAL), 0);
   obj->value[0] = ch->in_room->vnum;
   obj->value[3] = victim->in_room->vnum;
   obj->timer = duration;
   free_string (obj->short_descr);
   obj->short_descr = str_dup ("an infernal portal");
   free_string (obj->description);
   obj->description =
      str_dup ("An infernal portal of burning flames floats here.");
   if (IS_AFFECTED (victim, AFF_SHADOWPLANE))
      obj->extra_flags = ITEM_SHADOWPLANE;
   obj_to_room (obj, victim->in_room);

   act ("$p bursts from the ground in front of $n.", ch, obj, NULL, TO_ROOM);
   act ("$p bursts from the ground in front of you.", ch, obj, NULL, TO_CHAR);
   act ("$p bursts from the ground in front of $n.", victim, obj, NULL,
	TO_ROOM);
   act ("$p bursts from the ground in front of you.", ch, obj, victim,
	TO_VICT);
   return;
}

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

   one_argument (argument, arg);

   if (IS_NPC (ch))
      return;
   if (!IS_CLASS (ch, CLASS_VAMPIRE))
   {
      send_to_char ("Huh?\n\r", ch);
      return;
   }
   if (get_disc(ch, VAM_DAIM) < 3)
   {
      send_to_char ("You require Daimoinon level 3 to gate.\n\r", ch);
      return;
   }
   if (arg[0] == '\0')
   {
      send_to_char ("Who do you wish to gate to?\n\r", ch);
      return;
   }

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


   if ((victim == ch)
       || victim->in_room == NULL
       || IS_NPC (victim)
       || (!IS_NPC (victim) && !IS_IMMUNE (victim, IMM_SUMMON))
       || IS_SET (ch->in_room->room_flags, ROOM_PRIVATE)
       || IS_SET (ch->in_room->room_flags, ROOM_SOLITARY)
       || IS_SET (ch->in_room->room_flags, ROOM_NO_RECALL)
       || IS_SET (victim->in_room->room_flags, ROOM_PRIVATE)
       || IS_SET (victim->in_room->room_flags, ROOM_SOLITARY)
       || IS_SET (victim->in_room->room_flags, ROOM_NO_RECALL)
       || victim->in_room->vnum == ch->in_room->vnum)
   {
      send_to_char ("You failed.\n\r", ch);
      return;
   }


   obj = create_object (get_obj_index (OBJ_VNUM_GATE), 0);
   obj->value[0] = victim->in_room->vnum;
   obj->value[3] = ch->in_room->vnum;
   obj->timer = 5;
   if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
      obj->extra_flags = ITEM_SHADOWPLANE;
   obj_to_room (obj, ch->in_room);

   obj = create_object (get_obj_index (OBJ_VNUM_GATE), 0);
   obj->value[0] = ch->in_room->vnum;
   obj->value[3] = victim->in_room->vnum;
   obj->timer = 5;
   if (IS_AFFECTED (victim, AFF_SHADOWPLANE))
      obj->extra_flags = ITEM_SHADOWPLANE;
   obj_to_room (obj, victim->in_room);
   act ("A look of concentration passes over $n's face.", ch, NULL, NULL,
	TO_ROOM);
   send_to_char ("A look of concentration passes over your face.\n\r", ch);
   act ("$p appears in front of $n in a blast of flames.", ch, obj, NULL,
	TO_ROOM);
   act ("$p appears in front of you in a blast of flames.", ch, obj, NULL,
	TO_CHAR);
   act ("$p appears in front of $n in a blast of flames.", victim, obj, NULL,
	TO_ROOM);
   act ("$p appears in front of you in a blast of flames.", ch, obj, victim,
	TO_VICT);
   return;
}

/* Obeah Powers Coded by Macademus 14/11/99
 * Taken from ideas from WhiteWolf's Vampire the Masqerade
 * And Ideas from God Wars Deluxe
 * (C) Macademus (AKA Matt Little 1999 All Rights Reserved
 */

/* 
 * First Power level 1: Obeah. giving the Vampire a "Third Eye"
 */

DO_COM (do_obeah)
{
   if (IS_NPC (ch))
      return;

   if (!IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_OBEA) < 1)
   {
      do_rand_typo (ch);
      return;
   }

   if (get_disc(ch, VAM_OBEA) == 0)
   {
      do_rand_typo (ch);
      return;
   }


   if (IS_SET (ch->newbits, NEW_OBEAH))
   {
      if (ch->pcdata->obeah > 0)
      {
	 send_to_char
	    ("You cannot close your eye until it stops glowing!\n\r", ch);
	 return;
      }
      send_to_char ("You close the eye on your forehead.\n\r", ch);
      act ("$n closes the eye on $s forehead.", ch, NULL, NULL, TO_ROOM);
      REMOVE_BIT (ch->newbits, NEW_OBEAH);
      return;
   }
   send_to_char ("Your third eye opens in your forehead.\n\r", ch);
   act ("A third eye opens in $n's forehead.", ch, NULL, NULL, TO_ROOM);
   SET_BIT (ch->newbits, NEW_OBEAH);
   return;
}

DO_COM (do_panacea)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (get_disc(ch, VAM_OBEA) < 1)
   {
      do_rand_typo (ch);
      return;
   }
   if (ch->fight_timer > 0)
   {
      stc ("Not until your fight timer has cleared!\n\r", ch);
      return;
   }
   if (ch->pcdata->obeah > 0)
   {
      if (ch->pcdata->obeah > 1)
	 sprintf (buf,
		  "You cannot call upon your Obeah powers for another %d seconds.\n\r",
		  ch->pcdata->obeah);
      else
	 sprintf (buf,
		  "You cannot call upon your Obeah powers for another 1 second.\n\r");
      send_to_char (buf, ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Who do you want to heal with Panacea?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They are not here.\n\r", ch);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_OBEAH))
      do_obeah (ch, "");
   if (victim->position == POS_FIGHTING)
   {
      stc ("Sorry you cant use that on a player that is fighting!\n\r", ch);
      return;
   }
   if (victim->fight_timer > 0)
   {
      stc ("Sorry you cant use that on a player that has a fight timer!\n\r",
	   ch);
      return;
   }

   if (victim->loc_hp[6] > 0)
   {
      int sn = skill_lookup ("clot");
      act ("$n's third eye begins to glow with an intense white light.", ch,
	   NULL, NULL, TO_ROOM);
      send_to_char
	 ("Your third eye begins to glow with an intense white light.\n\r",
	  ch);
      ch->pcdata->obeah = 5;
      (*skill_table[sn].spell_fun) (sn, ch->level, ch, victim);
   }
   else
   {
      if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	   victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5]) != 0)
      {
	 act ("$n's third eye begins to glow with an intense white light.",
	      ch, NULL, NULL, TO_ROOM);
	 send_to_char
	    ("Your third eye begins to glow with an intense white light.\n\r",
	     ch);
	 ch->pcdata->obeah = 10;
	 reg_mend (victim);
      }
      else if (victim->hit < victim->max_hit)
      {
         victim->hit += get_disc(ch, VAM_OBEA) * 1000;
	 act ("$n's third eye begins to glow with an intense white light.",
	      ch, NULL, NULL, TO_ROOM);
	 send_to_char
	    ("Your third eye begins to glow with an intense white light.\n\r",
	     ch);
	 ch->pcdata->obeah = 30;
	 update_pos (victim);
	 if (victim->hit >= victim->max_hit)
	 {
	    victim->hit = victim->max_hit;
	    send_to_char ("You have been completely healed!\n\r", victim);
	    act ("$n's wounds have been completely healed!", victim, NULL,
		 NULL, TO_ROOM);
	 }
	 else
	 {
	    send_to_char ("Your wounds begin to heal!\n\r", victim);
	    act ("$n's wounds begin to heal!", victim, NULL, NULL, TO_ROOM);
	 }
      }
      else
      {
	 send_to_char ("They don't require any healing.\n\r", ch);
	 return;
      }
   }
   return;
}

DO_COM (do_anesthetic)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (get_disc(ch, VAM_OBEA) < 2)
   {
      do_rand_typo (ch);
      return;
   }
   if (ch->pcdata->obeah > 0)
   {
      if (ch->pcdata->obeah > 1)
	 sprintf (buf,
		  "You cannot call upon your Obeah powers for another %d seconds.\n\r",
		  ch->pcdata->obeah);
      else
	 sprintf (buf,
		  "You cannot call upon your Obeah powers for another 1 second.\n\r");
      send_to_char (buf, ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Who do you want to use Anesthetic Touch on?\n\r", ch);
      return;
   }

   if ((victim = get_char_room (ch, arg)) == NULL)
   {
      send_to_char ("They are not here.\n\r", ch);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_OBEAH))
      do_obeah (ch, "");

   act ("$n's third eye begins to glow with an intense white light.", ch,
	NULL, NULL, TO_ROOM);
   send_to_char
      ("Your third eye begins to glow with an intense white light.\n\r", ch);
   ch->pcdata->obeah = 30;

   if (IS_SET (victim->newbits, NEW_NOPAIN))
   {
      send_to_char ("You remove their immunity to pain.\n\r", ch);
      send_to_char ("You no longer feel so oblivious to pain.\n\r", victim);
      REMOVE_BIT (victim->newbits, NEW_NOPAIN);
      return;
   }

   send_to_char ("You make them immune to pain.\n\r", ch);
   send_to_char ("You feel completely oblivious to pain.\n\r", victim);
   SET_BIT (victim->newbits, NEW_NOPAIN);

   return;
}

DO_COM (do_renew)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   int sn, check, oldcheck;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

   if (get_disc(ch, VAM_OBEA) < 5)
   {
      do_rand_typo (ch);
      return;
   }

   if (ch->position < POS_SLEEPING)
   {
      send_to_char ("You are too stunned!.\n\r", ch);
      return;
   }

   if (ch->position == POS_FIGHTING)
   {
      send_to_char ("No way!  You are still fighting!\n\r", ch);
      return;
   }
   if (ch->pcdata->obeah > 0)
   {
      if (ch->pcdata->obeah > 1)
	 sprintf (buf,
		  "You cannot call upon your Obeah powers for another %d seconds.\n\r",
		  ch->pcdata->obeah);
      else
	 sprintf (buf,
		  "You cannot call upon your Obeah powers for another 1 second.\n\r");
      send_to_char (buf, ch);
      return;
   }

   if (arg[0] == '\0')
   {
      send_to_char ("Who do you want to use Renewed Vigor on?\n\r", ch);
      return;
   }

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

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

   if (victim->position == POS_FIGHTING)
   {
      stc ("Sorry you cant use that on a player that is fighting!\n\r", ch);
      return;
   }
   if (victim->fight_timer > 0)
   {
      stc ("Sorry you cant use that on a player that has a fight timer!\n\r",
	   ch);
      return;
   }
   if (!IS_SET (ch->newbits, NEW_OBEAH))
      do_obeah (ch, "");

   if ((victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
	victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5] +
	victim->loc_hp[6]) == 0 && victim->hit == victim->max_hit)
   {
      send_to_char ("They don't require any healing.\n\r", ch);
      return;
   }

   act ("$n's third eye begins to glow with an intense white light.", ch,
	NULL, NULL, TO_ROOM);
   send_to_char
      ("Your third eye begins to glow with an intense white light.\n\r", ch);
   ch->pcdata->obeah = 60;
   if ((check = victim->loc_hp[6]) > 0)
   {
      oldcheck = 0;
      sn = skill_lookup ("clot");
      while (oldcheck != (check = victim->loc_hp[6]))
      {
	 oldcheck = check;
	 (*skill_table[sn].spell_fun) (sn, ch->level, ch, victim);
      }
   }
   if ((check = (victim->loc_hp[0] + victim->loc_hp[1] + victim->loc_hp[2] +
		 victim->loc_hp[3] + victim->loc_hp[4] + victim->loc_hp[5])) >
       0)
   {
      oldcheck = 0;
      while (oldcheck != (check = victim->loc_hp[0] + victim->loc_hp[1] +
			  victim->loc_hp[2] + victim->loc_hp[3] +
			  victim->loc_hp[4] + victim->loc_hp[5]))
      {
	 oldcheck = check;
	 reg_mend (victim);
      }
   }
   if (victim->hit < victim->max_hit)
   {
      victim->hit = victim->max_hit;
      send_to_char ("You have been completely healed!\n\r", victim);
      act ("$n's wounds have been completely healed!", victim, NULL, NULL,
	   TO_ROOM);
      update_pos (victim);
   }

   return;
}

/* Diablerie for Vampires */

void do_diablerize (CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   int gen_vic;
   int gen_ch;

   argument = one_argument (argument, arg);

   if (IS_NPC (ch))
      return;

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

   if (!*arg)
   {
      send_to_char ("Diablerize Who?\r\n", ch);
      return;
   }

   if (!(victim = get_char_room (ch, arg)))
   {
      send_to_char ("They are not here.\n\r", ch);
      return;
   }

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

   gen_vic = victim->pcdata->stats[UNI_GEN];
   gen_ch = ch->pcdata->stats[UNI_GEN];

/*
    if (gen_ch < gen_vic )
    {
	send_to_char("There blood is too weak for you to diablerize.\n\r",ch);
    }

    if (gen_ch == gen_vic )
    {
	send_to_char("You can gain nothin from someone the same generation as you.\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 ("They are not even a vampire!\n\r", ch);
      return;
   }


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

   if (!CAN_PK (ch) || !CAN_PK (victim))
   {
      send_to_char ("Both players must be avatars.\n\r", ch);
      return;
   }

   if (victim->position > 1)
   {
      send_to_char ("They must be in torpor first.\n\r", ch);
      return;
   }

   if (is_safe (ch, victim))
      return;

//    victim->vampgen++;
   if (gen_vic < gen_ch && gen_ch > 3)
   {
      ch->pcdata->stats[UNI_GEN]--;
      victim->pcdata->stats[UNI_GEN]++;
   }
   ch->fight_timer += 10;
   ch->pkill = ch->pkill + 1;
   do_diabkill (ch, victim->name);
   victim->pdeath = victim->pdeath + 1;
   if (ch->beast < 100)
      ch->beast = ch->beast + 10;
   sprintf (buf, "#r%s#y has been diablerized by #r%s#n!", victim->name,
	    ch->name);
   do_info (ch, buf);
   return;

}