#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;
}
*/