/
vortex/area/
#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"

bool check_beast( CHAR_DATA *ch )
{
 if( IS_NPC(ch) )
  return FALSE;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
  return FALSE;
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_GOLCANDA)
  || IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_BEAST)
  || IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_DARK_GOLC) )
  return FALSE;
 if( number_range(1,130) < 10 )
  return TRUE;
 return FALSE;
}

void check_vkills( CHAR_DATA *ch )
{
 int chance;
 int chance_mod;
 char buf[MAX_STRING_LENGTH];

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
  return;
 if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_GOLCANDA) )
  return;

 chance = GET_POWERS(ch,VAMP_KILLS);
 chance_mod = (GET_POWERS(ch,VAMP_KILLS)/5);
 chance += chance_mod;

 if( number_range(1,130) < chance )
 {
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_GOLCANDA);
  SET_BIT_POWERS(ch,VAMP_BITS,BIT_DARK_GOLC);
  stc("You have now become one of the feared...A traitor of their own kind; a plague on humanity.\n\r",ch);
  stc("You are now...A Dark Golcanda!\n\r\n\r",ch);
  act("An inhuman power of darkness begins to course through your veins!",ch,NULL,NULL,TO_CHAR);
  act("An inhuman power of darkness begins to course through $n's veins!",ch,NULL,NULL,TO_ROOM);
  sprintf(buf,"%s has mutated into a Dark Golcanda!",ch->pcdata->switchname);
  do_info(ch,buf);
  return;
 }
 return;
}

void do_bloodme( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;
 GET_POWERS(ch,VAMP_BLOOD) = blood_max(ch);
 return;
}

int blood_max( CHAR_DATA *ch )
{
 int max, gen_mod, age_mod, base_mod, tide_mod;

 if( ch == NULL )
  return 0;
 base_mod = 100;
 switch( ch->generation )
 {
  case 1:  gen_mod = 7; break;
  case 2:  gen_mod = 5;  break;
  case 3:  gen_mod = 3;  break;
  case 4:  gen_mod = 1;  break;
  default: gen_mod = 0;  break;
 }
 switch( GET_POWERS(ch,VAMP_AGE) )
 {
  case AGE_NONE:       age_mod = 1; break;
  case AGE_CAITIFF:    age_mod = 3; break;
  case AGE_ANCILLA:    age_mod = 5; break;
  case AGE_ELDER:      age_mod = 7; break;
  case AGE_METHUSELAH: age_mod = 9; break;
  default:             age_mod = 0; break;
 }
 switch( ch->generation )
 {
  case 1:  tide_mod = 2.00; break;
  case 2:  tide_mod = 1.75; break;
  case 3:  tide_mod = 1.50; break;
  case 4:  tide_mod = 1.25; break;
  default: tide_mod = 1.00; break;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_TIDE) )
  max = ( ( (gen_mod + age_mod) * base_mod) * tide_mod);
 else
  max = ( (gen_mod + age_mod) * base_mod);
 return max;
}

