#include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include "merc.h" // Necromancy, Melpominee, Obeah void do_preserve( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( !IS_CLASS(ch, CLASS_VAMPIRE) ) { stc("Huh?\n\r",ch); return; } if ( ch->power[DISC_VAMP_NECR] < 2 ) { stc("You must obtain level 2 Necromancy to use Preserve.\n\r",ch); return; } if ( ( obj = get_obj_carry(ch, arg) ) == NULL ) { stc("You do not have that item.\n\r",ch); return; } if ( obj->item_type == ITEM_HEAD ) { stc("You cannot preserve that item.\n\r",ch); return; } if ( obj->timer <= 0 ) { stc("That object has no timer.\n\r",ch); return; } obj->timer = -1; act("You place your hands on $p and concentrate on it.",ch,obj,NULL,TO_CHAR); act("$n places $s hands on $p and it glows brightly.",ch,obj,NULL,TO_ROOM); return; } void do_spiritguard( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch) ) return; if (!IS_CLASS(ch, CLASS_VAMPIRE) ) { stc("Huh?\n\r",ch); return; } if ( ch->power[DISC_VAMP_NECR] < 4 ) { stc("You must obtain level 4 Necromancy to use Spirit Guardian.\n\r",ch); return; } if ( !IS_SET(ch->flag2, AFF_SPIRITGUARD) ) { stc("You awaken your spirit guardian.\n\r",ch); SET_BIT(ch->flag2, AFF_SPIRITGUARD); return; } else { stc("You dismiss your spirit guardian.\n\r",ch); REMOVE_BIT(ch->flag2, AFF_SPIRITGUARD); return; } return; } void do_spiritgate( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg[MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( !IS_CLASS(ch, CLASS_VAMPIRE) ) { stc("Huh?\n\r",ch); return; } if ( ch->power[DISC_VAMP_NECR] < 3 ) { stc("You must obtain level 3 Necromancy to use SpiritGate.\n\r",ch); return; } if ( ( obj = get_obj_world( ch, arg ) ) == NULL ) { stc("You cannot find that object.\n\r",ch); return; } if ( ch->pcdata->condition[COND_THIRST] < 66 ) { stc("You do not have enough blood.\n\r",ch); return; } if ( obj->in_room == NULL ) { stc("You cannot locate that object.\n\r",ch); return; } if ( obj->carried_by != NULL ) { stc("That corpse is being carried by someone!\n\r",ch); return; } if ( obj->item_type != ITEM_CORPSE_PC && obj->item_type != ITEM_CORPSE_NPC ) { stc("That's not even a corpse!\n\r",ch); return; } if ( obj->in_room->vnum == ch->in_room->vnum ) { stc("You're already there!\n\r",ch); return; } act("$n steps into a spirit gate and vanishes.",ch,NULL,NULL,TO_ROOM); char_from_room(ch); char_to_room(ch, get_room_index( obj->in_room->vnum )); act("You step through a spirit gate and appear before $p.",ch,obj,NULL,TO_CHAR); act("$n steps out of a spirit gate in front of $p.",ch,obj,NULL,TO_ROOM); ch->pcdata->condition[COND_THIRST] -= 65; return; } void do_scream( CHAR_DATA *ch, char *argument ) { CHAR_DATA *vch; CHAR_DATA *vch_next; CHAR_DATA *mount; char arg[MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( !IS_CLASS(ch, CLASS_VAMPIRE) ) { stc("Huh?\n\r",ch); return; } if ( ch->power[DISC_VAMP_MELP] < 1 ) { stc("You must obtain level 1 Melpominee to use Scream.\n\r",ch); return; } if ( IS_SET(ch->in_room->room_flags, ROOM_SAFE) ) { stc("Your screams will have no effect here.\n\r",ch); return; } if ( ch->pcdata->condition[COND_THIRST] < 50 ) { stc("You have insufficient blood.\n\r",ch); return; } for ( vch = char_list; vch != NULL; vch = vch_next ) { vch_next = vch->next; if ( vch->in_room == NULL ) continue; if ( !IS_NPC(vch) && vch->pcdata->chobj != NULL ) continue; if ( ch == vch ) continue; if ( vch->in_room == ch->in_room ) { if ( ( mount = ch->mount ) != NULL ) { if ( mount == vch ) continue; } if (can_see(ch,vch)) { if ( number_range( 1, (7 - ch->power[DISC_VAMP_MELP])) == 2 ) { act("$n lets out an ear-popping scream!",ch,NULL,vch,TO_ROOM); stc("You fall to the ground, clutching your ears.\n\r",vch); vch->position = POS_STUNNED; act("$n falls to the ground, stunned.",vch,NULL,vch,TO_NOTVICT); return; } else { act("$n lets out an ear-popping scream!",ch,NULL,vch,TO_ROOM); return; } } else continue; return; } } return; }