void do_vamp_conceal( CHAR_DATA *ch, char *argument )
{
 int cost = 200;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBFUSCATE) < 5 )
 {
  stc("You need to obtain Obfuscate 5 to conceal yourself.\n\r",ch);
  return;
 }
 if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_CONCEAL) && (GET_POWERS(ch,VAMP_BLOOD) < cost) )
 {
  stc("You first require 200 blood to conceal yourself.\n\r",ch);
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_CONCEAL) )
 {
  stc("You slowly fade back into existance.\n\r",ch);
  act("$n slowly fades back into existance.",ch,NULL,NULL,TO_ROOM);
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_CONCEAL);
  return;
 }
 else if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_CONCEAL) )
 {
  stc("You slowly fade out of existance.\n\r",ch);
  act("$n slowly fades out of existance.",ch,NULL,NULL,TO_ROOM);
  SET_BIT_POWERS(ch,VAMP_BITS,BIT_CONCEAL);
  GET_POWERS(ch,VAMP_BLOOD) -= cost;
  return;
 }
 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) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 7 )
 {
  stc("You need to obtain Quietus 7 to sharpen.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("What do you wish to sharpen?\n\r",ch);
  return;
 }
 if( ( obj = get_obj_carry(ch,arg) ) == NULL )
 {
  stc("You dont have that weapon.\n\r",ch);
  return;
 }
 if( IS_SET(obj->quest,QUEST_ARTIFACT) || obj->item_type != ITEM_WEAPON )
 {
  stc("You cant sharpen that item.\n\r",ch);
  return;
 }
 if( obj->value[0] == 18000 )
 {
  stc("This item is already razor sharp!\n\r",ch);
  return;
 }
 if( obj->value[0] != 0 )
 {
  stc(" This weapon already has a power.\n\r",ch);
  return;
 }

 obj->value[0] = 18000;
 obj->value[1] += 5;
 obj->value[2] += 10;

 sprintf(arg,"You grind away at %s until it is razor sharp!",obj->short_descr);
 stc(arg,ch);
 sprintf(arg,"%s grinds away at %s until it is razor sharp!",ch->name,obj->short_descr);
 act(arg,ch,NULL,NULL,TO_ROOM);
 return;
}

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

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 8 )
 {
  stc("You need to obtain Thaumaturgy 8 to gourge.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Who do you wish to gourge?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( !IS_NPC(victim) )
 {
  stc("You cannot gourge a person.\n\r",ch);
  return;
 }
 if( victim->level > 100 )
 {
  stc("Only small creatures are defenceless enough to be gourged on.\n\r",ch);
  return;
 }
 act("$n leaps toward $N baring $s fangs!",ch,NULL,victim,TO_NOTVICT);
 act("You leap toward $N baring your fangs!",ch,NULL,victim,TO_CHAR);
 WAIT_STATE(ch,15);
 act("You rip out $N's throat, and gourge on all of $S blood!",ch,NULL,victim,TO_CHAR);
 act("$n rips out $N's throat, and gourges on all of $S blood!",ch,NULL,victim,TO_NOTVICT);
 GET_POWERS(ch,VAMP_BLOOD) += (victim->level * (GET_POWERS(ch,DISC_THAUM) / 2));
 if( GET_POWERS(ch,VAMP_BLOOD) >= blood_max(ch) )
 {
  stc("Your bloodlust is sated.\n\r",ch);
  GET_POWERS(ch,VAMP_BLOOD) = blood_max(ch);
 }
 act("$N's body falls lifelessly to the ground.",ch,NULL,victim,TO_ROOM);
 raw_kill( victim );
 return;
}

void do_bloodwater( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 char arg[MAX_INPUT_LENGTH];
 int dam;
 int cost = 100;
 
 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 9 )
 {
  stc("You need to obtain Thaumaturgy 9 to use blood water.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 100 blood to turn blood into water.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc( "Whose blood do you wish to turn to water?\n\r", ch );
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc( "They aren't here.\n\r", ch );
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 dam = number_range(50,100) * GET_POWERS(ch,DISC_THAUM);
 if( IS_CLASS(victim,CLASS_VAMPIRE) )
 {
  dam *= 1.5;
  GET_POWERS(victim,VAMP_BLOOD) -= dam;
 }
 else
  victim->hit -= dam;
 act2("$N screams in agony as you turn $S blood to water! [$D]",ch,NULL,victim,TO_CHAR,dam);
 act2("$N screams in agony as $n turns $S blood to water! [$D]",ch,NULL,victim,TO_NOTVICT,dam);
 act2("You scream in agony as $n turns your blood to water! [$D]",ch,NULL,victim,TO_VICT,dam);
 if( IS_CLASS(victim,CLASS_VAMPIRE) && IS_SET(GET_POWERS(victim,VAMP_BITS),BIT_ACID) )
 {
  dam *= 1.25;
  act2("The acidic content of your blood causes you to scream in agony! [$D]",ch,NULL,victim,TO_VICT,dam);
  act2("The acidic content of $N's blood causes $m to scream in agony! [$D]",ch,NULL,victim,TO_ROOM,dam);
  GET_POWERS(victim,VAMP_BLOOD) -= dam;
  if( GET_POWERS(victim,VAMP_BLOOD) < 0 )
   GET_POWERS(victim,VAMP_BLOOD) = 0;
  victim->hit -= dam;
  update_pos(victim);
 }
 if( !IS_CLASS(victim,CLASS_VAMPIRE) )
  WAIT_STATE(ch,12);
 else
  WAIT_STATE(ch,6);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 return;
}

void do_spew( CHAR_DATA *ch, char *argument )
{
 int sn, level, spelltype;
 int cost = 150;
 
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 6 )
 {
  stc("You need Thaumaturgy 6 to spew acid.\n\r",ch);
  return; 
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 150 blood to spew acid.\n\r",ch);
  return;
 }
 if( IS_SET(ch->in_room->room_flags,ROOM_SAFE) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 if( ( sn = skill_lookup("spew") ) < 0 )
  return;
 spelltype = skill_table[sn].target;
 level = GET_POWERS(ch,DISC_THAUM);
 (*skill_table[sn].spell_fun) (sn,level,ch,NULL);
 WAIT_STATE(ch,12);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 return;
}

void do_vampdarkness( CHAR_DATA *ch, char *argument )
{
 ROOM_INDEX_DATA *room;   
 int cost = 100;
 room = ch->in_room;
 if( IS_NPC(ch) )
  return;
 if( IS_CLASS(ch,CLASS_DROW) )
 {
  do_darkness(ch,argument);
  return;
 }
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 6 )
 {
  stc("You need Quietus 6 to summon darkness.\n\r",ch);
  return;
 }
 if( weather_info.sunlight != SUN_SET && weather_info.sunlight != SUN_DARK )
 {
  stc("Darkness can not be summoned in the daylight!\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 100 blood to summon darkness.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 SET_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS);
 act("A look of concentration passes over $n's face.",ch,NULL,NULL,TO_ROOM);
 stc("A look of concentration passes over your face.\n\r",ch);
 act("A complete darkness fills the room.",ch,NULL,NULL,TO_ALL);
 return;
}

void do_dragonform( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 int cost = 300;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 7 )
 {
  stc("You need Vicissitude 7 to transform into a dragon.\n\r",ch);
  return;
 }
 if( (GET_POWERS(ch,VAMP_FORM) != FORM_ZULO) && (GET_POWERS(ch,VAMP_FORM) != FORM_DRAGON) )
 {
  stc("You can only transform into a dragon while in Zuloform.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) == FORM_DRAGON )
 {
  GET_POWERS(ch,VAMP_FORM) = FORM_ZULO;
  stc("You transform back into zuloform.",ch);
  act("$n shrinks back into a big black monster.",ch,NULL,NULL,TO_ROOM);
/*  free_string(ch->morph);
  ch->morph = str_dup("A big black monster");
  */return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to transform into a large dragon.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 stc("You transform into a large dragon!",ch);
 act("$n's body grows and distorts into a large dragon!",ch,NULL,NULL,TO_ROOM);
 GET_POWERS(ch,VAMP_FORM) = FORM_DRAGON;
/* free_string(ch->morph);
 ch->morph = str_dup("A large black dragon");
 */return;
}

void do_objform( CHAR_DATA *ch, char *argument )
{
 OBJ_DATA *obj;                              
 OBJ_DATA *obji;
 char buf[MAX_STRING_LENGTH];
 char arg[MAX_STRING_LENGTH];
 int cost = 500;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 stc("COMMAND TEMPORARILY DISABLED\n\r", ch);
 return; 
 if( GET_POWERS(ch,DISC_VICIS) < 10 )
 {
  stc("You need Vicissitude 10 to transform into an object.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 500 blood to transform into an object.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
 {
  stc("You cannot do this while not in human form.\n\r",ch);
  return;
 }
 if( ch->pcdata->obj_vnum != 0 )
 {
  do_humanform(ch,"");
  return;
 }
 if( ch->fight_timer > 0 )
 {
  stc("Not with a fight timer.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("What object in the game do you wish to assume the form of?\n\r",ch); 
  return;
 }
 if( (obji = get_obj_world(ch,arg) ) == NULL )
 {
  stc("Nothing like that is in the game.\n\r",ch);
  return;
 }
 if( IS_AFFECTED(ch,AFF_WEBBED) )
 {
  stc( "Not with all this sticky webbing on.\n\r", ch);
  return;
 }
 if( obji->item_type == ITEM_GEMSTONE ||
     obji->item_type == ITEM_HILT     ||
     obji->item_type == ITEM_COPPER   ||
     obji->item_type == ITEM_IRON     ||
     obji->item_type == ITEM_STEEL    ||
     obji->item_type == ITEM_ADAMANTITE||
     obji->item_type == ITEM_QUEST ||
     IS_SET(obji->quest,QUEST_ARTIFACT)
     || IS_SET(obji->quest,QUEST_RELIC) )
 {
  stc("You are unable to take the form of that.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 obj = create_object(get_obj_index(obji->pIndexData->vnum),60);
 obj_to_room(obj,ch->in_room);
 stc("You concentrate briefly...\n\r",ch);
 act("$n's form shrinks and distorts into $p.",ch,obj,NULL,TO_ROOM);
 act("Your form shrinks and distorts into $p.",ch,obj,NULL,TO_CHAR);
 ch->pcdata->obj_vnum = obj->pIndexData->vnum;
 sprintf(buf,"%d",ch->pcdata->obj_vnum);
 stc(buf,ch);
 obj->chobj = ch;
 ch->pcdata->chobj = obj;
 GET_POWERS(ch,VAMP_FORM) = FORM_OBJECT;
 SET_BIT(ch->extra, EXTRA_OSWITCH);
/* free_string(ch->morph);
 ch->morph = str_dup(obj->short_descr);
 */return;
}

void do_baal( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 9 )
 {
  stc("You need Daimionon 9 to summon the spirit of Baal.\n\r",ch);
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_BAAL) )
 {
  stc("You already have the spirit of Baal with you!\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < blood_max(ch) )
 {
  stc("You need maximum blood to summon Baal.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) = 0;
 WAIT_STATE(ch,20);
 SET_BIT_POWERS(ch,VAMP_BITS,BIT_BAAL);
 GET_POWERS(ch,DISC_POTENCE)++;
 GET_POWERS(ch,DISC_CELERITY)++;
 GET_POWERS(ch,DISC_FORTITUDE)++;
 stc("You feel a surge of power as the spirit of Baal courses through your veins!\n\r",ch);
 return;
}

void do_inferno( CHAR_DATA *ch, char *argument )
{
 ROOM_INDEX_DATA *room;
 int cost = 200;

 room = ch->in_room;
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 6 )
  {
  stc("You need Daimionon 6 to use Inferno.\n\r",ch);
  return;
  }
 if( IS_SET(ch->in_room->room_flags,ROOM_FLAMING) )
 {
  stc("This room is already engulfed in flames!\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 200 blood to summon the fires of hell.\n\r",ch);
  return;
 }
 if( IS_SET(ch->in_room->room_flags,ROOM_SAFE) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 SET_BIT(room->room_flags,ROOM_FLAMING);
 act("A look of concentration passes over $n's face.",ch,NULL,NULL,TO_ROOM);
 stc("A look of concentration passes over your face.\n\r",ch);
 act("The room suddenly explodes into flames!",ch,NULL,NULL,TO_ALL);
 return;
}

void do_zombie(CHAR_DATA *ch, char *argument )
{
 char buf2[MAX_STRING_LENGTH]; 
 char buf [MAX_INPUT_LENGTH];
 char arg [MAX_STRING_LENGTH];
 AFFECT_DATA af;
 CHAR_DATA *victim;
 OBJ_DATA *obj;
 int cost = 300; 

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Zombie what corpse?\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 3 )
 {
  stc("You need Daimionon 3 to create a zombie.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to summon a zombie.\n\r",ch);
  return;
 }
 if( ch->pcdata->followers > 0 )
 {
  stc("Nothing happens.\n\r",ch);
  return;
 }
 if( (obj = get_obj_carry(ch,arg) ) == NULL )
 {
  stc("You dont have that corpse.",ch);
  return;
 }
 if( obj->item_type != ITEM_CORPSE_NPC || IS_SET(obj->quest,QUEST_ZOMBIE) )
 {
  stc("You can only create zombies from original corpses.\n\r",ch);
  return;
 }
 if( obj->value[2] == 6 )
 {
  stc("You cannot zombie a mount.\n\r",ch);
  return;
 }
 if( IS_SET(ch->newbits, HAS_HADES) )
 {
   stc("Hades stops you from making a zombie.\n\r", ch);
   return;
 }
 if( obj->level > 750 )
 {
  stc("You fail to make a zombie from the corpse.\n\r", ch);
  return;
 }
 victim = create_mobile( get_mob_index(obj->value[2]) );
 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);
 do_say(ch,"Get your ass out of that moldy dirt so I can ride you like a donkey all night long! (Kalfyre,03.26.02)");
 sprintf(buf,"%s slowly rises from the earth.\n\r",obj->short_descr);
 act(buf,ch,NULL,NULL,TO_ROOM);
 stc(buf,ch);
 char_to_room(victim,ch->in_room);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 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);
 do_follow(victim,ch->name);
 ch->pcdata->followers++;
 return;
}

void do_fleshcraft( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 char arg[MAX_INPUT_LENGTH];
 int cost = 300;

 argument = one_argument( argument, arg );
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 2 )
 {
  stc("You need Vicissitude 2 to change your appearance.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Change to look like whom?\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
 {
  stc("You need to be in humanform, first.\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg)) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the required 300 blood to mold your flesh.\n\r",ch);
  return;
 }
 if( ch == victim )
 {
  if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_DISGUISE) )
  {
   stc("You already look like yourself!\n\r",ch);
   return;
  }
  sprintf(arg,"%s's flesh molds and transforms into %s.",ch->pcdata->switchname,ch->pcdata->switchname);
  act("Your flesh molds and transforms into your true form.",ch,NULL,victim,TO_CHAR);
  act(arg,ch,NULL,victim,TO_ROOM);
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_DISGUISE);
/*  free_string(ch->morph);
  ch->morph = str_dup("");
  */return;
 }
 act("Your flesh molds and transforms into a clone of $N.",ch,NULL,victim,TO_CHAR);
 act("$n's flesh molds and transforms into a clone of $N.",ch,NULL,victim,TO_NOTVICT);
 act("$n's flesh molds and transforms into a clone of you!",ch,NULL,victim,TO_VICT);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 SET_BIT_POWERS(ch,VAMP_BITS,BIT_DISGUISE);
/* free_string(ch->morph);
 if( IS_NPC(victim) )
  ch->morph = str_dup(victim->short_descr);
 else
  ch->morph = str_dup(victim->pcdata->switchname);
 */return;
}

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

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) ) 
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_PRESENCE) < 3 )
 {
  stc("You need Presence 3 to entrance.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 200 blood to entrance.\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( ch == victim )
 {
  stc("You cannot entrance yourself.\n\r",ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 stc("A look of concentration crosses your face.\n\r",ch);
 act("A look of concentration crosses over $n's face.",ch,NULL,victim,TO_ROOM);
 if( (sn = skill_lookup("charm") ) < 0 )
  return;
 spelltype = skill_table[sn].target;
 level = GET_POWERS(ch,DISC_PRESENCE) * 30;
 (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 WAIT_STATE(ch,12);
 return;
}

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

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) ) 
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBTEN) < 6 )
 {
  stc("You need Obtenebration 6 to summon abyssal tendrils.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 100 blood to summon abyssal tendrils.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Summon abyssal tendrils on who?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( ch == victim )
 {
  stc("You cannot summon abyssal tendrils on yourself.\n\r", ch );
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 if( (sn = skill_lookup("web") ) < 0 )
  return;
 spelltype = skill_table[sn].target;
 level = ch->spl[spelltype] * 0.25;
 (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 WAIT_STATE(ch,12);
 return;
}

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

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBTEN) < 5 )
 {
  stc("You need Obtenebration 5 to lamprey.\n\r",ch);
  return;
 }
 if( (victim = ch->fighting) == NULL )
 {
  stc("You aren't fighting anyone!\n\r",ch);
  return;
 }
 if( !IS_NPC(victim) )
  dam = GET_POWERS(ch,DISC_OBTEN) * number_range(50,100);
 else
  dam = GET_POWERS(ch,DISC_OBTEN) * number_range(50,150);
 act2("Your tendrils of darkness hits $N incredibly hard! [$D]",ch,NULL,victim,TO_CHAR,dam);
 act2("$n's tendrils of darkness hits you incredibly hard! [$D]",ch,NULL,victim,TO_VICT,dam);
 act2("$n's tendrils of darkness hits $N incredibly hard! [$D]",ch,NULL,victim,TO_NOTVICT,dam);

 hurt_person(ch,victim,dam);
 GET_POWERS(ch,VAMP_BLOOD) += dam/5;
 if( GET_POWERS(ch,VAMP_BLOOD) >= blood_max(ch) )
 {
  stc("Your bloodlust is sated.\n\r",ch);
  GET_POWERS(ch,VAMP_BLOOD) = blood_max(ch);
 }
 if( IS_CLASS(victim,CLASS_VAMPIRE) && IS_SET(GET_POWERS(victim,VAMP_BITS),BIT_ACID) )
 {
  dam *= 1.75;
  act2("The acidic content of $N's blood eats away at your insides [$D]!",ch,NULL,victim,TO_CHAR,dam);
  act2("$n doubles over in agony as the acidic content of $N's blood eats away at $s insides! [$D]",ch,NULL,victim,TO_ROOM,dam);
  GET_POWERS(ch,VAMP_BLOOD) -= dam;
  if( GET_POWERS(ch,VAMP_BLOOD) < 0 )
   GET_POWERS(ch,VAMP_BLOOD) = 0;
  ch->hit -= dam;
  update_pos(ch);
 }
 WAIT_STATE(ch,8);
 return;
}

void do_assassinate( 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) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 4 )
 {
  stc("You need Quietus 4 to assassinate.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Assassinate whom?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( victim == ch )
 {
  stc( "How can you assassinate yourself?\n\r", ch );
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 if( victim->fighting != NULL )
 {
  stc("You can't assassinate a fighting person!\n\r",ch);
  return;
 }
 if( victim->hit < (victim->max_hit * 0.80) )
 {
  act("$N is hurt and suspicious...you can't sneak up.",ch,NULL,victim,TO_CHAR);
  return;
 }
 if( IS_AWAKE(victim) )
  dam = GET_POWERS(ch,DISC_QUIETUS) * 200;
 else
  dam = GET_POWERS(ch,DISC_QUIETUS) * 300;
 if( IS_AFFECTED(ch,AFF_HIDE) )
  dam *= 1.25;
 if( IS_AFFECTED(ch,AFF_SNEAK) )
  dam *= 1.25;
 if( GET_POWERS(ch,DISC_QUIETUS) >= 10 )
  dam *= 1.25;
 dam += number_range(1,100);
 act2("Your assassination hits $N incredibly hard! [$D]",ch,NULL,victim,TO_CHAR,dam);
 act2("$n's assassination hits you incredibly hard! [$D]",ch,NULL,victim,TO_VICT,dam);
 act2("$n's assassination hits $N incredibly hard! [$D]",ch,NULL,victim,TO_NOTVICT,dam);
 if( dam > victim->hit )
  dam = victim->hit-1;
 hurt_person(ch,victim,dam);
 set_fighting(ch,victim);
 if( victim->hit <= 1 )
 {
  victim->hit = 1;
  stc("You spin around and throw a headbutt to finish them!\n\r",ch);
  set_fighting(ch,victim);
  damage(ch,victim,11,gsn_headbutt);
 }
 WAIT_STATE(ch,18);
 return;
}

void do_mindblast( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 CHAR_DATA *victim;
 int cost = 300;
 
 argument = one_argument(argument,arg);
 
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_PRESENCE) < 2 )
 {
  stc("You require Presence 2 to mindblast.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to mindblast.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Mindblast whom?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( ch == victim )
 {
  stc("You cannot mindblast yourself!\n\r",ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 if( victim->hit < (victim->max_hit * .90) )
 {
  stc("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);
 if( number_range(1,100) > (GET_POWERS(ch,DISC_PRESENCE) * 7) )
 {
  stc("You attempt to focus your mental energies...and fail!\n\r",ch);
  return;
 }
 WAIT_STATE(ch,12);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 act("You clutch your head in agony!",ch,NULL,victim,TO_VICT);
 act("$n clutches his head in agony!",ch,NULL,victim,TO_ROOM);
 victim->position = POS_STUNNED;
 victim->stuntimer = 2;
 update_pos(victim);
 return;
}

void do_tongue( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 int dam;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_SERPENTIS) < 4 )
 {
  stc("You need Serpentis 4 to tongue.\n\r",ch);
  return;
 }
 if( (victim = ch->fighting) == NULL )
 {
  stc("You aren't fighting anyone.\n\r",ch);
  return;
 }
 if( !IS_NPC(victim) )
  dam = GET_POWERS(ch,DISC_SERPENTIS) * 30;
 else
  dam = GET_POWERS(ch,DISC_SERPENTIS) * 125;
 dam += number_range(1,100);
 act2("Your tongue of the serpent hits $N incredibly hard! [$D]",ch,NULL,victim,TO_CHAR,dam);
 act2("$n's tongue of the serpent hits you incredibly hard! [$D]",ch,NULL,victim,TO_VICT,dam);
 act2("$n's tongue of the serpent hits $N incredibly hard! [$D]",ch,NULL,victim,TO_NOTVICT,dam);
 WAIT_STATE(ch,6);
 hurt_person(ch,victim,dam);
 return;
}

void do_vamp_gate( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 OBJ_DATA  *obj;
 char arg[MAX_INPUT_LENGTH];
 int cost = 500; 

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 1 )
 {
  stc("You need Daimoinon 1 to create a gate of blood.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Who do you wish to gate to?\n\r",ch);
  return;
 }
 if( (victim = get_char_world(ch,arg ) ) == NULL )
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 500 blood to create a gateway of blood.\n\r",ch);
  return;
 }
 if( (ch->in_room->vnum >= 50) && (ch->in_room->vnum <= 68) )
 {
  stc("You cannot do this whilst you are in the arena.\n\r", ch);
  return;
 }
 if( (victim->in_room->vnum >= 50) && (victim->in_room->vnum <= 68) )
 {
  stc("You cannot do this whilst they are in the arena.\n\r", ch);
  return;
 }
 if( (victim == ch) 
  ||   victim->in_room == NULL
  ||   (!IS_NPC(victim) && !IS_IMMUNE(victim,IMM_SUMMON) )
  ||   (victim->in_room->vnum == ch->in_room->vnum)
  ||   is_ds_range(ch)
  ||   is_ds_range(victim) 
  ||   victim->in_room->vnum == 26 )
 {
  stc("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);
 stc("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);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 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) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_ANIMALISM) < 3 )
 {
  stc("You need Aimalism 3 to summon a pigeon messenger.\n\r",ch);
  return;
 }
 if( arg1[0] == '\0' )
 {
  stc("Pigeon which object?\n\r",ch);
  return;
 }
 if( arg2[0] == '\0' )
 {
  stc("Pigeon what to whom?\n\r",ch);
  return;
 }
 if( (obj = get_obj_carry(ch,arg1) ) == NULL )
 {
  stc("You are not carrying that item.\n\r",ch  );
  return;
 }
 if( (victim = get_char_world(ch,arg2) ) == NULL )
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( IS_NPC(victim) )
 {
  stc("Not on mobs.\n\r",ch);
  return;
 }
 if( IS_DAMNED(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_embrace( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 CHAR_DATA *victim;
 int dam = 0;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Whom do you wish to embrace?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL)
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( victim->level >= 400 )
 {
  stc("They are too powerful for you to embrace.\n\r", ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 act("$n leaps toward $N baring $s fangs!",ch,NULL,victim,TO_ROOM);
 act("You leap toward $N baring your fangs!",ch,NULL,victim,TO_CHAR);
 act("$n leaps toward you baring $s fangs!",ch,NULL,victim,TO_VICT);
 WAIT_STATE(ch,15);
 if( victim->position != POS_STUNNED && victim->position != POS_SLEEPING )
 {
  act("$N lunges away from you!",ch,NULL,victim,TO_CHAR);
  act("$N lunges away from $n!",ch,NULL,victim,TO_ROOM);
  act("You lunge away from $n!",ch,NULL,victim,TO_VICT);
  return;
 }
 act("You bury your fangs deep into $N's neck, drinking all of $S blood!",ch,NULL,victim,TO_CHAR);
 act("$n buries $s fangs deep into $N's neck, drinking all of $S blood!",ch,NULL,victim,TO_NOTVICT);
 act("$n buries $s fangs deep into your deck, drinking all of your blood!",ch,NULL,victim,TO_VICT);
 GET_POWERS(ch,VAMP_BLOOD) += number_range(300,700);
 if( GET_POWERS(ch,VAMP_BLOOD) >= blood_max(ch) )
 {
  stc("Your bloodlust is sated.\n\r",ch);
  GET_POWERS(ch,VAMP_BLOOD) = blood_max(ch);
 }
 act("$N's body falls to the ground, lifeless.",ch,NULL,victim,TO_NOTVICT);
 act("$N's body falls to the ground, lifeless.",ch,NULL,victim,TO_CHAR);
 stc("Your body falls to the ground, lifeless.",victim);
 if( IS_NPC(victim) )
  raw_kill(victim);
 else
 {
  hurt_person(ch,victim,number_range(1000,4000));
  if( IS_CLASS(victim,CLASS_VAMPIRE) && IS_SET(GET_POWERS(victim,VAMP_BITS),BIT_ACID) )
  {
   dam = number_range(100,500);
   act2("The acidic content of your blood causes you to scream in agony! [$D]",ch,NULL,victim,TO_CHAR,dam);
   act2("The acidic content of $N's blood causes $m to scream in agony! [$D]",ch,NULL,victim,TO_ROOM,dam);
   GET_POWERS(ch,VAMP_BLOOD) -= dam;
   if( GET_POWERS(ch,VAMP_BLOOD) < 0 )
    GET_POWERS(ch,VAMP_BLOOD) = 0;
   ch->hit -= dam;
   update_pos(ch);
  }
 }
 update_pos(victim);
 return;
}

void do_decay( CHAR_DATA *ch,char *argument )
{
 CHAR_DATA *victim;
 OBJ_DATA *obj;
 char arg[MAX_INPUT_LENGTH];
 int cost = 300;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 5 )
 {
  stc("You need Daimoinon 5 to cause decay of the flesh.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to cause decay of the flesh.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Deacy who's flesh?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 WAIT_STATE(ch,40);
 act("A look of concentration crosses over $n's face.",ch,NULL,victim,TO_ROOM);
 stc("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) )
 {
  stc("All of their limbs have already decayed!\n\r",ch);
  return;
 }
 if( number_range(1,100) < 30 )
 {
  GET_POWERS(ch,VAMP_BLOOD) -= cost;
  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");
   act("A supernatural force rips $N's arm off!",ch,NULL,victim,TO_ALL);
   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");
   act("A supernatural force rips $N's arm off!",ch,NULL,victim,TO_ALL);
   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");
   act("A supernatural force rips $N's leg off!",ch,NULL,victim,TO_ALL);
   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");
   act("A supernatural force rips $N's leg off!",ch,NULL,victim,TO_ALL);
   return;
  }
 }
 else
 {
  stc("You failed.\n\r",ch);
  return;
 }
 return;
}

void do_infirmity( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 char arg[MAX_INPUT_LENGTH];
 int sn, level, spelltype;
 int cost = 300;
    
 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 2 )
 {
  stc("You need Quietus 2 to inflict infirmity.\n\r",ch);
  return; 
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You require 300 blood to inflict infirmity.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Who do you wish to inflict infirmity on?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg ) ) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 if( ( sn = skill_lookup("infirmity") ) < 0 ) 
  return;
 spelltype = skill_table[sn].target;
 level = GET_POWERS(ch,DISC_QUIETUS) * 2;
 (*skill_table[sn].spell_fun) ( sn, level, ch, victim );
 WAIT_STATE( ch, 12 );
 return; 
}

void do_guardian(CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 AFFECT_DATA af;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 2 )
 {
  stc("You need Daimoinon 2 to summon a guardian.\n\r",ch);
  return;
 }
 if( IS_SET(ch->newbits, HAS_HADES) )
 {
   stc("Hades will not allow you to summon a guardian.\n\r", ch);
   return;
 }
 if( ch->pcdata->followers > 4 )
 {
  stc("Nothing happens.\n\r",ch);
  return;
 }
 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); 
 do_say(ch,"Come forth, creature of darkness, and do my bidding!");
 stc("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);
 af.duration  = 666;
 af.location  = APPLY_NONE;
 af.modifier  = 0;
 af.bitvector = AFF_CHARM;
 affect_to_char(victim,&af);
 do_follow(victim,ch->name);
 ch->pcdata->followers++;
 return;
}

void do_servant(CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 AFFECT_DATA af;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 8 )
 {
  stc("You need Daimoinon 8 to create a servant.\n\r",ch);
  return;
 }
 if( IS_SET(ch->newbits, HAS_HADES) )
 {
   stc("Hades will not allow you to summon a servant.\n\r", ch);
    return;
 }
 if( ch->pcdata->followers > 4 )
 {
  stc("Nothing happens.\n\r",ch);
  return;
 }
 victim = create_mobile( get_mob_index(18018) );
 victim->level = 300;
 victim->hit = 9000;
 victim->max_hit = 9000;
 victim->hitroll = 100;
 victim->damroll = 100;
 victim->armor = -700;
 do_say(ch,"Come forth, creature of darkness, and do my bidding!");
 stc("A demonic servant 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);
 victim->master = ch;
 af.duration  = 666;
 af.location  = APPLY_NONE;
 af.modifier  = 0;
 af.bitvector = AFF_CHARM;
 affect_to_char(victim,&af);
 SET_BIT(victim->act, ACT_NOEXP);
 do_follow(victim,ch->name);
 ch->pcdata->followers++;
 return;
}

void do_vamp_spit( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 int dam;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) ) 
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 1 )
 {
  stc("You need Quietus 1 to spit acid.\n\r",ch);
  return;
 }
 if( (victim = ch->fighting) == NULL )
 {
  stc("You aren't fighting anyone.\n\r",ch);
  return;
 }
 dam = GET_POWERS(ch,DISC_QUIETUS) * number_range(30,60);
 dam += number_range(1,100);
 act2("Your spit of acid hits $N incredibly hard! [$D]",ch,NULL,victim,TO_CHAR,dam);
 act2("$n's spit of acid hits you incredibly hard! [$D]",ch,NULL,victim,TO_VICT,dam);
 act2("$n's spit of acid hits $N incredibly hard! [$D]",ch,NULL,victim,TO_NOTVICT,dam);
 WAIT_STATE(ch,12);
 hurt_person(ch,victim,dam);
 if( victim->hit <= 10 )
  one_hit(ch,victim,20,gsn_headbutt);
 return;
}

void do_scales(CHAR_DATA *ch,char *argument)
{
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_SERPENTIS) < 5 )
 {
  stc("You need Serpentis 5 to get cover yourself in scales.\n\r",ch);
  return;
 }
 if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_SCALES) )
 {
  stc("Scales slide out of your body and surround you.\n\r",ch);
  SET_BIT_POWERS(ch,VAMP_BITS,BIT_SCALES);
  return;
 }
 else
 { 
  stc("Your scales slide back into your body.\n\r",ch);
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_SCALES);
  return;
 }
 return;
}

void do_cserpent( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 CHAR_DATA *victim;
 
 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_SERPENTIS) < 4 )
 {
  stc("You need Serpentis 4 to call a serpent.\n\r",ch);
  return;
 }
 if( IS_SET(ch->newbits, HAS_HADES) )
 {
   stc("Hades will not allow you to summon a serpent.\n\r", ch);
   return;
 }
 if( ch->pcdata->followers > 0 )
 {
  stc("Nothing happened.\n\r",ch);
  return;
 }
 victim = create_mobile( get_mob_index(MOB_VNUM_SERPENT) );
 if( victim == NULL )
 {
  stc("Error - Please inform Kline.\n\r",ch);
  return;
 }
 act("You close your eyes and concentrate a huge serpent walks in.",ch,NULL,victim,TO_CHAR);
 act("$n closes his eyes and concentrates a huge $N walks in.",ch,NULL,victim,TO_ROOM);
 char_to_room(victim,ch->in_room);
 SET_BIT(victim->act,ACT_NOEXP);
 SET_BIT(victim->act,ACT_MOUNT);
 return;
}

void do_scream( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *vch;
 CHAR_DATA *vch_next;
 int cost = 150;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBFUSCATE) < 2 )
 {
  stc("You must need Obfuscate 2 to scream.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < 150 )
 {
  stc("You lack the 150 blood to scream.\n\r",ch);
  return;
 }
 if( ch->fight_timer > 10 )
 {
  stc("Your fight timer is too big!\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 act("$n lets out a horrendous shrieking scream!",ch,NULL,NULL,TO_ROOM);
 act("You let out a horrendous shrieking scream!",ch,NULL,NULL,TO_CHAR);
 for( vch = ch->in_room->people; vch != NULL; vch = vch_next )
 {
  vch_next = vch->next_in_room;
  if( !IS_NPC(vch) && vch->pcdata->chobj != NULL )
   continue;
  if( ch == vch )
   continue;
  if( is_safe(ch,vch) )
   continue;
  if( (vch->hit < (vch->max_hit * 0.5) ) && !IS_NPC(vch) )
   continue;
  vch->hit -= ( GET_POWERS(ch,DISC_OBFUSCATE) * 50 );
  stc("You fall to the ground, clutching your ears!\n\r",vch);
  vch->position = POS_STUNNED;
  set_stun(vch,number_range(1,2));
  act("$n falls to the ground, stunned!",vch,NULL,vch,TO_NOTVICT);
 }
 FIGHT_TIMER(ch,10);
 return;
}

void do_bloodrod( CHAR_DATA *ch, char *argument )
{
 OBJ_DATA *obj;
 
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 2 )
 {
  stc("You need Thaumaturgy 2 to create a blood rod.\n\r",ch);
  return;
 }
 obj = create_object(get_obj_index(OBJ_VNUM_BROD),0);
 obj_to_char(obj,ch);
 act("A Rod of Blood appears in your hands.",ch,NULL,NULL,TO_CHAR);
 act("A Rod of Blood appears in $n's hands.",ch,NULL,NULL,TO_ROOM);
 return;
}

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

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBTEN) < 10 )
 {
  stc("You need Obtenebration 10 to shadow gaze.\n\r",ch);
  return;
 }
 if( !IS_AFFECTED(ch,AFF_SHADOWPLANE) )
 {
  stc("You need to be in the shadowplane first!\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Who do you wish to use shadow gaze on?\n\r", ch );
  return;
 }
 if( (victim = get_char_room(ch,arg)) == NULL )
 {
  stc("They arent here.\n\r",ch);
  return;
 }
 if( IS_AFFECTED(victim,AFF_SHADOWPLANE) )
 {
  stc("They are already in the Shadowplane!\n\r",ch);
  return;
 }
 WAIT_STATE(ch, 8);
 act("$n gazes deeply into $N's eyes, and pulls $M into the shadowplane!",ch,NULL,victim,TO_ROOM);
 act("You gaze deeply into $N's eyes, and pull $M into the shadowplane!",ch,NULL,victim,TO_CHAR);
 SET_BIT(victim->affected_by, AFF_SHADOWPLANE);
 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];

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_ANIMALISM) < 4 )
 {
  stc("You need Animalism 4 to share your spirit.\n\r",ch);
  return;
 }
 if( (familiar = ch->pcdata->familiar) != NULL )
 {
  sprintf(buf,"You release %s.\n\r",familiar->short_descr);
  stc(buf,ch);
  familiar->wizard = NULL;
  ch->pcdata->familiar = NULL;
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("What do you wish to share your spirit with?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( ch == victim )
 {
  stc("That would be pointless.\n\r",ch);
  return;
 }
 if( !IS_NPC(victim) )
 {
  stc("Not on players.\n\r",ch);
  return;
 }
 if( victim->wizard != NULL )
 {
  stc("Their spirit is already shared.\n\r",ch);
  return;
 }
 if( victim->level > (GET_POWERS(ch,DISC_ANIMALISM) * 4) )
 {
  stc("They are too powerful.\n\r",ch);
  return;
 }
 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_share( CHAR_DATA *ch, char *argument )
{
return;
}
void do_frenzy( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_ANIMALISM) < 5 )
 {
  stc("You need level 5 Animalism to use Frenzy.\n\r",ch);
  return;
 }
 if( ch->rage >= (GET_POWERS(ch,VAMP_BEAST) * 3) )
 {
  stc("You're already raged, foo.\n\r",ch);
  return;
 }
 stc("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->rage += number_range(20,30);
 WAIT_STATE(ch,12);
 return;
}

void do_drain( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 int dam;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 4 )
 {
  stc("You need Daimoinon 4 to drain the lifeforce of others.\n\r",ch);
  return;
 }
 if( (victim = ch->fighting) == NULL )
 {
  stc("You're not fighting anybody!\n\r",ch);
  return;
 }
 if( victim->hit < 500 )
 {
  stc("They are far to hurt to do that!\n\r",ch);
  return;
 }
 dam = GET_POWERS(ch,DISC_DAIMOINON) * number_range(60,110);
 dam += number_range(200,400);
 victim->hit -= dam;
 ch->hit += dam;   
 act2("You drain the lifeforce out of $N. [$D]",ch,NULL,victim,TO_CHAR,dam);
 act2("$n drains the lifeforce out of $N. [$D]",ch,NULL,victim,TO_NOTVICT,dam);
 act2("You feel $n draining your lifeforce. [$D]",ch,NULL,victim,TO_VICT,dam);
 WAIT_STATE(ch,18);
 return;
}

void do_flamehands( CHAR_DATA *ch, char *argument )
{ 
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_PROTEAN) < 4 )
 {
  stc("You need Protean 4 to engulf your hands in flames.\n\r",ch);
  return;
 }
 if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_FLAMEHANDS) )
 {
  stc("Your hands ignite in blazing flames!\n\r",ch);
  act("$n's hands ignite in blazing flames!",ch,NULL,NULL,TO_ROOM);
  SET_BIT_POWERS(ch,VAMP_BITS,BIT_FLAMEHANDS);
  return;
 }
 else if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_FLAMEHANDS) )
 {
  stc("The flames engulfing your hands fade away.\n\r",ch);
  act("The flames engulfing $n's hands fade away.",ch,NULL,NULL,TO_ROOM);
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_FLAMEHANDS);
  return;
 }
 return;
}

void do_shade( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;    
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBTEN) < 1 )
 {	  
  stc("You need Obtenebration 1 to shroud yourself in darkness.\n\r",ch);	  
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_SHADE) )
 {
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_SHADE);
  stc( "You step out from the shadows.\n\r",ch);
  act("$n emerges from the shadows.",ch,NULL,NULL,TO_ROOM);    
 }
 else 
 {
  stc("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_POWERS(ch,VAMP_BITS,BIT_SHADE);
 }
 return;
}

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

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 3 )
 {
  stc("You need Vicissitude 3 to modify your bone structure.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc( "Syntax: bonemod <modification>\n\r",ch );
  stc( "Horns, Wings, Head, Exoskeleton, Tail\n\r",ch);
  return;
 }
 if( !str_prefix(arg,"horns") )
 {
  if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_HORNS) )
  {
   SET_BIT_POWERS(ch,VAMP_BITS,BIT_HORNS);
   stc("You pull a set of horns out of your head.\n\r",ch);
   act("$n pulls a set of horns from his head!",ch,NULL,NULL,TO_ROOM);
   return;
  }
  else
  {
   REM_BIT_POWERS(ch,VAMP_BITS,BIT_HORNS);
   stc("You push your horns back into your head.\n\r",ch);
   act("$n pushes $s horns back into $s head.",ch,NULL,NULL,TO_ROOM); 
   return;
  }
 }
 if( !str_prefix(arg,"wings") )
 {
  if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_WINGS) )
  {
   SET_BIT_POWERS(ch,VAMP_BITS,BIT_WINGS);
   stc("You pull a pair of leathery wings from your back.\n\r",ch);
   act("$n pulls a pair of leathery wings from $s back!",ch,NULL,NULL,TO_ROOM);
   return;
  }
  else
  {
   REM_BIT_POWERS(ch,VAMP_BITS,BIT_WINGS);
   stc("You push your wings into your back.\n\r",ch);
   act("$n pushes $s wings into $s back.",ch,NULL,NULL,TO_ROOM); 
   return;
  }
 }
 if( !str_prefix(arg,"exoskeleton") )
 {
  if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_EXO) )
  {
   SET_BIT_POWERS(ch,VAMP_BITS,BIT_EXO);
   stc("Your skin is covered by a hard exoskeleton.\n\r",ch);
   act("$n's skin is covered by a hard exoskeleton!",ch,NULL,NULL,TO_ROOM);
   return;
  }
  else
  {
   REM_BIT_POWERS(ch,VAMP_BITS,BIT_EXO);
   stc("Your exoskeleton slowly disappears under your skin.\n\r",ch);
   act("$n's hard exoskeleton disappears under $s skin.",ch,NULL,NULL,TO_ROOM); 
   return;
  }
 }
 if( !str_prefix(arg,"tail") )
 {
  if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_TAIL) )
  {
   SET_BIT_POWERS(ch,VAMP_BITS,BIT_TAIL);
   stc("Your spine extends out into a long, pointed tail.\n\r",ch);
   act("$n's spine extends to form a long pointed tail!",ch,NULL,NULL,TO_ROOM);
   return;
  }
  else
  {
   REM_BIT_POWERS(ch,VAMP_BITS,BIT_TAIL);
   stc("Your tail slowly retracts into your spine.\n\r",ch);
   act("$n's tail shrinks and vanishes into $s spine.",ch,NULL,NULL,TO_ROOM); 
   return;
  }
 }  
 if( !str_prefix(arg,"head") )
 {
  if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_HEAD) )
  {
   SET_BIT_POWERS(ch,VAMP_BITS,BIT_HEAD);
   stc("Your head transforms into that of a fierce lion.\n\r",ch);
   act("$n's head transforms into that of a fierce lion!",ch,NULL,NULL,TO_ROOM);
   return;
  }
  else
  {
   REM_BIT_POWERS(ch,VAMP_BITS,BIT_HEAD);
   stc("Your head slowly resumes it's normal form.\n\r",ch);
   act("$n's head resumes its normal form.",ch,NULL,NULL,TO_ROOM); 
   return;
  }
 } 
 do_bonemod(ch,"");
 return;
}

void vamp_disciplines( CHAR_DATA *ch, char *argument, char *argument2 )
{
 char arg[MAX_INPUT_LENGTH];
 char arg2[MAX_INPUT_LENGTH];

 argument = one_argument(argument,arg);
 argument2 = one_argument(argument2,arg2);

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( arg[0] == '\0' && arg2[0] == '\0' )
 {
  display_class_stats(ch);
  return;
 }
 else if( !str_cmp(arg,"learn") )
 {
  if( arg2[0] == '\0' )
  {
   stc("Learn which discipline?\n\r",ch);
   return;
  }
  if( !str_cmp(arg2,"obtenebration") )
  {
   improve_class(ch,DISC_OBTEN);
   return;
  }
  else if( !str_cmp(arg2,"presence") )
  {
   improve_class(ch,DISC_PRESENCE);
   return;
  }
  else if( !str_cmp(arg2,"quietus") )
  {
   improve_class(ch,DISC_QUIETUS);
   return;
  }
  else if( !str_cmp(arg2,"thaumaturgy") )
  {
   improve_class(ch,DISC_THAUM);
   return;
  }
  else if( !str_cmp(arg2,"auspex") )
  {
   improve_class(ch,DISC_AUSPEX);
   return;
  }
  else if( !str_cmp(arg2,"dominate") )
  {
   improve_class(ch,DISC_DOMINATE);
   return;
  }
  else if( !str_cmp(arg2,"obfuscate") )
  {
   improve_class(ch,DISC_OBFUSCATE);
   return;
  }
  else if( !str_cmp(arg2,"protean") )
  {
   improve_class(ch,DISC_PROTEAN);
   return;
  }
  else if( !str_cmp(arg2,"serpentis") )
  {
   improve_class(ch,DISC_SERPENTIS);
   return;
  }
  else if( !str_cmp(arg2,"vicissitude") )
  {
   improve_class(ch,DISC_VICIS);
   return;
  }
  else if( !str_cmp(arg2,"daimoinon") )
  {
   improve_class(ch,DISC_DAIMOINON);
   return;
  }
  else if( !str_cmp(arg2,"animalism") )
  {
   improve_class(ch,DISC_ANIMALISM);
   return;
  }
  else if( !str_cmp(arg2,"celerity") )
  {
   improve_class(ch,DISC_CELERITY);
   return;
  }
  else if( !str_cmp(arg2,"potence") )
  {
   improve_class(ch,DISC_POTENCE);
   return;
  }
  else if( !str_cmp(arg2,"fortitude") )
  {
   improve_class(ch,DISC_FORTITUDE);
   return;
  }
  else
  {
   stc("Learn which discipline?\n\r",ch);
   return;
  }
  return;
 }
 else if( !str_cmp(arg,"obtenebration") )
 {
  if( GET_POWERS(ch,DISC_OBTEN) == 0 )
	stc("You have no knowledge of the Obtenebration discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"presence") )
 {
  if( GET_POWERS(ch,DISC_PRESENCE) == 0 )
	stc("You have no knowledge of the Presence discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"quietus") )
 {
  if( GET_POWERS(ch,DISC_QUIETUS) == 0 )
	stc("You have no knowledge of the Quietus discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"thaumaturgy") )
 {
  if( GET_POWERS(ch,DISC_THAUM) == 0 )
	stc("You have no knowledge of the Thaumaturgy discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"auspex") )
 {
  if( GET_POWERS(ch,DISC_AUSPEX) == 0 )
	stc("You have no knowledge of the Auspex discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"dominate") )
 {
  if( GET_POWERS(ch,DISC_DOMINATE) == 0 )
	stc("You have no knowledge of the Dominate discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"obfuscate") )
 {
  if( GET_POWERS(ch,DISC_OBFUSCATE) == 0 )
	stc("You have no knowledge of the OBFUSCATE discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"protean") )
 {
  if( GET_POWERS(ch,DISC_PROTEAN) == 0 )
	stc("You have no knowledge of the Protean discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"sepentis") )
 {
  if( GET_POWERS(ch,DISC_SERPENTIS) == 0 )
	stc("You have no knowledge of the Serpentis discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"vicissitude") )
 {
  if( GET_POWERS(ch,DISC_VICIS) == 0 )
	stc("You have no knowledge of the Vicissitude discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"daimoinon") )
 {
  if( GET_POWERS(ch,DISC_DAIMOINON) == 0 )
	stc("You have no knowledge of the Daimoinon discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"animalism") )
 {
  if( GET_POWERS(ch,DISC_ANIMALISM) == 0 )
	stc("You have no knowledge of the Animalism discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"celerity") )
 {
  if( GET_POWERS(ch,DISC_CELERITY) == 0 )
	stc("You have no knowledge of the Celerity discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"potence") )
 {
  if( GET_POWERS(ch,DISC_POTENCE) == 0 )
	stc("You have no knowledge of the Potence discipline.\n\r",ch);
  return;
 }
 else if( !str_cmp(arg,"fortitude") )
 {
  if( GET_POWERS(ch,DISC_FORTITUDE) == 0 )
	stc("You have no knowledge of the Fortitude discipline.\n\r",ch);
  return;
 }
 return;
}

void do_vamppowers( CHAR_DATA *ch, char *argument )
{
 stc("Obtenebration: tendrils, lamprey, shadowgaze, shade, shadowstep\n\r",ch);
 stc("Presence     : entrance, mindblast, summon\n\r",ch);
 stc("Quietus      : sharpen, darkness, assassinate, infirmity, spit, flash, death\n\r",ch);
 stc("Thamaturgy   : gourge, bloodwater, spew, bloodrod, tide, potency, theft\n\r",ch);
 stc("Auspex       : scry, penetrating vision\n\r",ch);
 stc("Dominate     : fcommand\n\r",ch);
 stc("Obfuscate    : conceal, scream, return\n\r",ch);
 stc("Protean      : flamehands, earthmeld, change\n\r",ch);
 stc("Serpentis    : tongue, scales, cserpent, coil, poisonweapon\n\r",ch);
 stc("Vicissitude  : dragonform, objform, fleshcraft, bonemod, clone, acidblood, rot, plasma, zuloform\n\r",ch);
 stc("Daimoinon    : baal, inferno, zombie, bloodgate, decay, guardian, servant, drain, hades\n\r",ch);
 stc("Animalism    : pigeon, share, frenzy\n\r",ch);
 stc("Celerity     : *attacks, parry/dodge*\n\r",ch);
 stc("Potence      : *offensive damage mod*\n\r",ch);
 stc("Fortitude    : *defensive damage mod*\n\r",ch);
 stc("Innate       : embrace, regenerate\n\r",ch);
 return;
}

void do_clone( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 OBJ_DATA *obj;
 int cost = 50; 

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 1 )
 {
  stc("You need Vicissitude 1 to clone an item.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 50 blood require to clone an item.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Make a clone of what object?\n\r",ch);
  return;
 }
 if( (obj = get_obj_carry(ch,arg)) == NULL )
 {
  stc( "You dont have that item.\n\r",ch);
  return;
 }
 if( IS_SET(obj->extra_flags, ITEM_ONE_RING) )
 {
   stc("You are not powerful enough to clone Sauron's magic!\n\r", ch);
   return;
 }
 if( obj->pIndexData->vnum >= 26000 && obj->pIndexData->vnum <= 26058 )
 {
	stc("You cannot clone objects from a dream!\n\r", ch);
	return;
 }
 if( obj->points > 0
  || IS_SET(obj->extra_flags,ITEM_FORGED)
  || IS_SET(obj->quest,QUEST_ARTIFACT)
  || IS_SET(obj->quest,QUEST_RELIC)
  || obj->chobj != NULL
  || obj->item_type == ITEM_GEMSTONE 
  || obj->item_type == ITEM_HILT     
  || obj->item_type == ITEM_COPPER   
  || obj->item_type == ITEM_IRON     
  || obj->item_type == ITEM_STEEL    
  || obj->item_type == ITEM_ADAMANTITE
  || obj->item_type == ITEM_QUEST
  || obj->item_type == ITEM_QUESTCARD
  || obj->item_type == ITEM_GEM
  || obj->item_type == ITEM_ORE
  || obj->item_type == ITEM_METAL)
 {
  stc("You cant clone that object.\n\r",ch);
  return;
 }
 do_oclone(ch,arg);
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 WAIT_STATE(ch,6);
 return;
}

void do_coil( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_SERPENTIS) < 8 )
 {
  stc("You need Serpentis 8 to coil your body.\n\r", ch);
  return;
 }
 if( !IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_COIL) )
 {
  stc("You prepare to coil your victims.\n\r",ch);
  SET_BIT_POWERS(ch,VAMP_BITS,BIT_COIL);
  return;
 }
 else
 {
  stc("You relax your body once again.\n\r",ch);
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_COIL);
  return;
 }
 return;
}

void do_tide( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 10 )
 {
  stc("You need Thaumaturgy 10 to use summon a tide of vitae.\n\r", ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < blood_max(ch) )
 {
  stc("You require full blood to summon a tide of vitae.\n\r",ch);
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_TIDE) )
 {
  stc("The tide is already with you.\n\r",ch);
  return;
 }
 SET_BIT_POWERS(ch,VAMP_BITS,BIT_TIDE);
 stc("You feel a tide of vitae rush over you.\n\r",ch);
 GET_POWERS(ch,VAMP_BLOOD) = 0;
 WAIT_STATE(ch,20);
 return;
}

void do_flash( CHAR_DATA *ch, char *argument )
{
 int cost = 300;
 
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 9 )
 {
  stc("You need Quietus 9 to use to quicken your reflexes.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to quicken your reflexes.\n\r",ch);
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_FLASHING) )
 {
  stc("You are already moving swiftly.\n\r",ch);
  return;
 }
 SET_BIT_POWERS(ch,VAMP_BITS,BIT_FLASHING);
 GET_POWERS(ch,DISC_CELERITY)++;
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 act("$n starts moving with lightening speed.",ch,NULL,NULL,TO_ROOM);
 stc("You start moving with lightening speed.\n\r",ch);
 WAIT_STATE(ch,20);
 return;
}

void do_death( CHAR_DATA *ch, char *argument )
{
 ROOM_INDEX_DATA *room;
 int cost = 200;
 
 room = ch->in_room;
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_QUIETUS) < 5 )
 {
  stc("You need Quietus 5 to use create a deathly silence.\n\r",ch);
  return;
 }
 if( RTIMER(ch->in_room,RTIMER_SILENCE) != 0 )
 {
  act("The silence leaves the room.",ch,NULL,NULL,TO_ALL);
  SET_RTIMER(ch->in_room,RTIMER_SILENCE,0);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 200 blood to create a deathly silence.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 SET_RTIMER(room,RTIMER_SILENCE,10);
 act("A look of concentration passes over $n's face.",ch,NULL,NULL,TO_ROOM);
 stc("A look of concentration passes over your face.\n\r",ch);
 act("An eerie silence fills the room.",ch,NULL,NULL,TO_ALL);
 return;
}

void do_acid( CHAR_DATA *ch, char *argument )
{
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 9 )
 {
  stc("You Vicissitude 9 to acidify your blood.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) != blood_max(ch) )
 {
  stc("Your blood must be full to change the acid content of it.\n\r", ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) = 0;
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_ACID) )
 {
  stc("Your blood returns to normal.\n\r",ch);
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_ACID);
  return;
 }
 else
 {
  stc("Your blood becomes acidic.\n\r",ch);
  SET_BIT_POWERS(ch,VAMP_BITS,BIT_ACID);
  return;
 }
 return;
}

void do_retrn( CHAR_DATA *ch, char *argument )
{
 ROOM_INDEX_DATA *location;
 int cost = 300;

 location = get_room_index(27000);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBFUSCATE) < 8 )
 {
  stc("You need Obfuscate 8 to return to Caine.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to return to Caine.\n\r",ch);
  return;
 }
 if( ch->in_room == location )
  return;
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 act("$n raises $s arms to the sky.",ch,NULL,NULL,TO_ROOM);
 stc("Your raise your arms to the sky.",ch);
 act("$n disappears.",ch,NULL,NULL,TO_ROOM);
 char_from_room(ch);
 char_to_room(ch,location);
 act("$n appears in the room.",ch,NULL,NULL,TO_ROOM);
 do_look(ch,"auto");
 return;
}

void do_rot( 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) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 6 )
 {
  stc("You need Vicissitude 6 to cause flesh to rot.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Cause who's flesh to rot?\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg)) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( IS_NPC(victim) )
 {
  stc("Not on mobs.\n\r",ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\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);
 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->extra, EXTRA_ROT);
 return;
}        

void do_hades( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 AFFECT_DATA af;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DAIMOINON) < 10 )
 {
  stc("You need Daimoinon 10 to summon Hades to your aid.\n\r",ch);
  return;
 }
 if( ch->pcdata->followers == 0 )
  REMOVE_BIT(ch->newbits, HAS_HADES);
 if( IS_SET(ch->newbits, HAS_HADES) )
 {
   stc("Only one Satan can exist in this world.\n\r", ch);
   return;
 }
 if( ch->pcdata->followers > 0)
 {
  stc("Hades refuses to come to your aid while others follow you.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < blood_max(ch) )
 {
  stc("Your blood must be full to summon Hades to your aid.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) = 0;
 victim = create_mobile(get_mob_index(8));
 victim->level = 350;
 victim->hit = 10000;
 victim->max_hit = 10000;
 victim->hitroll = 500;
 victim->damroll = 500;
 victim->armor = -2000;
 do_say(ch,"I command you, Hades, to rise before my feet and crush all who oppose me with your might!");
 act("The ground roars and shakes as $N bursts forth from it!",ch,NULL,victim,TO_ALL);
 char_to_room(victim,ch->in_room);
 af.duration  = 666;
 af.location  = APPLY_NONE;
 af.modifier  = 0;
 af.bitvector = AFF_CHARM;
 affect_to_char(victim,&af);
 SET_BIT(victim->act,ACT_NOEXP);
 do_follow(victim,ch->name);
 ch->pcdata->followers++;
 SET_BIT(ch->newbits, HAS_HADES);
 return;
}

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

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 3 )
 { 
  stc("You need Thaumaturgy 3 to make your blood more potent.\n\r",ch);
  return;
 }
 if( ch->generation == 1 )
 {
  stc("Your blood is already as potent as that of Caine!\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) != blood_max(ch) )
 {
  stc("Your blood must be full to make it more potent.\n\r", ch);
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_POTENCE) )
 {
  stc("Your blood is already more potent.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) = 0;
 stc("Your blood becomes more potent.\n\r",ch);
 SET_BIT_POWERS(ch,VAMP_BITS,BIT_POTENCE);
 ch->generation--;
 WAIT_STATE(ch,20);
 return;
}


void do_plasma( CHAR_DATA *ch, char *argument )
{
 OBJ_DATA *obj;

 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 stc("COMMAND TEMPORARILY DISABLED\n\r", ch);
 return;
 if( GET_POWERS(ch,DISC_VICIS) < 5 )
 { 
  stc("You need Vicissitude 5 to turn into plasma.\n\r",ch);
  return;    
 }
 save_char_obj(ch);
 if( (obj = create_object(get_obj_index(30007),60)) == NULL )
 {
  stc("[ERROR] Missing object, 30007.  Inform Kline immediately.\n\r",ch);	
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) == FORM_PLASMA )    
 {      
  ch->pcdata->obj_vnum = 0;
  GET_POWERS(ch,VAMP_FORM) = FORM_NORMAL;
  REM_BIT_POWERS(ch,VAMP_BITS,BIT_DISGUISE);
  REMOVE_BIT(ch->extra,EXTRA_OSWITCH);
  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("Your reform your human body.",ch,obj,NULL,TO_CHAR);
  extract_obj(obj);
  return;
 }
 if( ch->fight_timer > 0 )
 {	
  stc("You cannot use plasma with your fight timer active.\n\r",ch);
  return;	
 }        
 if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )   
 {	
  stc("You need to be in human form.\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 = 30007;
 obj->chobj = ch;   
 ch->pcdata->chobj = obj;
 GET_POWERS(ch,VAMP_FORM) = FORM_PLASMA;
 SET_BIT_POWERS(ch,VAMP_BITS,BIT_DISGUISE);   
 SET_BIT(ch->extra,EXTRA_OSWITCH); 
/* free_string(ch->morph);    
 ch->morph = str_dup("a pool of blood");
 */obj_to_room(obj,ch->in_room);  
 return;
}

void do_shadowstep( 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) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_OBTEN) < 7 )
 {
  stc("You need Obtenebration 7 to step through the shadows.\n\r",ch);
  return;
 }
 if( weather_info.sunlight != SUN_SET && weather_info.sunlight != SUN_DARK )
 {
  stc("You can't step through shadows in daylight!\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Shadowstep to who?\n\r",ch);
  return;
 }
 if( ( victim = get_char_world( ch, arg ) ) == NULL )
 {
  stc( "They aren't here.\n\r", ch );
  return;
 }
 if( ch == victim )
 {
  stc("Not too bright, are you?!\n\r",ch);
  return;
 }
 if( IS_IMMORTAL(victim) )
 {
  stc("Not to immortals!\r\n", ch);
  return;
 }
 if( is_ds_range(victim) )
 {
  stc("You can't shadowstep into a dream.\n\r", ch);
  return;
 }
 if( ch->fight_timer > 0 )
 {
  stc("Not with a fight timer!\n\r",ch);
  return;
 }
 if( victim->in_room == ch->in_room )
 {
  stc("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_earthmeld( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_PROTEAN) < 4 )
 {
  stc("You need Protean 4 to meld into the earth.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
 {
  stc("You must be in human form.\n\r",ch);
  return;
 }
 if( ch->fight_timer > 0 )
 {
  stc("Not with a fight timer.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) == FORM_EARTH )
 {
  stc("You rise up from the ground.\n\r",ch);
  act("$n rises up from the ground.",ch,NULL,NULL,TO_ROOM);
  GET_POWERS(ch,VAMP_FORM) = FORM_NORMAL;
  return;
 }
/* free_string(ch->morph);
 ch->morph = str_dup("A mound of earth");
 */stc("You sink into the ground.\n\r",ch);
 act("$n sinks into the ground.",ch,NULL,NULL,TO_ROOM);
 return;
}

void do_theft( 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) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_THAUM) < 4 )
 {
  stc("You need Thaumaturgy 4 to use the theft of vitae.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Steal who's blood?\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
 {
  stc("You need to be in human form.\n\r",ch);
  return;
 }
 if( (victim = get_char_room(ch,arg) ) == NULL )
 {
  stc("They aren't here.\n\r",ch);
  return;
 }
 if( IS_NPC(victim) )
 {
  stc("Not on mobs.\n\r",ch);
  return;
 }
 if( IS_CLASS(victim,CLASS_VAMPIRE) && GET_POWERS(victim,VAMP_BLOOD) < 1 )
 {
  stc( "There isn't enough blood to steal.\n\r", ch);
  return;
 }
 if( is_safe(ch,victim) )
 {
  stc("Not while safe.\n\r",ch);
  return;
 }
 act("A stream of blood shoots from $N into your body!",ch,NULL,victim,TO_CHAR);
 act("A stream of blood shoots from $N into $N!",ch,NULL,victim,TO_ROOM);
 act("A stream of blood shoots from your body into $N!",ch,NULL,victim,TO_VICT);
        
 GET_POWERS(ch,VAMP_BLOOD) = GET_POWERS(victim,VAMP_BLOOD);
 GET_POWERS(victim,VAMP_BLOOD) = 0;
 if( GET_POWERS(ch,VAMP_BLOOD) > blood_max(ch) )
 {
  stc("Your bloodlust is sated.\n\r",ch);
  GET_POWERS(ch,VAMP_BLOOD) = blood_max(ch);
 }
 if( IS_SET(GET_POWERS(victim,VAMP_BITS),BIT_ACID) )
 {
  stc("Their blood is a deadly acid!\n\r",ch);
  ch->hit -= (GET_POWERS(ch,VAMP_BLOOD) * 2);
  return;
 }
 return;
}

void do_zuloform( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 int cost = 300;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_VICIS) < 4 )
 {
  stc("You need Vicissitude 4 to transform into a large beast.\n\r",ch);
  return;
 }
 if( (GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL) && (GET_POWERS(ch,VAMP_FORM) != FORM_ZULO) )
 {
  stc("You can only transform while in Human or Zulo form.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_FORM) == FORM_ZULO )
 {
  GET_POWERS(ch,VAMP_FORM) = FORM_NORMAL;
  stc("You transform back into humanform.",ch);
  act("$n shrinks back into a human.",ch,NULL,NULL,TO_ROOM);
//  free_string(ch->morph);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 300 blood to transform into a large beast.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 stc("You transform into a large beast!",ch);
 act("$n's body grows and distorts into a large beast!",ch,NULL,NULL,TO_ROOM);
 GET_POWERS(ch,VAMP_FORM) = FORM_ZULO;
/* free_string(ch->morph);
 ch->morph = str_dup("A large black monster");
 */return;
}

void do_change( CHAR_DATA *ch, char *argument )
{
 char arg[MAX_INPUT_LENGTH];
 int cost = 100;

 argument = one_argument(argument,arg); 
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_PROTEAN) < 3 )
 {
  stc("You need Protean 3 to change your form.\n\r",ch);
  return;
 }
 if( IS_SET(GET_POWERS(ch,VAMP_BITS),BIT_DISGUISE) )
 {
  stc("You can't change forms while assuming the form of another.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r",ch);
  return;
 }
 if( !str_cmp(arg,"bat") )
 {
  if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
  {
   stc("You can only polymorph from human form.\n\r",ch);
   return;
  }
  if( GET_POWERS(ch,VAMP_BLOOD) < cost )
  {
   stc("You lack the 100 blood to change forms.\n\r",ch);
   return;
  }
  GET_POWERS(ch,VAMP_BLOOD) -= cost;
  act( "You transform into bat form.", ch, NULL, NULL, TO_CHAR );
  act( "$n transforms into a bat.", ch, NULL, NULL, TO_ROOM );
  GET_POWERS(ch,VAMP_FORM) = FORM_BAT;
  sprintf(arg,"%s the vampire bat",ch->name);
/*  free_string(ch->morph);
  ch->morph = str_dup(arg);
  */return;
 }
 else if( !str_cmp(arg,"wolf") )
 {
  if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
  {
   stc("You can only polymorph from human form.\n\r",ch);
   return;
  }
  if( GET_POWERS(ch,VAMP_BLOOD) < cost )
  {
   stc("You lack the 100 blood to change forms.\n\r",ch);
   return;
  }
  GET_POWERS(ch,VAMP_BLOOD) -= cost;
  act( "You transform into wolf form.", ch, NULL, NULL, TO_CHAR );
  act( "$n transforms into a dire wolf.", ch, NULL, NULL, TO_ROOM );
  GET_POWERS(ch,VAMP_FORM) = FORM_WOLF;
  sprintf(arg,"%s the dire wolf",ch->name);
/*  free_string(ch->morph);
  ch->morph = str_dup(arg);
  */return;
 }
 else if( !str_cmp(arg,"mist") )
 {
  if( GET_POWERS(ch,VAMP_FORM) != FORM_NORMAL )
  {
   stc("You can only polymorph from human form.\n\r",ch);
   return;
  }
  if( GET_POWERS(ch,VAMP_BLOOD) < cost )
  {
   stc("You lack the 100 blood to change forms.\n\r",ch);
   return;
  }
  GET_POWERS(ch,VAMP_BLOOD) -= cost;
  act( "You transform into mist form.", ch, NULL, NULL, TO_CHAR );
  act( "$n transforms into a white mist.", ch, NULL, NULL, TO_ROOM );
  GET_POWERS(ch,VAMP_FORM) = FORM_MIST;
  SET_BIT(ch->affected_by,AFF_ETHEREAL);
  sprintf(arg,"%s the white mist",ch->name);
/*  free_string(ch->morph);
  ch->morph = str_dup(arg);
  */if( IS_EXTRA(ch,TIED_UP) )
  {
   act("The ropes binding you fall through your ethereal form.",ch,NULL,NULL,TO_CHAR);
   act("The ropes binding $n fall through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
   REMOVE_BIT(ch->extra,TIED_UP);
   REMOVE_BIT(ch->extra,GAGGED);
   REMOVE_BIT(ch->extra,BLINDFOLDED);
  }
  if( IS_AFFECTED(ch,AFF_WEBBED) )
  {
   act("The webbing entrapping $n falls through $s ethereal form.",ch,NULL,NULL,TO_ROOM);
   stc("The webbing entrapping you falls through your ethereal form.\n\r",ch);
   REMOVE_BIT(ch->affected_by,AFF_WEBBED);
  }
  return;
 }
 else if ( !str_cmp(arg,"human") )
 {
  if( GET_POWERS(ch,VAMP_FORM) == FORM_NORMAL )
  {
   stc( "You are already in human form.\n\r", ch );
   return;
  }
  if( GET_POWERS(ch,VAMP_FORM) == FORM_MIST )
   REMOVE_BIT(ch->affected_by, AFF_ETHEREAL);
  act( "You transform into human form.", ch, NULL, NULL, TO_CHAR );
  act( "$n transforms into human form.", ch, NULL, NULL, TO_ROOM );
  GET_POWERS(ch,VAMP_FORM) = FORM_NORMAL;
/*  free_string(ch->morph);
  ch->morph = str_dup("");
  */return;
 }
 else
  stc("You can change between 'human', 'bat', 'wolf' and 'mist' forms.\n\r",ch);
 return;
}

void do_poisonw( CHAR_DATA *ch, char *argument )
{
 OBJ_DATA  *obj;
 char arg[MAX_INPUT_LENGTH];
 int cost = 100;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_SERPENTIS) < 3 )
 {
  stc("You need Serpentis 3 to use poison your blades.\n\r",ch);
  return;
 }
 if( ((obj = get_eq_char(ch,WEAR_WIELD)) == NULL )
  && ((obj = get_eq_char(ch,WEAR_HOLD)) == NULL) )
 {
  stc("You must wield the weapon you wish to poison.\n\r",ch);
  return;
 }
 if( obj->value[0] >= 18025 )
 {
  stc("This weapon cannot be poisoned.\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 100 blood to coat a weapon with poison.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 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);
 if( obj->value[0] == 18000 )
  obj->value[0] += 24;
 else
  obj->value[0] = 24;
 obj->level = 100;
 return;
}

void do_regenerate( CHAR_DATA *ch, char *argument )
{
 char arg [MAX_INPUT_LENGTH];
 int cost = 25;
 int gain = 0;

 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( ch->rage > 0 )
 {
  stc("You cannot control your regenerative powers while you are filled with rage.\n\r",ch);
  return;
 }
 if( ch->position == POS_FIGHTING )
 {
  stc("You cannot regenerate while fighting.\n\r",ch);
  return;
 }
 if( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana && ch->move >= ch->max_move )
 {
  stc("But you are already completely regenerated!\n\r",ch);
  return;
 }
 if( GET_POWERS(ch,VAMP_BLOOD) < cost )
 {
  stc("You lack the 25 blood to regenerate yourself.\n\r",ch);
  return;
 }
 GET_POWERS(ch,VAMP_BLOOD) -= cost;
 if (ch->hit < 1 )
 {
  gain = 1;
  WAIT_STATE(ch,6);
 }
 else
 {
  gain = ( (cost * (GET_POWERS(ch,VAMP_AGE) * 1.5)) + number_range(100,200) );
  WAIT_STATE(ch,8);
 }
 ch->hit += gain;
 ch->mana += gain;
 ch->move += gain;
 if( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana && ch->move >= ch->max_move )
 {
  stc("Your body has completely regenerated.\n\r",ch);
  act("$n's body completely regenerates itself.",ch,NULL,NULL,TO_ROOM);
 }
 else
 {
  act2("Your body slowly regenerates itself. [$D]",ch,NULL,NULL,TO_CHAR,gain);
  act2("$n's body slowly regenerates itself. [$D]",ch,NULL,NULL,TO_ROOM,gain);
 }
 return;
}

void do_vamp_summon(CHAR_DATA *ch, char *argument)
{
 CHAR_DATA *victim;
 char arg [MAX_INPUT_LENGTH];
    
 argument = one_argument(argument,arg);
 if( IS_NPC(ch) )
  return;
 if( GET_POWERS(ch,DISC_PRESENCE) < 4 )
 {
  stc("You need Presence 4 to summon another.\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("Summon whom?\n\r",ch);
  return;
 }
 if( (victim = get_char_world(ch,arg)) == NULL)
 {
  stc("They aren't here.\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->fighting != NULL
  ||   (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON) )
  ||   is_ds_range(victim) 
  ||   victim->level >= 400 )

 {
  stc("You failed.\n\r",ch);
  return;
 }
 WAIT_STATE(ch,12);
 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");
 return;
}
/*
void do_fcommand( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 char arg[MAX_INPUT_LENGTH];

 arg = argument;
 if( IS_NPC(ch) )
  return;
 if( !IS_CLASS(ch,CLASS_VAMPIRE) )
 {
  do_huh(ch,"");
  return;
 }
 if( GET_POWERS(ch,DISC_DOMINATE) < 3 )
 {
  stc("You need Dominate 3 to command others over great distances.\n\r",ch);
  return;
 }
 if( (victim = ch->pcdata->familiar) == NULL )
 {
  stc("You have no familiar to command!\n\r",ch);
  return;
 }
 if( arg[0] == '\0' )
 {
  stc("What do you wish to make your familiar do?\n\r",ch);
  return;
 }
 interpret(victim,argument);
 return;
}
*/
void do_fcommand( CHAR_DATA *ch, char *argument )
{
return;
}
/*
void do_testemb(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))
    {
	stc("Huh?\n\r",ch);
	return;
    }

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

    if (ch->embracing != NULL)
    {
	if ((victim=ch->embracing) != NULL)
	{
	    stc("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)
    {
	stc("They arent here.\n\r",ch);
	return;
    }

    if (IS_NPC(victim) || !IS_CLASS(ch,CLASS_VAMPIRE))
    {
	stc("You can only embrace vampires.\n\r",ch);
	return;
    }
  
    if (victim->position != POS_MORTAL)
    {
	stc("You can only embrace mortally wounded vampires.\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);
    stc(buf,ch);
    WAIT_STATE(ch, 15);
    
    sprintf(buf, "You sink your teeth into their throat.\n\r");
    stc(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);
    stc(buf,victim);
    victim->embraced=ch;
    ch->embracing=victim;
 
    return;
}
*/